先說兩句
SX1301/SX1302是semtech公司推出的基站端射頻基帶芯片,其與SX127x/SX126x的主要區別在於:
- 只是個基帶芯片,使用時需要加射頻前端(SX125x/SAW/...)
- 其具有比SX1278強大很多的基帶處理能力,可以同時解調8個信道的數據,並且每個信道可以同時監聽SF7-12(SX1302為SF5-12)
所以,從參數上可以看出,對於lorawan這樣的多節點網絡來講,使用SX1301/SX1302才是正確的打開方式。
接下來,我就分享一下我自己從零開始搭建LoRaWAN基站的經驗。
准備工作
運行環境
- raspberry 3/3b/4都可以
- M-GW1302S模塊
- 樹莓派轉接板
Note:
由於硬件使用GPIO7作為SX1302的RESET,與樹莓派的SPI0.1的CS腳沖突(雖然沒有用的SPI0.1,但是有些版本的鏡像會有沖突),
我平時使用2020-05-27版本的剛好沒有沖突,所以建議大家先不要下載最新版的鏡像,2020-05-27-樹莓派鏡像下載地址
實物圖
用到的軟件
SSH工具(XShell,PuTTY等都可以)
資料
- M-GW1302S的用戶手冊(描述使用方法)
- M-GW1302S的硬件設計手冊(描述模塊硬件設計時需要用到的資料),暫時還用不到
- 基站端代碼,見下方
官方開源代碼
https://github.com/Lora-net/sx1302_hal
git命令:
git clone https://github.com/Lora-net/sx1302_hal.git
廠家適配后的源碼
因為官方源碼中使用了一個溫度傳感器,而在此版設計中,並沒有此傳感器,所以需要將部分代碼注釋掉才能運行,這一步,M-GW1302S的廠家已經幫我們改好了。
https://gitee.com/rejeee/gw1302s
git命令:
git clone https://gitee.com/rejeee/gw1302s
步驟
准備工作
- 樹莓派制作好系統,連上網線,使用SSH與樹莓派連接
- 進入樹莓派之后,需要先開啟SPI,若有問題請自行百度,不同版本的樹莓派可能會不同
下載代碼、編譯、運行
-
git clone https://gitee.com/rejeee/gw1302s.git
-
cd gw1302s
-
修改target.cfg中的TARGET_DIR為
TARGET_DIR=/home/pi/gw1302s/bin
-
make clean all ->此步驟會把代碼編譯成可執行文件
-
make install -> 此步驟會用調用SCP將編譯結果拷貝到TARGET_DIR所在目錄,所以可能需要輸入密碼(此處是將scp的dst設為localhost,所以會拷貝到本地),若不想輸密碼,可參考README.md進行ssh秘鑰拷貝,后續就無需輸入密碼了
-
make install_conf ->至此,源碼就編譯完成了,並且生成的已經在TARGET_DIR指定的目錄下了
-
接下來我們需要配置global_conf.json,配置得適用於我們的需要,此處我貢獻一下我的global_conf.json文件,其中配置基站的接收頻點是通過配置兩個SX1250的中心頻點,外加8個偏移頻點來進行的,如下圖,我配置的為474.3~475.7的接收頻點范圍
{ "SX130x_conf": { "spidev_path": "/dev/spidev0.0", "lorawan_public": true, "clksrc": 0, "antenna_gain": 0, /* antenna gain, in dBi */ "full_duplex": false, "precision_timestamp": { "enable": false, "max_ts_metrics": 255, "nb_symbols": 1 }, "radio_0": { "enable": true, "type": "SX1250", "single_input_mode": true, "freq": 474600000, "rssi_offset": -207.0, "rssi_tcomp": {"coeff_a": 0, "coeff_b": 0, "coeff_c": 20.41, "coeff_d": 2162.56, "coeff_e": 0}, "tx_enable": true, "tx_freq_min": 470000000, "tx_freq_max": 510000000, "tx_gain_lut":[ {"rf_power": -6, "pa_gain": 0, "pwr_idx": 0}, {"rf_power": -3, "pa_gain": 0, "pwr_idx": 1}, {"rf_power": 0, "pa_gain": 0, "pwr_idx": 2}, {"rf_power": 3, "pa_gain": 1, "pwr_idx": 3}, {"rf_power": 6, "pa_gain": 1, "pwr_idx": 4}, {"rf_power": 10, "pa_gain": 1, "pwr_idx": 5}, {"rf_power": 11, "pa_gain": 1, "pwr_idx": 6}, {"rf_power": 12, "pa_gain": 2, "pwr_idx": 7}, {"rf_power": 13, "pa_gain": 1, "pwr_idx": 8}, {"rf_power": 14, "pa_gain": 2, "pwr_idx": 9}, {"rf_power": 16, "pa_gain": 2, "pwr_idx": 10}, {"rf_power": 20, "pa_gain": 3, "pwr_idx": 11}, {"rf_power": 23, "pa_gain": 3, "pwr_idx": 12}, {"rf_power": 25, "pa_gain": 3, "pwr_idx": 13}, {"rf_power": 26, "pa_gain": 3, "pwr_idx": 14}, {"rf_power": 27, "pa_gain": 3, "pwr_idx": 15} ] }, "radio_1": { "enable": true, "type": "SX1250", "single_input_mode": true, "freq": 475400000, "rssi_offset": -207.0, "rssi_tcomp": {"coeff_a": 0, "coeff_b": 0, "coeff_c": 20.41, "coeff_d": 2162.56, "coeff_e": 0}, "tx_enable": false }, "chan_multiSF_0": {"enable": true, "radio": 0, "if": -300000}, "chan_multiSF_1": {"enable": true, "radio": 0, "if": -100000}, "chan_multiSF_2": {"enable": true, "radio": 0, "if": 100000}, "chan_multiSF_3": {"enable": true, "radio": 0, "if": 300000}, "chan_multiSF_4": {"enable": true, "radio": 1, "if": -300000}, "chan_multiSF_5": {"enable": true, "radio": 1, "if": -100000}, "chan_multiSF_6": {"enable": true, "radio": 1, "if": 100000}, "chan_multiSF_7": {"enable": true, "radio": 1, "if": 300000}, "chan_Lora_std": {"enable": true, "radio": 1, "if": -200000, "bandwidth": 250000, "spread_factor": 7, "implicit_hdr": false, "implicit_payload_length": 17, "implicit_crc_en": false, "implicit_coderate": 1}, "chan_FSK": {"enable": true, "radio": 1, "if": 300000, "bandwidth": 125000, "datarate": 50000} }, "gateway_conf": { "gateway_ID": "AA555A0000000000", /* change with default server address/ports */ "server_address": "lora.ansitw.com", "serv_port_up": 1700, "serv_port_down": 1700, /* adjust the following parameters for your network */ "keepalive_interval": 10, "stat_interval": 30, "push_timeout_ms": 100, /* forward only valid packets */ "forward_crc_valid": true, "forward_crc_error": false, "forward_crc_disabled": false, /* Beaconing parameters */ "beacon_period": 0, "beacon_freq_hz": 869525000, "beacon_datarate": 9, "beacon_bw_hz": 125000, "beacon_power": 14, "beacon_infodesc": 0 }, "debug_conf": { "ref_payload":[ {"id": "0xCAFE1234"}, {"id": "0xCAFE2345"} ], "log_file": "loragw_hal.log" } }
- 最后,我們運行一下./lora_pkt_fwd,程序就會讀取global_conf.json文件,啟動起來了。
至此,我們就擁有一台自己DIY的LoRaWAN基站了!!
global_conf.json配置
這個配置文件是lora_pkt_fwd程序運行的所有配置參數,其中有幾點是我們平時會比較常用到的:
- 如何修改基站的接收頻點
- 如何設置基站的ID
- 如何設置基站的LoRaWAN NS指向
- 如何設置基站的發射功率
設置基站的接收頻點
設置接收頻點主要是通過設置radio_0和radio_1的中心頻點,並在此基礎上設置8個接收信道的偏移來進行的,比如上面的參數,其中radio_0.freq==474600000,radio_1.freq==475400000,這就是radio_0和radio_1的中心頻點,下面會根據設置的8個頻點的偏移情況來開啟8個接收信道,具體體現在
"chan_multiSF_0": {"enable": true, "radio": 0, "if": -300000},
"chan_multiSF_1": {"enable": true, "radio": 0, "if": -100000},
"chan_multiSF_2": {"enable": true, "radio": 0, "if": 100000},
"chan_multiSF_3": {"enable": true, "radio": 0, "if": 300000},
"chan_multiSF_4": {"enable": true, "radio": 1, "if": -300000},
"chan_multiSF_5": {"enable": true, "radio": 1, "if": -100000},
"chan_multiSF_6": {"enable": true, "radio": 1, "if": 100000},
"chan_multiSF_7": {"enable": true, "radio": 1, "if": 300000},
我們以第一條為例
-
chan_multiSF_X,指的是這個頻點是可以接收多個SF的,這種頻點最多可以有8個,這是由硬件決定的
-
enable:true表示這個頻點開啟
-
"radio":0,表明此信道的中心頻點是radio_0的中心頻點
-
"if": -300000,表明此信道在中心頻點上偏移-300000Hz
故此條配置的含義是:
- 此頻點可接收多個SF
- 此頻點為radio_0.freq-300000=474600000-300000=474300000=474.3MHz
設置基站的ID
gateway_conf.gateway_ID即是
如何設置基站的LoRaWAN NS指向
- gateway_conf.server_address為NS的地址
- gateway_conf.serv_port_up為NS的上行端口
- gateway_conf.serv_port_down為NS的下行端口
如何設置基站的發射功率
基站的發射功率
-
首先是要有個radio的tx_enable是true的,即表示通過此芯片發送下行,這個和硬件有關,不過大部分情況下都是radio_0(大家都參考的原廠的參考設計)
-
tx_freq_min,tx_freq_max設置的是發射的最大,最小頻點范圍
-
tx_gain_lut是tx power的一個具體配置表,也就是說,當基站收到NS的下發命令時,會按照指定功率進行下發,若指定的功率不在這個表里面,那么可能就不會進行下發了,此表為什么這配我也不清楚,一般情況下不要去改動它