
Fig 1: 船用電臺CG效果圖,來自BING Image Search
昨天花了一整天去學習ECC背后的數(shù)學,學到懷疑人生。無論是英文、中文教程,里面的數(shù)學概念都讓人舉步維艱。今早換個腦子,來搞搞ALOHA的固件,后面還有客戶等著用呢。
LoRa作為LPWAN的代表產(chǎn)品,長距離、低速率,不太適合運行短距無線電的路由協(xié)議,因為路由協(xié)議本身就是一種消耗。所以這一點上看,更加類似無線電通訊發(fā)展初期的情況,也類似于現(xiàn)在的HAM火腿族的應用情況。從數(shù)據(jù)通訊的MAC層來看,比較適用于簡單的基于競爭的ALOHA協(xié)議(該協(xié)議也在以太網(wǎng)、RFID等其他場景中使用)。周期性定時休眠和喚起,配合RTS/CTS幀可以避免隱藏終端的問題,成為最簡單的S-MAC協(xié)議。
mbed上的AlohaTransceiver例程本質(zhì)上只包括了Radio的PHY/MAC/LL以及最簡單的API,同時也提供了類似STX/ETX的二進制協(xié)議??梢允褂?,但是因為不提供技術(shù)支持,所以即使有Bug,也得不到任何技術(shù)支持。是的,該團隊甚至關(guān)閉了所有的聯(lián)系方式。
所以,我做的事情是:
- 嘗試編譯工程,并按照編譯器出錯的提示去修正,先移除一些形式上和類型上的錯誤,缺點是邏輯錯誤都沒有仔細看;
- 重新調(diào)整代碼,AlohaTransceiver把Radio的底層歸集成為API,所以我們需要寫的就是整合AlohaTransceiver/SerialInterfaceProtocol兩個模塊,再配合一些LED/BTN之類的輔助IO來構(gòu)建一個main.cpp.
- 定義用戶命令,因為SerialInterfaceProtocol實際上也是一組API,所以需要用戶根據(jù)自己的應用來確定最終的用戶命令。并利用Callback回調(diào)整合起來。
SerialInterfaceProtocol的Command變量雖然是8位字節(jié),但協(xié)議中卻是16位的Int類型。擴展余地很大,所以,我目前定義了一個枚舉。
typedef enum{
NONE = 0,
USR_SET,
PSW_SET,
UNIT_NR_Q,
SNR_Q,
FW_VER_Q,
UPTIME_Q,
ALARM_Q,
ONOFF_SET,
ONOFF_Q,
RADIO_SET, // Carrier, Bandwidth, CR, SF, TXP and other params.
RADIO_Q,
DIAG_Q,
MAC_SET, // MAC layer settings.
MAC_Q,
COM_SET, // Valid in UART, invalid in USB
COM_Q,
MSG_SET, // Message Memory settings.
MSG_Q,
MSG_SEND,
MSG_RECV,
LASTCMD
}Command_t;
每個對象都有SET/GET,參數(shù)還有長有短。但是如果添加了IPV6之后,受控對象會增加很多,所以需要仔細規(guī)劃。節(jié)省資源,比如某些對象宜作為虛擬寄存器的方式進行讀寫,這樣大量對象就可以集中到兩個命令中去了,也可以節(jié)省代碼空間。
目前已經(jīng)整合了USB,但沒有填充命令處理函數(shù)的情況下,代碼在58KB。一旦在應用添加了很多命令處理函數(shù),則跳出64KB是大概率事件,所以必須采用CB后綴的MCU,即QFP48/128KB ROM,比如STM32F103CB/072CB/L073CB等。
測試完成后,本人將基于這個代碼提供定制服務,其中用戶命令接口代碼,將使用Python代碼生成器來定制C++和Python主機代碼。