当前位置:   article > 正文

LoRaWAN网关搭建

lorawan网关

网关搭建方案

M-GW1302S-EV

LoRaWAN 的入网网关的搭建,我为了图方便。使用了南京仁珏的 LoRaWAN 网关开发组件M-GW1302S-EV。这个开发组件采用树莓派的CM3+作为网关的 SoC ,使用南京仁珏自研的 M-GW1302S 射频模块作为 LoRaWAN 网关的基带芯片。同时,开发组件还集成了 GPS 、 RJ45 以及 4G 模块,比较方便网关的软件开发。

M-GW1302S-EV 的主要接口如下图所示:

M-GW1302S-EV接口

SX1302

M-GW1302S-EV 使用的 LoRaWAN 基带芯片是 Semtech 的 SX1302 芯片。在 SX1302 前,Semtech 有 SX1301 的 LoRaWAN 基带芯片,SX1302 可以看做是 SX1301 升级版本。M-GW1302S 模块的是参考 Semtech 官方的开发板进行的设计的。SX1302 的内部主要模块如下图所示:

SX1302内部框架

SX1302 内部的主要模块先不进行详细说明,有个大概了解即可。目前,能够通过模块快速搭建网关接入 LoRaWAN 服务器,方便进行 LoRaWAN 模块开发即可。

树莓派 CM3+

树莓派CM3+模块

树莓派 CM3+ 以 BCM2837B0 为处理器,拥有 1G DDR2 RAM,10G eMMC,主要的总线外设有:

  • 48 x GPIO
  • 2 x I2C
  • 2 x SPI
  • 2 x UART
  • 2 x SD/SDIO
  • 1 x HDMI 1.3a
  • 1 x USB2 HOST/OTG
  • 1 x DPI
  • 1 x NAND 接口

M-GW1302S-EV 的基本设计把该预留的接口都进行预留了,M-GW1302S-EV 的接口如下图所示:

M-GW1302S-EV原理图

M-GW1302S 模块通过 CM3+ 的 SPI0 接口相连接。GPIO7 连接到了 M-GW1302S 的 LoRa_PERST 管脚。这里需要注意的是 GPIO7 连接到了 M-GW1302S 的 LoRa_PERST 管脚!

软件系统方面,CM3+ 模块可以直接跑树莓派官方的 Raspberry Pi OS 作为运行的系统。搭建 LoRaWAN 网关时,我就直接使用官方带桌面的 Raspberry Pi OS(32bits),作为网关运行的系统。树莓派 CM3+ 怎么安装系统就不再赘述了。

构建网关软件系统

Semtech 针对 SX1302 提供了官方的 sx1302_hal 代码库,通过这个代码库,可以直接参考官方的网关设计,编译工程后就可以直接在官方的参考设计运行网关的程序。不过,由于官方的参考设计一直在不断的迭代,导致 M-GW1302S 的设计与官方的参考设计有了一些偏差,M-GW1302S 自己也在 Gitee 上保留了自己的代码仓库,可以拿过来直接用。我为了方便,也在 Gitee 上 Fork 了自己的仓库。

由于 CM3+ 跑的是 Raspberry Pi OS 系统,可以直接接上鼠标键盘像操作 PC 一样进行操作。后续的操作,可以直接在 Raspberry Pi OS 的桌面呼叫命令行进行操作。根据我自己的个人习惯,我是通过 SSH 直接登陆到了 CM3+ 中进行下列操作。

获取源代码

在自己指定的目录下,从 gitee 获取 gw1302s 的源码:

git clone https://gitee.com/sage-xiong/gw1302s.git
  • 1

编译工程

进入 gw1302s 工程目录:

cd gw1302s
  • 1

PS: gw1302s 工程的以下操作都是在工程的根目录进行操作的,这个是需要注意的地方。

清空结果并编译源码:

make clean all
  • 1

运行了 make clean all后,CM3+ 就开始构建工程。只需要等待工程编译完成即可。编译完成后,就像下面的结果。

工程编译结果

至此,gw1302s 的官方源码构建完毕,可以根据构建的结果安装应用程序了。

应用程序安装

生成 ssh 秘钥

gw1302s 编译结束后,是通过 ssh-copy-id 的方式,讲编译的结果安装到需要运行的网关上的。因此,在安装可执行文件前,需要先生成本级的秘钥和证书:

ssh-keygen -t rsa
  • 1

复制可执行文件

