teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

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

2018/09/11 01:04

投稿

naritamago
naritamago

スコア15

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

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

2018/09/11 01:04

投稿

naritamago
naritamago

スコア15

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
  {