Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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). Started with BluetoothChat example and have the embedded device paired with the phone. So far all seems to work fine, the devices get connected and data is passed from Android to embedded device. 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.

like image 631
zmashiah Avatar asked May 24 '12 06:05

zmashiah


People also ask

How do I make my Android phone automatically connect to Bluetooth?

Return to the Settings, search for Bluetooth auto-connect and enable it. Then swipe down from the status bar to open the notification panel and touch and hold the Bluetooth icon to enter the Bluetooth settings screen. Make sure the name of the car kit is in the list of Paired devices and tap on it to reconnect.

How do I stop my Bluetooth from automatically connecting to other devices?

To stop your device from automatically connecting to Bluetooth devices, you'll need to access the Bluetooth settings on your device and disable the “automatically connect” feature. Once this feature is disabled, your device will no longer automatically connect to any Bluetooth devices in range.

How do I stop my Android from automatically connecting to Bluetooth?

Go to Connected device > Connection preferences > Driving Mode. 2. Next, tap on Turn on automatically. Lastly, expand Advanced and disable the Turn on Bluetooth automatically option.


1 Answers

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. I followed the innstructions and the code example in: 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). In my Android code, the BluetoothSerialService (equivalent to the PhoneInfoServer example code) is stuck in the AcceptThread on: 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
  2. Android BluetoothSerialService AcceptThread code that listens to incoming connection
  3. logcat messages that show that the code is stuck waiting for incoming connection

In Google's BluetoothChat demo app there is an option to make the phone discoverable so that another phone can connect to it. 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. Does someone know of such an app?

Regards, Avner

  1. Arduino code that sets the connection mode to auto and initiates a connection with the Android phone

    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

    // ...
        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

        // ...
    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.

I discovered this by reseting the RN-42 BT to the factory defaults. Using the BlueTerm app I successfully connect from the Android phone to the RN-42 BT. When I perform an inquiry scan ($$$I\r) I get the mac address and the name of the LG phone. 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.

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)

// 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.
I have tried setting the BluetoothServerSocket to listen using listenUsingInsecureRfcommWithServiceRecord and listenUsingRfcommWithServiceRecord. I notice that there is a command createInsecureRfcommSocketToServiceRecord. Should I use it instead?

Any advice would be greatly appreciated.

Thanks, Avner

like image 83
Avi Avatar answered Oct 29 '22 01:10

Avi