同様の構成があります (Android Galaxy S3 phone 4.0 と RN-42 BT が Arduino Uno に接続されています)。Android と Bluetooth をペアリングし、Android から RN-42 BT に接続できます (BlueTerm アプリを使用しています)。それをテストするために)しかし、RN-42 BT から Android フォンに接続できません。http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/の指示とコード例に従いました。
クライアントとして機能するように 42 BT をプログラムし、自動接続モード (SR,3) に設定しました。私の Android コードでは、BluetoothSerialService (PhoneInfoServer のサンプル コードに相当) が AcceptThread on: socket = mmServerSocket.accept(); でスタックしています。接続の問題に関連する次のコードを添付します。
- 接続モードを自動に設定し、Android フォンとの接続を開始する Arduino コード
- 着信接続をリッスンする Android BluetoothSerialService AcceptThread コード
- 着信接続の待機中にコードがスタックしていることを示す logcat メッセージ
Google の BluetoothChat デモ アプリには、電話を検出可能にして別の電話を接続できるようにするオプションがあります。Bluetoothシリアル接続に似たものを探しています。Bluetooth シリアル デバイスからの着信接続要求のリッスンをテストするアプリを Google Play で探しましたが、そのようなアプリは見つかりませんでした。誰かそんなアプリ知ってる?
よろしく、アヴナー
接続モードを自動に設定し、Android フォンとの接続を開始する Arduino コード
void setup() {
Serial.begin(115200);
Serial.println("BEG setup");
static const char *initString0 = "$$$SR,04FE3144A0A4\r";
// R,1 Forces a complete reboot of the device (similar to a power cycle).
static const char initString1a[] = "$$$";
static const char initString1b[] = "R,1\r";
// auto
static const char initString2a[] = "$$$";
static const char initString2b[] = "SM,3\rSO,Z\r---\r";
static const char *initVector[] = { initString0, initString1a, initString1b, initString2a, initString2b, NULL };
int i;
for (i=0; initVector[i] != NULL; i++) {
Serial.print(initVector[i]);
delay(500);
}
Serial.println("Setup completed");
}
着信接続をリッスンするAndroidBluetoothSerialService AcceptThread
コード
// ...
private class AcceptThread extends Thread
{
// The local server socket
static private final String TAG = "BluetoothSerialServiceAcceptThread";
private final BluetoothServerSocket mmServerSocket;
private String mSocketType;
/** Creates an thread for accepting incoming Bluetooth connections
* @param secure Currently ignored, but suppose to represent the mode of socket.
* All communication is currently done over insecure socket
*/
public AcceptThread(boolean secure) {
Log.i(TAG, "BEG AcceptThread::AcceptThread");
BluetoothServerSocket tmp = null;
mSocketType = secure ? "Secure":"Insecure";
// Create a new listening server socket
try {
Log.i(TAG, "AcceptThread constructor trying to create listening socket");
if (!secure) {
// This is for Android 2.2
// tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_INSECURE, BT_SPP_UUID);
// This is for Android 2.3 but testing the above on 2.3 device showed it to be working.
tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, BT_SPP_UUID);
}
Log.d(TAG, "AcceptThread: Listening BT Socket " + mSocketType + " created");
}
catch (IOException e)
{
Log.e(TAG, "AcceptThread: Listening BT Socket Type: " + mSocketType + " listen() failed " + e.getMessage());
acceptProblem();
}
mmServerSocket = tmp;
Log.d(TAG, "mmServerSocket: " + mmServerSocket);
} // public AcceptThread
public void run() {
Log.i(TAG, "BEG BluetoothSerialService::run");
if (mmServerSocket == null)
{
Log.e(TAG, "AcceptThread.run: No server socket");
return;
}
Log.d(TAG, "AcceptThread.run: socket type:" + mSocketType);
setName("AcceptThread" + mSocketType);
BluetoothSocket socket = null;
Log.i(TAG, "mState: " + mState);
// Listen to the server socket if we're not connected
while (mState != STATE_CONNECTED)
{
Log.i(TAG, "socket before mmServerSocket.accept(): " + socket);
try
{
// This is a blocking call and will only return on a
// successful connection or an exception
socket = mmServerSocket.accept();
Log.d(TAG, "AcceptThread.run: returned from accept");
}
catch (IOException e)
{
Log.e(TAG, "AcceptThread.run: Socket Type: " + mSocketType + "accept() failed " + e.getMessage());
break;
}
Log.i(TAG, "socket after mmServerSocket.accept(): " + socket);
//...
着信接続の待機中にコードがスタックしていることを示す logcat メッセージ
// ...
12-09 01:04:38.765: I/BluetoothSerialServiceAcceptThread(16175): BEG AcceptThread::AcceptThread
12-09 01:04:38.765: I/BluetoothSerialServiceAcceptThread(16175): AcceptThread constructor trying to create listening socket
12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): initSocketNative
12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): ...fd 49 created (RFCOMM, lm = 0)
12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): initSocketFromFdNative
12-09 01:04:38.775: D/BluetoothUtils(16175): isSocketAllowedBySecurityPolicy start : device null
12-09 01:04:38.775: V/BluetoothSocket.cpp(16175): bindListenNative
12-09 01:04:38.775: V/BluetoothSocket.cpp(16175): ...bindListenNative(49) success
12-09 01:04:38.785: D/BluetoothSerialServiceAcceptThread(16175): AcceptThread: Listening BT Socket Insecure created
12-09 01:04:38.785: D/BluetoothSerialServiceAcceptThread(16175): mmServerSocket: android.bluetooth.BluetoothServerSocket@41af72c8
12-09 01:04:38.785: D/BluetoothReadService(16175): END start
12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): BEG BluetoothSerialService::run
12-09 01:04:38.795: D/BluetoothSerialServiceAcceptThread(16175): AcceptThread.run: socket type:Insecure
12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): mState: 1
12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): socket before mmServerSocket.accept(): null
12-09 01:04:38.795: V/BluetoothSocket.cpp(16175): acceptNative
12-09 01:04:38.855: I/MainActivity(16175): mBtStatus: android.widget.ImageView@41adc698
12-09 01:04:38.855: I/MainActivity(16175): In case: BluetoothSerialService.STATE_LISTEN
12-09 01:04:38.855: D/MainActivity(16175): Beg onCreateOptionsMenu
12-09 01:04:38.885: D/memalloc(16175): ion: Mapped buffer base:0x5d760000 size:3768320 offset:0 fd:57
12-09 01:04:38.925: D/CLIPBOARD(16175): Hide Clipboard dialog at Starting input: finished by someone else... !
// ...
さらに、RN-42 BT が自動接続モードになっていることを発見しましたが、家にある別の非 Android LG 電話に接続しようとしています。
RN-42 BT を工場出荷時のデフォルトにリセットして、これを発見しました。BlueTerm アプリを使用して、Android フォンから RN-42 BT に正常に接続しました。照会スキャン ($$$I\r) を実行すると、MAC アドレスと LG 電話の名前が取得されます。この電話には別の MAC アドレス (0026e25d8a91) を持つ Bluetooth があります - RN-42 BT がこのデバイスに接続しようとする原因がわかりません。
これは、自動接続モードは機能しますが、接続が間違った電話に向けられることを意味します。次のコマンドを使用してAndroidフォンのMACアドレスを指定しているため、困惑しています(コマンド間に遅延があります)
// The mac address of the android phone
$$$SR,04FE3144A0A4\r
// Force a complete reboot of the device (similar to a power cycle).
$$$R,1\r
// SM,3 - mode=auto
// SO,Z - Extended Status String, Setting this string enables status messages to be sent to the local serial port.
// --- - exit command mode (three minus signs).
$$$SM,3\rSO,Z\r---\r
私は今、RN-42 BT からの接続開始は問題ないと考えていますが、Android コードの BluetoothServerSocket が正しく設定されていません。
listenUsingInsecureRfcommWithServiceRecord と listenUsingRfcommWithServiceRecord を使用して、BluetoothServerSocket をリッスンするように設定しようとしました。コマンド createInsecureRfcommSocketToServiceRecord があることに気付きました。代わりに使用する必要がありますか?
アドバイスをいただければ幸いです。
ありがとう、アヴナー