And we continue digging into the WeDo 2.0 Hub primary services, now with the “Nordic LED Button Service”
[A0:E6:F8:1E:58:57][LE]> primary ... attr handle: 0x000c, end grp handle: 0x002f uuid: 00001523-1212-efde-1523-785feabcd123 ...
So this Primary service uses handles from 0x000c to 0x002f. Let’s look deeper:
[A0:E6:F8:1E:58:57][LE]> characteristics 000c 002f handle: 0x000d, char properties: 0x0a, char value handle: 0x000e, uuid: 00001524-1212-efde-1523-785feabcd123 handle: 0x0010, char properties: 0x12, char value handle: 0x0011, uuid: 00001526-1212-efde-1523-785feabcd123 handle: 0x0014, char properties: 0x10, char value handle: 0x0015, uuid: 00001527-1212-efde-1523-785feabcd123 handle: 0x0018, char properties: 0x12, char value handle: 0x0019, uuid: 00001528-1212-efde-1523-785feabcd123 handle: 0x001c, char properties: 0x12, char value handle: 0x001d, uuid: 00001529-1212-efde-1523-785feabcd123 handle: 0x0020, char properties: 0x12, char value handle: 0x0021, uuid: 0000152a-1212-efde-1523-785feabcd123 handle: 0x0024, char properties: 0x08, char value handle: 0x0025, uuid: 0000152b-1212-efde-1523-785feabcd123 handle: 0x0027, char properties: 0x0a, char value handle: 0x0028, uuid: 0000152c-1212-efde-1523-785feabcd123 handle: 0x002a, char properties: 0x02, char value handle: 0x002b, uuid: 0000152d-1212-efde-1523-785feabcd123 handle: 0x002d, char properties: 0x08, char value handle: 0x002e, uuid: 0000152e-1212-efde-1523-785feabcd123 [A0:E6:F8:1E:58:57][LE]> char-desc 000c 002f handle: 0x000c, uuid: 00002800-0000-1000-8000-00805f9b34fb handle: 0x000d, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x000e, uuid: 00001524-1212-efde-1523-785feabcd123 handle: 0x000f, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x0010, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0011, uuid: 00001526-1212-efde-1523-785feabcd123 handle: 0x0012, uuid: 00002902-0000-1000-8000-00805f9b34fb handle: 0x0013, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x0014, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0015, uuid: 00001527-1212-efde-1523-785feabcd123 handle: 0x0016, uuid: 00002902-0000-1000-8000-00805f9b34fb handle: 0x0017, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x0018, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0019, uuid: 00001528-1212-efde-1523-785feabcd123 handle: 0x001a, uuid: 00002902-0000-1000-8000-00805f9b34fb handle: 0x001b, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x001c, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x001d, uuid: 00001529-1212-efde-1523-785feabcd123 handle: 0x001e, uuid: 00002902-0000-1000-8000-00805f9b34fb handle: 0x001f, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x0020, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0021, uuid: 0000152a-1212-efde-1523-785feabcd123 handle: 0x0022, uuid: 00002902-0000-1000-8000-00805f9b34fb handle: 0x0023, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x0024, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0025, uuid: 0000152b-1212-efde-1523-785feabcd123 handle: 0x0026, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x0027, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x0028, uuid: 0000152c-1212-efde-1523-785feabcd123 handle: 0x0029, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x002a, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x002b, uuid: 0000152d-1212-efde-1523-785feabcd123 handle: 0x002c, uuid: 00002901-0000-1000-8000-00805f9b34fb handle: 0x002d, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x002e, uuid: 0000152e-1212-efde-1523-785feabcd123 handle: 0x002f, uuid: 00002901-0000-1000-8000-00805f9b34fb
Lot of things here: 10 characteristics and 36 handles!
The first handle (0x000c) just marks the begin of the service (UUID 2800).
Then we see that there are 10 handles with UUID 2803 (Characteristic Declaration Attribute) and also 10 handles with UUID 2901 (Characteristic User Description) – these handles mark the begin of each characteristic and also defines its properties, so let’s read them all (char-read-hnd) and translate it:
Name Char 0x000e read+write Button Char 0x0011 notify+read Port Type Char 0x0015 notify Low Voltage alert 0x0019 notify+read High Current alert 0x001d notify+read Low Signal alert 0x0021 notify+read Turn off device 0x0025 write Vcc port control 0x0028 read+write Battery type Indicator 0x002b read Disconnect Char 0x002e write
Some characteristics also have an handle with UUID 2902 (Client Characteristic Configuration). That’s used for Notifications – the 5 characteristics that support this feature use this extra handle to activate or deactivate it.
So let’s read the 7 handles that are readable:
Name Char 75 30 30 30 31 = u0001 Button Char 00 Low Voltage alert 00 High Current alert 00 Low Signal alert 00 Vcc port control 01 Battery type Indicator 00
So ‘Name char’ contains the friendly name of my Hub. And it is writable, so what happens if I change it?
[A0:E6:F8:1E:58:57][LE]> char-write-cmd 0x000e 4d616a6f72 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 0x00e Characteristic value/descriptor: 4d 61 6a 6f 72
Well it retains what I wrote.
And if I now read the ‘Device Name’ it is no longer ‘u0001’:
[A0:E6:F8:1E:58:57][LE]> char-read-uuid 0x2A00 handle: 0x0003 value: 4d 61 6a 6f 72
So now my Hub announces a new name:
$ sudo hcitool -i hci0 lescan LE Scan ... A0:E6:F8:1E:58:57 (unknown) A0:E6:F8:1E:58:57 Major
Cool, isn’t it?
Now the ‘Button Char’ just reads zero. But if I press the Hub’s button while I read it:
[A0:E6:F8:1E:58:57][LE]> char-read-hnd 0011 Characteristic value/descriptor: 01
it reads ‘1’.
And what about ‘Port Type Char’? It’s not defined as readable (just ‘notify’) but I can try to read it anyway:
[A0:E6:F8:1E:58:57][LE]> char-read-hnd 0015 Characteristic value/descriptor:
Hmm… null value.
But I have nothing connected to the Hub. Let’s try it again with a motor at port 1:
[A0:E6:F8:1E:58:57][LE]> char-read-hnd 0015 Characteristic value/descriptor: 01 01 00 01 01 00 00 00 01 00 00 00
And removing the motor again:
[A0:E6:F8:1E:58:57][LE]> char-read-hnd 0015 Characteristic value/descriptor: 01 00
Interesting – it’s not null now.
Let’s do the same again but on port 2:
[A0:E6:F8:1E:58:57][LE]> char-read-hnd 0015 Characteristic value/descriptor: 02 01 01 01 01 00 00 00 01 00 00 00 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 0015 Characteristic value/descriptor: 02 00
So the first byte seems to identify the Port (’01’ or ’02’) and the second byte the action (’01’ might be ‘device plugged’ and ’00’ might be ‘device removed’). I have no explanation for the third byte and the other 8 bytes bytes seem to be some kind of identification of the motor.
Now let’s connect a tilt sensor in port 1 (and nothing in port 2):
01 01 00 22 00 00 00 10 00 00 00 10
and then move it to port 2:
02 01 01 22 00 00 00 10 00 00 00 10
Now just a distance sensor in port 1:
01 01 00 23 00 00 00 10 00 00 00 10
and move it to port 2:
02 01 01 23 00 00 00 10 00 00 00 10
Now just the motor again in port 1 and then the tilt sensor in port 2 (two readings):
01 01 00 01 01 00 00 00 01 00 00 00 02 01 01 22 00 00 00 10 00 00 00 10
So ‘Port Type Char’ doesn’t describe the ports state, it just shows the last action detected at ports. I think that’s the reason it’s not defined as ‘notify + read’, it’s purpose is just to notify that a change ocurred on ports.
Now we have 3 characteristics named “Alert”: Low Voltage Alert, High Current Alert and Low Signal Alert. Their names seem clear enough to understand their purpose and since all read zero everything seems to be OK. But let’s try to force an “High Current Alert” – make the motor run, block it and read the handle:
[A0:E6:F8:1E:58:57][LE]> char-read-hnd 001d Characteristic value/descriptor: 00 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 001d Characteristic value/descriptor: 00 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 001d Characteristic value/descriptor: 00 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 001d Characteristic value/descriptor: 00 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 001d Characteristic value/descriptor: 01 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 001d Characteristic value/descriptor: 01 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 001d Characteristic value/descriptor: 01 [A0:E6:F8:1E:58:57][LE]> char-read-hnd 001d Characteristic value/descriptor: 00
When I block the motor with my hand, the Hub beeps and flashes the LED twice (in yellow). And sometimes the Alert reads ’01’.
But instead of reading several times the handler, we can activate ‘Notifications’ by turning ON the ‘notification’ flag in the ‘Client Characteristic Configuration’ and then just wait for the Hub to send the notification when the High Current Alert changes it’s state:
[A0:E6:F8:1E:58:57][LE]> char-write-req 001e 0100 -listen Characteristic value was written successfully [A0:E6:F8:1E:58:57][LE]> char-write-cmd 003d 01010164 Notification handle = 0x001d value: 01 Notification handle = 0x001d value: 00
We used a different write command: ‘char-write-req’ instead of ‘char-write-cmd’ expects an answer from the device and ‘-listen’ keeps listening for future ‘answers’.
Now the ‘Vcc port control’ name isn’t much clear about it’s purpose. It reads ‘1’ but it’s also writable… does it allows us to control power in the ports? No matter what I write to 0x003d it seems to retain only ‘0’ or ‘1’ and when I write ‘0’ to it while the motor is running it keeps running.
‘Battery type indicator’ reads zero, I guess that it identifies the kind of battery being used. I’m using 2 AA alcaline batteries, will try again with the LiPo battery when I get it.
And finally the 2 writable-only characteristics: ‘Disconnect Char’ and ‘Turn off device’. They also seem quite clear about their purpose:
[A0:E6:F8:1E:58:57][LE]> char-write-cmd 002e 01 [A0:E6:F8:1E:58:57][LE]> (gatttool:8257): GLib-WARNING **: Invalid file descriptor. [A0:E6:F8:1E:58:57][LE]> connect Attempting to connect to A0:E6:F8:1E:58:57 Connection successful
Writing to ‘Disconnect Char’ makes the Hub disconnects but keeps it in discovery mode so I cpuld reconnect to it.
[A0:E6:F8:1E:58:57][LE]> char-write-cmd 0025 01 [A0:E6:F8:1E:58:57][LE]> (gatttool:8257): GLib-WARNING **: Invalid file descriptor. [A0:E6:F8:1E:58:57][LE]> connect Attempting to connect to A0:E6:F8:1E:58:57 [A0:E6:F8:1E:58:57][LE]> Error: connect error: Connection refused (111)
Writing to ‘Turn off device’ really turns it off.
So that’s it for ‘Nordic LED button service’. What LED, you ask? Well, the Android App is from Nordic and they have some examples on the Net with this UUID so my explanation is that LEGO used part of their code for the ‘button’ part without changing the UUID so the App recognizes it this way.
Next post: Motors and LED.