初识无线传感器网络 — Blink实验
一、实验目的
通过本实验的课程教学,主要是让用户了解以下内容:
1.初识无线传感器网络基础节点
2.了解TinyOS传感器网络操作系统编程方式
3.了解TinyOS编程模式与NesC基本概念
二、知识介绍
1.GEN-0200B新型物联网传感器节点硬件介绍
在下面实验教程中,我们使用GEN-0200B新型物联网传感器节点,如下图GEN-0200B、GEN-0200B外观。
图1-1GEN-0200B、GEN-0200B外观
无线传感器网络节点采用低功耗ZigBee无线射频芯片及16位RISC指令集MCU。该节点支持Tinyos操作系统,提供全套Tinyos源程序代码。模块可以通过动态地址方便组成传感器网络,可以实时传输采集的各种数据,模块各地址可以在每次USB下载中方便指定。整个传感模块采用低功耗设计,工作时只需要两节1.5V的5号干电池。
2.功能及参数
1.支持USB、干电池供电和太阳能(室外)供电;采用AA型电池供电时,可在室外连续工作3个月以上,通过软件适当管理,基本节点可以有效工作达一年以上;
2.CPU使用TI公司的MSP430F1611 ,射频模块为CC2420;
3.通讯半径:室内20-50m,户外75-125m;
4.通讯频段:2.4-2.4835GHZ,最大数据传输率:250Kbps;
5.存储器:内存:48K;RAM:10K;Flash:1M;
6.可见光传感器S1087,可检测光波波长范围 320nm~730nm;
7.湿度传感器SHT11检测湿度精度±3.0%RH,温度精度0.4℃;
8.USB接口具备数据连接、供电及在线编程的功能;
9.快速唤醒,时间<6uS;
10.工作电压:DC,1.8~3.6V,可以使用2节1.5V碱性电池供电;
11.待机功耗:0.6mW;
12.峰值功耗:65mW。
该节点即可以使用内置天线,亦可使用外置天线来提升通信距离;其调试接口有USB和JTAG这两种模式,扩展接口丰富,可外接十余种低功耗传感器。
在这里我们需要了解无线信号发送模型,理想模型认为节点天线信号是以圆周辐射的,如下图。
图1-2 无线信号理想模型
但是实际信号的发射收到天气因素(温度湿度等)、建筑反射等的影响,其实际模型如下图。
图1-3 无线信号实际模型
三、实验步骤
点击开始实验进入实验操作界面
1.上传实验代码
点击下图图标上传代码,上传的代码支持压缩文件zip格式。
图1-4 实验代码上传
2.编译实验代码
点击图1-5箭头标识的按钮编译实验代码,编译结果如图1-6所示,编译对应我们TinyOS下的 make telosb 命令。
图1-5 编译实验代码
图1-6 代码编译结果
3.申请SmartNode
点击下一步进入Step2页面,此时界面没有节点,我们需要申请要用到的SmartNode,点击下图箭头所指申请按钮。
图1-7申请界面
4.烧录代码
选中0号节点(选中节点后,节点编号会变黑如下图所示),选择该实验代码Blink代码,点击烧录按钮,即可将代码烧录到0号节点,界面右方有操作提示信息。
烧录对应我们TinyOS下的 make telosb install,0 bsl,/dev/ttyUSB0命令。
图1-8 节点操作界面
图1-9 操作提示信息
5.实验结果显示
观察0号节点的3个led灯,可看到它们以不同的周期闪烁。
四、实验分析
1.TinyOS编程模式分析
TinyOS的编程方式采用nesc语言,这是一种类C语言,nesc语言有几个最重要概念:组件,接口,模块。如下图BlinkC程序组件图:
图1-10 BlinkC组件图
2.nesC程序基本概念:Component(组件)
- 每一个程序都是由若干组件(component)组成;
- 组件有两种类型,一种是模块(module),另一种是配置(configuration);
- 配置文件的作用是表明组件之间的关系。模块文件的作用是将程序的具体实现放在其中;
- 每个程序都需要一个顶层的配置文件,它的名字是用程序名字命名。
从上图可以发现,BlinkC这个组件是由MainC,TimeMilliC,LedsC组件组成。
3.nesC程序基本概念:Interface
- 每个component都提供以及使用 interface;
- Component提供的interface说明了该组件为使用者提供的功能;
- Component使用的interface说明了该组件需要用到的由其他组件提供的功能。
接口常使用的关键词是command和event。
从上图中,箭头的名字表示组件与组件之间访问使用的接口。下面我们结合程序来看下组件、接口、模块的概念。
Blink目录下面包含Makefile、BlinkAppC.nc、BlinkC.nc三个文件。
BlinkAppC.nc
源码
configuration BlinkAppC //表示这是一个名为BlinkAppC的配置
{
}
implementation
{ //组件申明
components MainC, BlinkC, LedsC;
components new TimerMilliC() as Timer0;
components new TimerMilliC() as Timer1;
components new TimerMilliC() as Timer2;
//组件间使用关系定义
BlinkC -> MainC.Boot;
BlinkC.Timer0 -> Timer0;
BlinkC.Timer1 -> Timer1;
BlinkC.Timer2 -> Timer2;
BlinkC.Leds -> LedsC;
}
在implementation关键字后面的括号内是配置的具体实现。components关键字后面表明了这个配置文件所引用的组件,在这里分别是Main、BlinkC、LedsC以及三个TimerMilliC组件。最后五行表明了各组件间的provider和user的关系。A->B表示了一种关系,其中A为使用方(user),而B为提供方(provider)。命令(command)就是接口提供方已经实现的函数。事件(event)就是需要接口使用方实现的函数。
BlinkC.nc
源码
module BlinkC @safe() //声明了使用到的接口名称,具体语法可以详细查看Nesc语法。
{
uses interface Timer<TMilli> as Timer0;
uses interface Timer<TMilli> as Timer1;
uses interface Timer<TMilli> as Timer2;
uses interface Leds;
uses interface Boot;
}
implementation
{
event void Boot.booted()
{
call Timer0.startPeriodic( 250 ); //每250ms触发一次event void Timer0.fired()
call Timer1.startPeriodic( 500 );
call Timer2.startPeriodic( 1000 );
}
event void Timer0.fired()
{
dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string());
call Leds.led0Toggle(); //使Led状态反转
}
event void Timer1.fired()
{
dbg("BlinkC","Timer 1 fired @ %s \n", sim_time_string());
call Leds.led1Toggle();
}
event void Timer2.fired()
{
dbg("BlinkC", "Timer 2 fired @ %s.\n", sim_time_string());
call Leds.led2Toggle();
}
}
注意这里面定义的接口我们可以从BlinkC组件图里面看到,箭头上的接口名称就是在这个区域定义的。
第一行内容表明这是一个名为BlinkC的module,而后括号的内容表明了该module使用的接口(interface)。[注意这个module没有提供接口(provide)]
由于使用方必须实现接口中的event函数。因此我们可以看到该文件中的implement中包含了初始化Boot.booted,以及三个timer计时的event函数的具体实现。在每个timer的触发event函数内容中写明了其需要触发的内容。详见示例程序。
在模块文件的具体实现里面涉及到了TinyOS执行模型,该模块使用了MainC组件的boot接口,以事件的响应的方式作为节点上电后的响应事件。在这里涉及到了接口中常见的用法:命令(command)和事件(event)。在BlinkC模块具体实现中,从节点上电开发,触发Boot接口事件,在该事件中,调用了TimerMilliC组件的Timer接口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)