Alex
Alex

Reputation: 472

Bluetooth LE: Send "Handle Value Notification" to device

I'm trying to reproduce an ATT packet being sent to a Bluetooth LE device already connected to a phone.

Is this even possible?

I've figured out how the packet should look like, I'm just not able to wrap my head around GATT and how it translates to ATT in this specific case.


The wireshark dump looks like this:

localhost ()    remote ()   ATT 26  Sent Handle Value Notification, Handle: 0x0035 (Unknown)

Bluetooth Attribute Protocol
  Opcode: Handle Value Notification (0x1b)
    0... .... = Authentication Signature: False
    .0.. .... = Command: False
    ..01 1011 = Method: Handle Value Notification (0x1b)
  Handle: 0x0035 (Unknown)
  Value: 0a0b313233343536373839303132

I've already figured out that the actual application payload here starts after the handle 0x0035, with 0x0a 0x0b being some custom control characters and everything afterwards a number (123456789012), exactly as I expected it to be.


How do I translate the "handle" to the GATT protocol? Is this done in Android GATT via UUIDs? If I loop over all services on that device a get a bunch of services, loads of characteristics, descriptors and I'm lost.

Oh, what I forgot to mention: None of the services and characteristics I get seem to be related to the handle 0x0035.

Is "getInstanceId" supposed to return the handle that will be used? Writing to writable characteristics on that device lead to Wireshark showing the handle value corresponding to the getInstanceId.

Upvotes: 0

Views: 2972

Answers (2)

FishingIsLife
FishingIsLife

Reputation: 2362

first thing you have to know is that in Android you can't use the Handles direktly as a developer. You have to deal with the UUIDs. in Wireshark when you have a look at the ATT Protocoll you should be able to see the UUID of the service and the characteristic when opening the Handle drop down. With this Information you should be able to detect the UUids you need.
https://developer.android.com/guide/topics/connectivity/bluetooth-le shows you how to send a value to a notification. In general you can use Constants for example to ebanle notifications. I guess if your server requires specific bytes you should be able to send them the same way.

Upvotes: 1

Alex
Alex

Reputation: 472

Well, after inspecting logs and docs a little more I came to the conclusion that the remote device (which should provide serivces) here is actually using a server on the local host and this is a value notification sent from the host to the remote.

Upvotes: 0

Related Questions