上下文: - iPhone 5c上的iOS 7.1.2 - 葡萄糖测量“外围”(BT LE) - 设备和外围设备已配对(引入代码) - 外围设备上有> = 1条记录。 - 下面描述的行为被重复了几次。外围设备只有一个记录,并且还有两个新记录。读取的结果(characteristic.value)总是相同的。
我正试图通过以下方式使用iOS设备从外设读取(接收)记录:
peripheral:didDiscoverServices:error:
发现特征,葡萄糖测量(0x2A18),葡萄糖测量上下文(0x2A34),葡萄糖特征 (0x2A51)和记录访问控制点(0x2A52)peripheral:didDiscoverCharacteristicsForService:error:
中迭代所有特征并读取这些特征的值(通过[_peripheral readValueForCharacteristic:characteristic]
)[_peripheral setNotifyValue:YES forCharacteristic:characteristic]
(除“葡萄糖特征”特征外)。当“已加载所有内容”时,通过单击按钮触发此操作。通过“记录访问控制点”请求可用记录数(由用户触发),如:
char buffer[3];
// Op Code: 0x04 report number of stored records
buffer[0] = 0x04;
// Operator: 0x01 All records
buffer[1] = 0x01;
// Operand: 0x00 n/a
buffer[2] = 0x00;
NSData *data = [NSData dataWithBytes:buffer length:3];
[_peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
peripheral:didUpdateValueForCharacteristic:error:
委托方法,更新后的值为06000405
。我不完全理解相关规范(见下面的链接),所以我无法解释我自己的反应,但LSO(最不重要的八位组)中的5或6意味着“成功”(或至少不是错误)。触发所有存储记录的请求(由用户触发),如:
char buffer[3];
// Op Code: 0x01 report stored records
buffer[0] = 0x01;
// Operator: 0x01 All records, 0x06 last one
buffer[1] = 0x01; // Tried 0x06 as well with the same result
// Operand: 0x00 n/a
buffer[2] = 0x00;
NSData *data = [NSData dataWithBytes:buffer length:3];
[_peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
peripheral:didUpdateValueForCharacteristic:error:
来回拨电话06000105
。将第二个八位字节从0x01
更改为0x06
会产生相同的响应(值)。这也是我无法理解/解释的。注意:在Android上,似乎还必须将客户端特性配置描述符设置为通知和/或指示,但尝试这导致异常和消息,应该使用外设上的setNotifyValue:forCharacteristic:
在特征本身上设置通知。
我的主要问题是,葡萄糖测量特征上的peripheral:didUpdateValueForCharacteristic:error:
没有回调,包括记录。在请求记录后,我尝试再次针对该特征呼叫[_peripheral setNotifyValue:YES forCharacteristic:characteristic]
。
有没有人知道我的错误在哪里?有没有人(在iOS上)实现了我想要实现的目标?
另一件事是BT glucose service specification。我将非常感激,如果有人可以启发我如何解释响应(意味着记录访问控制点特征的更新值)我得到。因为我甚至不确定characteristic.value
中的字节的顺序是什么(例如,当它们通过getBytes:length:
的{{1}}方法读取时。
我想我正在按照Glucose Profile specification中描述的流程进行操作,所以我真的很茫然。
非常感谢你!
祝你好运, 加布里埃尔
答案 0 :(得分:1)
遇到同样的问题后,我无法弄清楚如何解释06000105的值,但我认为这是一个错误的响应代码。
为我解决的问题是如果操作数为空,则排除操作数,只使用操作码和操作符:
char buffer[2];
// Op Code: 0x01 report stored records
buffer[0] = 0x01;
// Operator: 0x01 All records, 0x06 last one
buffer[1] = 0x01;
NSData *data = [NSData dataWithBytes:buffer length:2];
...
然后所有记录按照didUpdateValueForCharacteristic
中的预期流入