简体   繁体   English

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

[英]Auto connecting to Paired Bluetooth devices on Android

I want to connect my Android Phone (2.3.6 Samsung Note) to an embedded Bluetooth device (RN-42 BT UART module on Arduino). 我想将我的Android手机(2.3.6 Samsung Note)连接到嵌入式蓝牙设备(Arduino上的RN-42 BT UART模块)。 Started with BluetoothChat example and have the embedded device paired with the phone. 开始使用BluetoothChat示例,并将嵌入式设备与手机配对。 So far all seems to work fine, the devices get connected and data is passed from Android to embedded device. 到目前为止,所有设备似乎工作正常,设备连接,数据从Android传递到嵌入式设备。 What I am still missing is to make the devices connect automatically once the two are in range. 我仍然缺少的是让设备在两个范围内自动连接。

Using the debugger I see the embedded device is "Host" or in it's term "Slave" and the Android being a client, as the Android issuing a connect request. 使用调试器我看到嵌入式设备是“主机”或其中的术语“从属”,Android是客户端,因为Android发出连接请求。

I have a similar configuration (Android Galaxy S3 phone 4.0 and RN-42 BT connected to Arduino Uno) I am able to pair the Android and the bluetooth and to connect from the Android to the RN-42 BT (I am using the BlueTerm app to test that) However, I'm unable to connect from the RN-42 BT to the Android phone. 我有一个类似的配置(Android Galaxy S3手机4.0和RN-42 BT连接到Arduino Uno)我能够配对Android和蓝牙,并从Android连接到RN-42 BT(我正在使用BlueTerm应用程序)测试一下)但是,我无法从RN-42 BT连接到Android手机。 I followed the innstructions and the code example in: http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/ 我按照以下内容中的说明和代码示例进行了操作: http//www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/

I programmed the 42 BT to serve as a client and set it to Auto connect mode (SR,3). 我将42 BT编程为客户端并将其设置为自动连接模式(SR,3)。 In my Android code, the BluetoothSerialService (equivalent to the PhoneInfoServer example code) is stuck in the AcceptThread on: socket = mmServerSocket.accept(); 在我的Android代码中,BluetoothSerialService(相当于PhoneInfoServer示例代码)卡在AcceptThread上:socket = mmServerSocket.accept(); I'm attaching the following pieces of codes that are related to the connection problem: 我附加了以下与连接问题相关的代码:

  1. Arduino code that sets the connection mode to auto and initiates a connection with the Android phone Arduino代码,用于将连接模式设置为auto并启动与Android手机的连接
  2. Android BluetoothSerialService AcceptThread code that listens to incoming connection Android BluetoothSerialService AcceptThread代码,用于侦听传入连接
  3. logcat messages that show that the code is stuck waiting for incoming connection logcat消息,显示代码卡在等待传入连接

In Google's BluetoothChat demo app there is an option to make the phone discoverable so that another phone can connect to it. 在Google的BluetoothChat演示应用程序中,有一个选项可以让手机被发现,以便另一部手机可以连接到它。 I am looking for something similar for bluetooth serial connection. 我正在寻找类似的蓝牙串行连接。 I looked for an app on Google Play that will test listenning to an incoming connection request from a bluetooth serial device, but didn't find such an app. 我在Google Play上搜索了一个应用程序,该应用程序将测试从蓝牙串行设备收听传入的连接请求,但没有找到这样的应用程序。 Does someone know of such an app? 有人知道这样的应用程序吗?

Regards, Avner 此致,Avner

  1. Arduino code that sets the connection mode to auto and initiates a connection with the Android phone Arduino代码,用于将连接模式设置为auto并启动与Android手机的连接

     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 code that listens to incoming connection 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 messages that show that the code is stuck waiting for incoming connection 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... ! // ... 

I further discovered that the RN-42 BT is getting into auto-connect mode but tries to connect to another non-android LG phone at the house. 我进一步发现RN-42 BT正在进入自动连接模式,但试图连接到家里的另一台非Android手机。

I discovered this by reseting the RN-42 BT to the factory defaults. 我通过将RN-42 BT重置为出厂默认值来发现这一点。 Using the BlueTerm app I successfully connect from the Android phone to the RN-42 BT. 使用BlueTerm应用程序,我成功地从Android手机连接到RN-42 BT。 When I perform an inquiry scan ($$$I\\r) I get the mac address and the name of the LG phone. 当我执行查询扫描($$$ I \\ r)时,我得到了mac手机的地址和名称。 This phone has a bluetooth with a different mac address (0026e25d8a91) - I don't know what causes the RN-42 BT to try and connect with this device. 这款手机有一个蓝牙与不同的mac地址(0026e25d8a91) - 我不知道是什么原因导致RN-42 BT尝试连接此设备。

This means that the auto connect mode does work but the connection is directed to the wrong phone. 这意味着自动连接模式可以正常工作,但连接是针对错误的手机。 I'm pazzled because I'm specifying the mac address of the Android phone using the following commands (with delays between them) 我很困惑,因为我使用以下命令指定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

I am now thinking that the connection initiation from the RN-42 BT is Ok but that the BluetoothServerSocket on the android code is not set up properly. 我现在认为从RN-42 BT启动连接是好的,但是android代码上的BluetoothServerSocket没有正确设置。
I have tried setting the BluetoothServerSocket to listen using listenUsingInsecureRfcommWithServiceRecord and listenUsingRfcommWithServiceRecord. 我已经尝试将BluetoothServerSocket设置为使用listenUsingInsecureRfcommWithServiceRecord和listenUsingRfcommWithServiceRecord进行侦听。 I notice that there is a command createInsecureRfcommSocketToServiceRecord. 我注意到有一个命令createInsecureRfcommSocketToServiceRecord。 Should I use it instead? 我应该使用它吗?

Any advice would be greatly appreciated. 任何建议将不胜感激。

Thanks, Avner 谢谢,Avner

So I figured out the "trick". 所以我想出了“技巧”。 First the mobile phone is set to only Accept connections and the embedded device which has line power to auto-connect. 首先,移动电话设置为仅接受连接和具有线路电源以自动连接的嵌入式设备。 The change was to set the embedded device from "Host" mode to "Client" mode with auto-connect. 更改是使用自动连接将嵌入式设备从“主机”模式设置为“客户端”模式。

Next obstacle was the Android had to have the Accept code in a service otherwise that connection would only work if the application was made active. 下一个障碍是Android必须在服务中使用Accept代码,否则该连接仅在应用程序处于活动状态时才有效。 With putting the Accept piece of code into a service the application can be non-active and the embedded accessory would auto connect. 通过将Accept代码片段放入服务中,应用程序可以是非活动的,并且嵌入式附件将自动连接。 Code will be shared in Instructable: enter link description here 代码将在Instructable中共享: 在此处输入链接描述

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

It includes not only the code but also explanation on how it works and assembly description. 它不仅包括代码,还包括有关其工作原理和装配描述的说明。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM