中文版LightweightMeshDeveloperGuideApplication.docx
《中文版LightweightMeshDeveloperGuideApplication.docx》由会员分享,可在线阅读,更多相关《中文版LightweightMeshDeveloperGuideApplication.docx(46页珍藏版)》请在冰豆网上搜索。
中文版LightweightMeshDeveloperGuideApplication
翻译有些错误的地方,请各位修改指导
LightweightMesh开发指南
本文的功能:
●AtmelLightweightMesh协议栈的功能和API
●LightweightMesh软件开发工具包(SDK)
说明:
这份文档描述了LightweightMesh的功能——简单易用的爱特梅尔公司专有的低功率无线网状网络协议。
这份文档能被认为是完整和全面的协议说明和相关API规范。
本文还描述了协议的参考实现。
LightweightMesh主要针对系统设计师、嵌入式程序员和硬件工程师进行原型机设计评估和部署无线解决方案产品。
LightweightMesh以软件开发工具包方式提供,其中包括完整的堆栈组件的源代码,以及样品吗应用程序。
使用者被认为是熟悉C编程语言,了解一些嵌入式系统推荐,但不是必需的。
1、概述
1.1目标应用
LightweightMesh旨在解决需要广泛无线连接的应用程序。
这些应用程序包括:
●远程控制
●安防和保险
●自动抄表
●智能家居和楼宇自动化
●玩具和教学仪器
1.2硬件要求
LightweightMesh旨在工作在所有Atmel的IEEE®802.15.4的收发芯片和片上系统。
当前的协议栈可以工作在基于AVR®-和ARM®的单片机上,但考虑到极端的可移植性和较低的资源需求,它可以运行在几乎任何Atmel单片机。
支持平台的完整列表可以在LightweightMeshGettingStartedGuide中查看。
1.3缩写和术语
AODV——AODV路由协议
(AODV(Adhocon-demanddistancevectorrouting)是一种源驱动路由协议。
当一个节点需要给网络中的其他节点传送信息时,如果没有到达目标节点的路由,则必须先以多播的形式发出RREQ(路由请求)报文。
RREQ报文中记录着发起节点和目标节点的网络层地址,邻近节点收到RREQ,首先判断目标节点是否为自己。
如果是,则向发起节点发送RREP(路由回应);如果不是,则首先在路由表中查找是否有到达目标节点的路由,如果有,则向源节点单播RREP,否则继续转发RREQ进行查找。
)
API——应用程序接口
Device,Node——物理设备作为网络的一部分
GPIO——通用输入输出
LQI——链路质量指示
(LQI(linkqualityindicator)是链路质量指示,表示接收数据帧的能量与质量。
其大小基于信号强度以及检测到的信噪比(SNR),由MAC(mediaaccesscontrol)层计算得到并提供给上一层,一般与正确接收到数据帧的概率有关。
IEEE802.15.4标准定义了链路质量:
指示(LQI)计量的就是所收到的数据包的强度和/或质量。
IEEE802.15.4标准要求的LQI值限制在范围0到255,至少需要8个唯一的值。
)
MAC——介质访问控制
MCU——微控制器
MIC——消息完整性编码
NWK——网络层
PAN——个人局域网络
PHY——物理层
RAM——可读写存储器
RSSI——接收信号强度指示器
2.LightweightMesh协议栈概述
2.1功能
LightweightMesh协议栈的实现现状具有以下特点:
●配置和使用简单
●在一个网络里多达65535个节点(理论极限)
●在一个信道上多达65535个独立的局域网络
●15个独立的应用程序端点
●没有专门的节点需要去启动网络
●没有定期业务流量占用带宽
●两种不同类型的节点:
路由(网络地址为<0x8000)
非路由(网络地址为0x8000≥)
●一旦接通电源节点就准备好发送和接收数据;没有什么特别的加入过程
●节点之间没有父子关系
●非路由节点能够发送和接收数据至/从任何其他节点(包括非路由节点),但是它们永远不会被用于路由目的
●如果到达目的是未知,路由发现是将会自动发生的
●路由表将被自动更新,根据从接收到的和发送的帧中的数据
●可选支持AODV路由
●可以选择多播通信
●重复帧(广播或单播多路径)被拒绝
●占用硬件少(8KBFlash和4KBRAM是一个典型例子)
22.网络拓扑
网络拓扑结构和可能的设备类型由图2-1所示。
以蓝色显示的节点是路由节点;他们形成了典型的网络核心和期望用主电源供电。
在绿色显示的节点都是非路由节点;它们是网络的一部分,并且它们可以发送和接收的数据,只要它们在无线覆盖范围内,但它们不是一直工作的(它们可以休眠,或移动出无线覆盖范围等)。
非路由节点将不被用于路由的目的,因此它们不能充当范围扩展器,并且通常会位于网络的边缘。
2.3提供的服务
LightweightMesh提供了以下核心服务:
●基本数据服务(发送和接收数据)
●致谢
●路由
●基本安全
●无线收发器的功率管理
●接口的无线收发器的高级功能(加密,能量检测,随机数等)
LightweightMesh的应用程序负责:
●网络管理(发现,连接,调试等)
●先进的网络运行情况(沉睡的路由器,亲子关系,数据传输到睡觉的节点等)
●数据发送失败后重发
●定义消息负载格式
●高级安全
●MCU的电源管理
●接口硬件外设(ADC,PWM,EEPROM等)
3.LightweightMesh的结构
3.1结构亮点
LightweightMesh高层体系结构表示在图3-1。
LightweightMesh代码分离成若干个,每个均提供了一组用于用户访问的API。
该协议栈的设计提供唯一的功能用于无线通信的,并且因此预计剩余部分用于被用户创建,或者由第三方库提供,如果需要的话。
●硬件抽象层(HAL)提供基本的硬件相关的功能,如硬件定时器,睡眠控制,对于无线电接口的GPIO接入
●无线物理层(PHY)提供用于无线电收发的访问。
其中有些只访问网络层(请求发送数据时,数据指示);他们中的一些可以从应用程序中使用(信道选择,随机数的产生,能量检测等)
●网络层(NWK)提供核心协议栈功能,这将在详细贯穿本文献中描述
●系统服务提供所有的层普通功能,一些必要的正常操作协议栈的常用功能。
系统服务包括基本类型和定义,软件定时器,默认的配置参数,加密模块接入等
●应用服务不是本协议栈必须要求的模块,但是常见于大多数应用。
目前,这种服务的唯一应用就是在空中升级(OTA)。
应用服务超出本文献的讨论范围
3.2命名约定
LightweightMesh使用一套定义良好的命名约定,使人们很容易阅读源代码,并
缩短应用开发时间。
以下是一些基本的规则:
●每个API函数名是由函数所在的层的名称作为前缀。
例如,该NWK_SetAddr()是网络层的
●每个函数名前缀后面是一个下划线字符的描述和分离前缀函数名
●描述函数名可能有所需的物品,工业或CONF后缀,表明以下几点:
◆REQ对应于协议栈用户程序中的请求(例如,NWK_DataReq())
◆IND对应于协议栈用户应用的事件异步指示传播的到来(例如,NWK_DataInd())
◆CONF对应于用户定义的回调的异步请求,证实了请求执行
●每个结构和类型名带有后缀_t,标注形式
●枚举和宏变量名是大写字母
所以建议应用程序开发者坚持上述命名约定在用户应用程序。
3.3文件系统布局
SDK的文件系统布局密切反映LightweightMesh的架构。
LightweightMeshSDK文件系统布局
4网络层规范
4.1通用LightweightMesh帧格式
LightweightMesh网络报头和有效载荷应用的是标准IEEE805.15.4的内部封装数据帧有效载荷(参见[1]),但堆栈本身不遵守标准,因此它不会接收和处理的IEEE805.15.4命令帧。
图4-1显示了IEEE805.15.4MAC报头组成的通用帧格式,网络报头,应用程序有效载荷,可选的消息完整性代码(MIC)和校验和(CRC)
以下设置用于MAC帧控制字段如[1]:
●帧类型:
数据
●安全启用:
假
●帧未完成:
假
●确认请求:
真正的单播帧和假的广播帧
●PANID压缩:
真
●目标寻址模式:
16位短地址
●框架版本:
0
●源寻址模式:
16位短地址
这给出了对于可以由协议栈生成和确认的MAC帧控制字段的两个可能值:
0x8841为广播帧,并0x8861用于单播帧。
4.1.1帧控制字段(FrameControlField)
帧控制字段是1个字节的长度,并包含控制信息的帧。
帧控制字段被格式化为示于图4-2。
4.1.1.1确认请求子字段(AcknowledgmentRequestSubfield)
确认请求子字段是1个位的长度,并指定从一个确认是否需要目的节点。
如果该子字段被设置为1,目的节点必须发送,如果帧的确认命令被接收和处理。
如果该子字段被设置为零,所述目的地装置不发送确认帧(例外情况见4.3节)。
4.1.1.2安全启用子字段(SecurityEnabledSubfield)
安全启用字段的长度为1个位,如果该帧有效载荷进行加密,则应被设置为1,否则,就设置为零。
如果安全性已启用子字段设置为1,消息完整性代码(MIC)应存在
4.1.1.3本地链路子字段(LinkLocalSubfield)
本地链路字段的长度为1个位,并且它可以被设置为1,以防止转播一个相邻节点的数据帧。
此字段是仅适用于广播帧,并且对单播帧没有影响。
4.1.1.4组播子字段(MulticastSubfield)
组播字段的长度为1个位,如果目的地址是一组地址,应被设置为1,如果不是应被设置为0。
如果组播字段被设置为1,组播部首应存在。
4.1.1.5保留子字段(ReservedSubfield)
保留字段为4位的长度,它应被设置成0。
4.1.2序列号字段(SequenceNumberField)
序列号字段的长度是1个字节,并指定该帧的序列标识符。
节点每发送一个帧,该序列编号字段应增加1,它不应该改变路由帧。
4.1.3源地址字段(SourceAddressField)
源地址字段的长度为2个字节,并指定该节点发起该帧的网络地址。
4.1.4目的地址域(DestinationAddressField)
目标地址字段的长度为2个字节,并指定目标的网络地址,不满足多播消息。
目标地址字段的含义由组播subf定义网络帧控制字段。
目标地址字段可以被设置为0xFF为广播帧。
4.1.5源端点字段(SourceEndpointField)
源端点字段是4个位的长度,并指定源端点标识符。
0值保留了协议栈命令端点。
4.1.6目标端点字段(DestinationEndpointField)
目标端点字段是4个位的长度,并指定目标端点标识符。
0值被保留一个协议栈命令端点。
4.1.7组播头字段(MulticastHeaderField)
组播头字段的长度为2个字节,并包含控制信息头字段的格式说明如图4-3。
4.1.7.1非成员范围子字段(Non-memberRadiusSubfield)
非成员范围子字段为4个位的长度,并为剩余的范围(跳数),且不属于由所述目的地址域字段所指示的群组节点分配一个帧。
如果节点不属于组,且收到一个非成员范围子字段等于0应该指示这个帧到应用,但是不应该在发送它。
在起始节点,此子字段应与最大非成员范围子字段(MaximumNon-memberRadiusSubfield)具有相同的值。
在重新发送数据帧前,属于由所述目的地址域表示的组节点应设置非成员范围子字段等于最大非成员范围子字段。
。
4.1.7.2最大非成员范围子字段(MaximumNon-memberRadiusSubfield)
最大非成员范围子字段为4个位的长度,并指定最大半径(跳数),为不属于目的地址域所表示的组的节点分配一个帧。
这个字段的值是由起始节点设置,并且不会被再发送节点修改。
4.1.7.3成员范围子字段(MemberRadiusSubfield)
成员范围子字段为4个位的长度,并指定其余的半径(跳数),以哪些节点是属于由所述目的地址域中指示将分配一个帧的组。
如果属于该组的一个节点接收到的帧的成员范围子字段等于0,应该将这个帧指明到应用,但不应该进一步的重新发送。
在起始节点此子字段应与最大成员范围子字段(MaximumMemberRadiusSubfield)具有相同的值。
在重新发送一个帧之前,不属于目的地址域字段应设置成员范围子字段值等于最大成员范围子字段(MaximumMemberRadiusSubfield)值。
4.1.7.4最大成员范围子字段(MaximumMemberRadiusSubfield)
最大成员范围子字段为4个位的长度,并指定最大半径(跳数),为不属于目的地址域所表示的组的节点分配一个帧。
这个字段的值是由起始节点设置,并且不会被再发送节点修改。
4.2各个命令帧的格式(FormatofIndividualCommandFrames)
4.2.1应答命令帧格式(AcknowledgmentCommandFrameFormat)
应答命令帧是响应所接收到的帧,如果应答请求的子字段(AckRequestsubfield)网络帧控制字段(NetworkFrameControlfield)被设定为1。
另外本地的应答命令帧是在路由发现过程中建立反向路由时形成的(见4.3节的详细说明)。
图4-4显示了应答命令帧格式。
4.2.1.1命令ID字段(CommandIDField)
命令ID字段的长度是1个字节,它包含了一个恒定值(0×00)。
4.2.1.2序列号字段(SequenceNumberField)
序列号字段的长度是1个字节,它包含了一个正被确认的网络序列号
4.2.1.3控制消息字段(ControlMessageField)
该控制消息字段的长度为1个字节,它可在发送端被设置为任意值。
此域可被用于提供额外的指令发送到接收侧。
4.2.2路由错误命令帧格式(RouteErrorCommandFrameFormat)
路由错误命令帧是在当前接收到的数据帧路由需要的情况下和节点无法找到有效的路由表项进行路由选择时产生。
图4-5显示了路线错误命令帧格式。
4.2.2.1命令ID字段(CommandIDField)
命令ID字段的长度是1个字节,它包含了一个恒定值(0×01)。
4.2.2.2源地址字段(SourceAddressField)
源地址字段的长度为2个字节,它包含了除路由地址外的帧的网络地址数据。
4.2.2.3目的地址字段(DestinationAddressField)
目标地址字段的长度为2个字节,并且它包含一个目的地网络地址或组ID(作为组播地址(MulticastField)表示)从数据帧中,不能为路由帧。
4.2.2.4组播字段(MulticastField)
组播字段的长度是1个字节,如果目标地址字段(DestinationAddressfield)包含了网络地址,它应被设置为0,如果目的地址字段(DestinationAddressfield)包含一个组ID,它应被设置为0。
4.2.3路由请求命令帧格式(RouteRequestCommandFrameFormat)
路由请求命令帧是响应于应用程序的请求,生成要发送的数据,在路由表不包含目的地址的有效条目的情况下。
图4-6显示了路由请求命令帧格式。
4.2.3.1命令ID字段(CommandIDField)
命令ID字段的长度是1个字节,它包含了一个恒定值(0x02)。
4.2.3.2源地址字段(SourceAddressField)
源地址字段的长度为2个字节,它包含不是路由帧的源网络地址。
4.2.3.3目的地址字段(DestinationAddressField)
目标地址字段的长度为2个字节,包含目的地节点的网络地址或组网络地址即通过组播字段(Multicastfield)来表示的目标组的ID。
4.2.3.4组播字段(MulticastField)
组播字段的长度是1个字节,如果目标地址字段(DestinationAddressfield)包含了网络地址,它应被设置为0,如果目的地址字段(DestinationAddressfield)包含一个组ID,它应被设置为0。
4.2.3.5链路质量字段
链路质量字段的长度是1个字节,包含潜在跳向目的地路由链路的质量值。
源节点应该设置链路质量字段为255。
每个节点重新发送路由请求命令帧必须更新的链路质量字段值与LQI所接收的帧的值。
4.2.4路由应答命令帧格式(RouteReplyCommandFrameFormat)
路由应答命令帧是新发现的路线优于任何先前发现的路径的情况下,响应所接收到的路由请求命令帧(参见4.3节了解详细信息)更好。
图4-7说明路由应答命令帧格式。
4.2.4.1命令ID字段(CommandIDField)
命令ID字段的长度是1个字节,它包含了一个恒定值(0x03)。
4.2.4.2源地址字段(SourceAddressField)
源地址字段的长度为2个字节,它包含不是路由帧的源网络地址。
4.2.4.3目的地址字段(DestinationAddressField)
目标地址字段的长度为2个字节,包含目的地节点的网络地址或组网络地址即通过组播字段(Multicastfield)来表示的目标组的ID。
4.2.4.4组播字段(MulticastField)
组播字段的长度是1个字节,如果目标地址字段(DestinationAddressfield)包含了网络地址,它应被设置为0,如果目的地址字段(DestinationAddressfield)包含一个组ID,它应被设置为0。
4.2.4.5前向链路质量字段(ForwardLinkQualityField)
前向链路质量字段的长度是1个字节,链路质量字段的值来自于相应的路由请求命令帧(RouteRequestCommandFrame)。
这个字段的值不应被修改,在重新发送响应源节点时
4.2.4.6反向链路质量字段
反向链路质量字段的长度是1个字节,它包含所发现的路径的链路质量值累计到源节点的所有路由跳数。
源节点应设置反向链路质量字段为255。
每个节点重新发送路由回复命令帧(RouteReplyCommandframe)必须更新接收到的链路质量字段(LQI)的值。
反向链路质量的值被用于在路由发现过程来比较路由。
4.3路由
4.3.1概述
LightweightMesh支持两种路由算法:
●本机的路由
这是原来的LightweightMesh算法;它很简单,结构紧凑,不使用额外的命令来执行路由发现但这种算法不能保证发现的路线是最佳的,因为它仅执行局部优化。
它也不能用于发现路由的组。
●AODV路由
这是更标准的算法;它使用额外的命令来执行路由发现和路由发现进程可能耗费更长的时间。
这个算法选择最优路由,并且可以被用于发现路由到组。
这两种路由算法都使用路由表的操作。
路由表由路由表项组成。
每个路由条目包括在表4-1中描述的字段。
路由表项具有相同的格式用于两种算法,但他们使用略有不同的方法来进入维修。
对应翻译如下:
表4-1路由表条目字段
名称
多少位长度
描述
固定位(fixed)
1
表示一个固定的条目,即使目的地节点不可到达,也不能去掉。
协议栈永远不会为此字段创建一个设置值为1的条目,但是应用可以利用它来创建静态路由
组播(multicast)
1
表示组播表项。
如果此字段设置为1,则dstAddr字段包含一个组ID
保留的(reserved)
2
保留位,应设置为0
得分(score)
4
表示表单项的正常情况。
如果该字段的值达到0,相应条目从路由表中删除
网络地址(dstAddr)
16
网络地址或通过组播字段指明的组ID
nextHopAddr
16
朝着目的地节点路线下一跳的节点的网络地址
排名(Rank)
8
表示经常使用的表项。
在路由表满了或有新表项加入的情况下最低优先级的表项将被最先替换掉
LQI
8
路由链路质量:
•对于本机的路由算法,此字段包含最后从节点收到的LQI和下一跳地址。
这一字段的值可能会被协议栈实时更新
•对于AODV路由算法此字段包含反向链路质量字段的值
来自于路由应答命令用于建立路由线路。
在路由被发现之后协议栈不会修改此字段的值
路由表条目可以通过一组API被应用程序访问,这个将在第5章中描述。
应用程序对路由表的修改是没有进过验证的,所以应用程序需要格外小心,应用程序必须确保在任何时间存在至少一个条目的路由表是不固定的,可用于分配的。
路由发现目标地址的目的是节点的实际网络地址,如果组播支持被禁用,而目的地地址字段和组播标志的组合,如果组播支持已启用。
4.3.2本机路由
4.3.2.1路由发现和建立
LightweightMesh的本地路由算法没有特殊的路由发现过程;路线发现为正常的数据传输的一部分。
这样一来,不具有路由的惩罚是非常低的,和发送一个常规的广播帧的成本做对比。
下面的路由发现算法说明。
节点标记为“1”,“2”和“3”的路由节点。
这个例子做以下假设:
•节点1希望将数据发送到节点3
•所有节点上的路由表是空的
•节点1和节点3之间没有直接的路径
初始的网络配置被显示在图4-8。
图4-8最初的网络配置
图4-9第一个数据传输涉及路由发现的步骤
1.节点1发送网络目的地址设置帧到3的,而MAC目标地址设置为0xFF。
2.节点2接收到这个帧,增加节点1的表项到自己的路由表。
图4-10。
数据传输涉及路由发现的第二个步骤
3.节点2广播帧(由于MAC目标地址设置为0xFF)。
4.节点3接收该帧,增加节点2的表项到自己的路由表。
5.节点3添加了节点1到其路由表条目(从网络源地址)。
图4-11第三个数据传输涉及路由发现的步骤
6.节点3处理数据帧,并发送一个确认帧,即使没有什么请求。
这样做是建立一个反向路由。
节点3现在知道的路线到节点1,因此单播帧被发送。
图4-12数据传输涉及路由发现的最后一步
7.节点2接收该帧,并将到节点3的路线保存到自己的路由表。
8.节点2具有用于节点1的路由表项,所以它的路由所接收的帧到其最终目的地。
9.节点1接收该帧,并将到节点3的路线保存到自己的路由表。
图4-13数据传输涉及路由发现后,最终的网络配置
现在节点1和节点3之间的路线建立了,它将被用于以后的数据帧。
注意,在路由发现的过程中,沿路线的所有节点学习了如何将数据路由到目的节点。
这些路由条目将用于路由目的不需要进一步进行路由发现过程。
最后,只要有足够大的路由表,所有节点网络会发现所有可能的(使用)的路线。
另外请注意,对于某些节点发现的到某个节点的路线在路由表里面不止一个条目。
这是路由算法的共同属性,在选择路由表大小时被记住和预计路由大量的流量。
同时路由表条数有一个上界,它是在网络中的节点的最大数目。