質問編集履歴
2
エラーが発生する箇所を追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -119,4 +119,41 @@
|
|
119
119
|
|
120
120
|
### 試したこと
|
121
121
|
|
122
|
-
スレッドの理解が及ばないまま`mSocket = mServerSocket.Accept();`を動かそうとしていましたが、ドキュメントを読むとAccept()は別スレッドでコールバックを受け付けないといけないとのことで、挫折しました。
|
122
|
+
スレッドの理解が及ばないまま`mSocket = mServerSocket.Accept();`を動かそうとしていましたが、ドキュメントを読むとAccept()は別スレッドでコールバックを受け付けないといけないとのことで、挫折しました。
|
123
|
+
|
124
|
+
|
125
|
+
### 追記(9/11)
|
126
|
+
f-miyuさんのご回答を参考に動かしてみましたが、機器の接続のところでIOExceptionが発生(Connect()メソッドがタイムアウトする)し、スレッドに関する動きを確認できていません。
|
127
|
+
ソース全体は[github](https://github.com/johta/XF-BT)にあげています。問題が発生しているのは以下のメソッドです。
|
128
|
+
```BluetoothManager
|
129
|
+
private void openDeviceConnection(BluetoothDevice btDevice)
|
130
|
+
{
|
131
|
+
try
|
132
|
+
{
|
133
|
+
mSocket = btDevice.CreateRfcommSocketToServiceRecord(getUUIDFromString());
|
134
|
+
System.Console.WriteLine("#debug get socket [{0}]", btDevice.Name);
|
135
|
+
mSocket.Connect();
|
136
|
+
System.Console.WriteLine("#debug connect[{0}]", btDevice.Name);
|
137
|
+
//input stream
|
138
|
+
mStream = mSocket.InputStream;
|
139
|
+
System.Console.WriteLine("#debug open InputStream [{0}]", btDevice.Name);
|
140
|
+
mReader = new InputStreamReader(mStream);
|
141
|
+
System.Console.WriteLine("#debug get StreamReader [{0}]", btDevice.Name);
|
142
|
+
reader = new BufferedReader(mReader);
|
143
|
+
System.Console.WriteLine("#debug get get BufferedReader [{0}]", btDevice.Name);
|
144
|
+
}
|
145
|
+
catch(IOException e)
|
146
|
+
{
|
147
|
+
close(mSocket);
|
148
|
+
close(mStream);
|
149
|
+
close(mReader);
|
150
|
+
e.PrintStackTrace();
|
151
|
+
throw e;
|
152
|
+
}
|
153
|
+
}
|
154
|
+
```
|
155
|
+
`btDevice`はペアリング済みデバイスの情報が格納されています。
|
156
|
+
|
157
|
+
`CreateRfcommSocketToServiceRecored()`の引数として読んでいる`getUUIDFromStrng()`は、String型のローカル変数で定義しているUUIDをUUID型に変換して渡しているだけです。
|
158
|
+
|
159
|
+
9行目の`Connect()`メソッドがタイムアウトし、IOExceptionが帰ってきてしまいます。
|
1
タイトル・読みにくい箇所の修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
【Xamarin.Forms】Bluetoothの実装
|
1
|
+
【Xamarin.Forms】AndroidにおけるBluetoothの実装(主にスレッド)
|
body
CHANGED
@@ -8,16 +8,16 @@
|
|
8
8
|
|
9
9
|
- Xamarin.FormsでAndroidのスレッドをどう扱えば良い?
|
10
10
|
|
11
|
-
チュートリアルとしてよく見るのはスマホ同士で片方をサーバー、片方をクライアントにして接続するものですが、今回接続したいのは画面の無いクラシックBluetooth(SPP)のセンサーです。その場合はセンサーから送られて来るデータを読み込むサーバーとして実装
|
11
|
+
チュートリアルとしてよく見るのはスマホ同士で片方をサーバー、片方をクライアントにして接続するものですが、今回接続したいのは画面の無いクラシックBluetooth(SPP)のセンサーです。その場合はセンサーから送られて来るデータを読み込むサーバーとして実装するのが正解でしょうか?
|
12
|
-
デバイス側の実装が公開されておらず、スマホからMacAddressとUUIDを指定して接続要求をすれば値が返って来るものなのかもよく分かっていませんが、PC向けの純正アプリでは接続されるのを確認しています。
|
12
|
+
Bluetoothデバイス側の実装が公開されておらず、スマホからMacAddressとUUIDを指定して接続要求をすれば値が返って来るものなのかもよく分かっていませんが、PC向けの純正アプリでは接続され、値が取得できるのを確認しています。
|
13
13
|
|
14
14
|
また、MVVM(っぽい)実装を目指していて、ViewにはUI、ViewModelでViewに表示する値の取得、ModelでAndroid固有機能を呼び出すインターフェースの定義、Androidプロジェクトでインターフェースに定義した機能を実装しています。
|
15
15
|
Android固有機能の呼び出しはインターフェースを介してDependencyService呼び出してます(この解釈で合ってるのか怪しいですが…)
|
16
|
-
この場合、接続要求を待つ別スレッドはVM
|
16
|
+
この場合、接続要求を待つ別スレッドはVMに書くのか、Android側に書くのとどちらが望ましいでしょうか?
|
17
17
|
|
18
18
|
### 該当のソースコード
|
19
19
|
こちらの動画を参考にしています→[Youtube](https://www.youtube.com/watch?v=dL_CQmmsKSQ)
|
20
|
-
close
|
20
|
+
close処理などは省略しています。
|
21
21
|
```Android
|
22
22
|
public class BluetoothManager : IBluetoothManager
|
23
23
|
{
|