
《Lorawan协议说明书》由会员分享,可在线阅读,更多相关《Lorawan协议说明书(48页珍藏版)》请在文档大全上搜索。
1、第1章介绍本文档描述了LoRaWAN网络协议,是针对电池供电的终端设备(不管移动还是固定位置)进行优化的一套网络协议。LoRaWAN网络通常采用星型拓扑结构, 由拓扑中的网关来转发终端与后台网络服务器间的消息。网关通过标准IP连接来接入网络服务器,而终端则通过单跳的LoRa或者FSK来和一个或多个网关通讯。虽然主要传输方式是终端上行传输给网络服务器,但所有的传输通常都是双向的。终端和网关间的通讯被分散到不同的信道频点和数据速率上。数据速率的选择需要权衡距离和消息时长两个因素,使用不同数据速率的设备互不影响。LoRa的数据速率范围可以从到50kbps。为了最大程度地延长终端的电池寿命和扩大网络容
2、量,LoRa网络使用速率自适应(ADR)机制来独立管理每个终端的速率和RF输出。虽然每个设备可以在任意信道,任意时间,发送任意数据,但需要注意遵守如下规定:?终端的每次传输都使用伪随机方式来改变信道。 频率的多变使得系统具有更强的抗干扰能力。?终端要遵守相应频段和本地区的无线电规定中的发射占空比要求。?终端要遵守相应频段和本地区的无线电规定中的发射时长要求。twowinter注:发射占空比,意思是发射时长占总时长的比例。按照无线电规定,每个设备不能疯狂发射霸占信道,总得给别人一点机会。这份文档主要讲述协议细节, 一些基于各地区规定的操作参数, 例如发射占空比和发射时长等,在另一份文档LoRaW
3、AN地区参数中做具体描述。将这份文档分开,是为了加入新地区参数时不影响基础的协议规范。LoRaWANClasses所有的LoRaWAN设备都必须至少实现本文档描述的ClassA功能。另外也可以实现本文档中描述的ClassB和ClassC及后续将定义的可选功能。不管怎么样,设备都必须兼容ClassAo文档约定MAC命令的格式写作LinkCheckReq(粗余体),位和位域的格式写作FRMPayload(粗体),常量的格式写作RECEIVE_DELAY1,变量的格式写作Nc在本文档中,?所有多字节字段的字节序均采用小端模式?EUI是8字节字段,采用小端模式传输?默认所有RFU保留位都设为0第2章L
4、oRaWANClasses类型介绍LoRa是由Semtech面向长距离、低功耗、低速率应用而开发的无线调制技术。本文档中,将ClassA基础上实现了更多功能的设备称为“更高class终端”。LoRaWANClassesLoRa网络包含基础LoRaWAN(称之为ClassA)和可选功能(ClassB,ClassC):ApplicationLoRaMACClassAClassQClassC(basolinB)(beacon)(Continuokjs)LoRaModulation图Classes?双向传车 ft 终端(ClassA):ClassA的终端在每次上行后都会紧跟两个短暂的下行接收窗口,以此
5、实现双向传输。传输时隙是由终端在有传输需要时安排,附加一定的随机延时(即ALOHA协议)。这种ClassA操作是最省电的, 要求应用在终端上行传输后的很短时间内进行服务器的下行传输。 服务器在其他任何时间进行的下行传输都得等终端的下一次上行。?划定接收时隙的双向传输终端(ClassB):ClassB的终端会有更多的接收时隙。除了ClassA的随机接收窗口,ClassB设备还会在指定时间打开别的接收窗口。为了让终端可以在指定时间打开接收窗口,终端需要从网关接收时间同步的信标Beacon。这使得服务器可以知道终端正在监听。?最大化接收时隙的双向传输终端(ClassC):ClassC的终端基本是一直
6、打开着接收窗口,只在发送时短暂关闭。ClassC的终端会比ClassA和ClassB?更加耗电,但同时从服务器下发给终端的时延也是最短的ApplicationMACMACoptionsModulationRegionalISMbandEUEUUSAS868433915430文档范围这份LoRaWAN协议还描述了与ClassA不同的其他Class的额外功能。更高Class的终端必须满足ClassA定义的所有功能。注意:物理层帧格式,MAC帧格式,以及协议中更高class和ClassA相同的内容都写在了ClassA部分,避免内容重复。第3章PHY帧格式LoRa有上行消息和下行消息。上行消息上行消息
7、是由终端发出,经过一个或多个网关转发给网络服务器。上行消息使用LoRa射频帧的严格模式,消息中含有PHDR和PHDR_CRC。载荷有CRC校验来保证完整性。PHDR,PHDR_CRC及载荷CRC域都通过射频收发器加入。上行PHY:PreamblePHDRPHDR_CRCPHYPayloadCRC图2.上行PHY帧格式下行消息下行消息是由网络服务器发出,经过单个网关转发给单个终端。下行消息使用射频帧的严格模式,消息中包含PHDR和PHDR_CRCo下行PHY:PreamblePHDRPHDR_CRCPHYPayload图3.下行PHY帧格式接收窗口每个上行传输后终端都要开两个短的接收窗口。接收窗
8、口开始时间的规定,是以传输结束时间为参考。IVV414Hananit叵111R/己i图4.终端接收时隙的时序图第一接收窗口的信道,数据速率和启动。第一接收窗口RX1使用的频率和上行频率有关,使用的速率和上行速率有关。RX1是在上行调制结束后的RECEIVE_DELAY1秒打开。上行和RX1时隙下行速率的关系是按区域规定,详细描述在LoRaWAN地区参数文件中。默认第一窗口的速率是和最后一次上行的速率相同。第二接收窗口的信道,数据速率和启动。第二接收窗口RX2使用一个固定可配置的频率和数据速率,在上行调制结束后的RECEIVE_DELAY2秒打开。频率和数据速率可以通过MAC命令(见第5章)默认
9、的频率和速率是按区域规定,详细描述在LoRaWAN地区参数文件中。接收窗口的持续时间接收窗口的长度至少要让终端射频收发器有足够的时间来检测到下行的前导码。接收方在接收窗口期间的处理如果在任何一个接收窗口中检测到前导码,射频收发器需要继续激活,直到整个下行帧都解调完毕。如果在第一接收窗口检测到数据帧,且这个数据帧的地址和MIC校验通过确认是给这个终端,那终端就不必开启第二个接收窗口。网络发送消息给终端如果网络想要发一个下行消息给终端,它会精确地在两个接收窗口的起始点发起传输。接收窗口的重要事项终端在第一或第二接收窗口收到下行消息后,或者在第二接收窗口阶段,不能再发起另一个上行消息。其他协议的收发
10、处理节点在LoRaWAN收发窗口阶段可以收发其他协议,只要终端能满足当地要求以及兼容LoRaWAN协议。2梳理解析LoRaWAN第3章,主要是讲了接收窗口这回事,只要记住张图就行。目前RX1一般是在上行后1秒开始,RX2是在上行后2秒开始。3源码分析源码流程在梳理这章节的对应代码时,自己手动做了张思维导图。有时是这样,代码再有层次感,也不及一个图。好,请收下。发送完成就开始RX1和RX2延时staticvoidOnRadioTxDone(void)(.)接收窗口的射频处理从上面一步,我们已经清晰的知道,对应的处理肯定是在OnRxWindowlTimerEvent和OnRxWindow2Time
11、rEvent中。?这两个接收窗口的处理, 会对速率和信道进行设置, 按照中对各地区的要求分别进行处理。比如这个470的处理,对上行信道对48取余得到下行信道。RxWindowSetup(LORAMAC_FIRST_RX1_CHANNEL+(Channel%48)*LORAMAC_STEPWIDTH_第4章MAC帧格式LoRa所有上下行链路消息都会携带PHY载荷,PHY载荷以1字节MAC头(MHDR)开始,紧接着MAC载荷(MACPayload),最后是4字节的MAC校验码(MIC)。射频PHY层:PreamblePHDRPHDR_CRCPHYPayload图5.射频PHY结构(注意CRC只有上
12、行链路消息中存在)PHY载荷:MHDRMACPayloadMIC或者MHDRJoin-RequestMIC或者MHDRJoin-ResponseMIC图载荷结构MAC载荷:FHDRFPortFRMPayload图载荷结构FHDR:DevAddrFCtrlFCntFOpts图8.帧头结构图帧格式元素(即图58)CRCMAC层(PHYPayload)Size(bytes)11.M4PHYPayloadMHDRMACPayloadMICMACPayload字段的最大长度M,在第6章有详细说明。MAC头(MHDR字段)Bit#7.54.21.0MHDRbitsMTypeRFUMajorMAC头中指定了
13、消息类型(MType)和帧编码所遵循的LoRaWAN规范的主版本号(Major)。消息类型(MType位字段)LoRaWAN定义了六个不同的MAC消息类型:joinrequest,joinaccept,unconfirmeddataup/down,以及confirmeddataup/down。描述MType000JoinRequest001JoinAccept010UnconfirmedDataUp011UnconfirmedDataDown100ConfirmedDataUp101ConfirmedDataDown110RFU111Proprietary表消息类型?消息join-reques
14、t和join-accept都是用在空中激活流程中,具体见章节?Datamessages用来传输MAC命令和应用数据,这两种命令也可以放在单个消息中发送。?Confirmed-datamessage接收者需要应答。?Unconfirmed-datamessage接收者则不需要应答。?Proprietarymessages用来处理非标准的消息格式,不能和标准消息互通,只能用来和具有相同拓展格式的消息进行通信。不同消息类型用不同的方法保证消息一致性,下面会介绍每种消息类型的具体情况。数据消息白主版本(Major位字段)捕4术Major位字段佃00LoRaWANR101.11RFU表歹U表注意:Maj
15、or定义了激活过程中(joinprocedure)使用的消息格式(见章节)和MACPayload的前4字节(见第4章)。终端要根据不同的主版本号实现不同最小版本的消息格式。终端使用的最小版本应当提前通知网络服务器。MAC载荷(MACPayload)MAC载荷,也就是所谓的“数据帧”,包含:帧头(FHDR)、端口(FPort)以及帧载荷(FRMPayload),其中端口和帧载荷是可选的。帧头(FHDR)FHDR是由终端短地址(DevAddr)、1字节帧控制字节(FCtrl)、2字节帧计数器(FCnt)和用来传输MAC命令的帧选项(FOpts,最多15个字节)组成。Size(bytes)4120.
16、15FHDRDevAddrFCtrlFCntFOptsFCtrl在上下行消息中有所不同,下行消息如下:Bit#76543.0FCtrlbitsADRADRACKReqACKFPendingFOptsLen上行消息如下:Bit#76543.0FCtrlbitsADRADRACKReqACKRFUFOptsLen?帧头中自适应数据速率的控制(ADR,ADRACKReqinFCtrl)LoRa网络允许终端采用任何可能的数据速率。LoRaWAN协议利用该特性来优化固定终端的数据速率。这就是自适应数据速率(AdaptiveDataRate(ADR)。当这个使能时,网络会优化使得尽可能使用最快的数据速率。
17、移动的终端由于射频环境的快速变化,数据速率管理就不再适用了,应当使用固定的数据速率。如果ADR的位字段有置位,网络就会通过相应的MAC命令来控制终端设备的数据速率。如果ADR位没设置,网络则无视终端的接收信号强度,不再控制终端设备的数据速率。ADR位可以根据需要通过终端及网络来设置或取消。不管怎样,ADR机制都应该尽可能使能,帮助终端延长电池寿命和扩大网络容量。注意:即使是移动的终端,可能在大部分时间也是处于非移动状态。因此根据它的移动状态,终端也可以请求网络使用ADR来帮助优化数据速率。如果终端被网络优化过的数据速率高于自己默认的数据速率,它需要定期检查下网络仍能收到上行的数据。每次上行帧计
18、数都会累加(是针对于每个新的上行包,重传包就不再增加计数),终端增加ADR_ACK_CNT计数。如果直到ADR_ACK_LIMIT次上行(ADR_ACK_CNT=ADR_ACK_LIMIT)者B没有收至U下行回复,它就得置高ADR应答请求位(ADRACKReq)。网络必须在规定时间内回复一个下行帧,这个时间是通过ADR_ACK_DELAY来设置, 上行之后收到任何下行帧就要把ADR_ACK_CNT的计数重置。 当终端在接收时隙中的任何回复下行帧的ACK位字段不需要设置,表示网关仍在接收这个设备的上行帧。如果在下一个ADR_ACK_DELAY上行时间内都没收到回复(例如,在总时间ADR_ACK_
19、LIMIT+ADR_ACK_DELAY之后),终端必须切换到下一个更低速率,使得能够获得更远传输距离来重连网络。终端如果在每次ADR_ACK_LIMIT到了之后依旧连接不上, 就需要每次逐步降低数据速率。 如果终端用它的默认数据速率, 那就不需要置位ADRACKReq,因为无法帮助提高链路距离。注意:不要ADRACKReq立刻回复,这样给网络预留一些余量,让它做出最好的下行调度处理。注意:上行传输时,如果ADR_ACK_CNT=ADR_ACK_LIMIT并且当前数据速率比设备的最小数据速率高,就要设置ADRACKReq,其它情况下不需要。?消息应答位及应答流程(ACKinFCtrl)收至ijc
20、odirmed类型的消息时,接收端要回复一条应答消息(应答位ACK要进行置位)。如果发送者是终端,网络就利用终端发送操作后打开的两个接收窗口之一进行回复。如果发送者是网关,终端就自行决定是否发送应答。?应答消息只会在收到消息后回复发送,并且不重发。注意:为了让终端尽可能简单,尽可能减少状态,在收到confirmation类型需要确认的数据帧,需要立即发送一个严格的应答数据帧。或者,终端会延迟发送应答,在它下一个数据帧中再携带。?重传流程当需要应答却没收到应答时就会进行重发,重发的个数由终端自己定,可能每个终端都不一样,这个参数也可以由网络服务器来设置调整。注意:一些应答机制的示例时序图在第18
21、章中有提供。注意:如果终端设备重发次数到达了最大值,它可以降低数据速率来重连。至于后面是否再重发还是说丢弃不管,都取决于终端自己。注意:如果网络服务器重发次数到达了最大值,它就认为该终端掉线了,直到它再收到终端的消息。一旦和终端设备的连接出现问题时,要不要重发都取决于网络服务器自己。注意:在重传期间的数据速率回退的建议策略在章节中有描述。?帧挂起位(FPendinginFCtrl只在下行有效)帧挂起位(FPending)只在下行交互中使用,表示网关还有挂起数据等待下发,需要终端尽快发送上行消息来再打开一个接收窗口。FPending的详细用法在章节。?帧计数器(FCnt)每个终端有两个计数器跟踪
22、数据帧的个数,一个是上行链路计数器(FCntUp),由终端在每次上行数据给网络服务器时累加;另一个是下行链路计数器(FCntDown),由服务器在每次下行数据给终端时累计。网络服务器为每个终端跟踪上行帧计数及产生下行帧计数。终端入网成功后,终端和服务端的上下行帧计数同时置0。每次发送消息后,发送端与之对应的FCntUp或FCntDown就会加1。接收方会同步保存接收数据的帧计数,对比收到的计数值和当前保存的值,如果两者相差小于MAX_FCNT_GAP(要考虑计数器滚动),接收方就按接收的帧计数更新对应值。如果两者相差大于MAX_FCNY_GAP就说明中间丢失了很多数据,这条以及后面的数据就被丢
23、掉。LoRaWAN的帧计数器可以用16位和32位两种,节点上具体执行哪种计数,需要在带外通知网络侧,告知计数器的位数。?如果采用16位帧计数,FCnt字段的值可以使用帧计数器的值,此时有需要的话通过在前面填充0(值为0)字节来补足;如果采用32位帧计数,?FCnt就对应计数器32位白勺16个低有效位(上行数据使用上行FCnt,下行数据使用下行FCnt)。终端在相同应用和网络密钥下,不能重复用相同的FCntUp数值,除非是重传。?帧可选项(FOptsLeninFCtrl,FOpts)?FCtrl字节中的FOptsLen位字段描述了整个帧可选项(FOpts)的字段长度。FOpts字段存放MAC命令
24、,最长15字节,详细的MAC命令见章节。如果FOptsLen为0,贝UFOpts为空。在FOptsLen非0时,则反之。如果MAC命令在FOpts字段中体现,port。不能用(FPort要么不体现,要么非0)。MAC命令不能同时出现在FRMPayload和FOpts中,如果出现了,设备丢掉该组数据。端口字段(FPort)如果帧载荷字段不为空,端口字段必须体现出来。端口字段有体现时,若FPort的值为0表示FRMPayload只包含了MAC命令;具体见章节中的MAC命令。FPort的数值从1223(0 x01.0 xDF)都是由应用层使用。FPort的值从224至H255(0 xE0.0 xFF
25、)是保留用做未来的标准应用拓展。Size(bytes)7.230.10.NMACPayloadFHDRFPortFRMPayloadN是应用程序载荷的字节个数。N的有效范围具体在第7章有定义。N应该小于等于:?N)caseFRAME_TYPE_JOIN_REQ:.fCtrl-=AdrNextDr(fCtrl-,true,&);.if(SrvAckRequested=true)SrvAckRequested=false;fCtrl-=1;LoRaMacBufferpktHeaderLen+=(LoRaMacDevAddr)&0 xFF;LoRaMacBufferpktHeaderLen+=(Lo
26、RaMacDevAddr8)&0 xFF;LoRaMacBufferpktHeaderLen+=(LoRaMacDevAddr16)&0 xFF;LoRaMacBufferpktHeaderLen+=(LoRaMacDevAddr24)&0 xFF;LoRaMacBufferpktHeaderLen+=fCtrl-Value;LoRaMacBufferpktHeaderLen+=UpLinkCounter&0 xFF;LoRaMacBufferpktHeaderLen+=(UpLinkCounter8)&0 xFF;OmitthefPort.ProcessMacCommands(payload
27、,8,appPayloadStartIndex-1,snr);)MAC命令的发送及回复MAC命令的发送及回复处理都在这个函数中,AddMacCommand()协议栈对MAC命令发送的处理还是比较简单的,都是放在这个15字节的MacCommandsBuffer中LinkADR是LoRaWAN网络管理中相当重要的一个MAC命令,其解析占用了183行。索性专门写篇源码解析,记录下。阅读此文前,最好再把第五章的这个命令好好翻一翻,代码和协议才能对应上。我正在陆续对协议的各个章节进行翻译,具体其他章节的译文,以及译文之外的代码解析,可点此查看帖子。?本文作者twowinter,转载请注明作者:LinkA
28、DRReq的源码角军析按照代码思路走一遍。1.解析DataRate_TXPower字段datarate=payloadmacIndex+;txPower=datarate&0 x0F;datarate=(datarate4)&0 x0F;if(AdrCtrlOn=false)&(!=datarate)|(!=txPower)Fopts中来传输,都在析ChMask字段chMask=(uint16_t)payloadmacIndex+;chMask|=(uint16_t)payloadmacIndex+4)&0 x07;nbRep&=0 x0F;if(nbRep=0)nbRep=1;)把字段中的c
29、hMaskCntl和nbRep都给解析了出来。4.按地区规定处理chMaskCntl,及判断ChMask有效性#elifdefined(USE_BAND_470)if(chMaskCntl=6)(requency!=0)(channelsMaskk|=1j;)elseif(chMaskCntl=7)(status&=0 xFE;requency=0)断速率有效性if(ValidateDatarate(datarate,channelsMask)=false)status&=0 xFD;断发射功率有效性if(ValueInRange(txPower,LORAMAC_MAX_TX_POWER,LO
30、RAMAC_MIN_TX_POWER)=false)status&=0 xFB;部判断通过后更新参数if(status&0 x07)=0 x07)(=datarate;=txPower;memcpy1(uint8_t*),(uint8_t*)channelsMask,sizeof();一一=nbRep;8.回复MAC命令LinkADRAnsAddMacCommand(MOTE_MAC_LINK_ADR_ANS,status,0);突然发现AddMacCommand的形参只有CID加2字节的回复,我是太无聊,把终端所有MAC命令都翻了一遍,确认所有payload确实是小于2字节。再次赞扬LoRa
31、WAN协议的精简作风。第6章终端激活为了加入LoRaWAN网络,每个终端需要初始化及激活。终端的激活有两种方式,一种是空中激活Over-The-AirActivation(OTAA),1设备部署和重置时使用;另一种是独立激活ActivationByPersonalization(ABP),此时初始化和激活这两步就在一个步骤内完成。twowinter备注:ABP这个词不太好翻译,通常会翻成个性化激活,也就是通过独立配置参数的方式激活。但总感觉少点味道,与空中激活摆在一起,感觉独立激活这个词在语义上更有并列感。当然这是我的主观感觉,建议大家和同行交流时,还是说ABP激活吧。终端激活后的数据存储激活
32、后,终端会存储如下信息:设备地址(DevAddr),应用ID(AppEUI),网络会话密钥(NwkSKey),应用会话密钥(AppSKey)。?终端地址(DevAddr)终端地址(DevAddr)由可标识当前网络设备的32位ID所组成,具体格式如下:Bit#31.2524.0DevAddrbitsNwkIDNwkAddr它的高7位是NwkId,用来区别同一区域内的不同网络,另外也保证防止节点窜到别的网络去。它的低25位是NwkAddr,是终端的网络地址,可以由网络管理者来分配。?应用ID(AppEUI)?AppEUI是一个类似IEEEEUI64的全球唯一ID,标识终端的应用提供者。??APPE
33、UI在激活流程开始前就存储在终端中。?网络会话密钥(NwkSKey)NwkSKey被终端和网络服务器用来计算和校验所有消息的MIC,以保证数据完整性。也用来对单独MAC的数据消息载荷进行加解密。?应用会话密钥(AppSKey)AppSKey被终端和网络服务器用来对应用层消息进行加解密。当应用层消息载荷有MIC时,也可以用来计算和校验该应用层MIC。空中激活OTAA针对空中激活,终端必须按照加网流程来和网络服务器进行数据交互。如果终端丢失会话消息,则每次必须重新进行一次加网流程。?加网流程需要终端准备好如下这三个参数:DevEUI,AppEUI,AppKey。APPEUI在上面的已经做了描述。注
34、意:对于空中激活,终端不会初始化任何网络密钥。只有当终端加入网络后,才会被分配一个网络会话密钥,用来加密和校验网络层的传输。通过这样,使得终端在不同网络间的漫游处理变得方便。同时使用网络和应用会话密钥,使得网络服务器中的应用数据,不会被网络提供者读取或者篡改。?终端ID(DevEUI)?DevEUI是一个类似IEEEEUI64的全球唯一ID,标识唯一的终端设备。?应用密钥(AppKey)?AppKey是由应用程序拥有者分配给终端,很可能是由应用程序指定的根密钥来衍生的,并且受提供者控制。当终端通过空中激活方式加入网络,AppKey用来产生会话密钥NwkSKey和AppSKey,会话密钥分别用来
35、加密和校验网络层和应用层数据。?加网流程??从终端角度看,加网流程是由和服务器的两个MAC命令交互组成的,分别是joinrequest和joinaccept。?Join-request消息??加网流程总是由终端发送join-request来发起。Size(bytes)882JoinRequestAppEUIDevEUIDevNoncejoin-request消息包含了AppEUI和DevEUI,后面还跟了2个字节的声明DevNonce。DevNonce是一个随机值。网络服务器为每个终端记录过去的DevNonce数值,如果相同设备发出相同的DevNonce的joinrequest就会忽略。joi
36、n-request消息的MIC数值(见第4章MAC帧格式)按照如下公式计算:cmac=aes128_cmac(AppKey,MHDR|AppEUI|DevEUI|DevNonce)?MIC=cmac0.3join-request消息不用加密。?Join-accept消息??待补充。独立激活ABP在某些情况下,终端可以独立激活。独立激活是让终端绕过joinrequest-joinaccept的加网流程,直接加入到指定网络中。独立激活终端,意味着DevAddr和两个会话密钥NwkSKey和AppSKey直接存储在终端中,而不是DevEUI,AppEUI,AppKey。终端在一开始就配置好了入网必要
37、的信息。每个终端必须要有唯一的NwkSKey和AppSKey。这样,一个设备的密钥被破解也不会造成其他设备的安全性危险。创建那些密钥的过程中,密钥不允许通过公开可用信息获得(例如节点地址)。2梳理解析LoRaWAN第6章,主要对节点加网做了描述,它有两种方式。如果要用一句话来总结的话,那就是这一句了,请看:如果是空中激活,则需要准备DevEUI,AppEUI,AppKey这三个参数,即设备自身MAC地址和要使用的应用(应用ID和密钥)。?如果是ABP激活,则直接配置DevAddr,NwkSKey,AppSKey这三个LoRaWAN最终通讯的参数,不再需要join流程。在这种情况下,这个设备是可
38、以直接发应用数据的。这里插个题外话,商用的LoRaWAN网络一般都是走OTAA流程,这样安全性才得以保证。(twowinter,你数数,这是一句话)?(如果是空中激活,则需要准备DevEUI,AppEUI,AppKey来join。如果是ABP激活,则直接配置DevAddr,NwkSKey,AppSKey。)3代码位置激活处理协议的第6章,相关的核心代码是这么几行,位于。?整个代码结构非常清晰,用一个宏(OVER_THE_AIR_ACTIVATION)分开两段,分别对应两种激活方式。caseDEVICE_STATE_JOIN:#if(OVER_THE_AIR_ACTIVATION!=0)Mlme
39、Req_tmlmeReq;Figure3:CN470-510channelfrequenciesSomeofthemanyimprovementsinclude:-India:addedsupportforthecountrys865MHzband,whichenabledtherecentdeploymentannouncedbyTataCommunicationsthatincludesmanagingdatafrom200,000sensorsandgatewaysusingHewlettPackardEnterprisesUniversalloTplatform.-Australia:
40、theLoRaAlliancedemonstrateditsresponsivenesstotheconstantlychangingtechnicallandscapebyrapidlyaddingsupportforAustraliasrecentregulatorychangetoitsISMband.ThesechangesgreatlyextendthemaximumrangeandpayloadsofLoRaWANnetworks,usingeventhelowestdatarates.-Korea:expandedKoreanbandcapabilities.-Global:ad
41、dedmoreconsistentsupportforregionswherethemaximumallowedtransmitpowerisexpressedasequivalentisotropicradiatedpower(EIRP).ThisEIRPsupportmakesitmucheasierfornetworkoperatorstomanageheterogeneousdeviceswhileensuringregulatorycompliance.简单梳理下:印度新增865MHz频段,这为塔塔通讯近期宣布的20万传感器和基站节点建设计划进行了规范铺路。更新提及塔塔通讯将使用HP
42、E的IoT平台,HPE是惠普2015年分出来的技术公司,主攻云平台这块,这个知识点大家伙做个简单备忘。另外一个大的更新应该是澳大利亚地区,澳大利亚政府最近更新了ISM频段的监管要求,这使得LoRaWAN可以极大地提高了载荷容量,特别是低速率情况下的数据量,你知道吗以前澳大利亚在最低速率只能发11字节。在公告中,官方还发布了最新的网络覆盖图,可以明显看到大洋洲这块转为了公开部署网络的国家。、广刖百在中已经为中国规划了470频段,因此国内开发者对此需求很强烈。在最新(2017-02-27)的版本协议栈上已经新增了中国470频段。这篇文章从源码角度解析下其实现方式。目前国内的LoRaWAN基站产品都
43、和标准有一些不同,比如CLAA等,所以搞清楚整个代码实现还是很有必要的。只要熟悉了整个流程,对接任何一个基站都不是难事。我正在陆续对协议的各个章节进行翻译,具体其他章节的译文,以及译文之外的代码解析,可点此查看帖子。?本文作者twowinter,转载请注明作者:源码解析1.前导码格式的源码实现同步字的处理在SX1276的驱动中:voidSX1276SetPublicNetwork(boolenable)SX1276SetModem(MODEM_LORA);if(enable=true)道频率的源码实现先说上行信道的处理。第一步,初始化时把所有信道6*16=96个上行信道都使能了0=0 xFFF
44、F;1 =0 xFFFF;2 =0 xFFFF;3 =0 xFFFF;4 =0 xFFFF;5 =0 xFFFF;第二步,紧接着把96个信道的频点赋值一遍。for(uint8_ti=0;iLORA_MAX_NB_CHANNELS;i+)(Channelsi.Frequency=+i*200e3;Channels。.=(DR_54)|DR_0;Channelsi.Band=0;)第三步,发送时在SetNextChannel中选择合适的频点,默认是96个信道中随机选择。Channel=enabledChannelsrandr(0,nbEnabledChannels-1);这上面是上行信道处理三部曲
45、,下行信道处理则轻松多了。主要是配合接收窗口处理,由这个宏定义了下行的起始频点。具体可以看下面第7点。#defineLORAMAC_FIRST_RX1_CHANNEL(uint32_t)3.数据速率和节点发射功率编码速率编码如下:constuint8_tDatarates口=12,11,10,9,8,7;发射功率编码如下:constint8_tTxPowers口=17,16,14,12,10,7,5,2;速率范围如下:/*!* Minimaldataratethatcanbeusedbythenode*/*!* Maximaldataratethatcanbeusedbythenode*/#d
46、efineLORAMAC_TX_MAX_DATARATEDR_5/*!* Minimaldataratethatcanbeusedbythenode*/#defineLORAMAC_RX_MIN_DATARATEDR_0/*!* Maximaldataratethatcanbeusedbythenode*/#defineLORAMAC_RX_MAX_DATARATEDR_5/*!* Defaultdatarateusedbythenode*/#defineLORAMAC_DEFAULT_DATARATEDR_0发射功率范围如下:/*!* MinimalTxoutputpowerthatcanb
47、eusedbythenode*/#defineLORAMAC_MIN_TX_POWERTX_POWER_2_DBM/*!* MaximalTxoutputpowerthatcanbeusedbythenode*/#defineLORAMAC_MAX_TX_POWERTX_POWER.17_DBM/*!* DefaultTxoutputpowerusedbythenode*/#defineLORAMAC_DEFAULT_TX_POWER14_DBMTXPOWER中国没有。具体见OnRadioRxDone中的FRAME_TYPE_JOIN_ACCEPT分支命令对于ChMaskCntl的处理都在Pr
48、ocessMacCommands()的SRV_MAC_LINK_ADR_REQ分支中。小彩蛋一个:你发现没,注释里写着ChannelmaskKO。不知是djaeckle(loramac-node的作者之一)调皮,还是语言习惯如此。if(chMaskCntl=6)requency!=0)channelsMaskk|=1j;elseif(chMaskCntl=7)status&=0 xFE;requency=0)大载荷长度/*!*Maximumpayloadwithrespecttothedatarateindex.Cannotoperatewithrepeater.*/constuint8_tM
49、axPayloadOfDatarate=51,51,51,115,222, 222;/*!*Maximumpayloadwithrespecttothedatarateindex.Canoperatewithrepeater.*/constuint8_tMaxPayloadOfDatarateRepeater口=51,51,51,115,222,222;这在RxWindowSetup()进行处理,调用了最终的驱动函数。if(RepeaterSupport=true)(modem,MaxPayloadOfDatarateRepeaterdatarate+LORA_MAC_FRMPAYLOAD_O
50、VERHEAD);else(modem,MaxPayloadOfDataratedatarate+LORA_MAC_FRMPAYLOAD_OVERHEAD);7.接收窗口处理。RX1的处理在OnRxWindow1TimerEvent()中,满足协议要求。RxWindowSetup(LORAMAC_FIRST_RX1_CHANNEL+(Channel%48)*LORAMAC_STEPWIDTH_RX1_CHANNEL,datarate,bandwidth,symbTimeout,false);RX2的默认参数见如下宏:#defineRX_WND_2_CHANNEL,DR_0)RX2的处理在OnR
51、xWindow2TimerEvent()中:if(RxSlot=1;)速率偏移处理如下:datarate=-;if(datarate根配置文件?libloragw/-静态库?libloragw/-license要求?libloragw/inc/-从衍生出的C配置标志?libloragw/inc/loragw_*.h-你需要用到的头文件(例如._haland_gps)在这个库链接到你的应用之后,只有license文件要求在程序文件中拷贝和保留。硬件条件硬件版本loragw_reg和loragw_hal是针对Semtech硬件编写的特殊版本:?SemtechSX1301芯片?SemtechSX12
52、57orSX1255收发器如果硬件版本和库版本不匹配的话,这个库将无法使用。你可以用test_loragw_reg来测试软硬件是否匹配。SPI通信loragw_spi的SPI函数适合平台相关的,如果你用别的SPI接口可能需要重写这个函数:?SPImastermatchedtotheLinuxSPIdevicedriver(provided)?SPIoverUSBusingFTDIcomponents(notprovided)?nativeSPIusingamicrocontrollerperipheral(notprovided)你可以用test_loragw_spi来测试SPI通信。GPS接
53、收为了使用库中的GPS模块,主机必须要通过串口连接GPS接收器,串口连接必须以“tty”设备出现在/dev/目录, 启用这个程序的用户必须用读写这个设备的权限。使用chmoda+rw来允许所有用户能操作指定的tty设备,或者使用sudo来运行你的程序(例如.sudo./test_loragw_gps)。当前版本,库只从串口读取数据,在GPS接收器上电后会收到他们发出NMEA帧以及u-blox模块私有的UBX消息。GPS接收器必须在发出PPS脉冲后发出UBX消息,让内部集中器的时间戳可以用GPS时基校准。如果GPS接收器发出了GGANMEA语句,gateway则可以进行3D定位。使用设置软件环境
54、对一个典型应用,你需要这么做:?源码中包含?编译时链接静态库文件?由于loragw_aux的依赖关系,需要链接librt库如果应用需要直接访问集中器配置寄存器的话(例如做些高级配置),你还需要这样做:?源码中包含使用软件API要在你的应用中使用HAL,需要遵守如下规则:?在射频启动之前需要配置好radiospath和IF+modempath?只有在调用了start函数之后,配置才会传送给硬件?只有在radio使能,同时IF+modem使能,以及集中器启动后,才能接收数据包。?只有在radio使能,以及集中器启动后,才能发送数据包。?改变配置之前,必须停止集中器。一个对HAL的典型应用流程图如下
55、:loop/!注意,lgw_send在LoRa集中器仍然发包时,或者即使在准备开始发包时,是非阻塞立即返回。当有数据包在发送时,将无法收到任何数据。你的应用需要考虑发包的时长,或者在尝试发包前检查下状态(使用lgw_status)。当前一包未完成时立即发一包,会导致前一包无法发送,或者发送部分(会导致接收端出现CRC错误)调试模式为了调试程序,可以激活调试信息后(在中设置DEBUG_HAL=1),编译loragw_hal函数。这样就会输出很多细节信息,包括stderr的错误细节信息。2.帮助程序工程中的这些程序提供了一些示例,应该如何使用HAL库。帮助系统构建者单独测试不同部分。.util_p
56、kt_loggerThissoftwareisusedtosetupaLoRaconcentratorusingaJSONconfigurationfileandthenrecordallthepacketsreceivedinalogfile,indefinitely,untiltheuserstopstheapplication.这个软件用来让LoRa集中器使用JSON配置文件,以及记录所有的包于一个10g文件,除非用户停止这个应用。.util_spi_stressThissoftwareisusedtocheckthereliabilityofthelinkbetweenthehostp
57、latform(onwhichtheprogramisrun)andtheLoRaconcentratorregisterfilethatistheinterfacethroughwhichallinteractionwiththeLoRaconcentratorhappens.这个软件用来检测主CPU与LoRa协调器寄存器文件的连接的稳定性。.util_tx_testThissoftwareisusedtosendtestpacketswithaLoRaconcentrator.Thepacketscontainlittleinformation,onnoprotocol(ie.MACadd
58、ress)informationbutcanbeusedtoassessthefunctionalityofagatewaydownlinkusingothergatewaysasreceivers.这个软件用来做发包测试。包里没有协议信息,但可以用来检测基站下行功能,使用另一台基站来做接收。.util_tx_continuousThissoftwareisusedtosetLoRaconcentratorinTxcontinuousmode,forspectralmeasurement.这个软件用来设置LoRa集中器为持续TX模式,用于频谱测试。.util_spectral_scanThis
59、softwareisusedtoscanthespectralbandinbackground,wheretheLoRa这个软件用来扫描基站工作环境的频段。.util_lbt_testThissoftwareisusedtotestListen-Before-Talkchannelstimestamps.这个软件用来测试Listen-Before-Talk”的信道时间戳。3.帮助脚本ThisscriptmustbelaunchedonloTStartKitplatformtoresetconcentratorchipthroughGPIO,beforestartinganyapplicationusingtheconcentrator.这个脚本仅在IoTStartKit平台上运行,用于在启动任何应用前,通过位集中器芯片。GPIO复