LoraWAN Class B状态机分析

1、默认参数

CLASSB_BEACON_RESERVED      2120

CLASSB_BEACON_GUARD         3000

CLASSB_BEACON_WINDOW	   122880

CLASSB_BEACON_INTERVAL	   128000

2、三个process过程

a. LoRaMacClassBProcessBeacon 信标处理
b. LoRaMacClassBProcessPingSlot ping插槽处理
c. LoRaMacClassBProcessMulticastSlot 多播ping插槽处理

2.1 信标状态机

BEACON_STATE_ACQUISITION
BEACON_STATE_ACQUISITION_BY_TIME
BEACON_STATE_TIMEOUT
BEACON_STATE_MISSED
BEACON_STATE_REACQUISITION
BEACON_STATE_LOCKED
BEACON_STATE_HALT
BEACON_STATE_IDLE
BEACON_STATE_GUARD
BEACON_STATE_RX
BEACON_STATE_LOST

  • 信标的初始状态BEACON_STATE_ACQUISITION;
  • 收到信标,状态为BEACON_STATE_ACQUISITION_BY_TIME;
  • BEACON_STATE_MISSED 错过信标状态未使用;
  • 收到信标,状态为BEACON_STATE_LOCKED,超时未接收到信标,状态为BEACON_STATE_TIMEOUT;
  • 没收到信标要重新接收,状态为BEACON_STATE_REACQUISITION;如果信标丢失的时间超过了2个小时,状态为BEACON_STATE_LOST,同时需要切换Class;
    如果没有超过2小时,切换到BEACON_STATE_IDLE;
  • 如果进程被优先级更高的任务打断,状态为BEACON_STATE_HALT;

注:初始化的时候把信标的状态置为BEACON_STATE_ACQUISITION,后来收到信标,就不用这个初始状态了,转为BEACON_STATE_ACQUISITION_BY_TIME,其实也是回到了初始状态,只不过这个初始状态是接收到过信标,获取同步时间后新一轮周期的初始状态。

信标获得后,计划下一次信标的时间点。在Guard的时间点再次启动定时器。

static TimerTime_t ApplyGuardTime( TimerTime_t beaconEventTime )
{
    TimerTime_t timeGuard = beaconEventTime;

    if( timeGuard > CLASSB_BEACON_GUARD )
    {
        timeGuard -= CLASSB_BEACON_GUARD;
    }
    return timeGuard;
}

2.2 Pingslot状态机

PINGSLOT_STATE_CALC_PING_OFFSET
PINGSLOT_STATE_SET_TIMER
PINGSLOT_STATE_IDLE
PINGSLOT_STATE_RX

在状态PINGSLOT_STATE_CALC_PING_OFFSETPing下计算PingOffset的值,状态下PINGSLOT_STATE_SET_TIMER下PingSlotTime的定时器时长。
定时器到,状态切换到PINGSLOT_STATE_IDLE,同步更新射频参数,进入PINGSLOT_STATE_RX,等待接收数据或接收超时。

2.3 MulticastSlot状态机
流程基本与Pingslot一致。

小结:开源代码中的封装还是条理清晰的,从应用层的设备状态机到MAC层的MLME状态机,再到BEACON状态机。

posted @ 2025-06-11 14:07  eybstar  阅读(22)  评论(0)    收藏  举报