物联网实验报告.docx
《物联网实验报告.docx》由会员分享,可在线阅读,更多相关《物联网实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
物联网实验报告
物联网实验
实验一基础实验
1.1串口调试组件实验
1.1.1实验目的
在程序开发过程中,往往需要对编写的代码进行调试,前面介绍了通过LED进行调试的方法,该实验主要是介绍串口调试的方式。
本实验通过一个简单的例子让读者学会串口调试编写的代码。
1.1.2实验原理
串口调试的语句格式为,ADBG(x,args…),其中x为调试级别。
我们在Makefile中定义一个默认级别,在写代码的时候只有x不小于Makefile中定义的默认级别时,该语句才能被输出到串口,args…为打印的内容,具体的格式和c语言中printf相同。
ADBG(….)语句实际上是通过CC2430的串口Uart0输出打印语句的。
1.1.3实验步骤
1.将基站同电脑用烧录线连接好,打开基站的开关,同时将基站的烧录开关拨上去
2.用串口线将基站和PC机器连接起来
3.打开串口助手(串口助手在光盘中的目录为$(光盘目录)\辅助工具\串口助手),波特率设置为9600,其中串口号要根据自己的情况选择,点击【打开串口】。
4.打开Cygwin开发环境
5.在Cygwin界面中执行cdapps/Demos/Basic/SerialDebug,进入到串口调试实验目录下。
6.在串口调试代码目录下执行makeantc3install,进行编译和烧录。
7.烧录成功后,实验现象为串口有内容输出,输出内容如下图。
1.1.4继续实验
通过级别控制,使得某些调试语句没有被输出到串口
修改方案:
如实验原理说讲ADBG(x,args…),x是调试级别,当x小于makefile文件定义的默认级别时,此ADBG语句将不被执行。
所以可以做如下修改:
…………
#defineDBG_LEV3000
#defineRPG_LEV2000
…………
ADBG(DBG_LEV,"\r\n\r\nDEMOofSerialDebug\r\n",'x');
ADBG(DBG_LEV,"1.Thisisastring,andthisischar'%c'\r\n",'x');
ADBG(DBG_LEV,"2.NUM1:
HEX=0x%x,DEC=%d\r\n",(int)(num1),(int)(num1));
ADBG(RPG_LEV,"2.NUM2:
HEX=0x%lx,DEC=%ld\r\n",(uint32_t)(num2),(uint32_t)(num2));
ADBG(RPG_LEV,"3.FLOAT:
%f\r\n",float1);
…………
这样,第4句和第5句就不会输出。
输出内容如下图所示:
1.1.5碰到的问题
第一次将基站同电脑用烧录线连接起来时,电脑会无法识别此USB设备。
这样就不能把程序烧录到基站和节点当中。
需要先在PC机上安装此USB设备的驱动程序。
具体操作是在设备管理器当中,双击图标有感叹号的设备,点击更新驱动程序,路径为:
F:
\实验室软件\物联网\驱动程序。
1.1.6心得体会
本实验属于验证性实验,比较简单,代码也浅显易懂。
主要通过此实验学习了如何通过串口对程序进行调试,这个调试功能是分级别调试的,只有调用处的调试级别不小于makefile中定义的调试级别的时候才会被输出到串口。
1.2串口组件通信实验
1.2.1实验目的
能够掌握CC2530中的串口的通讯功能,包括串口的发送功能和接受功能以及串口波特率设置功能。
为今后的综合实验打下基础。
1.2.2实验原理
平台提供了串口通信模块组件PlatformSerialC,该组件提供了三个接口:
StdControl、UartStream以及CC2530UartControl,其中,StdControl用于控制串口通信模块的开关,UartStream提供了串口收发功能;CC2530UartControl接口用于设置串口通信得到波特率。
其中UartStream的实现,实际上是在串口层做了一个缓冲,每次将发送缓冲器的数据一个字节一个字节地往串口发送,最终达到串口的连续传输。
1.2.3实验步骤
1.将基站同电脑用烧录线连接好,打开基站的开关
2.用串口线将基站和PC机器连接起来
3.打开串口助手(串口助手在光盘中的目录为$(光盘目录)\辅助工具\串口助手),波特率设置为9600,其中串口号要根据自己的情况选择,点击【打开串口】。
4.打开Cygwin开发环境
5.在Cygwin界面中执行cdapps/Demos/Basic/SerialIO,进入到串口通讯实验目录下。
6.在串口通讯代码目录下执行makeantc3install,进行编译和烧录。
7.烧录成功后,实验现象为串口有内容输出。
8.根据串口输出的提示进行操作,串口提示为按下键盘【1】,基站的蓝灯会闪烁一下,按下键盘【2】,基站的黄灯会闪烁一下。
如果是其它按键,串口会提示“Errorkey”,如下图。
1.2.4继续实验
实现一个串口实验,在串口助手中实现回显的功能。
修改方案:
在taskvoidlightLED()函数当中,当m_echo_buf==’1’和m_echo_buf==’2’时其各自的ADBG语句后面都多加一句postshowMenuTask();
taskvoidlightLED()
{
if(m_echo_buf=='1')
{
LED_BLUE_TOGGLE;/*切换蓝色LED灯*/
ADBG(DBG_LEV,"YouchoosetotoggleBLUELED\r\n");
postshowMenuTask();
}
elseif(m_echo_buf=='2')
{
LED_YELLOW_TOGGLE;/*切换黄色LED灯*/
ADBG(DBG_LEV,"YouchoosetotoggleYELLOWLED\r\n");
postshowMenuTask();
}
else
{
ADBG(DBG_LEV,"ErrorKey%c\r\n",m_echo_buf);
postshowMenuTask();
}
}
调试结果:
1.2.5碰到的问题
此实验相对比较容易,基本无碰上什么问题。
1.2.6心得体会
此实验的代码看起来是挺容易读懂的,但是在编程实现上缺没有那么容易。
TinyOS系统事先已经将串口的发送和接受功能封装成接口来让我们调用,为我们使用串口的功能提供的极大的便利。
这是nesC的一大优势。
提供各式各样的内部组件也为我们做物联网的开发应用节省了许多编程上的时间。
1.3Flash组件读写实验
1.3.1实验目的
掌握CC2530芯片Flash的读写操作,同时为后面的综合实验做准备。
1.3.2实验原理
Flash存储器具有非易失的特点,即其存储的数据掉电后不会丢失。
因此常用来存储一些设备参数等。
Flash存储器的组织结构为:
每页2KB,共64页(CC2530-F128)。
Flash存储器的写入有别于RAM、EEPROM等其他存储介质,写Flash时,每bit可以由1变为0而不能由0变为1,必须分页擦除后才能恢复全“1”。
因此,需要修改某页中的部分字节时,需要将本页中用到的所有数据读出到RAM空间中修改,然后擦除本页,再将RAM中的数据写入。
CC2530中使用Flash控制器来处理Flash读写和擦除。
使用DMA传输和CPU直接访问SFR都可以配合Flash控制器完成写Flash等操作。
DMA写Flash:
需要写入的数据应存于XDATA空间,其首地址作为DMA的源地址,目的地址固定为FWDATA,触发事件为FLASH。
当FCTL.WRITE置“1”时触发DMA,传输长度应为4的整数倍,否则需要补充;选择字节传输,传输模式为单次模式,选择高优先级。
1.3.3实验步骤
1.将基站同电脑用烧录线连接好,打开基站的开关
2.用串口线将基站和PC机器连接起来
3.打开串口助手
4.打开Cygwin开发环境
5.在Cygwin开发环境中执行cdapps/Demos/Basic/Flash
6.在Flash目录下执行makeantc3install,进行软件的编译和烧录
7.烧录成功后,串口有内容输出,具体如下图
1.3.4继续实验
自己定义一个结构体,并且将结构体的内容写入到0x1fff8,并且在写完后将结构体的数据读取出来通原始数据进行比较。
修改方案:
将数组ieee2改为结构体,在结构体里面定义一个数组。
structSuper{
uint8_tnum[8];
};
uint8_tieee[8]={0};
uint8_tieee1[8]={7,2,4,11,21,3,92,1};
taskvoidinitTask()
{
uint8_ti;
structSupersuper;
for(i=0;i<8;i++)
{
super.num[i]=ieee1[i];
}
ADBG(DBG_LEV,"readnow\n");
callHalFlash.erase((uint8_t*)0x1fff8);
for(i=0;i<8;i+=4)
{
callHalFlash.write((uint8_t*)(0x1FFF8+i),(&super.num+i),4);
}
callHalFlash.read(ieee,(uint8_t*)0x1FFF8,8);
ADBG(DBG_LEV,"readok.\n");
for(i=0;i{
ADBG(DBG_LEV,"super.num[%d]=%d\n",(int)i,(int)ieee[i]);
}
}
调试结果:
1.3.5碰到的问题
在做继续实验的时候,原本想,像对数组初始化那样直接给结构体里面的数组赋初值,但是如果这样做了,在编译的时候就会出现错误。
在定义结构体类型的时候不能给结构体内定义的数组赋初值,在定义好结构体变量后,也不能直接给该结构体变量的数组变量赋初值。
最保险的方法就是对机构体变量的数组变量挨个赋值。
1.3.6心得体会
这次实验学习了Flash存储器读写的基本原理,并通过了实验来验证对Flash存储器的基本操作实现。
这次实验相对比较容易,就是在做继续实验的时候对nesC的结构体的基础知识了解不够深而卡了一小会儿。
这些基础实验虽然比较简单,但是在之后的综合实验上会经常使用到,为后面的综合实验做准备。
实验二点对点通信实验
2.1实验目的
1.了解节点对点通信过程
2.学会ATOS平台通讯模块(ActiveMessage)的使用
2.2实验原理
本实验使用TinyOS中的活动消息(ActiveMessage)模型实现点对点通信,活动模型组件ActiveMessageC包含了网络协议中路由层以下的部分。
在ATOS平台下,ActiveMessageC包含的主要功能有:
CSMA/CA、链路层重发、重复包判断等机制。
其中,CSMA/CA机制使节点在发送数据之前,首先去侦听信道状况,只有在信道空闲的情况下才发送数据,从而避免了数据碰撞,保证了节点间数据稳定传输;链路层重发机制是当节点数据发送失败时,链路层会重发,直到发送成功或重发次数到达设定的阈值为止,提高了数据成功到达率;重复包判断机制是节点根据发送数据包的源节点地址及数据包中的dsn域判断该包是不是重复包,如果是重复包,则不处理,防止节点收到同一个数据包的多个拷贝。
ActiveMessageC向上层提供的接口有AMSend、Receive、AMPacket、Packet、Snoop等。
AMSend接口实现数据的发送,Receive接口实现数据的接收,Snoop是接收发往其它节点的数据,AMPacket接口用于设置和提取数据包的源节点地址、目的地址等信息,Packet接口主要是得到数据包的有效数据长度(payloadlength)、最大有数据长度、有效数据的起始地址等。
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部分不需要通过射频发送出去,只是在发送前和接收后提取或写入相应的域。
2.3实验步骤
1.将基站同电脑用烧录线连接好,打开基站的开关,将基站的烧录开关拨上去
2.用串口线将基站和PC机器连接起来
3.打开串口助手
4.打开Cygwin开发环境
5.在Cygwin开发环境中执行/opt/atos/apps/Demos/RFDemos/1_P2P
6.在点对点通讯目录下执行makeantc3installGRP=01NID=01,进行软件的编译和烧录,(GRP=01NID=01的意思是将当前的点烧录为第一组,第一号)
7.烧录成功后,将基站的烧录开关拨下去,将节点对应的烧录开关拨上去,然后打开节点的开关
8.执行makeantc3reinstallGRP=01NID=02
9.重启基站
10.打开刚刚烧录的节点的开关
11.在串口助手中根据提示输入对应的操作内容
12.当节点和基站通讯成功的情况如下图
13.当节点和基站通讯失败的情况如下图
2.4继续实验
完成一个点对点的传输,让基站给单独节点发送一个命令,节点在接收到命令后将自己的蓝灯状态改变。
修改方案:
在Receive.receive(message_t*msg,void*payload.unit8_tlen)函数中做修改。
基站从串口接收到的数据存放在payload变量当中,所以只需要判断payload的长度和内容跟命令是否一样,如果一样就改变蓝灯的状态。
这里假设该命令为”BLUE”。
修改代码:
eventmessage_t*Receive.receive(message_t*msg,void*payload,uint8_tlen)
{
uint8_ti;
ADBG_APP("\r\n*Receive,len=[%d],DATA:
\r\n",ADBG_N(len));
for(i=0;i{
ADBG_APP("%c",((uint8_t*)payload)[i]);
}
/*继续实验修改部分开始*/
if(len==4)
{
if(((uint8_t*)payload)[0]=='B'&&((uint8_t*)payload)[1]=='L'&&((uint8_t*)payload)[2]=='U'&&((uint8_t*)payload)[3]=='E')
{
LED_BLUE_TOGGLE;
}
}
/*继续实验修改部分结束*/
ADBG_APP("\r\n");
LED_YELLOW_TOGGLE;
m_input_type=INPUT_ADDRESS;
postshowMenu();
}
2.5碰到的问题
1.在给节点烧录程序的时候,容易出现no-chip-systemwasdetected。
这个时候要将下载器的reset按钮按下去复位,才能使得节点顺利烧录程序。
2.按照实验步骤一步步做下来以后,基站给节点发送消息时,串口调试助手大多时间会显示SentFAIL!
。
这个问题一直得不到解决,所以只好做继续实验。
做继续实验的时候发现,虽然串口调试助手显示的是SentFAIL,但是基站还是能够通过发送命令控制蓝灯的亮灭。
这说明基站跟节点的通讯是成功的。
串口调试助手上显示的是有误的。
至于为什么会出现这个问题,我们也没有讨论出结果来。
2.6心得体会
该实验完成了基本的节点之间的通讯,该实验是基于稳定的MAC点对点传输。
所以熟练掌握这个实验是接下来研究路由协议的基础。
这个实验依然是验证性实验,但是出现的问题比前几个实验多了。
节点烧录不进去、基站与节点能够进行通信,但是串口调试助手显示失败。
在这两个地方纠结的很久,最后还是跟同学交流,才知道这些问题大家都有出现。
所以猜测可能是接口程序有问题。
实验三发射功率设置实验
3.1实验目的
了解CC2530芯片的8个输出功率等级,掌握节点输出功率的设置方法。
3.2实验原理
CC2530芯片支持8个等级的发射功率,不同功率等级发射的最远距离不一样,但是不是线性变化的。
该实验就是改变CC2530芯片的发射功率寄存器的数值来改变发射功率。
3.3实验步骤
1.将基站同电脑用烧录线连接好,打开基站的开关
2.用串口线将基站和PC机器连接起来
3.打开串口助手
4.打开Cygwin开发环境
5.在Cygwin开发环境中执行
cd/opt/atos/apps/Demos/RFDemos/3_SetTransmitPower/
6.在功率设置实验目录下执行makeantc3installGRP=01NID=02,进行软件的编译和烧录
7.烧录成功后,将基站的烧录开关拨下去,将节点对应的烧录开关拨上去,然后打开节点的开关
8.执行makeantc3reinstallGRP=01NID=01
9.重启基站
10.打开节点的开关,按照上面的提示进行操作。
在上面的界面中,按“Y”后
会显示功率列表提供选择,根据自己的选择进行功率设置,在设置完成后程序会自动给节点号为1的节点发送射频数据,如下图。
11.通过改变距离和改变发射功率级别,可以观察到发送功率对发送的有效距离的影响。
3.4继续实验
在该实验的基础上测试,在最大和最小发射功率下两个点之间通讯距离的差距。
3.5碰到的问题
与“点对点通信实验”一样,基站与节点通讯成功以后,串口调试助手依旧显示SentFAIL,但是我们可以通过查看代码知道射频接收数据的函数Receive.receive()函数里面有一条语句:
LED_YELLOW_TOGGLE;说明当节点接收到数据以后,节点的黄灯就会改变灯的状态。
我们就以此作为判断节点是否成功接收到基站发出的数据的依据。
在设置发射功率的时候,想把功率设置成14,却怎么也设置不了。
查看代码才知道16的发射功率等级对应的是十六进制的‘0’—‘F’,如果要设置发射功率为14,则应该输入‘C’。
3.6心得体会
本实验是在点对点通信实验的基础上完成的。
通过本实验,让我们了解了CC2530芯片中功率级别的概念,以及如何设置发射功率的寄存器的值。
为了解决这个实验中出现的问题,仔细阅读了所给的SetTransmitPowerM.nc文件的代码。
通过阅读、分析代码,对在TinyOS系统上进行nesC编程有了进一步地了解,也对nesC程序整体的框架有了一定的了解。
实验四星状网络通讯实验
4.1实验目的
了解星形网络的特点,掌握星形网络的实现方法。
4.2实验原理
该实验主要是完成星形网络通讯实验。
在这个实验中所有的基本节点都是直接将数据发送给基站,这样就会形成一个星形。
在节点端,每个节点都会启动一个定时器,在定时器超时的时候,节点就会开始采集传感器数据,在完成传感器数据采集后,节点就会将采集的数据发送给基站;在基站端,接收到节点的数据后,按照基站和上位机通讯的协议将数据上报给上位机软件。
4.3实验步骤
1.将基站同电脑用烧录线连接好,打开基站的开关
2.用串口线将基站和PC机器连接起来
3.打开Cygwin开发环境
4.在Cygwin开发环境中执行cd/opt/atos/apps/Atosenet/ANTStartnet/Base
5.在功率设置实验目录下执行makeantc3installGRP=01NID=01,进行软件的编译和烧录
6.烧录成功后,将基站的烧录开关拨下去,将节点对应的烧录开关拨上去,然后打开节点的开关
7.执行cd/opt/atos/apps/Atosenet/ANTStartnet/Node,进入到星形实验的节点目录。
8.在该目录下面执行makeantc3installASO=LIGHTTYPE3GRP=01NID=02,对节点进行烧录。
9.依次烧录剩下的节点,确保每个节点的NID是不一样的
10.将节点和基站的天线都插好,并且将节点的开关都打开。
11.运行光监控软件,如果没有安装,请先安装该软件,这个软件的安装包在【实验光盘\演示中心\LightField.msi】。
12.选择正确的串口号,点击运行标志,运行之后的界面如下。
13.从运行的图片中可以看到一个星形的网络。
如果想看到一个更大的星形的网络,可以多烧录几个节点。
4.4继续实验
在该实验的基础上,尝试让基站的ID变为2。
每个基本节点都将自己的目的地址变为2。
并且最终通讯形成星形网络。
修改方案:
将node文件夹里面的makefile文件打开,将PFLAGS+=-DATE_PROFILE_TABLE_CONFIG改为PFLAGS+=-DATE_PROFILE_TABLE_CONFIG=2。
这个修改的目的是为了设置星形网络的父节点。
ATE_PROFILE_TABLE_CONFIG的值就是静态路由默认的目的节点的ID号。
所以这样一改,就能使每个基本节点都将自己的目的地址变为2。
4.5碰到的问题
按照步骤将所给的程序分别烧录到基站和节点以后,会发现网络拓扑图所示的网络非星形网络,而是树状网络。
询问助教才知道这是没有对控制星形网络父节点的变量赋初值的缘故。
需要将Node文件夹里的makefile文件的ATE_PROFILE_TABLE_CONFIG改为PFLAGS+=-DATE_PROFILE_TABLE_CONFIG=1。
这样得到的网络拓扑图才是正确的。
按照继续实验的要求修改makefile文件后,烧录时给基站赋予的节点ID值也改为了2,但是出来的网络拓扑图,其星形网络的父节点的ID仍然是1。
这个问题其他的同学也出现过。
但是没有讨论出解决方案。
4.6心得体会
这个实验是每个基本节点都将采集到的传感器数据发送给基站,所以使用的是星形网络。
该网络只需要基本节点将数据发送到基站,而不需要基本节点之间进行通讯,也不需要基站向基本节点发送消息,所以基本节点在每次发送的时候只需要填写