全面拆解和构建5G物联网-26:LoRaWAN Class A/B/C类型终端的软件架构

前言:

本文是在了解LoRoWAN协议的基础之上,对LoRa Class A/B/C终端的通用的软件实现架构进行拆解。

从软件架构的角度拆解LoRa Class A/B/C终端的软件功能实体之间的关系。


目录:

1. 软件的总体架构

2.  Radio硬件层

3.   STM8 MCU通用接口驱动程序层

4.  Radio硬件的驱动层

5.  LoRaWAN MAC层

6.  LoRaWAN控制层

7. LoRaWAN接口层

8. 应用层



1. 软件的总体架构


2.  Radio硬件层

Radio硬件层又分为三个子层

2.1 高频RF

主要是解决调制后的高频信号的发送。

2.2 频段Band

频段就是一段许可额高频电磁波的范围,包括欧洲的EC868,EU433, 中国的CN470和美国的US430等频段。

不同频段,频率的范围、频谱的带宽、发送的功率都有不同的规范。

2.3 通道channel

虽然同一时间只能发送和接收一个载频的带宽,但在LoRaWAN允许一个LoRaWAN在的终端,可以在不同的时间,使用不同的某个频段的不同频率进行通信。

每个通道的带宽为200K

2.4 调制解调层

LoRa专有的扩频通信就是该层实现的,扩频码的配置、还有4/5纠错码的实现、IQ的反转,也可归在此层。

2.3 Lora物理层

主要完成的物理层帧的编码与解码。

3.   STM8 MCU通用接口驱动程序层

Radio驱动程序,如果需要通过Radio收发数据,必须通过MCU与Radio之间的结果SPI总线来完成。

而SPI的驱动程序就是由 STM8 MCU通用接口驱动程序层实现的。

除了SPI接口驱动,STM8 MCU通用接口驱动程序层还提供GPIO驱动、定时器驱动、中断驱动、MCU片内Flash驱动等。

4.  Radio硬件的驱动层

硬件的驱动层主要完成对Radio芯片的初始化、配置、物理层帧的净荷的发送与接收。

 sx126x.c、radio.c主要就是完成此层的功能。

5.  LoRaWAN MAC层

完成的功能有:

(1)MAC层帧的编码与解码或者说MAC层帧的组装与卸装。

(2)支持MAC 注册(join)的功能

(3)提供确认(confimed)的数据包的发送服务,类似与 TCP传输的服务

(4)提供无确认(unconfimed)的数据包的发送服务,类似与UDP传输服务

(5)Class A, B. C三种不同的MAC层的终端类型与调度策略。

(6)对MAC层的payload进行解码与解密的功能。

6.  LoRaWAN控制层

LoRa的控制命令command,可以通过LoRa MAC的帧头进行携带,也可以通过port0的用户数据来承载。

Port是LoRA MAC提供的类似Socket端口的机制,不同的port,代码不同的应用程序.

Port0是一个保留的port号,留给MAC自己使用。

MAC的控制命令,都可以通过port 0的用户数据承载。

7. LoRaWAN接口层

LoRa WAN与应用程序之间采用两种接口机制

7.1 基于端口号的网络协议接口

该接口用于定义MAC与应用层之间的数据包的封装规范,主要用于不同的网络设备之间数据封装。

port1-255是留给应用程序的。port号与应用程序之间的关系,由应用程序自己决定, LoRa WAN MAC不做规定。

但port0是保留给LoRa WAN MAC层自己使用的。

7.2. 基于API的接口

主要功能是,LoRa终端自身的应用程序的通过该接口,利用LoRa WAN提供的本地的LoRa WAN MAC层服务,实现与远程的LoRa server在应用层之间的通信。

主要的接口包括:

(1)LoWAN的初始化接口:LoRaMacInitialization

功能:实现对LoRa WAN MAC的初始化

原型:

LoRaMacStatus_t LoRaMacInitialization ( LoRaMacPrimitives_t *primitives, LoRaMacCallback_t *callbacks, LoRaMacRegion_t region );

案例:

         LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
         LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
         LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
         LoRaMacPrimitives.MacMlmeIndication = MlmeIndication;
         LoRaMacCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
         LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, ACTIVE_REGION );


(2)MCPS(Mac Common Part Sublayer)接口

功能:应用层通过此接口,请求LoRaWAN MAC发送用户数据,支持下列三种服务。

typedef struct sMcpsReq
{
    Mcps_t Type;
    union uMcpsParam
    {
        McpsReqUnconfirmed_t Unconfirmed;  //Unconfirmed数据传输
        McpsReqConfirmed_t Confirmed;        //confimred数据传输
        McpsReqProprietary_t Proprietary;      //自定义的数据传输
    }Req;
}McpsReq_t;

原型:

LoRaMacStatus_t LoRaMacMcpsRequest( McpsReq_t *mcpsRequest );

案例:

mcpsReq.Type = MCPS_CONFIRMED;
mcpsReq.Req.Confirmed.fPort = AppPort;
mcpsReq.Req.Confirmed.fBuffer = AppData;
mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
mcpsReq.Req.Confirmed.NbTrials = 8;
mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;

