6

Android Phone (2.3.6 Samsung Note) を組み込みの Bluetooth デバイス (Arduino の RN-42 BT UART モジュール) に接続したいと考えています。BluetoothChat の例から始めて、組み込みデバイスを電話とペアリングします。これまでのところ、すべて正常に動作しているように見えます。デバイスが接続され、データが Android から組み込みデバイスに渡されます。私がまだ欠けているのは、2 つのデバイスが範囲内にあるときにデバイスを自動的に接続することです。

デバッガーを使用すると、組み込みデバイスが「ホスト」または「スレーブ」という用語であり、Android が接続要求を発行しているため、Android がクライアントであることがわかります。

4

3 に答える 3

3

同様の構成があります (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(); でスタックしています。接続の問題に関連する次のコードを添付します。

  1. 接続モードを自動に設定し、Android フォンとの接続を開始する Arduino コード
  2. 着信接続をリッスンする Android BluetoothSerialService AcceptThread コード
  3. 着信接続の待機中にコードがスタックしていることを示す logcat メッセージ

Google の BluetoothChat デモ アプリには、電話を検出可能にして別の電話を接続できるようにするオプションがあります。Bluetoothシリアル接続に似たものを探しています。Bluetooth シリアル デバイスからの着信接続要求のリッスンをテストするアプリを Google Play で探しましたが、そのようなアプリは見つかりませんでした。誰かそんなアプリ知ってる?

よろしく、アヴナー

  1. 接続モードを自動に設定し、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");        
    }
    
  2. 着信接続をリッスンする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);
    //...
    
  3. 着信接続の待機中にコードがスタックしていることを示す 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 があることに気付きました。代わりに使用する必要がありますか?

アドバイスをいただければ幸いです。

ありがとう、アヴナー

于 2012-12-10T00:31:36.303 に答える
0

完全なコードと手順: http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/

コードだけでなく、動作の説明やアセンブリの説明も含まれています。

于 2012-06-07T07:52:58.793 に答える