无线传感器网络实验报告班级: _14104341__ 姓名:__代姝佳__ 学号:_1410400111_时间:_2017-4-12__教师:_陈飞云_成绩:_________实验名称:一、实验目的1.了解点对点通信过程。
2.学会ATOS平台通讯模块(ActiveMessage)的使用。
二、实验原理本实验使用TinyOS中的活动消息(PlatformMacC)模型实现点对点通信,活动模型组件PlatformMacC包含了网络协议中路由层以下的部分。
在ATOS平台下,PlatformMacC包含的主要功能有:CSMA/CA、链路层重发、重复包判断等机制。
其中,CSMA/CA机制使节点在发送数据之前,首先去侦听信道状况,只有在信道空闲的情况下才发送数据,从而避免了数据碰撞,保证了节点间数据稳定传输;链路层重发机制是当节点数据发送失败时,链路层会重发,直到发送成功或重发次数到达设定的阈值为止,提高了数据成功到达率;重复包判断机制是节点根据发送数据包的源节点地址及数据包中的dsn域判断该包是不是重复包,如果是重复包,则不处理,防止节点收到同一个数据包的多个拷贝。
PlatformMacC向上层提供的接口有AMSend、Receive、AMPacket、Packet、Snoop等。
AMSend接口实现数据的发送,Receive接口实现数据的接收,Snoop是接收发往其它节点的数据,AMPacket接口用于设置和提取数据包的源节点地址、目的地址等信息,Packet接口主要是得到数据包的有效数据长度(payload length)、最大有数据长度、有效数据的起始地址等。
AMSend、Receive、Snoop都是参数化接口,参数为一个8位的id号,类似于TCP/IP协议中的端口号。
两个节点通信时,发送节点使用的AMSend接口的参数id必须与接收节点的Receive接口的参数id一致。
在TinyOS操作系统下,所有的数据包都封装到一个叫message_t的结构体中。
message_t结构体包含四个部分:header、data、footer、metadata四个部分。
其中header中包含了数据包长度、fcf、dsn、源地址、目的地址等信息;metadata包含了rssi等信息,详见cc2420.h、Message.h、platform_message.h。
其中,metadata部分不需要通过射频发送出去,只是在发送前和接收后提取或写入相应的域。
三、实验内容1.将J-Link对应端插入ATOS多模汇聚节点的CN3引脚,将ATOS多模汇聚节点上的STM32同电脑连接起来。
2.打开SEGGER/J-Link arm v4.081/J-flash arm软件,点击target/connect,连接成功后,点击file/open,按照路径光盘A/02 演示中心/STM32相关HEX打开M3GW-PC.hex,再点击target/program,其烧录到ATOS多模汇聚节点的STM32芯片中。
烧录成功后,最后点击target/start application在多模汇聚节点的STM32芯片上运行程序。
3.用串口线将ATOS多模汇聚节点和PC机器连接起来。
4.将ATOS多模汇聚节点与任一WIFI节点插上天线。
5.将ATOS多模汇聚节点同电脑用烧录线连接好,打开ATOS多模汇聚节点的开关,同时将ATOS多模汇聚节点的编程开关打开。
6.打开Cygwin开发环境。
7.在Cygwin开发环境中执行/opt/atos/apps/Demos/RFDemos/1_P2P。
8.在点对点通讯目录下执行make antc5 install GRP=01 NID=01,进行软件的编译和烧录,(GRP=01 NID=01 的意思是将当前的点烧录为第一组,第一号)。
9.烧录成功后,将ATOS多模汇聚节点的编程开关关闭,然后打开WIFI节点的开关,并将其对应的编程开关打开。
10.执行make antc5 reinstall GRP=01 NID=02。
11.打开串口助手,设置波特率与串口号。
12.重启ATOS多模汇聚节点,串口助手中有如下的内容:13.重启刚刚烧录的WIFI节点的开关。
14.通过电脑在串口助手窗口中输入2,点回车键,当出现“* To Send:”后,输入“hello”,再点击回车键。
15.当WIFI节点和ATOS多模汇聚节点通讯成功的情况如下图:四、实验过程1)详细的调试步骤1.将J-Link对应端插入ATOS多模汇聚节点的CN3引脚,将ATOS多模汇聚节点上的STM322.同电脑连接起来。
3.打开SEGGER/J-Link arm v4.081/J-flash arm软件,点击target/connect,连接成功后,点击file/open,按照路径光盘A/02 演示中心/STM32相关HEX打开M3GW-PC.hex,再点击target/program,其烧录到ATOS多模汇聚节点的STM32芯片中。
烧录成功后,最后点击target/start application在多模汇聚节点的STM32芯片上运行程序。
4.用串口线将ATOS多模汇聚节点和PC机器连接起来。
5.将ATOS多模汇聚节点与任一WIFI节点插上天线。
6.将ATOS多模汇聚节点同电脑用烧录线连接好,打开ATOS多模汇聚节点的开关,同时将7.ATOS多模汇聚节点的编程开关打开。
8.打开Cygwin开发环境。
9.在Cygwin开发环境中执行/opt/atos/apps/Demos/RFDemos/1_P2P。
10.在点对点通讯目录下执行make antc5 install GRP=01 NID=01,进行软件的编译和烧录,11.(GRP=01 NID=01 的意思是将当前的点烧录为第一组,第一号)。
12.烧录成功后,将ATOS多模汇聚节点的编程开关关闭,然后打开WIFI节点的开关,并将其13.对应的编程开关打开。
14.执行make antc5 reinstall GRP=01 NID=02。
15.打开串口助手,设置波特率与串口号。
16.重启ATOS多模汇聚节点,串口助手中有如下的内容:17.重启刚刚烧录的WIFI节点的开关。
18.通过电脑在串口助手窗口中输入2,点回车键,当出现“* To Send:”后,输入“hello”,再点击回车键。
19.当WIFI节点和ATOS多模汇聚节点通讯成功的情况如下图:2)实验现象1.通过电脑在串口助手窗口中输入2,点回车键,当出现“* To Send:”后,输入“hello”,再点击回车键。
2.当WIFI节点和ATOS多模汇聚节点通讯成功的情况如下图:3)必要的实验数据//配置组件configuration P2PC{}implementation{components P2PM;components MainC;P2PM.Boot -> MainC.Boot;/* 串口收发组件*/components PlatformSerialC;P2PM.UartStdControl -> PlatformSerialC;P2PM.UartStream -> PlatformSerialC;/*活动消息组件*/components new PlatformMacC(123);components AtosMacC;P2PM.AtosControl -> AtosMacC;P2PM.AMPacket -> PlatformMacC;P2PM.Packet -> PlatformMacC;P2PM.AMSend -> PlatformMacC;P2PM.Receive ->PlatformMacC;}//模块组件#define DBG_LEV 1000module P2PM{uses {interface Boot;interface AtosControl;interface StdControl as UartStdControl;interface UartStream;interface AMSend;interface Receive;interface AMPacket;interface Packet;}}implementation{enum{MAX_ADDRESS_LEN = 5,INPUT_ADDRESS = 0,INPUT_DATA = 1,};message_t m_msg;uint8_t m_len = 0;char m_address_str[MAX_ADDRESS_LEN] = {0};uint8_t m_address_index = 0;uint8_t m_input_type = 0;/* 显示菜单*/task void showMenu(){if( m_input_type == INPUT_DATA){/*等待输入欲发送的数据*/ADBG_APP( "\r\n* To Send:\r\n");}else{/*等待输入欲发送的地址*/ADBG_APP( "\r\n###################################################\r\n* MY NodeId = 0x%x, Group=0x%x, destination ?\r\n",ADBG_N(call AMPacket.address()),ADBG_N(TOS_IEEE_PANID));m_input_type = INPUT_ADDRESS;m_address_index = 0;}}/*将从串口输入的地址字符串转化为真实地址*/uint16_t getDestAddress(){uint16_t address = 0;uint8_t i = 0;if(m_address_index > MAX_ADDRESS_LEN){m_address_index = MAX_ADDRESS_LEN -1;}for ( i=0; i < m_address_index; ++i){uint8_t digital = m_address_str[i];if(digital >= 'A' && digital <= 'F'){digital = digital - 'A' + 10;}else if(digital >= 'a' && digital <= 'f'){digital = digital - 'a' + 10;}else if(digital >= '0' && digital <= '9'){digital = digital - '0';}address = address*16 +digital;}return address;}/* 发送数据*/task void sendData(){uint8_t i;uint8_t* payload = call Packet.getPayload(&m_msg, NULL);uint16_t address = call AMPacket.address();uint16_t dest_address = getDestAddress();ADBG_APP( "\r\n\r\n* Sending ... from [%d], to [%d], len=[%d]\r\n", ADBG_N(address),ADBG_N(dest_address),ADBG_N(m_len));call AMSend.send(dest_address, &m_msg, m_len);}/*发送完处理*/event void AMSend.sendDone(message_t* msg, error_t result){//ADBG_APP( "send done\n");ADBG_APP( "* Sent%s!\r\n", (result == SUCCESS) ? "OK" : "FAIL");if (result == SUCCESS){LED_BLUE_TOGGLE;}else{LED_YELLOW_TOGGLE;}m_len = 0;m_input_type = INPUT_ADDRESS;post showMenu();}/* 节点启动完毕*/event void Boot.booted(){call AtosControl.start(); /*开启射频*/call UartStdControl.start(); /*开启串口通信*/LED_YELLOW_OFF;LED_BLUE_OFF;ADBG_APP( "\r\n###############################################\r\n");ADBG_APP( " [P2PDEMO] My Address = 0x%x, Group = 0x%x\r\n", ADBG_N(call AMPacket.address()), ADBG_N(TOS_IEEE_PANID));ADBG_APP( "###############################################\r\n");m_input_type = INPUT_ADDRESS;post showMenu();}/*从串口接收数据事件,来一个8位数自动触发该事件,****串口命令***/async event void UartStream.receivedByte(uint8_t c){if(c != '\r'){if (m_input_type == INPUT_DATA) /*输入的为数据*/{uint8_t* payload = (uint8_t*)call Packet.getPayload(&m_msg, NULL);if(m_len >= call Packet.maxPayloadLength()){return;}payload[m_len++] = c;ADBG_APP( "%c", c);if(m_len < call Packet.maxPayloadLength()){return;}}else /*输入的为地址*/{if(m_address_index < MAX_ADDRESS_LEN){m_address_str[m_address_index++] = c;ADBG_APP( "%c", c);}if(m_address_index < MAX_ADDRESS_LEN){return;}}}/*按下回车键或者到达最大长度,则处理*/if(m_input_type == INPUT_DA TA){post sendData();}else{/*地址处理完毕,准备输入数据*/m_input_type = INPUT_DATA;post showMenu();}}/** 实现接口UartStream 接口中的事件*/async event void UartStream.sendDone(uint8_t* buf, uint16_t len, error_t error) {}async event void UartStream.receiveDone(uint8_t* buf, uint16_t len, error_t error) {}/*射频接收数据,*****************射频接收命令*/event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) {uint8_t i;ADBG_APP( "\r\n*Receive, len = [%d], DATA:\r\n", ADBG_N(len));for(i=0; i < len; i++){ADBG_APP( "%c", ((uint8_t*)payload)[i]);}ADBG_APP( "\r\n");LED_YELLOW_TOGGLE;m_input_type = INPUT_ADDRESS;}五、软件组成1.ATOS物联网教学实验平台实验箱2.天线两个3.烧录线一根4.平行串口线一根5.J-Link一个六、总结分析该实验完成了基本的节点之间的通讯,该实验是基于稳定的MAC点对点传输。