Byte*属性值为空的困惑

2018-02-28  本文已影响0人  coderxiaoqin

    近段时间来一直被开锁失败的问题困扰!经过排查,发现有一个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的值就不会为空了。

上一篇下一篇

猜你喜欢

热点阅读