使用 ssh-copy-id 复杂可执行文件。其中的 userhost_dest是安装主机的用户名主机地址

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host_dest
  • 1

这里由于我使用的 CM3+ 账户名是 pi 并且是在 CM3+ 的本地进行安装,主机地址直接填 localhost 即可。所以,直接在命令行输入:

ssh-copy-id -i ~/.ssh/id_rsa.pub pi@localhost
  • 1

由于我已经把可执行文件安装了,饭了一下的结果:

ssh-copy-id

安装配置项

执行 make install_conf安装配置项。

make install_conf
  • 1

配置项安装完成后,就可以在 gw1302s 的目录下的 bin 目录下,看到工程生成的所有文件了:

.
├── chip_id
├── global_conf.json
├── global_conf.json.sx1250.CN490
├── global_conf.json.sx1250.EU868
├── global_conf.json.sx1250.US915
├── global_conf.json.sx1257.EU868
├── gwstart.sh
├── lora_pkt_fwd
├── net_downlink
├── reset_lgw.sh
├── test_loragw_cal
├── test_loragw_capture_ram
├── test_loragw_counter
├── test_loragw_gps
├── test_loragw_hal_rx
├── test_loragw_hal_tx
├── test_loragw_i2c
├── test_loragw_reg
├── test_loragw_spi
├── test_loragw_spi_sx1250
└── update_gwid.sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

bin 目录下的几个主要文件的功能是:

  • global_conf.*: 网关配置文件,配置网关支持的频段信息,连接的服务器等。
  • gwstart.sh: 网关启动脚本,配置好后,可以直接运行启动网关的 LoRaWAN 程序。
  • test_xxx: 网关测试用的可执行文件
  • update_gwid.sh: gwid 更新脚本,用于配置文件的 gwid 更新。
  • lora_pkt_fwd: 网关的 packet_foward 程序,直接与 LoRaWAN 服务器通过 UDP 进行通讯。
  • reset_lgw.sh: sx1302 复位脚本,用于复位 M-GW1302S 模块。

修改 reset_lgw.sh 脚本

M-GW1302S-EV原理图

根据 M-GW1302S-EV 的原理图,树莓派 CM3+ 的 GPIO7 管脚与 M-GW1302S 的LoRa_PERST 管脚相连。SX1302 芯片在操作寄存器前,需要先对芯片进行复位。然而, Raspberry Pi OS 的系统更新后,使用 sudo raspi-config打开 spi 总线后,reset_lgw.sh脚本执行总是失败,导致 gwstart.sh网关启动脚本无法正确执行。查看 reset_lgw.sh脚本的内容:

#!/bin/sh

# This script is intended to be used on SX1302 CoreCell platform, it performs
# the following actions:
#       - export/unpexort GPIO7 used to reset the SX1302 chip
#
# Usage examples:
#       ./reset_lgw.sh stop
#       ./reset_lgw.sh start

# GPIO mapping has to be adapted with HW
#

SX1302_RESET_PIN=7

WAIT_GPIO() {
    sleep 0.1
}

init() {
    # setup GPIOs
    echo "$SX1302_RESET_PIN" > /sys/class/gpio/export; WAIT_GPIO

    # set GPIOs as output
    echo "out" > /sys/class/gpio/gpio$SX1302_RESET_PIN/direction; WAIT_GPIO
}

reset() {
    echo "CoreCell reset through GPIO$SX1302_RESET_PIN..."

    # write output for SX1302 CoreCell reset
    echo "1" > /sys/class/gpio/gpio$SX1302_RESET_PIN/value; WAIT_GPIO
    echo "0" > /sys/class/gpio/gpio$SX1302_RESET_PIN/value; WAIT_GPIO
}

term() {
    # cleanup all GPIOs
    if [ -d /sys/class/gpio/gpio$SX1302_RESET_PIN ]
    then
        echo "$SX1302_RESET_PIN" > /sys/class/gpio/unexport; WAIT_GPIO
    fi
}

case "$1" in
    start)
    term # just in case
    init
    reset
    ;;
    stop)
    reset
    term
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

查看反馈结果后,发现是

echo "$SX1302_RESET_PIN" > /sys/class/gpio/export;
  • 1

执行时,SX1302_RESET_PIN的 GPIO7 一直被占用,导致无法对 GPIO7 进行复位操作,最后导致无法复位 SX1302 模块。

