赞
踩
LoRaWAN 的入网网关的搭建,我为了图方便。使用了南京仁珏的 LoRaWAN 网关开发组件M-GW1302S-EV。这个开发组件采用树莓派的CM3+作为网关的 SoC ,使用南京仁珏自研的 M-GW1302S 射频模块作为 LoRaWAN 网关的基带芯片。同时,开发组件还集成了 GPS 、 RJ45 以及 4G 模块,比较方便网关的软件开发。
M-GW1302S-EV 的主要接口如下图所示:
M-GW1302S-EV 使用的 LoRaWAN 基带芯片是 Semtech 的 SX1302 芯片。在 SX1302 前,Semtech 有 SX1301 的 LoRaWAN 基带芯片,SX1302 可以看做是 SX1301 升级版本。M-GW1302S 模块的是参考 Semtech 官方的开发板进行的设计的。SX1302 的内部主要模块如下图所示:
SX1302 内部的主要模块先不进行详细说明,有个大概了解即可。目前,能够通过模块快速搭建网关接入 LoRaWAN 服务器,方便进行 LoRaWAN 模块开发即可。
树莓派 CM3+ 以 BCM2837B0 为处理器,拥有 1G DDR2 RAM,10G eMMC,主要的总线外设有:
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
进入 gw1302s 工程目录:
cd gw1302s
PS: gw1302s 工程的以下操作都是在工程的根目录进行操作的,这个是需要注意的地方。
清空结果并编译源码:
make clean all
运行了 make clean all
后,CM3+ 就开始构建工程。只需要等待工程编译完成即可。编译完成后,就像下面的结果。
至此,gw1302s 的官方源码构建完毕,可以根据构建的结果安装应用程序了。
gw1302s 编译结束后,是通过 ssh-copy-id 的方式,讲编译的结果安装到需要运行的网关上的。因此,在安装可执行文件前,需要先生成本级的秘钥和证书:
ssh-keygen -t rsa
使用 ssh-copy-id 复杂可执行文件。其中的 user
和 host_dest
是安装主机的用户名和主机地址。
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host_dest
这里由于我使用的 CM3+ 账户名是 pi 并且是在 CM3+ 的本地进行安装,主机地址直接填 localhost 即可。所以,直接在命令行输入:
ssh-copy-id -i ~/.ssh/id_rsa.pub pi@localhost
由于我已经把可执行文件安装了,饭了一下的结果:
执行 make install_conf
安装配置项。
make install_conf
配置项安装完成后,就可以在 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
bin 目录下的几个主要文件的功能是:
根据 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
查看反馈结果后,发现是
echo "$SX1302_RESET_PIN" > /sys/class/gpio/export;
执行时,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
再次运行,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
启动脚本 gwstart.sh
的内容非常简单:
#!/bin/sh
cd /home/pi/gw1302s/bin
./update_gwid.sh ./global_conf.json
./lora_pkt_fwd
第 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 }
gateway_conf
配置的是网关的一些基本信息,目前只需要关注一下几项:
我的 LoRaWAN 服务器是我自己搭建的服务器,所以,修改 server_address
服务器的地址为 192.168.10.125
然后保存即可。
然后重启网关服务:
cd ~/gw1302s/bin && ./gwstart.sh
到此,LoRaWAN 网关的基本配置就完成了。
LoRaWAN 网关的接入,还需要在 Chirpstack 服务器上添加网关的 gateway_ID
才能够在 Chirpstack 服务器的页面上看见 LoRaWAN 网关的相关信息。
使用浏览器,访问 Chirpstack 地址进入登陆页。我使用自己搭建的 Chirpstack 服务器,所以直接访问 192.168.10.125:8080
。
默认的登陆用户名是 admin/admin
。
登陆完成后,直接在后台的左侧选项卡,选择 Gateways
选项,进入 LoRaWAN 网关相关的配置页面。
按照图中的步骤完成后,就可以进入网关添加页面。
在网关添加页面中的 Gateway ID 栏填写上 global_conf.json
中的 gateway_ID
主键内容,就可以完成 LoRaWAN Gateway 的添加了,点击网页底部的 submit
完成网关添加。
然后,退回 Gateways
页面,就可以看到已经添加的网关:
等待一小段时间,重新刷新页面,就可以发现网关已经成功上线:
到此,LoRaWAN 网关的构建和服务器接入就全部完成了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。