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状态机。

浙公网安备 33010602011771号