首先参考博文 http://www.cnblogs.com/qmlm8844/archive/2012/03/13/2393366.html
问题1:
uint16 pan_id;
pan_id=0x1122;//你想要的ID
zb_WriteConfiguration(ZCD_NV_PANID, sizeof(uint16), &pan_id) ;
zb_SystemReset();//重启后才会启用新的PAN_ID,不然只是修改了NV里面的数据
楼主说:
如果没有添加zb_SystemReset();这条语句,通过zb_ReadConfiguration()函数读取的PAN_ID也是0x1122,说明zb_WriteConfiguration已经把数据成功写进NV里了。
但是用zb_GetDeviceInfo(ZB_INFO_PAN_ID,&pan_id);读出来的却还是旧的PAN_ID,因为系统没有启用新的PAN_ID来建立网络。
我认为:这只是表面原因,深究zb_WriteConfiguration()和zb_GetDeviceInfo(),这两个函数实现过程不一样。
zb_WriteConfiguration()中调用osal_nv_read(configId, 0, size, pValue),就是把PANID 写到NV里了。所以再次READ肯定是一样的。
zb_GetDeviceInfo(ZB_INFO_PAN_ID,&pan_id)是读取NIB信息库中的数据,它调用了osal_memcpy(pValue, &_NIB.nwkPanId, sizeof(uint16)),由此可以看到,并没有读取刚刚NV写过的数据。
问题2:
pan_id = 0x1122;
_NIB.nwkPanId = pan_id;
NLME_UpdateNV(0x01);
zb_SystemReset();
这样就可以建立一个新的pan_id的网络了,而且也可以和节点进行正常通信。
仔细研究NLME_UpdateNV(01),发现它就是把NIB写到NV中去了
NLME_UpdateNV()
Enables—要保存的项目的掩码:
以上方法到底能不能正确修改PAN ID并组网,还不清楚,还有,上面方法并没有广播新的PAN ID
但是飞比论坛中有个人说是要广播的,http://bbs.feibit.com/thread-3627-1-1.html
到底怎么样实验验证后再说