質問編集履歴

2

エラーが発生する箇所を追記

2018/09/11 01:04

投稿

naritamago
naritamago

スコア15

test CHANGED
File without changes
test CHANGED
@@ -241,3 +241,77 @@
241
241
 
242
242
 
243
243
  スレッドの理解が及ばないまま`mSocket = mServerSocket.Accept();`を動かそうとしていましたが、ドキュメントを読むとAccept()は別スレッドでコールバックを受け付けないといけないとのことで、挫折しました。
244
+
245
+
246
+
247
+
248
+
249
+ ### 追記(9/11)
250
+
251
+ f-miyuさんのご回答を参考に動かしてみましたが、機器の接続のところでIOExceptionが発生(Connect()メソッドがタイムアウトする)し、スレッドに関する動きを確認できていません。
252
+
253
+ ソース全体は[github](https://github.com/johta/XF-BT)にあげています。問題が発生しているのは以下のメソッドです。
254
+
255
+ ```BluetoothManager
256
+
257
+ private void openDeviceConnection(BluetoothDevice btDevice)
258
+
259
+ {
260
+
261
+ try
262
+
263
+ {
264
+
265
+ mSocket = btDevice.CreateRfcommSocketToServiceRecord(getUUIDFromString());
266
+
267
+ System.Console.WriteLine("#debug get socket [{0}]", btDevice.Name);
268
+
269
+ mSocket.Connect();
270
+
271
+ System.Console.WriteLine("#debug connect[{0}]", btDevice.Name);
272
+
273
+ //input stream
274
+
275
+ mStream = mSocket.InputStream;
276
+
277
+ System.Console.WriteLine("#debug open InputStream [{0}]", btDevice.Name);
278
+
279
+ mReader = new InputStreamReader(mStream);
280
+
281
+ System.Console.WriteLine("#debug get StreamReader [{0}]", btDevice.Name);
282
+
283
+ reader = new BufferedReader(mReader);
284
+
285
+ System.Console.WriteLine("#debug get get BufferedReader [{0}]", btDevice.Name);
286
+
287
+ }
288
+
289
+ catch(IOException e)
290
+
291
+ {
292
+
293
+ close(mSocket);
294
+
295
+ close(mStream);
296
+
297
+ close(mReader);
298
+
299
+ e.PrintStackTrace();
300
+
301
+ throw e;
302
+
303
+ }
304
+
305
+ }
306
+
307
+ ```
308
+
309
+ `btDevice`はペアリング済みデバイスの情報が格納されています。
310
+
311
+
312
+
313
+ `CreateRfcommSocketToServiceRecored()`の引数として読んでいる`getUUIDFromStrng()`は、String型のローカル変数で定義しているUUIDをUUID型に変換して渡しているだけです。
314
+
315
+
316
+
317
+ 9行目の`Connect()`メソッドがタイムアウトし、IOExceptionが帰ってきてしまいます。

1

タイトル・読みにくい箇所の修正

2018/09/11 01:04

投稿

naritamago
naritamago

スコア15

test CHANGED
@@ -1 +1 @@
1
- 【Xamarin.Forms】Bluetoothの実装がわからない
1
+ 【Xamarin.Forms】AndroidにおけるBluetoothの実装(主にスレッド)
test CHANGED
@@ -18,9 +18,9 @@
18
18
 
19
19
 
20
20
 
21
- チュートリアルとしてよく見るのはスマホ同士で片方をサーバー、片方をクライアントにして接続するものですが、今回接続したいのは画面の無いクラシックBluetooth(SPP)のセンサーです。その場合はセンサーから送られて来るデータを読み込むサーバーとして実装し、接続要求を待ちうけるのが正解でしょうか?
21
+ チュートリアルとしてよく見るのはスマホ同士で片方をサーバー、片方をクライアントにして接続するものですが、今回接続したいのは画面の無いクラシックBluetooth(SPP)のセンサーです。その場合はセンサーから送られて来るデータを読み込むサーバーとして実装るのが正解でしょうか?
22
-
22
+
23
- デバイス側の実装が公開されておらず、スマホからMacAddressとUUIDを指定して接続要求をすれば値が返って来るものなのかもよく分かっていませんが、PC向けの純正アプリでは接続されるのを確認しています。
23
+ Bluetoothデバイス側の実装が公開されておらず、スマホからMacAddressとUUIDを指定して接続要求をすれば値が返って来るものなのかもよく分かっていませんが、PC向けの純正アプリでは接続され、値が取得できるのを確認しています。
24
24
 
25
25
 
26
26
 
@@ -28,7 +28,7 @@
28
28
 
29
29
  Android固有機能の呼び出しはインターフェースを介してDependencyService呼び出してます(この解釈で合ってるのか怪しいですが…)
30
30
 
31
- この場合、接続要求を待つ別スレッドはVMで実装すれば良でしょうか?
31
+ この場合、接続要求を待つ別スレッドはVMに書くのか、Android側に書くのとどちらが望ましいでしょうか?
32
32
 
33
33
 
34
34
 
@@ -36,7 +36,7 @@
36
36
 
37
37
  こちらの動画を参考にしています→[Youtube](https://www.youtube.com/watch?v=dL_CQmmsKSQ)
38
38
 
39
- close()処理などは省略しています。
39
+ close処理などは省略しています。
40
40
 
41
41
  ```Android
42
42