由于在 Raspberry Pi OS 系统更新前,这个脚本是没有问题可以直接运行的,导致我查了很久都没有查出具体的问题。最后,改用 Raspi 提供的 gpio 操作工具,改写 reset_lgw.sh脚本如下:

#!/bin/sh

# This script is intended to be used on SX1302 CoreCell platform, it performs
# the following actions:
#       - export/unpexort GPIO7 used to reset the SX1302 chip
#
# Usage examples:
#       ./reset_lgw.sh stop
#       ./reset_lgw.sh start

# GPIO mapping has to be adapted with HW
#

SX1302_RESET_PIN=7

WAIT_GPIO() {
    sleep 0.1
}

init() {
    # set GPIOs as output
    sudo raspi-gpio set $SX1302_RESET_PIN op; WAIT_GPIO
}

reset() {
    echo "CoreCell reset through GPIO$SX1302_RESET_PIN..."

    # write output for SX1302 CoreCell reset
    sudo raspi-gpio set $SX1302_RESET_PIN dh; WAIT_GPIO
    sudo raspi-gpio set $SX1302_RESET_PIN dl; WAIT_GPIO
}

term() {
    # cleanup all GPIOs
    if [ -d /sys/class/gpio/gpio$SX1302_RESET_PIN ]
    then
        sudo raspi-gpio set $SX1302_RESET_PIN op; WAIT_GPIO
    fi
}

case "$1" in
    start)
    term # just in case
    init
    reset
    ;;
    stop)
    reset
    term
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

再次运行,reset_lgw.sh脚本,发现没有问题,启动 gwstart.sh可以正常启动 LoRaWAN Gatew 的应用程序。

Gateway_ID set to fffeb827ebff48d6 in file ./global_conf.json
*** Packet Forwarder ***
Version: 1.0.5
*** SX1302 HAL library version info ***
Version: 1.0.5;
***
INFO: Little endian host
INFO: found configuration file global_conf.json, parsing it
INFO: global_conf.json.sx1250.CN490 does contain a JSON object named SX130x_conf, parsing SX1302 parameters
INFO: spidev_path /dev/spidev0.0, lorawan_public 1, clksrc 0, full_duplex 0
INFO: antenna_gain 0 dBi
INFO: Configuring legacy timestamp
INFO: Configuring Tx Gain LUT for rf_chain 0 with 16 indexes for sx1250
INFO: radio 0 enabled (type SX1250), center frequency 471400000, RSSI offset -207.000000, tx enabled 1, single input mode 1
INFO: radio 1 enabled (type SX1250), center frequency 475000000, RSSI offset -207.000000, tx enabled 0, single input mode 1
INFO: Lora multi-SF channel 0>  radio 0, IF -300000 Hz, 125 kHz bw, SF 5 to 12
INFO: Lora multi-SF channel 1>  radio 0, IF -100000 Hz, 125 kHz bw, SF 5 to 12
INFO: Lora multi-SF channel 2>  radio 0, IF 100000 Hz, 125 kHz bw, SF 5 to 12
INFO: Lora multi-SF channel 3>  radio 0, IF 300000 Hz, 125 kHz bw, SF 5 to 12
INFO: Lora multi-SF channel 4>  radio 1, IF -300000 Hz, 125 kHz bw, SF 5 to 12
INFO: Lora multi-SF channel 5>  radio 1, IF -100000 Hz, 125 kHz bw, SF 5 to 12
INFO: Lora multi-SF channel 6>  radio 1, IF 100000 Hz, 125 kHz bw, SF 5 to 12
INFO: Lora multi-SF channel 7>  radio 1, IF 300000 Hz, 125 kHz bw, SF 5 to 12
INFO: Lora std channel> radio 1, IF -200000 Hz, 250000 Hz bw, SF 7, Explicit header
INFO: FSK channel> radio 1, IF 300000 Hz, 125000 Hz bw, 50000 bps datarate
INFO: global_conf.json does contain a JSON object named gateway_conf, parsing gateway parameters
INFO: gateway MAC address is configured to FFFEB827EBFF48D6
INFO: server hostname or IP address is configured to "localhost"
INFO: upstream port is configured to "1700"
INFO: downstream port is configured to "1700"
INFO: downstream keep-alive interval is configured to 10 seconds
INFO: statistics display interval is configured to 30 seconds
INFO: upstream PUSH_DATA time-out is configured to 100 ms
INFO: packets received with a valid CRC will be forwarded
INFO: packets received with a CRC error will NOT be forwarded
INFO: packets received with no CRC will NOT be forwarded
INFO: GPS serial port path is configured to "/dev/ttyS0"
INFO: Reference latitude is configured to 0.000000 deg
INFO: Reference longitude is configured to 0.000000 deg
INFO: Reference altitude is configured to 0 meters
INFO: Beaconing period is configured to 0 seconds
INFO: Beaconing signal will be emitted at 869525000 Hz
INFO: Beaconing datarate is set to SF9
INFO: Beaconing modulation bandwidth is set to 125000Hz
INFO: Beaconing TX power is set to 14dBm
INFO: Beaconing information descriptor is set to 0
INFO: global_conf.json does contain a JSON object named debug_conf, parsing debug parameters
INFO: got 2 debug reference payload
INFO: reference payload ID 0 is 0xCAFE1234
INFO: reference payload ID 1 is 0xCAFE2345
INFO: setting debug log file name to loragw_hal.log
WARNING: [main] impossible to open /dev/ttyS0 for GPS sync (check permissions)
CoreCell reset through GPIO7...
INFO: Configuring SX1250_0 in single input mode
INFO: Configuring SX1250_1 in single input mode
INFO: [main] concentrator started, packet can now be received
INFO: concentrator EUI: 0x0016c001ff1f3e67
INFO: [down] PULL_ACK received in 2 ms
INFO: [down] PULL_ACK received in 1 ms
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

