Ios 要求蓝牙设备报告超过某个日期的血糖记录会出现错误

Ios 要求蓝牙设备报告超过某个日期的血糖记录会出现错误,ios,objective-c,bluetooth,bluetooth-lowenergy,core-bluetooth,Ios,Objective C,Bluetooth,Bluetooth Lowenergy,Core Bluetooth,我有一个叫做Accu-Chek(Aviva Connect)的蓝牙血糖仪设备 我正在尝试筛选记录:仅获取晚于2016-10-23 20:01:02的记录。但是蓝牙设备的响应是错误的 在 -(void)外围设备:(CBPeripheral*)外围设备didWriteValueForCharacteristic:(CBCharacteristic*)特征错误:(NSError*)错误 我收到一个N错误: Error Domain=CBATTErrorDomain code=13“该值的长度无效。”

我有一个叫做Accu-Chek(Aviva Connect)的蓝牙血糖仪设备

我正在尝试筛选记录:仅获取晚于2016-10-23 20:01:02的记录。但是蓝牙设备的响应是错误的

-(void)外围设备:(CBPeripheral*)外围设备didWriteValueForCharacteristic:(CBCharacteristic*)特征错误:(NSError*)错误
我收到一个N错误:
Error Domain=CBATTErrorDomain code=13“该值的长度无效。”

关于葡萄糖服务的文件说明:

使用面向用户的时间筛选器类型时,操作数的格式为面向用户的时间筛选器类型值,后跟适用的面向用户的时间(基准时间和时间偏移的总和)值或值对,具体取决于运算符

有人能告诉我我做错了什么吗

下面是构建请求的代码,其中我添加了面向用户的时间过滤器类型,然后添加了面向用户的时间(基本时间+时间偏移):

-(无效)报告过滤器记录{
if(self.peripheral&&self.recordAccessControlPointCharacteristic){
NSMutableData*mutableData=NSMutableData.data;
uint8\u t操作码=0x01;//报告存储的记录
[mutableData appendBytes:(void*)和操作码长度:sizeof(操作码)];
uint8_t运算符=0x03;//大于或等于
[mutableData appendBytes:(void*)和运算符长度:sizeof(运算符)];
uint8\u t filterType=0x02;//面向用户的时间(基准时间+偏移时间)
[mutableData appendBytes:(void*)和filterType长度:sizeof(filterType)];
uint16年=2016年;
uint8_t月=10;
uint8_t day=23;
uint8_t小时=20;
uint8分钟=1;
uint8_t second=2;
uint8_t日期[7];
*((uint16)日期)=年;
日期[2]=月份;
日期[3]=天;
日期[4]=小时;
日期[5]=分钟;
日期[6]=第二天;
[mutableData appendBytes:(void*)和日期长度:sizeof(date)];
NSTimeZone*时区=NSTimeZone.localTimeZone;
NSInteger secondsFromGMT=时区。secondsFromGMT;
int分钟=(int)秒自GMT/60%60;
整小时=(整)秒自GMT/3600;
short userTimeZoneOffset=分钟+(小时*60);
uint8_t时间偏移[2];
*((短*)时间偏移)=用户时区偏移;
[mutableData appendBytes:(void*)和timeOffset长度:sizeof(timeOffset)];
[self.peripheral writeValue:Characteristic的可变数据:self.recordAccessControlPointCharacteristic类型:CBCharacteristicWriteWithResponse];
}
}
实际上,我试图解析
mutableData
以获取所有值,看看它们是否正确编码。数据编码正确

我发现,如果我发送4个字节–我得到没有错误,但仍然没有响应的记录:

-(无效)报告过滤器记录{
if(self.peripheral&&self.recordAccessControlPointCharacteristic){
NSMutableData*mutableData=NSMutableData.data;
uint8\u t操作码=0x01;//报告存储的记录
[mutableData appendBytes:(void*)和操作码长度:sizeof(操作码)];
uint8_t运算符=0x03;//大于或等于
[mutableData appendBytes:(void*)和运算符长度:sizeof(运算符)];
uint8\u t filterType=0x02;//面向用户的时间(基准时间+偏移时间)
[mutableData appendBytes:(void*)和filterType长度:sizeof(filterType)];

const uint8_t val1=(uint8_t)1;//我不会回答您的问题,但是
millisessfromgmt
应该命名为
secondsFromGMT
,这很奇怪。另外,我建议使用一个
结构(模仿doc)。以后阅读起来更容易,而且您不必做所有的中间操作。
appendBytes:length
。我不确定您使用的
timeOffset
是否正确。“基本时间和时间偏移之和”,我会选择
date[4]+=hours;date[5]+=minutes;
并没有附加它。这感觉很奇怪,但似乎是这样。我会阅读
0x2A08
值来检查设备日期,并使用iOS设备差异作为时区,而不是
currentTimeZone
(不确定设备是否真的使用GMT)。感谢@Larme的评论。我尝试过:
date[2]+=月;日期[3]+=天;日期[4]+=小时;日期[5]+=分钟;日期[6]+=秒;
没有帮助。我不会回答你的问题,但是
millisessfromgmt
应该命名为
secondsFromGMT
这很奇怪。另外,我建议使用
结构(模仿文档)。以后阅读起来更容易,而且您不必做所有的中间操作。
appendBytes:length
。我不确定您使用的
timeOffset
是否正确。“基本时间和时间偏移之和”,我会选择
date[4]+=hours;date[5]+=minutes;
并没有附加它。这感觉很奇怪,但似乎是这样。我会阅读
0x2A08
值来检查设备日期,并使用iOS设备差异作为时区,而不是
currentTimeZone
(不确定设备是否真的使用GMT)。感谢@Larme的评论。我尝试过:
date[2]+=月;日期[3]+=天;日期[4]+=小时;日期[5]+=分钟;日期[6]+=秒;
这没有帮助。