21
votes

I'm trying to implement an Android application to receive data from a medical device but I can't get through the discovery process and get the phone and the device paired or connected to each other.

Describing the medical device: The device is using Service Discovery Protocol (SDP) and Serial Port Profile (SPP). It starts an inquiry procedure to discover (up to 10) surrounding access points with matched COD Filter and Service Name. Then it sequentially establishes a connection (using Page Procedure) with the access point by checking the PIN. Once the PIN is matched, the data is uploaded. Upon uploading data the device waits for an acknowledge. The decice is the master and initiates the communication.

I have no control of the medical device. All I can do is to start it and await the procedure described above (after a measurement).

The Android application: I've started out from the Bluetooth Chat Example on the developer pages. So far I've replaced the UUID with the 00001101-0000-1000-8000-00805f9b34fb to use SPP and set the Service Name to the appropriate name. I can confirm this seems correct through inspection of the service from a computer. Since the medical device is the one that inquirys and initiates the communication my service is using a BluetoothServerSocket and the accept() method to start listening for it.

  1. In the developer pages I've read that UUID must match between the applications trying to communicate. Since I can't set any UUID for the medical device I'm wondering if this is going to be a problem or if it is enough that the medical device is using the SP Profile?

  2. If the Service Name and UUID are correct and the medical device would actually try to connect to my Bluetooth service which is listening for connections, would the Android system prompt me to input the PIN manually to be able to pair the devices (since the medical device has a pre-set PIN)?

  3. I haven't found anything in the Android SDK API that lets me set a PIN for my Bluetooth service (in case this is where it fails), is this possible?

I've read that normally the PIN is generated by the system nowadays and a user confirmation is the only thing needed. I guess not in my system, since the device is a bit older.

I would be greatful if you would like to share some knowledge, hints, guesses of anything related to what I've described above!

Thanks in advance, Fredrik


EDIT:

Now I've got the device paired with a bluegiga box and they communicate correctly. Now I'm searching for the criterias to fulfil for the blood pressure device to connect to my phone. I can inspect, from a Linux computer (sdptool search SP in a terminal), the Bluetooth service provided by the bluegiga and compare this to the Bluetooth service I provide on the Android. These values are what I get:

~$ sdptool search SP

Inquiring ...

Searching for SP on 8C:71:F8:E5:XX:XX . . .

Service Name: 1808130054

Service RecHandle: 0x10003

Service Class ID List:

UUID 128: 00001101-0000-1000-8000-00805f9b34fb

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 13

´

Seaching for SP on 00:07:80:88:XX:XX . . .

Service Name: 1808130054

Service Description: 1808130054

Service RecHandle: 0x10005

Service Class ID List:

"Serial Port" (0x1101)

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 12

Language Base Attr List:

code_ISO639: 0x656e

enconding: 0x6a

base_offset: 0x100

The first device found is the phone (mac=8C:71...Google Nexus S) and the second (mac=00:07...) is the bluegiga. I notice that there is no Service Description on the Android device. I think the most important difference is in the Service Class ID List. UUID 128 on the Android but a totally different format describing this on the bluegiga.

  1. Is it possible to implement using Service Class IDs with other format than UUID on Android?

  2. Can you manipulate the Service Record registered in the service discovery DB?

  3. Would it be possible to somehow implement towards the BlueZ directly, using native development c/c++?

/Fredrik

1
To those last three questions I guess the answer is no - no - no..?Fredricus
Android always will register the 128 bit UUID for applications. But as long as the upper part of the UUID is the same i.e "0x1101" the medical device should query down convert and find the service with the UUID "0x1101" that it should recognize. Is it possible for you to log the activity on the phone and check if the medical device is querying and able to connect to the phone ?Dennis Mathews
Yes, I've used the LogCat all the time to monitor the testing sessions. I have finally got connection between the device and my Android phone. In the pairing procedure I had to type the PIN manually very quickly before running out of time. I failed a couple of times before I finally made it. The pairing was successful and I received the expected package of data. Very nice. As you said it recognized the UUID anyway and that was very important! I have not tried it much more than that yet (it was the end of the working day). I'm going to continue the work now.Fredricus
Since I could not monitor anything of what was going on in the medical device from the beginning the main key to the solution was to actually pair it with the bluegiga and inspect the values of its service and then again try to pair it with the phone. Hopefully this will work for the rest of the development of the application. The medical device is a mean one. Now the next step will be to handle the connection and the data packages correctly. Thank you very very much for your assistance in this issue, Dennis Mathews!Fredricus
@Fredricus: i am creating similiar thing but my accept() is not detecting any incoming connection.I have two doubt: 1.When we got pairing request from client ,then it will affect in code for example when we debug.Because when i debug code is not called of accept. 2:can we make connection with diffrent UUID?Tofeeq Ahmad

1 Answers

7
votes

If you can provide the name / link to the medical device (if it is a commercial device) it might help to read up its guide to guess more on what might be going on. Here are a few suggestions :

  1. In addition to the Serial Port UUID , each service over the SPP can have a custom specific UUID - example the medical device could look for the service with which it is compatible using this custom-specific UUID.
    If the medical device currently connects to a PC or some other access point successfully and transfers data , the you could try read the SDP record of that device and determine what specific UUID in addition to the SPP UUID is in use if any, and use the same in your application also.

  2. If the medical device is not able to find your phone / application it could be because it is not discoverable. Android device by default is not discoverable even when you are a server, it will be only connectable and not discoverable, you can try to make it discoverable programetically or through the settings and see if the medical device can find your device. See here - Enabling Discoverability in Android

  3. For PIN pairing , The android device should start the pairing process when a non paired device tries to connect to it, you can try it after getting through the recommendations (1) and (2), PIN pairing is used if one of the devices are prior to version Bluetooth 2.1 , Even with newer devices a 6-digit passkey with some user intervention / confirmation will be required at the phone to allow for the pairing (its is just a good security policy to not allow this to just happen automatically without user intervention) , hopefully pairing will only be require the first time a connection happens, later it will not require any user intervention for subsequent connections.