tinyOS消息格式.doc_第1页
tinyOS消息格式.doc_第2页
tinyOS消息格式.doc_第3页
tinyOS消息格式.doc_第4页
tinyOS消息格式.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Mote节点之间传送消息的包格式文档说明:本文档主要介绍Mote节点之间传送消息的包格式,包括mote节点发往sink节点的数据包格式和sink节点发往mote节点的数据包格式。修改:2010-5-25,加入xmesh_header;2010-5-26:加入XCommand组件的消息包格式;2010-5-27,定义命令消息格式;2010-5-28,增加了命令消息的具体细节;2010-6-8,加入发送命令帧结构,经多天分析实验得到,能够实现控制远端节点LED亮和灭,至此上下行基本消息包格式都以得到;2010-6-10,加入AM_TYPE类型;撰写人:张伟军日期:2010-5-20;TinyOS消息格式:1. TinyOS的消息包头格式在安装目录CrossbowcygwinoptMoteWorkstostypes下的AM.h里面:typedef struct TOS_Msg/* The following fields are transmitted/received on the radio. */ uint16_t addr; /发送地址uint8_t type; /发送数据类型uint8_t group; /组iduint8_t length; /消息长度int8_t dataTOSH_DATA_LENGTH;/数据长度uint16_t crc;/数据冗余校验位/* The following fields are not actually transmitted or received * on the radio! They are used for internal accounting only. * The reason they are in this structure is that the AM interface * requires them to be part of the TOS_Msg that is passed to * send/receive operations. */这部分是用于Mac层的,从Mac层传输下来的。uint16_t strength;uint8_t ack;uint16_t time;uint8_t sendSecurityMode;uint8_t receiveSecurityMode; TOS_Msg;The addr field specifies the destination address (a moteID or the broadcast address). The group field specifies a channel for motes on a network. If a mote receives a packet with a different group ID, the packet is dropped. The type field specifies which handler to be called at the AM level when a packet is received. The length field specifies the length of the data portion of the TOS_Msg. Packets have a maximum payload of 29 bytes. The data portion consists of an array of 29 bytes (as specified by TOSH_DATA_LENGTH). The unsigned two byte field crc follows. When sending, the crc is incrementally calculated as each byte of the packet is transmitted. So, the maximum length of a transmitted TOS_Msg is 36 bytes (addr(2 bytes) + type(1 bytes) + group(1 bytes) + length(1 bytes) + data(29 bytes) + crc(2 bytes) = 36 bytes). 虽然最大长度是36个字节,但是除去各种开销,有效字节只有29个。以上是TinyOS的传输消息用的数据格式,图示如下:addrtypegrouplengthDatecrc| 2byte 1byte 1byte 1byte | 0-29 byte | 2byte | -TinyOS Header -|2. 传感器发往汇聚节点的消息格式传感器采用的MDA300,对应的包结构图示如下:该消息包含5bytes的TinOS Header,和7bytes的XMesh Header,用于多跳组网时使用;4bytes的XSensor Header,和若干字节的Payload ,和 2 bytes 的CRC。以下列举常用AM_TYPE常量,详细常量见TinyOS常量定义.doc。* AM_DEBUGPACKT : Health packet * AM_DATA2BASE : Upstream data message to base * AM_DATA2NODE : Downstream data to node * AM_DATAACK2BASE : Upstream data to base requiring an ack * AM_DATAACCK2NODE : Downstream data to node requiring an ack * AM_DOWNSTREAM_ACK : Acknowledge message from base to the originating mote * AM_UPSTREAM_ACK : Acknowledge message from node to the originating base * AM_PATH_LIGHT DOWN : Create dedicated stream to node for designated time * AM_PATH_LIGHT_UP : Create dedicated stream from node for designated time * AM_MULTIHOPMSG : Route Update message */enum AM_HEALTH = 3, /! 0x03 : Health packet AM_DEBUGPACKET = 3, /! 0x03 : Health packet AM_DATA2BASE = 11, /! 0x0B : Upstream data message to base AM_DATA2NODE = 12, /! 0x0C : Downstream data to node AM_DATAACK2BASE = 13, /! 0x0D : Upstream guaranteed delivery to base AM_DATAACK2NODE = 14, /! 0x0E : Downstream guaranteed delivery to node AM_ANY2ANY = 15, /! MyApps.StdControl;Main.StdControl - TimerC.StdControl;MyApps.Timer - TimerC.Timerunique(Timer);MyApps.SubControl-Comm;MyApps.Send - Comm.SendMsg;MyApps.Receive-Comm.ReceiveMsg;3.4 MyApps模块文件MyApps模块接口如下:module MyApps provides interface StdControl;uses interface Timer;interface SendMsg as Senduint8_t id;/发送消息接口interface ReceiveMsg as Receiveuint8_t id;/接收消息interface StdControl as SubControl;/子组件:完成发送初始化provides声明这个组件所实现接口中命令和通告相关事件的产生。需要实现StdControl接口中命令init()、start()和stop()。Uses声明这个组件调用接口中命令并对接口中事件进行响应。所需要响应的事件为Timer接口的fired()事件、SendMsg接口的sendDone事件和ReceiveMsg接口的receive事件。3.5 通信实现MyApps发送和接收消息是通过组件GenericComm来实现的。GenericComm通过调用其他组件实现从消息包到主动消息、字节 级数据传数、位级数据传送到无线电收发模块的功能。GenericComm提供了256个消息收发接口,也就是说系统可以使用256种消息,或者说256种状态进行转换。由于系统是非阻塞模式, 一旦消息到达组件MyApps中,receive事件就会立刻调用,因此在这个事件中实现不同消息的转换,从而实现通信双方的握手:event TOS_MsgPtr Receive.receiveuint8_t id(TOS_MsgPtr m) switch(id) case 1: /状态转换1case 2: /状态转换2 return m;*日期:2010-5-25MDA300传感板的详细介绍MDA300是一个环境监控板,它包含多个感测模式。板上有14个12-bit模拟输入端口,6个数字输入输出端口,2个继电器通道,1个2.5V、3.3V和5V的可选激励。它同时板载湿度、土壤湿度、标准光线和风速等环境监测传感器。数据包格式为:由以上的消息格式可以看出,在payload中的信息都是从数据采集板上读取的数据,可知该消息是由MOTE节点发往SINK节点的,即该消息包是上行链路的消息包格式。*日期:2010-5-26上午MDA300引脚的详解及选用MDA300提供6个数字I/O口(D0D5接口),14个模拟信号输入接口,2个继电器接口等引脚,具体引脚分布可参见下图。本项目中要实现对MDA300的外扩设备进行控制,考虑到数字I/O引脚提供信号的输入或输出功能,可以通过对该采集板上的6个数字I/O引脚输出高低电平实现控制;如果6个口全都使用的话,可以产生26=64(2的6次方)种命令模式;对于家庭网关的前期开发而言,我们可以保留其中3个口,使用另外3个接口,根据排列组合可以产生8种控制命令。我们定义D0、D1和D2接口为使用接口,D3、D4和D5为保留接口,供后期开发使用。下图是MDA300采集板的引脚分布图,可供外扩接线时参考: 数字I/O接口的参数详解:+VDD to GND*.0.3V to +5.5V Digital Lines: Input voltage range*.-0.5 V to VDD+ 0.5 V Continuous output low current.50 mA Continuous output high current.4 mA Analog Lines: Input voltage range.-0.2 V to VCC + 0.5 V Counter Line: Input voltage range .0 V to 5.5V Relays: Maximum Contact Voltage.100V Maximum Contact Current.150mA以上接口参数信息可为外扩电路参考接口电气特性。*日期:2010-5-26下午控制命令消息格式的解析1. 概述:在PC上运行moteview软件,在mib520网关(嵌入mote)上运行Xmeshbase程序,在mote节点(嵌入mda300)上运行xmda300程序,就可以通过moteview来控制mote节点上led灯或传感板的数据采集。分析MOTEWORKS的代码可知,代码中的程序还不具有控制数字I/O口的功能,因此要实现对DI/O接口的控制应该是我们针对家庭网关项目要编写的程序。由于moteworks的代码中已实现远程控制led等功能,说明代码中已定义好相应的命令控制消息,因此我们可以参考他们的控制消息格式,定义符合项目需求的命令消息格式。分析代码可知,在mote节点上运行的程序中都是通过调用XCommand组件实现消息的传送,分析该组件,在XCommand组件中定义了多种命令消息类型,主要有:* Summary of XSensor commands: * reset, sleep, wakeup/ * set/get (rate) heartbeat/ * set/get (nodeid, group)/设置/获得节点ID,ID; * set/get (radio freq, band, power)/设置/获得频率、带宽、能量; * actuate (device, state)/触发操作 * set/get (calibration) * set/get (mesh type, max resend)2. 命令消息详解:在XCommand组件中定义了三种命令消息,分别为:XCommandMsg,XMeshMsg和XCmdDataMsg。其中XCommandMsg和XMeshMsg为downstream命令,XCmdDataMsg为upstream命令。以下为XCommandMsg消息和XMeshMsg消息的具体结构:typedef struct XCommandMsg uint16_t dest;/Desired destination (0xFFFF for broadcast?) XCommandOp inst; _attribute_ (packed);typedef struct XMeshMsg XCommandOp inst; _attribute_ (packed) XMeshMsg;下图为XMeshMsg的消息格式:TinyOS HeaderXMesh Headercmdcmdkeyparamcrc|-payload (XcommandOp)-|typedef struct XCommandOp uint16_t cmd;/ XCommandOpcodeuint8_t cmdkey;union uint32_t newrate;/ FOR XCOMMAND_SET_RATEuint16_t nodeid;/ FOR XCOMMAND_SET_NODEID uint8_t group;/ FOR XCOMMAND_SET_GROUP uint8_t rf_power;/ FOR XCOMMAND_SET_RF_POWERuint8_t rf_channel;/ FOR XCOMMAND_SET_RF_CHANNEL struct uint16_t device;/ LEDS, sounder, relay, . uint16_t state;/ off, on, toggle, . actuate; /* FOR XCOMMAND_ACCTUATE */struct uint16_t type;/ FOR COMMAND TYPE uint16_t value;/ FOR CUSTOM VALUE custom_data;/* FOR CUSTOM ACTION */struct uint8_t serialid8; / 64 bit serial IDuint16_t nodeid;/ nodeis is refered as UID uidconfig;/* FOR XEE UID Config Packet */ param; _attribute_ (packed) XCommandOp;enum / Power Management: XCOMMAND_RESET = 0x10, XCOMMAND_SLEEP, XCOMMAND_WAKEUP, / Basic update rate: XCOMMAND_SET_RATE = 0x20,/ Update rate / MoteConfig Parameter settings: XCOMMAND_GET_CONFIG = 0x30, XCOMMAND_SET_NODEID, XCOMMAND_SET_GROUP, XCOMMAND_SET_RF_POWER, XCOMMAND_SET_RF_CHANNEL, XCOMMAND_CONFIG_UID, / Actuation: XCOMMAND_ACTUATE = 0x40, / custom action, need not save parameters XCOMMAND_CUSTOM_ACTION = 0x60, XCommandOpcode;2.1. ACTUATE消息:在cmd(XCommandOpcode) = XCOMMAND_ACTUATE时,parameter中的变量为actuate,其结构体如下:struct uint16_t device;/ LEDS, sounder, relay, . uint16_t state;/ off, on, toggle, . actuate; enum XCMD_DEVICE_LED_GREEN, XCMD_DEVICE_LED_YELLOW, XCMD_DEVICE_LED_RED, XCMD_DEVICE_LEDS, XCMD_DEVICE_SOUNDER, XCMD_DEVICE_RELAY1, /05 XCMD_DEVICE_RELAY2, XCMD_DEVICE_RELAY3 XSensorSubDevice;enum XCMD_STATE_OFF = 0, XCMD_STATE_ON = 1, XCMD_STATE_TOGGLE =2, XCMD_STATE_VALUE XSensorSubState;2.2. CUSTOM_ACTION消息:考虑到本项目需要实现对外围扩展电路的控制,需要用到数字I/O接口,参考上面列出的消息格式,定义命令消息格式为:方案一:各字段详解:Type:Enum1,2,64;转化为二进制:1表示000 001,表示对D0接口进行操作;2表示000 010,表示对D1接口进行操作;3表示000 011,表示对D0和D1接口进行操作;4表示000 100,表示对D2接口进行操作;Value:Enum0,1,2,64;转化为二进制:0表示000 000,表示对相应的接口赋值为低电平;1表示000 001,表示对D0接口赋值为OUTPUT_HIGH,其余接口为OUTPUT_LOW;2表示000 010,表示对D1接口赋值为OUTPUT_HIGH,其余接口为OUTPUT_LOW;3表示000 011,表示对D0和D1接口赋值为OUTPUT_HIGH,其余接口为OUTPUT_LOW;63表示111 111,表示对所有接口赋值为OUTPUT_HIGH;64表示对所选接口的工作模式选为INPUT模式;每个命令消息中,type应该与value组合使用;举例说明:如果外围电路使用3个数字I/O接口,即需要对D0、D1、D2进行操作,若控制命令为101,即D0为高电平,D1低电平,D2为高电平,那么type和value分别填写为:7 (000 111)B和5 (000 101)B;方案二:如果每次操作只需要利用到1个DI/O接口,即接口模式为输出高低电平或输入模式,那么命令包格式可以定义为:具体的格式中只需要设计type和value两个字段的具体内容;Type:enumD0,D1,D2,D3,D4,D5; /可以看做为device;Value:enumOUTPUT_HIGH,OUTPUT_LOW,INPUT;/可以看做为InterfaceMode;本方案简单明了,程序代码实现也简单易懂。方案一中定义的命令包结构可以完全利用全部数字I/O接口,不管外围电路使用哪几个DI/O接口,都可以灵活地进行扩展。方案二设计简单明了,可扩展性差。以上方案供大家讨论再定着修改。*2010-6-8:控制命令帧结构MDA300:控制4号节点红灯反转命令:7E 42 04 00 0C FF 16 00 00 00 00 00 00 30 40 00 00 02 00 02 00 00 00 00 00 00 00 00 00 E2 94 7E控制基站节点红灯亮:7E 42 00 00 0C FF 16 00 00 00 00 00 00 30 40 00 00 02 00 01 00 00 00 00 00 00 00 00 00 B5 70 7E控制基站节点红灯灭:7E 42 00 00 0C FF 16 00 00 00 00 00 00 30 40 00 00 02 00 00 00 00 00 00 00 00 00 00 00 F0 1F 7E控制基站节点红灯反转:7E 42 00 00 0C FF 16 00 00 00 00 00 00 30 40 00 00 02 00 02 00 00 00 00 00 00 00 00 00 7A C1 7E控制基站节点红灯反转:7e 42 00 00 0C 7d 5d 0d 00 00 00 00 00 00 30 40 00 00 02 00 02 00 e7 c0 7e;这条命令将7d作为group id,但是在计算CRC的时候不算5d,计算完CRC后,再将5d插入到7d后面;控制基站节点黄灯亮:控制基站节点黄灯灭:控制基站节点黄灯反转:7e 42 00 00 0C FF 16 00 00 00 00 00 00 30 40 00 00 01 00 02 00 00 00 00 00 00 00 00 00 e5 c4 7e控制4号节点红灯亮:7E 42 04 00 0C FF16 00 00 00 00 00 00 30 40 00 00 02 00 01 00 0000 00 00 00 00 00 00 2D 25 7E控制4号节点红灯灭:7E 42 04 00 0C FF 16 00 00 00 00 00 00 30 40 00 00 02 00 00 00 00 00 00 00 00 00 00 00 68 4A 7E控制4号节点红灯反转:7E 42 04 00 0C FF 16 00 00 00 00 00 00 30 40 00 00 02 00 02 00 00 00 00 00 00 00 00 00 E2 94 7E 控制4号节点红灯反转:7e 42 04 00 0C FF 0e 00 00 00 00 00 00 30 40 00 00 02 00 02 00 c5 23 7e 7e 42 04 00 0C 7d 5d 0e 00 00 00 00 00 00 30 40 00 00 02 00 02 00 dd 6b 7e*2010-06-09:控制命令学习设置采样速率:设置为7秒7E 42 00 00 0C FF 16 00 00 00 0000 00 30 20 00 00 58 1B00 00 00 00 00 00 00 0000 00 F6 D0 7E 7E 42 04 00 0C FF 16 00 00 00 0000 00 30 20 00 00 58 1B00 00 00 00 00 00 00 00 00 00 6E 85 7E设置速率为5秒:hex(00 00 13 88) = dec(5000);7E 42 00 00 0C FF 16 00 00 00 0000 00 30 20 00 00 88 13 00 00 00 00 00 00 00 00 00 00 C9 32 7E 7E 42 04 00 0C FF 16 00 00 00 0000 00 30 20 00 00 88 13 00 00 00 00 00 00 00 00 00 00 51 67 7E 参考相关代码: case XCOMMAND_ACTUATE: uint16_t device = opcode-param.actuate.device; uint16_t l_state = opcode-param.actuate.state; XCommandAcctuate(device, l_state); break;*以下是关于Dio组件的简单程序代码,主要是控制I/O 接口的输入/输出,仅供参考。includes sensorboardApp;configuration TestDioC implementation components Main, TestDioM, TimerC, LedsC, DioC; Main.StdControl - TestDioM.StdControl; Main.StdControl - TimerC.StdControl; TestDioM.DioControl - DioC.StdControl; TestDioM.Dio0 - DioC.Dio0; TestDioM.Leds - LedsC.Leds; TestDioM.Timer - TimerC.Timerunique(Timer);-includes sensorboard;module TestDioM provides interface StdControl; uses interface Timer; interface Leds; interface StdControl as DioControl; interface Dio as Dio0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论