自动连接到Android上的配对蓝牙设备

时间:2012-05-24 06:27:21

标签: android bluetooth

我想将我的Android手机(2.3.6 Samsung Note)连接到嵌入式蓝牙设备(Arduino上的RN-42 BT UART模块)。开始使用BluetoothChat示例,并将嵌入式设备与手机配对。到目前为止,所有设备似乎工作正常,设备连接,数据从Android传递到嵌入式设备。我仍然缺少的是一旦两个设备在范围内,设备就会自动连接。

使用调试器我看到嵌入式设备是“主机”或其中的术语“从属”而Android是客户端,因为Android发出连接请求。

3 个答案:

答案 0 :(得分:3)

我有类似的配置(Android Galaxy S3手机4.0和RN-42 BT连接到Arduino Uno) 我可以配对Android和蓝牙,并从Android连接到RN-42 BT  (我正在使用BlueTerm应用程序来测试它) 但是,我无法从RN-42 BT连接到Android手机。 我按照http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/

中的innstructions和代码示例进行了操作

我将42 BT编程为客户端并将其设置为自动连接模式(SR,3)。 在我的Android代码中,BluetoothSerialService(相当于PhoneInfoServer示例代码)卡在AcceptThread上:socket = mmServerSocket.accept(); 我附上了以下与连接问题相关的代码:

  1. Arduino代码,用于将连接模式设置为auto并启动 与Android手机的连接
  2. 侦听传入的Android BluetoothSerialService AcceptThread代码 连接
  3. 显示代码等待的logcat消息 传入连接
  4. 在Google的BluetoothChat演示应用程序中,有一个选项可以让手机被发现,以便另一部手机可以连接到它。 我正在寻找类似的蓝牙串行连接。我在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. 侦听传入连接的Android BluetoothSerialService 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... !
      // ...
      
    4. 我进一步发现RN-42 BT正在进入自动连接模式,但试图连接到家里的另一台非Android手机。

      我通过将RN-42 BT重置为出厂默认值来发现这一点。 使用BlueTerm应用程序,我成功地从Android手机连接到RN-42 BT。 当我执行查询扫描($$$ I \ r)时,我得到了mac手机的地址和名称。 这款手机有一个蓝牙,有不同的mac地址(0026e25d8a91) - 我不知道是什么原因导致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的连接启动正常,但安卓代码上的BluetoothServerSocket没有正确设置。
      我已经尝试将BluetoothServerSocket设置为使用listenUsingInsecureRfcommWithServiceRecord和listenUsingRfcommWithServiceRecord进行侦听。 我注意到有一个命令createInsecureRfcommSocketToServiceRecord。我应该使用它吗?

      非常感谢任何建议。

      谢谢, 阿夫纳

答案 1 :(得分:0)

所以我想出了“诡计”。首先,移动电话设置为仅接受连接和具有线路电源以自动连接的嵌入式设备。更改是使用自动连接将嵌入式设备从“主机”模式设置为“客户端”模式。

下一个障碍是Android必须在服务中使用Accept代码,否则该连接仅在应用程序处于活动状态时才有效。通过将Accept代码片段放入服务中,应用程序可以是非活动的,并且嵌入式附件将自动连接。代码将在Instructable中共享:enter link description here

答案 2 :(得分:0)

完整的代码和说明: http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/

它不仅包括代码,还包括有关其工作原理和装配描述的说明。