Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android communicating to HFP device via AT commands

im trying to control a bluetooth bracelet with vibration function via HFP (hands free profile) in Android. I've been able to connect to the bracelet and access the input- and outputstream.

My goal is to simulate an incoming call so that the bluetooth bracelet starts vibrating (which seems to be the only way to do that). To do this, im using AT commands. In the bluetooth specs at https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=238193 on page 22 you can see the handshake to establish service level connection. I need to establish this connection to use the "+CIEV" command (see handshake page 48).

But when my bracelet returns the command "AT+CIND=?" I dont know how to respond. I can't find any hints on how to answer with the "CIND:" command. Also I dont know how to send the acknowledgement (is it just "OK"?).

That might even be the completely wrong way to do this. Every suggestion is appreciated. I only found one post on stackoverflow that helped me in some way, rest of the posts I found were unanswered. By the way, im using a smartphone with Android 4.1.2. The bracelet supports HFP and HSP. Thanks in advance.

UPDATE 10/29/2014

Service Level Connection Procedure

===== Connection through RFCOMM Socket established at this point =====

        // read AT+BRSF=0 from device
        byte[] buffer = new byte[200];
        mBluetoothSocket.getInputStream().read(buffer);
        Log.d(TAG, new String(buffer).trim());

        //write answer BRSF: ...
        mBluetoothSocket.getOutputStream().write("+BRSF=20\r".getBytes());
        mBluetoothSocket.getOutputStream().write("OK\r".getBytes());

        // read AT+CIND=? command
        buffer = new byte[200];
        mBluetoothSocket.getInputStream().read(buffer);
        Log.d(TAG, new String(buffer).trim());

        //write answer CIND: ...
        mBluetoothSocket.getOutputStream().write("+CIND: (\"battchg\",(0-5)),(\"signal\",(0-5)),
           (\"service\",(0,1)),(\"call\",(0,1)),(\"callsetup\",(0-3)),
           (\"callheld\",(0-2)),(\"roam\",(0,1))".getBytes());
        mBluetoothSocket.getOutputStream().write("OK".getBytes());

        // read AT+CIND?
        buffer = new byte[200];
        mBluetoothSocket.getInputStream().read(buffer);
        Log.d(TAG, new String(buffer).trim());

Following the procedure of the protocol, I should receive the "AT+CIND?" command and then I could send the command "+CIND: 5,5,1,0,0,0,0", but...I dont receive the "AT+CIND?" command. Actually im not receiving anything. Am I missing something? Sending an "OK" doesnt change anything btw...

like image 205
V1nc3nt Avatar asked Sep 29 '22 15:09

V1nc3nt


1 Answers

I was fiddeling with exaclty the same problem. After days of trial and error, I finally got it to work. I think it depends on the speed at wich you answer the HF's commands, as well as on the correct line-endings ("COMMAND").

Here is my DroidScript which works. It's not cleaned up, but it works.

https://gist.github.com/t-oster/68a568ac4c4e133f67ac

like image 168
Thomas Oster Avatar answered Oct 10 '22 12:10

Thomas Oster