花了兩天時(shí)間湿诊,根據(jù) Semtech 公司的報(bào)文轉(zhuǎn)發(fā)網(wǎng)關(guān)文檔奔垦,我基于Twisted完成了相關(guān)原型開發(fā)叠穆,主要是用于之后的設(shè)備模擬少漆,設(shè)備交叉測(cè)試和服務(wù)器壓力測(cè)試,同時(shí)繪制了一下相關(guān)有限狀態(tài)機(jī)硼被。
FSM
Packet ID | Enum | Direction | Header | MAC | Token | Payload |
---|---|---|---|---|---|---|
PUSH_DATA | 0 | G>>S | 12 | Yes | G(X) | stat/rxpk[] |
PUSH_ACK | 1 | G<<S | 4 | N/A | S(X) | N/A |
PULL_DATA | 2 | G>>S | 12 | Yes | G(Y) | N/A |
PULL_ACK | 4 | G<<S | 4 | N/A | S(Y) | N/A |
PULL_RESP | 3 | G<<S | 4 | N/A | S(Z) | txpk |
TX_ACK | 5 | G>>S | 4 | N/A | G(Z) | N/A |
表1: LoRaWAN 協(xié)議有限狀態(tài)機(jī)
RF->>GW: New Packet Received
GW->>NS: PUSH_DATA
NS->>GW: PUSH_ACK
NS->>DB: Packet Stored
GW->>NS: PULL_DATA
NS->>GW: PULL_ACK
DB->>NS: Packet Loaded
NS->>GW: PULL_RESP
GW->>NS: TX_ACK
GW->>RF: Packet Transmitted
圖1: LoRaWAN流程
文檔分析
在這個(gè)網(wǎng)絡(luò)模型中示损,有兩個(gè)角色:
- GW即網(wǎng)關(guān);
- NS即網(wǎng)關(guān)服務(wù)器嚷硫。
NS基本上可以投入實(shí)用检访,對(duì)接數(shù)據(jù)庫和緩存即可。而目前的GW僅僅夠做壓測(cè)仔掸,另外一個(gè)MicroPython移植版本還在開發(fā)中脆贵。
相比NS,GW的開發(fā)需要增加多線程編程嘉汰。在原始的MicroPython設(shè)計(jì)中丹禀,有以下線程:
- UDP push data / pull data 的定時(shí)器線程,需要反復(fù)執(zhí)行,其中push data對(duì)于服務(wù)器是異步事件双泪,而pull data需要網(wǎng)關(guān)定時(shí)打開接受通道接受服務(wù)器下發(fā)持搜;
- RX/TX/Timeout 事件的ISR 回調(diào)函數(shù),來自D0/D1和對(duì)應(yīng)超時(shí)定時(shí)器焙矛;
- LoRa Downlink 定時(shí)器線程葫盼,用于下發(fā)窗口空口通訊。
在多通道網(wǎng)關(guān)設(shè)計(jì)中村斟,需要對(duì)多線程設(shè)計(jì)仔細(xì)規(guī)劃贫导,尤其在使用Python/Node.js這種多線程設(shè)計(jì)有缺陷的語言。相比之下蟆盹,C++/Java/Lua之類的更加成熟孩灯。有必要拆解成為雙通道網(wǎng)關(guān),而每個(gè)雙通道守護(hù)程序需要作為單獨(dú)線程存在逾滥。
要淡化定制協(xié)議的存在
即便是IBM這種高大上的IT專業(yè)公司峰档,和Semtech開發(fā)出來的這個(gè)協(xié)議,依然讓我失望寨昙。這種協(xié)議的缺陷在于:
- 二進(jìn)制和ASCII JSON混合在一起讥巡;
- 缺乏傳輸層安全,確切說安全是在應(yīng)用層實(shí)現(xiàn)的舔哪;
- 收發(fā)狀態(tài)機(jī)有限欢顷,擴(kuò)展困難;
- 報(bào)文下發(fā)比較困難捉蚤,尤其是GW在NAT之后時(shí)抬驴,需要GW定時(shí)發(fā)送Pull_data請(qǐng)求打開UDP接收端口。
雖說LoRaWANPktFwd協(xié)議在NS一側(cè)設(shè)計(jì)比較簡單外里,現(xiàn)在越來越多的LoRaWAN設(shè)計(jì)開始直接使用MQTT/TLS(也是IBM十年期的設(shè)計(jì)怎爵,但是通用性較強(qiáng))特石,并直接使用JSON作為序列化標(biāo)準(zhǔn)盅蝗。即便是ESP8266這種SoC中也有足夠資源來支持這些標(biāo)準(zhǔn)。一收一發(fā)姆蘸,簡單有效墩莫,擴(kuò)展容易。
所以逞敷,在TTN接入?yún)f(xié)議中狂秦,LoRaWANPktFwd是作為Legacy(歷史遺留)協(xié)議接入的。