用2430最诱人的地方应该还是ZigBee,但是有时候用ZigBee就像用宰牛刀杀鸡样,根本就没有那个必要,而且用ZigBee会降低实时性。用一般的时分多址(TDMA)就会显得简单而高效。
自己写的协议,应该是类于星状网的通信协议吧,所以下面的叙述的时候依然以网络来描述它。
这个网络的特征是由一个RX节点和1-250TX结点,RX结点类于ZigBee的网关吧,它要负责组网、维护和信息采集。而TX受控于RX,并且只能与一个RX通信,不能和别邻近RX通信。网络有网络标识和网络地址,前者用来区分各个网络,而后者用来区分一个网络内的不同设备。网络建立成功后不再接收新TX的加入。
先来说网络的建立,第一个网络第一次建立,设备上电后RX向TX发出重新配置网络广播(RE_CONFIG)次数应该保证所有在工作的TX点都能收到这一指令,告知TX将进行重新组网,而TX的接到这一指令后,将自己的参数清除,并将自己的网络标号写为GROUP_NEW,然后再次进入监听状态,RX在成功广播了RE_CONFIG后,也将自己的网络标号切换到GROUP_NEW,然后广播开始配置网络命令TX_START_APPLY_ID,实质是告诉TX,在READY_TIME后可以开始申请自己的网络地址(不同于网络标识哈),广播成功后,RX进入监听状态,而TX进入发送状态,TX在接收到TX_START_APPLY_ID指令READY_TIME后开始申请地址,申请地址的指令为ASK_FOR_ID,申请地址时,TX需要生成一个随机数,并且加入到发送的数据包中,也就是ASK_FOR_ID后的一个字为TX生成的随机数,后面作为校验用。当TX发送成功后,开始一个同步延时,在RX一方,一旦接收到ASK_FOR_ID,则分配一个地址,然后回复分配地址指令,格式是:SET_ID+g_id+id随机数,SET_ID为为指令,g_id是网络标识,id是分配给最后一个申请ID的TX的ID号,而随机数是由TX在ASK_FOR_ID指令中发来的。TX接收到SET_ID后,如果指令后第2字的随机数和它发出ASK_FOR_ID时的随机数一样,则完成了地址申请,并退出地址申请,不然就再次发ASK_FOR_ID指令,最多可以发10次,如果第10次仍然失败,则开启加入网络失败标志(如点亮一个红色的LED灯),然后进入睡眠。RX在SET_ID_TIME内一直处于接收状态,超时后,不再接收TX的申请,将已经加入网络的设备信息保存(可掉电的),切换网络标识为g_id,并退出网络建立的状态。同样的是TX在接收到正确的SET_ID指令后,将网络标识g_id和自己的id号保存(可掉电的),然后退出地址申请,进入设备正常工作模式。
网络维护,信息采集这两个事件合2为一了,网络建成后,RX周期性的向TX发READ_YOUR_INFO的指令,TX在接收到这一指令后向RX发出REPLY_INFO,(应用中REPLY_INFO可追加数据)。由于不能保证无线通信每次都能准确无误的通信成功,所在RX连续ERROR_COUNT_MAX后才宣告TX已经离开网络。
这样的网络建立成功以后任意重启设备,都不需要再重启设备。但是有几个问题还没有解决:
1,在第一个网络建立后,建立第二个网络时如何知道自己的网络标识(g_id)。
2,为什么网络建立后不可以再有TX加入网络。
3,当使用现场已经有一个网络在工作,如何避免新组建网络的RX不会去影响已经在工作的TX。
4,代码分块。
我是这样做的:
a) 已经有的RX定时去扫描新RX,新RX在发RE_CONFIG指令之前,应该有APPLY_G_ID_TIME时间去和已经存在的RX偿试通信,如果APPLY_G_ID_TIME时间内不能收到网络标识为g_id的RX回复,则说明这个g_id可用。
b)使用中如果在TX有可以输入自己的网络标识或者可以任意加入网络,则RX可以开放,在网络建立以后仍然接收并处理ASK_FOR_ID指令。
c)让TX在启动的ALLOW_RECONFIG_TIME内接收RX的RE_CONFIG指令,超时后如果没有加入网络则继续接收RE_CONFIG,反之则不再接收RE_CONFIG指令。
d)尚无良策。
最后说数据包的格式,
DESTADDR(1)+SRCADDR(1)+GROUP_ID(1)+DATA_TYPE(1bit )+resaved(7bit)+LEN(1)+SDATA(LEN)+CRC(2)
括号里的数字如无单位,则单位是BYTE。DATA_TYPE可以取DATA和COMMAND,而最后的SDATA为数据,长度由LEN指定,最后一字为CRC检验字。
---------------------END----------------
用户397244 2009-3-23 21:29