网关搭建方案
LoRaWAN 的入网网关的搭建,我为了图方便。使用了南京仁珏的 LoRaWAN 网关开发组件M-GW1302S-EV。这个开发组件采用树莓派的CM3+作为网关的 SoC ,使用南京仁珏自研的 M-GW1302S 射频模块作为 LoRaWAN 网关的基带芯片。同时,开发组件还集成了 GPS 、 RJ45 以及 4G 模块,比较方便网关的软件开发。
M-GW1302S-EV 的主要接口如下图所示:
SX1302
M-GW1302S-EV 使用的 LoRaWAN 基带芯片是 Semtech 的 SX1302 芯片。在 SX1302 前,Semtech 有 SX1301 的 LoRaWAN 基带芯片,SX1302 可以看做是 SX1301 升级版本。M-GW1302S 模块的是参考 Semtech 官方的开发板进行的设计的。SX1302 的内部主要模块如下图所示:
SX1302 内部的主要模块先不进行详细说明,有个大概了解即可。目前,能够通过模块快速搭建网关接入 LoRaWAN 服务器,方便进行 LoRaWAN 模块开发即可。
树莓派 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 模块通过 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 的官方源码构建完毕,可以根据构建的结果安装应用程序了。
应用程序安装
生成 ssh 秘钥
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 目录下的几个主要文件的功能是:
- 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 的原理图,树莓派 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
修改 global.json 配置连接到本地服务器
启动脚本 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
配置的是网关的一些基本信息,目前只需要关注一下几项:
- 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
到此,LoRaWAN 网关的基本配置就完成了。
Chirpstack 服务器添加网关
LoRaWAN 网关的接入,还需要在 Chirpstack 服务器上添加网关的 gateway_ID
才能够在 Chirpstack 服务器的页面上看见 LoRaWAN 网关的相关信息。
登陆 Chirpstack
使用浏览器,访问 Chirpstack 地址进入登陆页。我使用自己搭建的 Chirpstack 服务器,所以直接访问 192.168.10.125:8080
。
默认的登陆用户名是 admin/admin
。
登陆完成后,直接在后台的左侧选项卡,选择 Gateways
选项,进入 LoRaWAN 网关相关的配置页面。
按照图中的步骤完成后,就可以进入网关添加页面。
在网关添加页面中的 Gateway ID 栏填写上 global_conf.json
中的 gateway_ID
主键内容,就可以完成 LoRaWAN Gateway 的添加了,点击网页底部的 submit
完成网关添加。
然后,退回 Gateways
页面,就可以看到已经添加的网关:
等待一小段时间,重新刷新页面,就可以发现网关已经成功上线:
文章来源:https://www.toymoban.com/news/detail-788892.html
到此,LoRaWAN 网关的构建和服务器接入就全部完成了。文章来源地址https://www.toymoban.com/news/detail-788892.html
到了这里,关于LoRaWAN网关搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!