LoRaMacMcpsRequest( &mcpsReq )


(3)MLME(MAC Layer Manage Entity)接口

功能:应用层通过此接口,完成网络管理的功能

typedef struct sMlmeReq
{
    Mlme_t Type;
    union uMlmeParam
    {
        MlmeReqJoin_t Join;      //入网注册请求
        MlmeReqTxCw_t TxCw;  //设置连续发送模式
    }Req;
}MlmeReq_t;

原型:

LoRaMacStatus_t LoRaMacMlmeRequest( MlmeReq_t *mlmeRequest );

案例:

            MlmeReq_t mlmeReq;
            mlmeReq.Type = MLME_JOIN;
            mlmeReq.Req.Join.DevEui = DevEui;
            mlmeReq.Req.Join.AppEui = AppEui;
            mlmeReq.Req.Join.AppKey = AppKey;
            mlmeReq.Req.Join.Datarate = LORAWAN_DEFAULT_DATARATE;

            LoRaMacMlmeRequest( &mlmeReq );


(4)MIB(manangement information database)参数管理接口

功能:应用程序该接口,设置LoRoWAN的管理、配置数据

支持的管理、配置数据有:

typedef union uMibParam
{
    DeviceClass_t Class;  // LoRaWAN device class
    bool IsNetworkJoined; //是否已经注册过
    bool AdrEnable;       //是否支持ADR(Adaptive Data Rate)速率自适应
    uint32_t NetID;       //网络标识号
    uint32_t DevAddr;     //设备地址
    uint8_t *NwkSKey;     //网络会话加密key
    uint8_t *AppSKey;     //应用程序会话加密key
    bool EnablePublicNetwork; //公众网还是私网
    bool EnableRepeaterSupport; //是否支持Repeater
    ChannelParams_t* ChannelList; //增加通道列表
    Rx2ChannelParams_t Rx2Channel;       //当前的Rx2通道设置
    Rx2ChannelParams_t Rx2DefaultChannel;//Rx2默认的通道号
    uint16_t* ChannelsMask;            //当前的通道屏蔽字
    uint16_t* ChannelsDefaultMask; //默认的通道屏蔽字
    uint8_t ChannelNbRep;
    uint32_t MaxRxWindow;
    uint32_t ReceiveDelay1;
    uint32_t ReceiveDelay2;
    uint32_t JoinAcceptDelay1;
    uint32_t JoinAcceptDelay2;
    int8_t ChannelsDefaultDatarate;
    int8_t ChannelsDatarate;
    int8_t ChannelsDefaultTxPower;
    int8_t ChannelsTxPower;
    uint32_t UpLinkCounter;
    uint32_t DownLinkCounter;
    MulticastParams_t* MulticastList;
    uint32_t SystemMaxRxError;
    uint8_t MinRxSymbols;
    float AntennaGain;
    float DefaultAntennaGain;
}MibParam_t;

通过名字,我们可以知道其大概意思。

原型:

LoRaMacStatus_t LoRaMacMibSetRequestConfirm( MibRequestConfirm_t *mibSet )

LoRaMacStatus_t LoRaMacMibGetRequestConfirm( MibRequestConfirm_t *mibGet );

案例:

   mibReq.Type = MIB_ADR;
   mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
   LoRaMacMibSetRequestConfirm( &mibReq );

    MibRequestConfirm_t mibReq;
    mibReq.Type = MIB_NETWORK_JOINED;
    status = LoRaMacMibGetRequestConfirm( &mibReq );


其他。。。。。。。。


8. 应用层

(1)应用层数据的解析

(2)应用程数据的加解密

(3)MAC层对应用层的回调的通知

typedef struct sLoRaMacPrimitives
{
    void ( *MacMcpsConfirm )( McpsConfirm_t *McpsConfirm ); //通知应用层,LoRa WAN MAC层收到了McpsConfirm消息
    void ( *MacMcpsIndication )( McpsIndication_t *McpsIndication ); //通知应用层,LoRa WAN MAC层收到了McpsIndication消息
    void ( *MacMlmeConfirm )( MlmeConfirm_t *MlmeConfirm );//通知应用层,LoRa WAN MAC层收到了MlmeConfirm消息
    void ( *MacMlmeIndication )( MlmeIndication_t *MlmeIndication ); //通知应用层,LoRa WAN MAC层收到了MlmeIndication消息
}LoRaMacPrimitives_t;

typedef struct sLoRaMacCallback
{
    uint8_t ( *GetBatteryLevel )( void ); //MAC通过回调函数,获取当前电池的电量等级
}LoRaMacCallback_t;

(4)应用程序的主线性

  • 初始化
  • 注册
  • 应用数据发送
  • 应用数据接收
  • 状态机的驱动

(5)上行发送调度线程,该定时器是主线程启动的。

(6)状态机

猜你喜欢

转载自blog.csdn.net/HiWangWenBing/article/details/108302658