修改 global.json 配置连接到本地服务器

启动脚本 gwstart.sh的内容非常简单:

#!/bin/sh

cd /home/pi/gw1302s/bin
./update_gwid.sh ./global_conf.json
./lora_pkt_fwd
  • 1
  • 2
  • 3
  • 4
  • 5

第 2 句脚本是更新 global_conf.json内部的网关的 gateway_ID属性唯一。

第 3 句是启动 lora_pkt_fwd程序与 LoRaWAN 服务器连接。 lora_pkt_fwd在没有参数的情况下,会以相同目录的 global_conf.json作为全局的配置启动。

global_conf.json默认情况下的文件包含了许多内容,目前只需要网关能先连接服务器,所以只限关注 gateway_conf主键下的内容:

"gateway_conf": {
    "gateway_ID": "fffeb827ebff48d6",
    /* change with default server address/ports */
    "server_address": "localhost",
    "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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

gateway_conf配置的是网关的一些基本信息,目前只需要关注一下几项:

  • gateway_ID: LoRaWAN 网关的设备 ID 在服务器接入时有用;
  • server_address: LoRaWAN 服务器 IP 地址,默认是腾讯云服务器,根据实际的需要修改成自己的 LoRaWAN 服务器就好;
  • serv_port_up: LoRaWAN 网关上行数据端口,UDP 端口号;
  • serv_port_down: LoRaWAN 网关下行数据端口,UDP 端口号;

我的 LoRaWAN 服务器是我自己搭建的服务器,所以,修改 server_address服务器的地址为 192.168.10.125然后保存即可。

然后重启网关服务:

cd ~/gw1302s/bin && ./gwstart.sh
  • 1

到此,LoRaWAN 网关的基本配置就完成了。

Chirpstack 服务器添加网关

LoRaWAN 网关的接入,还需要在 Chirpstack 服务器上添加网关的 gateway_ID才能够在 Chirpstack 服务器的页面上看见 LoRaWAN 网关的相关信息。

登陆 Chirpstack

使用浏览器,访问 Chirpstack 地址进入登陆页。我使用自己搭建的 Chirpstack 服务器,所以直接访问 192.168.10.125:8080

chirpstack登陆页面

默认的登陆用户名是 admin/admin

登陆完成后,直接在后台的左侧选项卡,选择 Gateways选项,进入 LoRaWAN 网关相关的配置页面。

chirpstack网关页面

按照图中的步骤完成后,就可以进入网关添加页面。

chirpstack添加网关

在网关添加页面中的 Gateway ID 栏填写上 global_conf.json中的 gateway_ID主键内容,就可以完成 LoRaWAN Gateway 的添加了,点击网页底部的 submit完成网关添加。

然后,退回 Gateways页面,就可以看到已经添加的网关:

chirpstack网关添加成功

等待一小段时间,重新刷新页面,就可以发现网关已经成功上线:

chirpstack网关上线

到此,LoRaWAN 网关的构建和服务器接入就全部完成了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/516048
推荐阅读
相关标签
  

闽ICP备14008679号