從零開始搭建一個LoRaWAN基站


先說兩句

SX1301/SX1302是semtech公司推出的基站端射頻基帶芯片,其與SX127x/SX126x的主要區別在於:

  1. 只是個基帶芯片,使用時需要加射頻前端(SX125x/SAW/...)
  2. 其具有比SX1278強大很多的基帶處理能力,可以同時解調8個信道的數據,並且每個信道可以同時監聽SF7-12(SX1302為SF5-12)

所以,從參數上可以看出,對於lorawan這樣的多節點網絡來講,使用SX1301/SX1302才是正確的打開方式。

接下來,我就分享一下我自己從零開始搭建LoRaWAN基站的經驗。

准備工作

運行環境

  1. raspberry 3/3b/4都可以
  2. M-GW1302S模塊
  3. 樹莓派轉接板

Note:
由於硬件使用GPIO7作為SX1302的RESET,與樹莓派的SPI0.1的CS腳沖突(雖然沒有用的SPI0.1,但是有些版本的鏡像會有沖突),
我平時使用2020-05-27版本的剛好沒有沖突,所以建議大家先不要下載最新版的鏡像,2020-05-27-樹莓派鏡像下載地址

實物圖

用到的軟件

SSH工具(XShell,PuTTY等都可以)

資料

  1. M-GW1302S的用戶手冊(描述使用方法)
  2. M-GW1302S的硬件設計手冊(描述模塊硬件設計時需要用到的資料),暫時還用不到
  3. 基站端代碼,見下方

官方開源代碼

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

步驟

准備工作

  1. 樹莓派制作好系統,連上網線,使用SSH與樹莓派連接
  2. 進入樹莓派之后,需要先開啟SPI,若有問題請自行百度,不同版本的樹莓派可能會不同

下載代碼、編譯、運行

  1. git clone https://gitee.com/rejeee/gw1302s.git

  2. cd gw1302s

  3. 修改target.cfg中的TARGET_DIR為

    TARGET_DIR=/home/pi/gw1302s/bin
    
  4. make clean all ->此步驟會把代碼編譯成可執行文件

  5. make install -> 此步驟會用調用SCP將編譯結果拷貝到TARGET_DIR所在目錄,所以可能需要輸入密碼(此處是將scp的dst設為localhost,所以會拷貝到本地),若不想輸密碼,可參考README.md進行ssh秘鑰拷貝,后續就無需輸入密碼了

  6. make install_conf ->至此,源碼就編譯完成了,並且生成的已經在TARGET_DIR指定的目錄下了

  7. 接下來我們需要配置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"
        }
    }
    
    
    1. 最后,我們運行一下./lora_pkt_fwd,程序就會讀取global_conf.json文件,啟動起來了。

    至此,我們就擁有一台自己DIY的LoRaWAN基站了!!

global_conf.json配置

這個配置文件是lora_pkt_fwd程序運行的所有配置參數,其中有幾點是我們平時會比較常用到的:

  1. 如何修改基站的接收頻點
  2. 如何設置基站的ID
  3. 如何設置基站的LoRaWAN NS指向
  4. 如何設置基站的發射功率

設置基站的接收頻點

設置接收頻點主要是通過設置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

    故此條配置的含義是:

    1. 此頻點可接收多個SF
    2. 此頻點為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的下發命令時,會按照指定功率進行下發,若指定的功率不在這個表里面,那么可能就不會進行下發了,此表為什么這配我也不清楚,一般情況下不要去改動它


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM