一次给客户软件开发建议和改进的调讨,请注意根据你的应用场景调整,不要死板地复制。
XBee由于其特殊性,在不同的时期会有不同的模式,不建议在单片机里的连续程序和条件语句来处理各种异常,而要在进入大循环之前就先判断模式。利用各种异常机制的是来标志模式,从而下次就能跳入该模式,处理完毕要及时将模式置位到正常或合理的模式(纯属个人经验,高手也可跳过)
软件部分
软件架构上,不同的产品都应该有至少三种模式:部署模式,工作模式,测试模式。不同模式一般用程序安排(比如异常处理机制)或是不同频次按钮等方式来切换。 部署模式:分为第一次部署和节点增删的部署,部署模式也称组网模式,主要是完成组网的过程。 工作模式:程序主循环做的正常工作。 测试模式:可以分为出厂检测和调试时的模式。测试模式一般以按钮组合,水银开关等来切换。
协调器软件
建议协调器采用AP=2的转义字符方式来减少复杂电磁环境引发的异常。
部署模式
协调器在完成出厂检测后,其工作状态应处于准备实施第一次部署的状态。首次部署时,协调器应进行退网完成一次能量扫描,以在合适的信道生成网络。此时节点列表未在flash中生成,对于每个入网的节点,协调器应与其进行握手确认,并及时踢除不能在规定时间完成握手的节点。应给首次部署足够的时间,以一定的节点数量或是超过规定时间,比如10分钟,或是总共2个小时以内完成首次部署。完成着次部署后,协调器应同路由器一起封网,并设置子节点的NJ(NJ<FF),此时网络关闭,不再接受入网请求,但已经加入的子节点仍可以通过rejoin机制在无父节点响应时换父节点。 协调器应该响应按钮要求重新开启整个网络的加入,一般把协调器和路由器的重新开放用NJ来设置一定时间,到时自动关闭,以便有足够的时间添加节点。 路由器的重新开放主要通过协调器远程命令来开启,为了保障弱信号时的效果,建议开放网络时协调器对路由器列表多发一次远程开放命令。
握手过程: 协调器在收到握手请求,并核对握手信息,确认时要加一个确认码(比如信道号)给节点,节点收到确认码就进入正常工作模式(顺便保存历史信道号作为将来调试备查(序号:信道号)。握手请求信息应该为:MAC地址:NI:Type等,根据握手请求信息,协调器把许可节点加入列表。
完成首次部署,应进行封网,让网络不再允许加入,整个网络更稳定些。此时节点仍可在网内根据信号表况进行rejoin来更换父节点。 (测试reset是否会掉网,应该不会)
部署模式应在程序段中自行结束,转入工作模式。结束协调器的部署模式,除了定时外,还可以是外部按钮,上位机软件结束组网过程等。 通常首次部署完成并封网后,应该有异常机制或是外部按钮来重新开启加入窗口,进行增减节点的临时部署模式。异常机制中应该对异常等级进行标识,相应在临时部署模式中增加处理力度。
工作模式
工作模式是正常工作时的程序段,当网络完成部署,节点都连上来后,程序主循环要完成平时要做的事。 大这个大循环的前段,需要有机制检测是否需切换到其它模式。 定时发一个路由心跳包,作为路由的失联异常的辅助判断(30s一次左右,因为路由平时无数据,所以失联异常依靠心跳包,5分钟一次都没收到可认为路由器失联,标志异常)。 定时发一个子节点心跳包,以作为子节点失联的辅助判断(可选,一般不需要,因为子节点发送数据或是入不了网时有异常可以cover)
****主循环开始前**** 模式判断,当前是什么模式,转相应处理。 ... 心跳包或常态数据,入网状态,等等检测 长时间未入网,超出一定时间失联或无数据,或数据异常时,标注相应异常标识符,进行些预判断,传递参数,以便下个周期时处理异常 异常处理中,必要时我们甚至需要临时开放网络来进行合理安排,这时除了按钮外,还可以根据节点失联时间,数据上不来的时间,智能开放一段时间。 建议把异常分类分号保存在flash中,并对不同异常相应置位,以便在下个循环周期开始时,能自动切换到对应模式(一般是临时部署模式) ……。
中断要做的事情,检测外部按钮,是否有物理方式启动模式切换,相应置位。 检测异常标识符,是否有异常处理需要切换模式,把异常等级作为参数传出去或是在异常处理中检测flash中异常等级以进行相应的逻辑控制。 主循环
测试模式
一般用水银开关等物理方式来切到测试模式。包括出厂测试和debug调试。 出厂模式测试后,需把模块参数恢复到出厂默认值。 debug测试,主要是要把当前状态,包括信道,OP,父节点,0x98扩展信息等log在flash中或是方便XCTU观察。 注意debug测试模式,退出时需要把参数恢复到之前状态。我们需要用物理方式开启特定测试模式,除了物理方式退出外,也可以用个定时器来只开启一段时间的测试模式就自动退出,以防止测试模式干扰正常的程序工作。
路由器软件
部署模式
首次部署,开启和协调器等长的部署模式,退出时封网。 临时部署模式时,定时向协调器查询当前封网状态,如果不一致,把NJ调整和协调器一致。防止没收到封网指令。
工作模式
定时发心跳包,定时查NC, 超过一定时间没有任何子节点,查协调器封网状态。超过一定时间无心跳包回应,标识失联,以便切到临时部署模式时,处理失联。
检查异常
对于数据失联,比如已经加入的路由或节点的数据失联,那么这种异常也是有可能是节点移除造成的,因此我们还需要一个机制更新列表,对于在网数据,协调器定时发心跳包,并预期要收到回应,如果累计几个周期没有回应,则认为节点不在或已经远离信号范围,在列表中剔出,在踢除后开放一会儿网络以期重新加入。 对于累计几个周期没收到心跳包的路由器或节点,应主动标志异常,进行NR退网,这时有可能是封网的,但没有关系。有可能是换设备,我们将在入网异常中去cover这种可能性。 要注意休眠节点不能在休眠周期收到两个数据包,所以协调器的心跑包间隔要大于两个以上的休眠周期。(扩展休眠周期能否收到心跑包)
设备更换异常 封网后一般不需要进行退网来处理加入异常,但是如果添加路由器或更换设备时如何处理呢,这也是种异常 一般这时协调器要开启五分钟的开放时间
节点软件
部署模式
节点的部署模式就是入网过程,需要在这里也同时标注入网异常 分首次部署和后续的异常失联退网部署。 首次部署,长时间不要休眠20s,让它尽快加入,加入后才改为周期休眠。记录一下历史信道,处理一下握手。 异常失联退网指的是工作模式中心跑包等没收到,用NR退网,这种模式,在更换父节点或协调器时要能起作用。 对异常进行等级和分类化。
工作模式
检测是否物理动作(水银开关等)相应处理 检查是否有大异常需要主动退网等 标准流程,记录异常,比如心跳包长时间没收到,或是发送不成功累计一定值,启动主动退网进入临时部署模式。(需要比较高的值作阀值),如果是移点,有物理切换 数据异常时,要cover非预期的默认值,非预期路径异常,减少非预期路径异常造成的时间差引起系统紊乱的可能性(路由自愈,换父节点),这些会反应在心跳包或数据包上。
设备更换异常
调试模式
同协调器软件 log化