近段时间来一直被开锁失败的问题困扰!经过排查,发现有一个IEEE属性的值在刚获取设备信息的时候是有值的,但是打了开锁时通过breakpoint发现这个属性的值的空的。而在开锁的过程中需要用到这个属性合成秘钥。后来只能增加了一个类型为NSData的IEEEData属性。勉强解决了不能开锁的问题。
这两天,客户用的旧SDK也反馈有这样的问题,不得不下决心找到问题的根源从而永久搞定这个bug。
此为背景!......
IEEE为空时,在设备模型类中的实现文件初始值定义为:_IEEE = NULL;当网关返回设备信息时:
uint8_t ieee[8];
......(解析网关数据)
device.IEEE = ieee;
后来经过多次试验和思考得出如下结论:在解析方法中给了device.IEEE赋了一个指针。当方法执行完之后ieee的内存空间势必会在一定时间内被回收,故device.IEEE指向的是一个空值。
应该在设备模型类中申请堆内存空间来保存数据:_IEEE = malloc(sizeof(Byte) * 8);
在解析方法中按位给IEEE属性赋值:
uint8_t ieee[8];
for (int i = 0; i < 8; i++)
{
ieee[i] = msg[msgPtr++];
device.IEEE[i] = ieee[i];
}
这样处理之后,IEEE的值就不会为空了。
网友评论