请问一下网络地址的问题。
各位大侠好,我进入WSN不是很久,因需要,我设计了一个节点上的程序,让其实现路由和终端功能的切换,切换代码是
void ChangeNodeType(uint8 nodeType)
{
uint8 logicalType = nodeType;
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);
zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
startOptions = ZCD_STARTOPT_AUTO_START;
zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
zb_SystemReset();
}
使用的平台是CC2430, ZStack-CC2430-1.4.3-1.2.1 ,切换好像实现了,但是加大节点数量和测试时间后,发现全负荷工作几个小时后,就有节点掉线,难以入网的情况,检查数据发现,有的节点的网络地址出现了0x FF FE,好像到了最大值,不知道是不是节点网络地址的回收出现问题?另外我想通过程序指定各节点的网络地址,不管节点是路由还是终端,都保持我指定的节点短地址不变(因为我们用的节点数量不是很多,不超过100个,可以人为保证网络地址不冲突),不需要TI的网络地址分配,回收,冲突监测等过程,不知道在哪里去修改?
请指教!谢谢。
坐等,自己顶一下。我的问题如果不是网络地址的问题,那节点掉线就一直上不来(肯定有电),是什么原因呢。我就加了个 软重启的函数zb_SystemReset(),但是如果硬件Reset一下后,就可以正常入网通讯了,但是时间长了之后又会出现某个节点掉线上不来。此过程中协调器是一直正常工作的。
呼唤达人
节点在切换以后,有没有重新入网?
感谢VV的回复!
一般情况下应该是重新入网了,因为每次软重启,节点的类型都变了,从理论上说,分配给路由和终端的网络地址应该是不一样的,但是节点在切换类型之后,有时候网络地址变了,有时候没有变,但是采集的数据都发送给协调器了,所以我认为它是入网了,要是没入网怎么会有采集数据来?测试时,我是采用了5个节点,每节点都是半分钟切换一次,像这样大概要6~8小时就会出现有的节点消息了(没数据上来),但是都有电,我认为这时候可能是入网失败了。然后就一直没有,如果硬件Reset一下,马上就又入网了。之后这个问题又会跑到别的节点上,已经测试好久了,每次都会出现,不知道测试现象我说清楚了没?
类型切换,分配的地址一样是正常的,因为父设备是有保存的,而且会根据IEEE做比对的。
没数据上来的时候,网络中节点的状态是什么,能否抓下包看看
好的,我现在正在抓包,现在只设置了一个节点工作,要等到它掉线才能看到需要的东西,但是您说的网络中节点的状态是在哪个字段呢?
想抓包也不太好弄啊,测试工作太需要耐心了。
因为原实验方案是1协调器+5个节点;经过6~10小时后,每次都会出现某1、2个节点掉线,如果按照这个方案抓包,因为时间长,掉线时间和节点均不能确定,节点掉线之后别的节点还正常工作,所以掉线节点出问题时的包会被后续正常数据包湮没,所以我把实验方案是1协调器+1个节点,专抓这个节点的数据包。可是已经不休不眠的工作了近30小时了,单个节点的话,它工作正常,一直都是半分钟重启变换类型一次,没出问题。
节点多才会出问题,每次测试都会,但是要等6~10小时的样子,出问题的节点也是随机的,造成看目的包困难;只测试单个节点,好像问题不能出现,怎么办?
另一个现象,单个节点测试时,不管是作为路由还是终端,它的网络地址始终都是00 01,如果是多个节点测试的话,有的节点的网络地址有时不会改变,有时候会变。
上次图片不清楚,重新发一次。
这是测试单个节点工作的抓包截图(帖子中如果看不清,请点击图片一下即可放大显示)
这是串口接收的数据截图:
数据格式为7字节,01(自定义)+51(节点编号)+00 01(节点的网络地址)+01/02(节点类型)+ 11 22 (自定义数据),可以看到,数据都收到13万字节了,基本都在正常工作。
能不能把抓包文件另存为,用附件上传啊,这样图片发送看不到解析的数据的。
谢谢!
6201.20150616 1105.txt
VV大侠您好!
这一周都在做测试抓包,测试说明和数据,抓包文件见附件,测试说明里面应该说得比较清楚了,帖子里就不赘述了,真想邀请您来武汉出差^_^,抓包数据文件大小25M,超过允许的20M了,能给我个邮箱或者QQ什么的吗?我的QQ是1553867265,非常感谢。
抓包数据怎么是 .txt格式的。
你可以上传到网盘,我去下载就可以了
感谢VV!
上面那个txt文件不是抓包文件,只是测试环境、平台、部分串口数据、抓包环境,问题说明等等。
前天糊涂了,没想到把抓包文件压缩一下,汗...
今天附上数据抓包文件,太感谢您了。
另外如果您能抽出时间的话,真诚邀请您到我们这里来指导一下(会议、调研、交流都行吧),食宿和往返交通都我们来出吧。0005.20150617 001.rar
VV大神,上面那个抓包文件能打开么?找到我程序的病根了吗?好几天没动静,帖子一下子沉好远...
如果做路由和终端设备的切换,长时间的测试,这个问题是否还存在?
另外在抓包的文件中,没有看到设备掉线后rejoin的情况,你的协议栈既然已经使能了NV_RESTORE的话,应该会有rejoin的
你的路由和终端设备切换,是通过什么方式触发的?
To VV, 您晚上不睡觉的么?1:40,不能不佩服!
如果仅做一个节点上的路由和终端功能的切换,实验采用一个协调器 + 一个节点(节点上切换路由和终端),好像没遇到这个问题,在上面数据抓包之前我特地测了一下,结果直到节点电源耗光(30多个小时的样子)也没有出现这个问题。只有多个节点才会有。
另外,我的协议中没有用到NV_RESTORE,这个我确定,用了NV_RESTORE的话,切换无效。
路由和终端设备切换,我是通过自编函数实现的:
void ChangeNodeType(uint8 nodeType)
{
uint8 status = 0x01; //SUCCESS:0x00; FAILURE:0x01
uint8 logicalType = nodeType; //通过参数nodeType改变节点类型,01为Router, 02为End
osal_nv_write(ZCD_NV_LOGICAL_TYPE, 0, sizeof(logicalType), &logicalType);
status = osal_nv_item_init( ZCD_NV_STARTUP_OPTION, sizeof(startOptions), &startOptions );
if ( status == ZSUCCESS )
{
osal_nv_read( ZCD_NV_STARTUP_OPTION, 0, sizeof(startOptions), &startOptions);
startOptions = ZCD_STARTOPT_AUTO_START;
//自启动写入NV
osal_nv_write(ZCD_NV_STARTUP_OPTION, 0, sizeof(startOptions), &startOptions);
osal_set_event(GenericApp_TaskID, SYSTEM_RESTART); //自定义重启事件,该事件处理函数中就一句:SystemReset();
}
}
在程序初始化是我是设置NV中的ZCD_NV_LOGICAL_TYPE为读操作,上述函数在定时器中被调用,测试时30秒调用一次。
就这样。