搭建LoRaWAN网关,并集成ChirpStack服务和连接TTN平台
目录
a、开始安装 mosquitto 、 postgresql 、Redis
d、创建一个名为 chirpstack 的数据库,并指定该角色为数据库的所有者
f、在 chirpstack 数据库中创建 pg_trgm 扩展,用于支持三元组操作CREATE EXTENSION pg_trgm;
2、chirpstack_gateway_bridge 安装
一:硬件
a、树莓派4B
b、SX1302网关模块+树莓派转接板 或 PCIE转排针板
其他硬件也是可以的(必须搭载arm-linux的能力,硬件上拥有预留SPI接口、UART、IIC等)
ChirpStack服务都可以跑,但是硬件不一致有可能导致LoRaWAN网关模块驱动失败。
本文只讲树莓派4B的搭建方式。其他硬件可以根据自己的引脚自行设置匹配。
推荐硬件:香橙派3 3B、鲁班猫0 1 2 4 5 等等
二:系统
1、安装树莓派OS(Debian)
1.1、下载方式
a、官网下载:https://www.raspberrypi.com/software/operating-systems/
可以直接使用烧录器烧录(Etcher-Portable-1.4.9-x64)
也可以使用b来选择下载的镜像进行安装
可以下载带有桌面版本的,我下载的是:

b、 树莓派下载器,下载地址:https://www.raspberrypi.com/software/
界面图:

注意:把SD卡装入读写器再插入电脑,推荐把SD卡格式化成FAT32格式的
使用这个软件可以在烧录的时候添加用户、WiFi信息、打开SSH等,推荐用户名用:pi,密码用:raspberry
1.2、开始安装系统吧
傻瓜式安装,直接Install





自己对应自己的编辑一下配置

继续安装,直接安装。等待成功

1.3、插上屏幕测试
开机成功,查看一下ip地址

三:SSH连接树莓派-配置树莓派引脚
1、SSH连接树莓派
如果不知道自己树莓派的ip地址的话
电脑用“Advanced IP Scanner”软件进行扫描或CMD命令:arp -a 等
手机用“Fing”软件扫描 等
SSH工具有很多,电脑推荐用:MobaXterm,手机推荐用:JuiceSSH
我的用户名是pi 密码是 raspberry
登录成功,查看系统

如果想使用网口的话可参考:http://www.readke.com/c/542097.html
2、配置树莓派
LoRaWAN网关模块需要和树莓派建立联系,需要用到:
SPI:大部分都是只针对LoRaWAN模块
UART:GPS的数据
IIC:温湿度传感器的
有的模块还有用到网络比如RAK家的等等等。
我这个我目前使用的只用到了SPI、UART、IIC
打开树莓派,配置一下,使用 sudo raspi-config
找到:3 Interface Options 里面分别有 I4 SPI 、I5 I2C 、I6 Serial Port 这几个选项,全部yes
就配置好了,然后 sudo reboot 重启一下。
3、使用VScode控制编写树莓派
咱先看下一个问题,ssh连接错误的问题
C:\Users\aweig>ssh pi@192.168.30.32 Bad permissions. Try removing permissions for user: \Everyone (S-1-1-0) on file C:/Users/aweig/.ssh/config. Bad owner or permissions on C:\Users\aweig/.ssh/config
我是想测试一下用 powershell 连接我的树莓派的,然后出现了这个问题
这个问题我已经解决了,是windows下的用户组啥的问题,具体我不是太清楚。
接下来讲讲怎么解决的:
终端下:
cd C:\Users\aweig\.ssh
使用以下命令检查 config 文件的权限:
icacls config
要移除对 Everyone 的权限,可以使用以下命令:
icacls config /remove Everyone
Everyone就是搜到的文件的权限组
接下来添加本机的权限组




然后确定、确定、确定。

成功进入了
下面讲下VsCode的连接树莓派,先安装这两个插件

按Ctrl+Shift+P
选择配置SSH主机

选择第一个

我这里用的秘钥登录的,比较方便,我也来教一下

首先在windows终端输入这个 -C是增加个人签名之类的,我还给他增加了密码。所以验证的时候还要输入密码
ssh-keygen -t rsa -C 2222246570@qq.com

路径在:C:\Users\aweig/.ssh/ 下面了,把 id_rsa.pub 复制到树莓派中,拷贝到 /home/pi/.ssh/ 中

再进入目录 ~/.ssh ,执行 cat id_rsa.pub >>authorized_keys

使用VsCode连接

提示输入密码,输入刚才自己加的密码

创建个新的终端,好了

接下来愉快的使用。


四:sx1302_hal
1、叙述模块
讲一下我的模块,我是在鱼鱼软件中买的GreenPalm的GPML7931-PX模块+树莓派转接板
这是该模块的官网:http://www.greenpalm.cn
频段是CN470,下面是内部模块框图和PCIE引脚图:


由于鱼鱼中并没有提供资料,我只能自我发挥了。同过网络乾坤搜寻大法等等,再根据他的引脚图使用万用表和老司机牛马人的眼睛,终于找到他对应转接板的引脚。方法有很多,请勿模仿。
下面是连接树莓派用到的引脚

2、驱动sx1302网关模块
在下载驱动程序之前先更换一下树莓派的源:
sudo nano /etc/apt/sources.list
deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free
# deb-src http://mirrors.ustc.edu.cn/debian stable main contrib non-free
deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
# deb-src http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
# deb http://mirrors.ustc.edu.cn/debian stable-proposed-updates main contrib non-free
# deb-src http://mirrors.ustc.edu.cn/debian stable-proposed-updates main contrib non-free
注意,接下来要用常用的nano命令:按 Ctrl+O 后,按下回车 进行保存,然后按下 Ctrl+X 退出
sudo apt-get update
参考:https://blog.csdn.net/jomesm/article/details/88374156
阿里镜像源:https://developer.aliyun.com/mirror/?spm=a2c6h.13651104.mirror-detail.d1002.2ed64763vT4DcI
下载sx1302_hal:https://github.com/Lora-net/sx1302_hal.git
我们使用的是master,也就是V2.1.0版本的
先到home/pi目录下,直接使用git命令,就会在改目录下拥有一个sx1302_hal的文件了
最好是先创建个人文件夹,比如:liwei-workspace
git clone https://github.com/Lora-net/sx1302_hal.git
进入sx1302_hal:cd sx1302_hal
要修改的主要有:
- reset_lgw.h 复位SX1302 我的是GPIO23
- SPI设备接口 连接LoRaWAN模块的SPI 我的是SPI0.0
- UART接口 连接GPS的串口 我的是串口0
- I2C接口 连接温湿度模块 我的是I2C1
2.1、修改文件,适配自己的机器
2.1.1、reset_lgw.h修改
复制tools/reset_lgw.h复制到sx1302_hal的目录下
cp tools/reset_lgw.sh .
修改如下:直接修改成 raspi-gpio 来控制
#!/bin/sh
# 这个脚本用于管理SX1302 CoreCell平台的GPIO引脚
# 使用方法:
# ./reset_lgw.sh start - 初始化并重置GPIO引脚
# ./reset_lgw.sh stop - 执行重置并清理GPIO引脚
# 定义GPIO引脚
SX1302_RESET_PIN=23 # SX1302复位引脚
SX1302_POWER_EN_PIN=18 # SX1302电源使能引脚
SX1261_RESET_PIN=22 # SX1261复位引脚(可选)
AD5338R_RESET_PIN=13 # AD5338R复位引脚(可选)
WAIT_GPIO() {
sleep 0.1 # 等待GPIO操作生效的短暂延时
}
init() {
# 初始化GPIO引脚(当前使用raspi-gpio工具)
sudo raspi-gpio set $SX1302_RESET_PIN op; WAIT_GPIO
}
reset() {
echo "通过GPIO$SX1302_RESET_PIN重置CoreCell..."
# 通过切换GPIO引脚来执行重置
sudo raspi-gpio set $SX1302_RESET_PIN dh; WAIT_GPIO
sudo raspi-gpio set $SX1302_RESET_PIN dl; WAIT_GPIO
}
term() {
# 清理GPIO引脚(取消导出)
if [ -d /sys/class/gpio/gpio$SX1302_RESET_PIN ]; then
echo "$SX1302_RESET_PIN" > /sys/class/gpio/unexport; WAIT_GPIO
fi
if [ -d /sys/class/gpio/gpio$SX1261_RESET_PIN ]; then
echo "$SX1261_RESET_PIN" > /sys/class/gpio/unexport; WAIT_GPIO
fi
if [ -d /sys/class/gpio/gpio$SX1302_POWER_EN_PIN ]; then
echo "$SX1302_POWER_EN_PIN" > /sys/class/gpio/unexport; WAIT_GPIO
fi
if [ -d /sys/class/gpio/gpio$AD5338R_RESET_PIN ]; then
echo "$AD5338R_RESET_PIN" > /sys/class/gpio/unexport; WAIT_GPIO
fi
}
case "$1" in
start)
term # 清理任何现有的GPIO设置
init
reset
;;
stop)
reset
term
;;
*)
echo "用法: \$0 {start|stop}"
exit 1
;;
esac
exit 0
#WAIT_GPIO() 函数中注释了延时的目的。
#init() 函数中解释了GPIO引脚的初始化操作。
#reset() 函数中描述了如何通过GPIO引脚执行重置操作。
#term() 函数中说明了如何清理GPIO引脚的设置。
#case 语句 中给出了启动和停止脚本的用法提示。
2.1.2、global_conf.json修改
复制 packet_forwarder 下的 global_conf.json.sx1250.CN490 到sx1302_hal目录下
cp packet_forwarder/global_conf.json.sx1250.CN490 .
然后重命名为 global_conf.json 修改为如下:
mv global_conf.json.sx1250.CN490 global_conf.json
a、global_conf.json中文注释
{
"SX130x_conf": {
"com_type": "SPI", // 通信类型: SPI
"com_path": "/dev/spidev0.0", // SPI设备路径
"lorawan_public": true, // 是否启用LoRaWAN公共模式
"clksrc": 0, // 时钟源配置
"antenna_gain": 0, /* 天线增益,单位:dBi */
"full_duplex": false, // 是否启用全双工模式
"fine_timestamp": {
"enable": false, // 是否启用精确时间戳
"mode": "all_sf" /* 模式:high_capacity或all_sf */
},
"radio_0": {
"enable": true, // 是否启用第0个无线电模块
"type": "SX1250", // 无线电模块类型
"single_input_mode": true, // 是否启用单输入模式
"freq": 470600000, // 频率,单位:Hz
"rssi_offset": -207.0, // RSSI偏移量
"rssi_tcomp": { // RSSI温度补偿
"coeff_a": 0,
"coeff_b": 0,
"coeff_c": 20.41,
"coeff_d": 2162.56,
"coeff_e": 0
},
/* 设置发射功率,修改此配置要注意,要符合当地的无线通信法规*/
"tx_enable": true, // 是否启用发射功能
"tx_freq_min": 500000000, // 发射最小频率,单位:Hz
"tx_freq_max": 510000000, // 发射最大频率,单位:Hz
"tx_gain_lut": [ // 发射增益查找表
/* rf_power发射功率-6dBm pa_gain:0低增益 1高增益。索引值对应不同的功率设置 */
{"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": 1, "pwr_idx": 7},
{"rf_power": 13, "pa_gain": 1, "pwr_idx": 8},
{"rf_power": 14, "pa_gain": 1, "pwr_idx": 9},
{"rf_power": 16, "pa_gain": 1, "pwr_idx": 10},
{"rf_power": 20, "pa_gain": 1, "pwr_idx": 11},
{"rf_power": 23, "pa_gain": 1, "pwr_idx": 12},
{"rf_power": 25, "pa_gain": 1, "pwr_idx": 13},
{"rf_power": 26, "pa_gain": 1, "pwr_idx": 14},
{"rf_power": 27, "pa_gain": 1, "pwr_idx": 15}
]
},
"radio_1": {
"enable": true, // 是否启用第1个无线电模块
"type": "SX1250", // 无线电模块类型
"single_input_mode": true, // 是否启用单输入模式
"freq": 471400000, // 频率,单位:Hz
"rssi_offset": -207.0, // RSSI偏移量
"rssi_tcomp": { // RSSI温度补偿
"coeff_a": 0,
"coeff_b": 0,
"coeff_c": 20.41,
"coeff_d": 2162.56,
"coeff_e": 0
},
"tx_enable": false // 是否启用发射功能,一般情况发射都是用的radio_0
},
"chan_multiSF_All": {
"spreading_factor_enable": [5, 6, 7, 8, 9, 10, 11, 12] // 启用的扩频因子
},
"chan_multiSF_0": {
"enable": true, // 是否启用通道 0
"radio": 0, // 使用的无线电模块 0
"if": -300000 // 中频,单位:Hz 中心频点上偏移-300000Hz 470.3Mhz
},
"chan_multiSF_1": {
"enable": true,
"radio": 0,
"if": -100000 // 470.5Mhz
},
"chan_multiSF_2": {
"enable": true,
"radio": 0,
"if": 100000 // 470.7Mhz
},
"chan_multiSF_3": {
"enable": true,
"radio": 0,
"if": 300000 // 470.9Mhz
},
"chan_multiSF_4": {
"enable": true, // 是否启用通道 4
"radio": 1, // 使用的无线电模块 1
"if": -300000 // 中频,单位:Hz 471.1Mhz
},
"chan_multiSF_5": {
"enable": true,
"radio": 1,
"if": -100000 // 471.3Mhz
},
"chan_multiSF_6": {
"enable": true,
"radio": 1,
"if": 100000 // 471.5Mhz
},
"chan_multiSF_7": {
"enable": true,
"radio": 1,
"if": 300000 // 471.7Mhz
},
"chan_Lora_std": {
"enable": true, // 是否启用标准LoRa通道
"radio": 1, // 使用的无线电模块
"if": -200000, // 中频,单位:Hz
"bandwidth": 250000, // 带宽,单位:Hz
"spread_factor": 7, // 扩频因子
"implicit_hdr": false, // 是否启用隐式头
"implicit_payload_length": 17, // 隐式负载长度
"implicit_crc_en": false, // 隐式CRC是否启用
"implicit_coderate": 1 // 隐式编码速率
},
"chan_FSK": {
"enable": true, // 是否启用FSK通道
"radio": 1, // 使用的无线电模块
"if": 300000, // 中频,单位:Hz
"bandwidth": 125000, // 带宽,单位:Hz
"datarate": 50000 // 数据速率,单位:bps
}
},
/* 网关配置信息 */
"gateway_conf": {
"gateway_ID": "AA555A0000000000", // 网关ID
/* 修改为默认服务器地址/端口 */
"server_address": "localhost", // 服务器地址
"serv_port_up": 1700, // 服务器上传端口
"serv_port_down": 1700, // 服务器下载端口
/* 调整以下参数以适应您的网络 */
"keepalive_interval": 10, // 保活间隔时间,单位:秒
"stat_interval": 30, // 状态报告间隔时间,单位:秒
"push_timeout_ms": 100, // 推送超时时间,单位:毫秒
/* 仅转发有效数据包 */
"forward_crc_valid": true, // 是否转发CRC校验通过的数据包
"forward_crc_error": false, // 是否转发CRC校验错误的数据包
"forward_crc_disabled": false, // 是否转发CRC校验禁用的数据包
/* GPS配置 */
"gps_tty_path": "/dev/ttyS0", // GPS设备路径
/* GPS参考坐标 */
"ref_latitude": 0.0, // 参考纬度
"ref_longitude": 0.0, // 参考经度
"ref_altitude": 0, // 参考高度
/* 定位信号参数 */
"beacon_period": 0, // 定位信号周期,单位:秒
"beacon_freq_hz": 869525000, // 定位信号频率,单位:Hz
"beacon_datarate": 9, // 定位信号数据速率
"beacon_bw_hz": 125000, // 定位信号带宽,单位:Hz
"beacon_power": 14, // 定位信号发射功率,单位:dBm
"beacon_infodesc": 0 // 定位信号信息描述
},
"debug_conf": {
"ref_payload": [ // 调试参考负载
{"id": "0xCAFE1234"}, // 负载ID 1
{"id": "0xCAFE2345"} // 负载ID 2
],
"log_file": "loragw_hal.log" // 日志文件名
}
}
2.1.3、global_conf.json配置说明
这个配置文件是lora_pkt_fwd程序运行的所有配置参数,其中几点是我们平时会比较常用到的:
- 如何修改基站的接收频点
- 如何设置基站的ID
- 如何设置基站的LoRaWAN NS指向
- 如何设置基站的发射功率
a:设置基站的接收频点
a1、频率对照请参考
https://www.milesight.cn/support/milesight-gateway-3
设置接收频点主要是通过设置 radio_0 和 radio_1 的中心频点,并在此基础上设置 8 个接收信道的偏移来进行的,比如上面的参数,其中 :
radio_0.freq==470600000
radio_1.freq==471400000
这就是 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=470600000-300000=470300000=470.3MHz
b:设置基站的ID
gateway_conf.gateway_ID即是
c:如何设置基站的LoRaWAN NS指向
- gateway_conf.server_address为NS的地址
- gateway_conf.serv_port_up为NS的上行端口
- gateway_conf.serv_port_down为NS的下行端口
d:如何设置基站的发射功率
基站的发射功率
-
首先是要有个radio的tx_enable是true的,即表示通过此芯片发送下行,这个和硬件有关,不过大部分情况下都是radio_0(大家都参考的原厂的参考设计)
-
tx_freq_min,tx_freq_max设置的是发射的最小,最大频点范围
-
tx_gain_lut是tx power的一个具体配置表,也就是说,当基站收到NS的下发命令时,会按照指定功率进行下发,若指定的功率不在这个表里面,那么可能就不会进行下发了,一般情况下不要去改动它
2.1.4、loragw_i2c修改
在 sx1302_hal/libloragw/in c目录下修改 loragw_i2c.h 文件
nano libloragw/inc/loragw_i2c.h
#define I2C_DEVICE "/dev/i2c-1"
2.1.5、编译运行sx1302_hal代码
以上修改完毕就可以进行编译运行了,请先把 reset_lgw.h 改名成 reset_lgw.h~ 因为 make clean的时候可能会被清除,为了保险起见,等编译后再改个名就行了。
-
make clean all ->此步骤会把代码编译成可执行文件
-
make install -> 此步骤会用调用SCP将编译结果拷贝到TARGET_DIR所在目录,所以可能需要输入密码(此处是将scp的dst设为localhost,所以会拷贝到本地),若不想输密码,可参考README.md进行ssh秘钥拷贝,后续就无需输入密码了,我这里输入密码:raspberry
如果要改TARGET_DIR的位置,请到 sx1302_hal/target.cfg 下更改
注意:如果密码失败,请重新设置一个密码就好了,用树莓派配置命令去设置密码
sudo raspi-config找到:1 System Options ——> S3 Password 进行设置密码,然后重新make install
-
make install_conf ->至此,源码就编译完成了,并且生成的已经在TARGET_DIR指定的目录下了
编译完成后启动:
确保 reset_lgw.h 可以正常运行。

运行sx1302
sudo ./packet_forwarder/lora_pkt_fwd -c global_conf.json
也可以 把lora_pkt_fwd拷贝到sx1302_hal目录下运行
./lora_pkt_fwd
2.1.6、sx1302启动信息
a、我的启动信息:
pi@raspberrypi:~/sx1302_hal $ sudo ./packet_forwarder/lora_pkt_fwd -c global_conf.json
*** Packet Forwarder ***
Version: 2.1.0
*** SX1302 HAL library version info ***
Version: 2.1.0;
***
INFO: Little endian host
INFO: found configuration file global_conf.json, parsing it
INFO: global_conf.json does contain a JSON object named SX130x_conf, parsing SX1302 parameters
INFO: com_type SPI, com_path /dev/spidev0.0, lorawan_public 1, clksrc 0, full_duplex 0
INFO: antenna_gain 0 dBi
INFO: Configuring legacy timestamp
INFO: no configuration for SX1261
INFO: Configuring Tx Gain LUT for rf_chain 0 with 16 indexes for sx1250
INFO: radio 0 enabled (type SX1250), center frequency 470600000, RSSI offset -207.000000, tx enabled 1, single input mode 1
INFO: radio 1 enabled (type SX1250), center frequency 471400000, 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 AA555A0000000000
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
INFO: [main] TTY port /dev/ttyS0 open for GPS synchronization
通过GPIO23重置CoreCell...
Opening SPI communication interface
Note: chip version is 0x10 (v1.0)
INFO: Configuring SX1250_0 in single input mode
INFO: Configuring SX1250_1 in single input mode
INFO: using legacy timestamp
INFO: LoRa Service modem: configuring preamble size to 8 symbols
ARB: dual demodulation disabled for all SF
INFO: found temperature sensor on port 0x39
INFO: [main] concentrator started, packet can now be received
INFO: concentrator EUI: 0x0016c001ff1325e1
##### 2024-08-20 17:52:22 GMT #####
### [UPSTREAM] ###
# RF packets received by concentrator: 0
# CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
# RF packets forwarded: 0 (0 bytes)
# PUSH_DATA datagrams sent: 0 (0 bytes)
# PUSH_DATA acknowledged: 0.00%
### [DOWNSTREAM] ###
# PULL_DATA sent: 3 (0.00% acknowledged)
# PULL_RESP(onse) datagrams received: 0 (0 bytes)
# RF packets sent to concentrator: 0 (0 bytes)
# TX errors: 0
### SX1302 Status ###
# SX1302 counter (INST): 30724621
# SX1302 counter (PPS): 0
# BEACON queued: 0
# BEACON sent so far: 0
# BEACON rejected: 0
### [JIT] ###
src/jitqueue.c:440:jit_print_queue(): INFO: [jit] queue is empty
#--------
src/jitqueue.c:440:jit_print_queue(): INFO: [jit] queue is empty
### [GPS] ###
# Invalid time reference (age: 1724176342 sec)
# no valid GPS coordinates available yet
### Concentrator temperature: 36 C ###
##### END #####
JSON up: {"stat":{"time":"2024-08-20 17:52:22 GMT","rxnb":0,"rxok":0,"rxfw":0,"ackr":0.0,"dwnb":0,"txnb":0,"temp":36.3}}
1、中文解释:
程序版本:
Packet Forwarder 版本 2.1.0。
SX1302 HAL 库版本 2.1.0。
配置文件:
找到并解析 global_conf.json 配置文件。
读取 SX130x_conf 对象中的 SX1302 参数。
通信设置:
使用 SPI 类型通信,路径为 /dev/spidev0.0。
设置 LoRaWAN 公网模式、时钟源和全双工模式。
无线电配置:
配置了两个 SX1250 无线电模块。
设置中心频率和 RSSI 偏移,启用或禁用发射。
LoRa通道:
配置了 8 个 LoRa 多扩频 (SF) 通道及其频率和带宽。
配置了标准 LoRa 通道和 FSK 通道。
网关配置:
设置了网关 MAC 地址、服务器地址和端口。
配置了上行和下行端口、保活间隔、统计显示间隔等。
GPS和信标:
配置了 GPS 串口路径及参考位置。
配置了信标的发射频率、数据速率、调制带宽和发射功率。
调试信息:
设置了调试日志文件名称,配置了调试参考数据包。
启动过程:
通过 GPIO23 重置 CoreCell。
打开 SPI 通信接口并配置 SX1250 模块。
启动集中器并准备接收数据包,显示了集中器的 EUI 地址。
[UPSTREAM] 上行数据
RF packets received by concentrator: 0
集中器接收到的无线电数据包数:0
CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
无线电数据包的 CRC 校验情况:
CRC 校验成功率:0.00%
CRC 校验失败率:0.00%
无 CRC 校验的数据包比例:0.00%
RF packets forwarded: 0 (0 bytes)
转发的无线电数据包数:0,数据总量:0 字节
PUSH_DATA datagrams sent: 0 (0 bytes)
发送的 PUSH_DATA 数据包数:0,数据总量:0 字节
PUSH_DATA acknowledged: 0.00%
PUSH_DATA 数据包的确认率:0.00%
[DOWNSTREAM] 下行数据
PULL_DATA sent: 3 (0.00% acknowledged)
发送的 PULL_DATA 数据包数:3,确认率:0.00%
PULL_RESP(onse) datagrams received: 0 (0 bytes)
接收到的 PULL_RESP 数据包数:0,数据总量:0 字节
RF packets sent to concentrator: 0 (0 bytes)
发送到集中器的无线电数据包数:0,数据总量:0 字节
TX errors: 0
发射错误数:0
SX1302 状态
SX1302 counter (INST): 30724621
SX1302 计数器的实例计数值:30724621
SX1302 counter (PPS): 0
SX1302 计数器的脉冲计数值:0
BEACON queued: 0
排队的信标数据包数:0
BEACON sent so far: 0
已发送的信标数据包数:0
BEACON rejected: 0
被拒绝的信标数据包数:0
[JIT] Just-in-Time (JIT) 队列
src/jitqueue.c:440:jit_print_queue(): INFO: [jit] queue is empty
JIT 队列状态:队列为空
[GPS] GPS 信息
Invalid time reference (age: 1724176342 sec)
GPS 时间参考无效(时间差:1724176342 秒)
no valid GPS coordinates available yet
目前没有有效的 GPS 坐标
Concentrator temperature 集中器温度
Concentrator temperature: 36 C
集中器的温度:36 摄氏度
JSON 数据
{"stat":{"time":"2024-08-20 17:52:22 GMT","rxnb":0,"rxok":0,"rxfw":0,"ackr":0.0,"dwnb":0,"txnb":0,"temp":36.3}}
JSON 格式的统计数据:
时间:2024年8月20日 17:52:22 GMT
接收到的数据包数 (rxnb): 0
成功的接收数据包数 (rxok): 0
转发的数据包数 (rxfw): 0
确认率 (ackr): 0.0%
发送的 PULL_DATA 数据包数 (dwnb): 0
发送的数据包数 (txnb): 0
温度 (temp): 36.3 摄氏度
b、接收到 LoRaWAN 模块的入网 JOIN 信息:
INFO: Received pkt from mote: 07578093 (fcnt=67)
JSON up: {"rxpk":[{"jver":1,"tmst":198290871,"chan":7,"rfch":1,"freq":471.700000,"mid": 8,"stat":1,"modu":"LORA","datr":"SF10BW125","codr":"4/5","rssis":-5,"lsnr":13.2,"foff":2414,"rssi":-4,"size":46,"data":"QJOAVwcBQwAC0udlck4PuUZvVKKC5JJW+S7ApV3rGQkJ+M+rDv/3249gGqOrUQ=="}]}
INFO: Received pkt from mote: 07578093 (fcnt=68)
JSON up: {"rxpk":[{"jver":1,"tmst":203034971,"chan":3,"rfch":0,"freq":470.900000,"mid": 9,"stat":1,"modu":"LORA","datr":"SF10BW125","codr":"4/5","rssis":-11,"lsnr":9.0,"foff":2424,"rssi":-11,"size":13,"data":"QJOAVwcARABjqaNgIA=="}]}
1、中文解释:
INFO: Received pkt from mote: 07578093 (fcnt=67)
信息:接收到来自节点 07578093 的数据包,帧计数器值为 67
JSON up: 发送的数据包 JSON 格式:
jver: 1
协议版本:1
tmst: 198290871
时间戳:198290871(单位:微秒)
chan: 7
通道编号:7
rfch: 1
无线电频道:1
freq: 471.700000
频率:471.700 MHz
mid: 8
消息 ID:8
stat: 1
状态:1(表示成功接收)
modu: "LORA"
调制方式:LORA
datr: "SF10BW125"
数据速率:SF10BW125(扩频因子 10,带宽 125 kHz)
codr: "4/5"
纠错码率:4/5
rssis: -5
接收信号强度指示(SNR):-5 dB
lsnr: 13.2
信噪比(SNR):13.2 dB
foff: 2414
频偏:2414 Hz
rssi: -4
接收信号强度指示(RSSI):-4 dB
size: 46
数据包大小:46 字节
data: "QJOAVwcBQwAC0udlck4PuUZvVKKC5JJW+S7ApV3rGQkJ+M+rDv/3249gGqOrUQ=="
数据内容:经过 Base64 编码的实际数据
c、接收到 LoRaWAN模块的数据信息:
INFO: Received pkt from mote: 07578093 (fcnt=71)
JSON up: {"rxpk":[{"jver":1,"tmst":348700402,"chan":0,"rfch":0,"freq":470.300000,"mid": 8,"stat":1,"modu":"LORA","datr":"SF10BW125","codr":"4/5","rssis":-11,"lsnr":9.2,"foff":2404,"rssi":-10,"size":23,"data":"QJOAVwcARwBVeWhLZzDKUZ78rOtSDWk="}]}
1、中文解释:
INFO: Received pkt from mote: 07578093 (fcnt=71)
信息:接收到来自节点 07578093 的数据包,帧计数器值为 71。
JSON up: 发送的数据包 JSON 格式:
jver: 1
协议版本:1。指示数据包使用的协议版本。
tmst: 348700402
时间戳:348700402 微秒(单位为微秒)。表示数据包接收的时间。
chan: 0
通道编号:0。表示数据包的接收通道编号。
rfch: 0
无线电频道:0。表示使用的无线电频道编号。
freq: 470.300000
频率:470.300 MHz。表示接收数据包时的无线电频率。
mid: 8
消息 ID:8。表示数据包的消息标识符。
stat: 1
状态:1。状态值 1 表示数据包接收成功。
modu: "LORA"
调制方式:LORA。表示数据包使用的调制方式为 LoRa。
datr: "SF10BW125"
数据速率:SF10BW125。表示数据包的扩频因子为 10,带宽为 125 kHz。
codr: "4/5"
纠错码率:4/5。表示数据包的纠错码率为 4/5。
rssis: -11
接收信号强度指示(RSSI):-11 dB。表示接收到的数据包的信号强度。
lsnr: 9.2
信噪比(SNR):9.2 dB。表示接收到的数据包的信噪比。
foff: 2404
频偏:2404 Hz。表示数据包的频率偏移量。
rssi: -10
接收信号强度指示(RSSI):-10 dB。另一个测量的 RSSI 值。
size: 23
数据包大小:23 字节。表示数据包的有效负载大小。
data: "QJOAVwcARwBVeWhLZzDKUZ78rOtSDWk="
数据内容:经过 Base64 编码的实际数据。解码后的数据为:QJOAVwcARwBVeWhLZzDKUZ78rOtSDWk。可以进一步解码以查看具体内容。
这是从节点 07578093 接收到的一个数据包的详细信息。数据包通过 LoRa 网络接收,使用的调制方式为 LoRa,数据速率为 SF10BW125,信号强度和信噪比都表明接收质量良好。
如果大家手中使用的是M-GW1302S模块,可以参考这篇文章:从零开始搭建一个LoRaWAN基站
https://www.cnblogs.com/answerinthewind/p/13154904.html
五:了解一下 chirpstack
官网:https://www.chirpstack.io/
ChirpStack 是一个开源的 LoRaWAN 网络服务器解决方案,目前主流版本:
ChirpStack v3、ChirpStack v4
ChirpStack 版本对比
ChirpStack v3
- 组件:
ChirpStack Network Server:处理 LoRaWAN 网络协议的核心组件,负责处理 LoRaWAN 数据包、网络管理、设备管理等。
ChirpStack Application Server:管理应用层数据,处理设备数据的存储、转发和管理。提供 REST API 和 Web 管理界面。
ChirpStack Gateway Bridge:与 LoRa 网关通信,将网关的数据转发到网络服务器。 - 数据库:PostgreSQL。
- 消息队列:默认使用 MQTT。
- 配置文件:
chirpstack-network-server.toml:网络服务器的配置文件,包括 LoRaWAN 网络参数、数据库连接、MQTT 配置等。chirpstack-application-server.toml:应用服务器的配置文件,包括应用数据处理设置、API 密钥、用户管理等。chirpstack-gateway-bridge.toml:网关桥接器的配置文件,包括网关与网络服务器的连接设置。 - 主要配置项:网络服务器设置、应用服务器配置、网关桥接参数。
ChirpStack v4
- 组件:类似于 v3,但架构有改进,增强了多租户和用户管理功能。
- 数据库:PostgreSQL。
- 消息队列:与 MQTT 的集成增强,提供更多配置选项。
- 配置文件:
chirpstack-network-server.toml:类似于 v3,但增加了多租户支持的配置选项。chirpstack-application-server.toml:增强了用户权限管理、多租户支持和 API 密钥设置。chirpstack-gateway-bridge.toml:保持一致,但提供了更多调优选项。 - 主要配置项:详细的多租户管理、用户权限、API 密钥配置。
六:开始搭建ChirpStack
本次使用V4版本,需要安装:
ChirpStack Gateway Bridge:网关桥
ChirpStack:包含了ChirpStack Network Server和ChirpStack Application Server
1、安装准备
安装之前我们需要安装:Mqtt:mosquitto 、 数据库:postgresql 、Redis 在官网就可以看到:https://www.chirpstack.io/docs/chirpstack/requirements.html
a、开始安装 mosquitto 、 postgresql 、Redis
sudo apt install mosquitto mosquitto-clients postgresql redis-server
b、配置一下 postgresql 数据库
sudo -u postgres psql
c、创建一个用于认证的角色,允许登录并设置密码
CREATE ROLE chirpstack WITH LOGIN PASSWORD 'chirpstack';
d、创建一个名为 chirpstack 的数据库,并指定该角色为数据库的所有者
CREATE DATABASE chirpstack WITH OWNER chirpstack;
e、切换到 chirpstack 数据库
\c chirpstack
f、在 chirpstack 数据库中创建 pg_trgm 扩展,用于支持三元组操作
CREATE EXTENSION pg_trgm;
CREATE EXTENSION pg_trgm;
g、退出 psql 命令行界面
\q
2、chirpstack_gateway_bridge 网关桥安装
可以去chirpstack官网下载,地址如下:https://www.chirpstack.io/docs/chirpstack-gateway-bridge/downloads.html
a、下载安装包

b、下载后安装
sudo dpkg -i chirpstack-gateway-bridge_4.0.11_linux_arm64.deb
c、安装成功

d、修改配置文件
d1、修改 chirpstack-gateway-bridge.toml
资料地址
https://www.chirpstack.io/gateway-bridge/install/config/
sudo nano /etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge.toml
内容如下:
# 这个配置文件提供了 Semtech UDP 数据包转发器后端,并与 MQTT 代理集成。许多选项和默认值已被省略以简化配置。
#
# 请参阅 https://www.chirpstack.io/gateway-bridge/install/config/ 以获取完整的配置示例和文档。
# 网关后端配置。
[backend]
# 后端类型。
type="semtech_udp"
# Semtech UDP 数据包转发器后端。
[backend.semtech_udp]
# 绑定 UDP 监听器的 IP:端口
#
# 示例:0.0.0.0:1700,表示在所有网络接口上监听端口 1700。
# 这是数据包转发器转发数据的监听器,因此确保你的数据包转发器中的
# 'serv_port_up' 和 'serv_port_down' 与此端口匹配。
udp_bind = "0.0.0.0:1700"
# 集成配置。
[integration]
# 负载编码器。
#
# 这定义了 MQTT 负载的编码方式。有效的选项有:
# * protobuf: Protobuf 编码
# * json: JSON 编码(更易于调试,但比 'protobuf' 更占用空间)
#marshaler="protobuf"
marshaler="json"
# MQTT 集成配置。
[integration.mqtt]
# 事件主题模板。
event_topic_template="gateway/{{ .GatewayID }}/event/{{ .EventType }}"
# 命令主题模板。
command_topic_template="gateway/{{ .GatewayID }}/command/#"
# MQTT 认证。
[integration.mqtt.auth]
# 类型定义了 MQTT 认证类型。
#
# 将其设置为下面各节之一的名称。
type="generic"
# 通用 MQTT 认证。
[integration.mqtt.auth.generic]
# MQTT 服务器(例如 scheme://host:port,其中 scheme 是 tcp、ssl 或 ws)
# server="tcp://127.0.0.1:1883"
server="tcp://0.0.0.0:1883"
# 使用给定的用户名进行连接(可选)
username=""
# 使用给定的密码进行连接(可选)
password=""
修改: marshaler="json" 主要为了调试的时候可以更直观的看到数据,也可以不改,只要与后面的chirpstack配置对应就行。但是不改的话mqtt收到数据就会乱码
修改: server="tcp://0.0.0.0:1883" 更换mqtt服务器地址,这样就都可以访问了
e、启动网关桥:
sudo systemctl start chirpstack-gateway-bridge
e1、网关桥命令:
以下是有关 chirpstack-gateway-bridge 的一些有用命令及其中文注释:
配置文件位置:
配置文件位于:
/etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge.toml
命令:
1.启动服务:
这个命令会启动 chirpstack-gateway-bridge 服务。
sudo systemctl start chirpstack-gateway-bridge
2.重启服务:
这个命令会重启 chirpstack-gateway-bridge 服务,适用于更新配置文件或解决服务问题时。
sudo systemctl restart chirpstack-gateway-bridge
3.停止服务:
这个命令会停止 chirpstack-gateway-bridge 服务。
sudo systemctl stop chirpstack-gateway-bridge
4.显示日志:
这个命令会实时显示 chirpstack-gateway-bridge 服务的最新日志。-f 表示跟随日志输出,-n 100 表示显示最近的 100 行日志,-u chirpstack-gateway-bridge 指定了要查看的服务单元。
sudo journalctl -f -n 100 -u chirpstack-gateway-bridge
d、更改目录的用户和组
有朋友问我为什么进不去安装后的这个目录下,我们来看一下文件的用户和组并不是当前的

改成当前pi用户和组,这样就可以进去了,其实里面也就一个chirpstack-gateway-bridge.toml
注意修改后请及时修改过来!否则mqtt接收数据将会错误
sudo chown -R pi:pi /etc/chirpstack-gateway-bridge
3、ChirpStack安装
在官网chirpstack下载:https://www.chirpstack.io/docs/chirpstack/downloads.html
a、下载安装包

b、下载后安装
sudo dpkg -i chirpstack_4.9.0_linux_arm64.deb
c、安装成功

d、修改配置文件
在 etc/chirpstack 下创建一个 start-chirpstack-cn470 目录
把 /etc/chirpstack 中的 chirpstack.toml 和 region_cn470* 复制到 start-chirpstack-cn470
如果复制不了,请修改用户和组
sudo chown -R pi:pi /etc/chirpstack
sudo mkdir /etc/chirpstack/start-chirpstack-cn470
cp chirpstack.toml region_cn470* start-chirpstack-cn470/
sudo cp /etc/chirpstack/chirpstack.toml /etc/chirpstack/start-chirpstack-cn470/
sudo cp /etc/chirpstack/region_cn* /etc/chirpstack/start-chirpstack-cn470/
d1、修改 chirpstack.toml
# 日志配置
[logging]
# 日志级别
#
# 选项包括:trace、debug、info、warn、error。
level = "info"
# PostgreSQL 配置
[postgresql]
# PostgreSQL 数据源名称 (DSN)
#
# 格式示例:postgres://<用户名>:<密码>@<主机名>/<数据库>?sslmode=<SSL模式>
#
# SSL 模式选项:
# * disable - 不使用 SSL
# * require - 始终使用 SSL(跳过验证)
# * verify-ca - 始终使用 SSL(验证服务器证书是否由受信任的 CA 签发)
# * verify-full - 始终使用 SSL(验证服务器证书是否由受信任的 CA 签发,并且服务器主机名与证书中的主机名匹配)
dsn = "postgres://chirpstack:chirpstack@localhost/chirpstack?sslmode=disable"
# 最大打开连接数
#
# 设置 PostgreSQL 连接池中允许的最大打开连接数。
max_open_connections = 10
# 最小空闲连接数
#
# 设置 PostgreSQL 连接池中最小的空闲连接数(0 表示等于最大打开连接数)。
min_idle_connections = 0
# Redis 配置
[redis]
# 服务器地址或多个地址。
#
# 连接到集群时,请设置多个地址。
servers = ["redis://localhost/"]
# Redis 集群。
#
# 当提供的 URL 指向 Redis 集群实例时,将此选项设置为 true。
cluster = false
# 网络相关配置
[network]
# 网络标识符 (NetID,3 字节) 以 HEX 编码 (例如 010203)。
net_id = "000000"
# 启用的区域。
#
# 可以同时启用多个区域。每个区域必须与 '[[regions]]' 中区域配置的 'name' 参数匹配。
enabled_regions = [
"cn470_0",
"cn470_1",
"cn470_2",
"cn470_3",
"cn470_4",
"cn470_5",
"cn470_6",
"cn470_7",
"cn470_8",
"cn470_9",
"cn470_10",
"cn470_11",
]
# API 接口配置
[api]
# 绑定 API 接口的接口地址和端口。
bind = "0.0.0.0:8080"
# 密钥。
#
# 此密钥用于生成登录和 API 令牌,请确保此密钥不要暴露。更改此密钥将使所有登录和 API 令牌失效。可以使用以下命令生成随机密钥:
# openssl rand -base64 32
secret = "you-must-replace-this"
# 集成配置
[integration]
enabled = ["mqtt"]
[integration.mqtt]
# MQTT 服务器地址
# server = "tcp://localhost:1883/"
server = "tcp://0.0.0.0:1883/"
# 是否使用 JSON 格式
json = true
d2、修改 region_cn470_*
目前我先修改一下 region_cn470_0.toml 文件
# 该文件包含一个 CN470 示例(频道 0-7)。
[[regions]]
# ID 是用户定义的该区域的标识符。
id = "cn470_0"
# 描述是该区域的简短描述。
description = "CN470_0 (频道 0-7)"
# 通用名称指的是 LoRa 联盟定义的该区域的通用名称。
common_name = "CN470"
# 用户定义的区域信息。
#
# 这些信息将显示在 ChirpStack 网页界面的区域页面顶部。例如,它可以包含有关用户如何连接其网关的信息(例如 MQTT 端点、MQTT 主题前缀、TLS 配置等)。可以使用 Markdown 语法进行格式化。
user_info = ""
# 网关配置。
[regions.gateway]
# 强制将网关设为私有。
#
# 如果启用,网关只能被同一租户下的设备使用。
force_gws_private = false
# 网关后端配置。
[regions.gateway.backend]
# 启用的后端类型。
enabled = "mqtt"
# MQTT 配置。
[regions.gateway.backend.mqtt]
# 主题前缀。
#
# 主题前缀可用于定义网关的区域。
# 注意,不需要在前缀后面添加斜杠 '/'。如果配置了前缀,斜杠 '/' 将自动添加到前缀中。
# topic_prefix = "cn470_0"
event_topic="gateway/+/event/+"
command_topic="gateway/{{gateway_id}}/command/{{command}}"
# 共享订阅名称。
#
# 如果多个 ChirpStack 实例共享相同的订阅名称,则 MQTT 代理只会将网关事件传递给一个订阅者。
# 如果您有一个生产环境和一个测试环境连接到同一个 MQTT 代理,请确保每个环境都有自己的订阅名称,例如:
# chirpstack_prod 和 chirpstack_tst。
share_name = "chirpstack"
# MQTT 服务器(例如 scheme://host:port,其中 scheme 可以是 tcp、ssl 或 ws)
# server = "tcp://localhost:1883"
server = "tcp://0.0.0.0:1883"
# 使用给定的用户名连接(可选)
username = ""
# 使用给定的密码连接(可选)
password = ""
# 服务质量等级
#
# 0: 至多一次
# 1: 至少一次
# 2: 确切一次
#
# 注意:增加此值会降低性能。
# 了解更多信息请参见:https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels
qos = 0
# 清除会话
#
# 在此客户端连接到 MQTT 代理时,在连接消息中设置 "clean session" 标志。通过设置此标志,您表示不希望代理为此客户端保存的消息被传递。
clean_session = false
# 客户端 ID
#
# 设置此客户端在连接到 MQTT 代理时使用的客户端 ID。客户端 ID 必须不超过 23 个字符。如果留空,将由 ChirpStack 生成一个随机 ID。
client_id = ""
# 保持活动间隔。
#
# 这定义了客户端和服务器之间最大可以不进行通信的时间。
keep_alive_interval = "30s"
# CA 证书文件(可选)
#
# 当设置安全连接(服务器使用 ssl://...)但服务器使用的证书不被任何 CA 证书信任(例如,自生成证书)时使用。
ca_cert = ""
# TLS 证书文件(可选)
tls_cert = ""
# TLS 密钥文件(可选)
tls_key = ""
# 网关通道配置。
#
# 注意:此配置仅在网关使用 ChirpStack Concentratord 守护进程时使用。
# 在其他情况下,此配置将被忽略。
[[regions.gateway.channels]]
frequency = 470300000
bandwidth = 125000
modulation = "LORA"
spreading_factors = [7, 8, 9, 10, 11, 12]
[[regions.gateway.channels]]
frequency = 470500000
bandwidth = 125000
modulation = "LORA"
spreading_factors = [7, 8, 9, 10, 11, 12]
[[regions.gateway.channels]]
frequency = 470700000
bandwidth = 125000
modulation = "LORA"
spreading_factors = [7, 8, 9, 10, 11, 12]
[[regions.gateway.channels]]
frequency = 470900000
bandwidth = 125000
modulation = "LORA"
spreading_factors = [7, 8, 9, 10, 11, 12]
[[regions.gateway.channels]]
frequency = 471100000
bandwidth = 125000
modulation = "LORA"
spreading_factors = [7, 8, 9, 10, 11, 12]
[[regions.gateway.channels]]
frequency = 471300000
bandwidth = 125000
modulation = "LORA"
spreading_factors = [7, 8, 9, 10, 11, 12]
[[regions.gateway.channels]]
frequency = 471500000
bandwidth = 125000
modulation = "LORA"
spreading_factors = [7, 8, 9, 10, 11, 12]
[[regions.gateway.channels]]
frequency = 471700000
bandwidth = 125000
modulation = "LORA"
spreading_factors = [7, 8, 9, 10, 11, 12]
# 区域特定网络配置。
[regions.network]
# ADR 引擎使用的安装裕度(分贝)。
#
# 较高的数值意味着网络服务器会保留更多的裕度,
# 这将导致较低的数据速率,但减少了设备因为无法
# 连接到某个周围的网关而断开的概率。
installation_margin = 10
# RX 窗口(Class-A)。
#
# 设置为:
# 0: RX1 / RX2
# 1: 仅 RX1
# 2: 仅 RX2
rx_window = 0
# RX1 延迟(1 - 15 秒)。
rx1_delay = 1
# RX1 数据速率偏移
rx1_dr_offset = 0
# RX2 数据速率
rx2_dr = 0
# RX2 频率(赫兹)
rx2_frequency = 505300000
# 当 RX1 数据速率小于指定值时,优先使用 RX2。
#
# 根据 RX1 数据速率优先使用 RX2。当 RX1 数据速率
# 小于配置的值时,网络服务器将首先尝试在 RX2 上
# 安排下行数据,若失败(例如网关已经在 RX2 时间
# 上安排了负载),则尝试 RX1。
rx2_prefer_on_rx1_dr_lt = 0
# 根据链路预算优先使用 RX2。
#
# 当 RX2 的链路预算优于 RX1 时,网络服务器将首先
# 尝试在 RX2 上安排下行数据,若失败,则尝试 RX1。
rx2_prefer_on_link_budget = false
# 下行 TX 功率(以 dBm EIRP 为单位)
#
# 设置为 -1 时,将使用配置的频段中的下行 TX 功率。
#
# 请查阅 LoRaWAN 区域参数和当地法规以获取有效和合法的
# 选项。注意,配置的 TX 功率必须由你的网关支持。
downlink_tx_power = -1
# ADR 被禁用。
adr_disabled = false
# 最小数据速率。
min_dr = 0
# 最大数据速率。
max_dr = 5
# 启用的上行通道。
#
# 当仅使用默认启用通道的子集时使用。例如,当只使用
# 美国频段的前 8 个通道时。注意:如果留空 / 空数组,
# 所有通道将被启用。
enabled_uplink_channels = [0, 1, 2, 3, 4, 5, 6, 7]
# 重新加入请求配置(LoRaWAN 1.1)
[regions.network.rejoin_request]
# 请求设备定期发送重新加入请求。
enabled = false
# 设备必须至少每 2^(max_count_n + 4) 个上行消息发送一次类型 0 的重新加入请求。
# 有效值为 0 到 15。
max_count_n = 0
# 设备必须至少每 2^(max_time_n + 10) 秒发送一次类型 0 的重新加入请求。
# 有效值为 0 到 15。
#
# 0 = 大约 17 分钟
# 15 = 约 1 年
max_time_n = 0
# Class-B 配置。
[regions.network.class_b]
# Ping-slot 数据速率。
ping_slot_dr = 2
# Ping-slot 频率(赫兹)
#
# 设置为 0 以使用配置区域的默认频率计划
# (可能包括频率跳变)。
ping_slot_frequency = 0
修改用户组

sudo chown -R pi:pi /etc/chirpstack/
sudo chown -R chirpstack:chirpstack/etc/chirpstack/
e、启动ChirpStack
chirpstack -c /etc/chirpstack/start-chirpstack-cn470/
f、更改目录的用户和组
sudo chown -R pi:pi /etc/chirpstack
g、分析启动日志
日志:
pi@raspberrypi:~ $ chirpstack -c /etc/chirpstack/start-chirpstack-cn470/
2024-08-21T09:38:23.795756Z INFO chirpstack::cmd::root: Starting ChirpStack LoRaWAN Network Server version="4.9.0" docs="https://www.chirpstack.io/"
2024-08-21T09:38:23.795871Z INFO chirpstack::storage: Setting up PostgreSQL connection pool
2024-08-21T09:38:23.796386Z INFO chirpstack::storage: Applying schema migrations
2024-08-21T09:38:23.852705Z INFO chirpstack::storage: Setting up Redis client
2024-08-21T09:38:23.853188Z INFO chirpstack::region: Setting up regions
2024-08-21T09:38:23.853306Z INFO setup{common_name=CN470 region_id=cn470_3}: chirpstack::region: Configuring region
2024-08-21T09:38:23.853486Z INFO setup{common_name=CN470 region_id=cn470_6}: chirpstack::region: Configuring region
2024-08-21T09:38:23.853988Z INFO setup{common_name=CN470 region_id=cn470_11}: chirpstack::region: Configuring region
2024-08-21T09:38:23.854137Z INFO setup{common_name=CN470 region_id=cn470_7}: chirpstack::region: Configuring region
2024-08-21T09:38:23.854297Z INFO setup{common_name=CN470 region_id=cn470_8}: chirpstack::region: Configuring region
2024-08-21T09:38:23.854444Z INFO setup{common_name=CN470 region_id=cn470_0}: chirpstack::region: Configuring region
2024-08-21T09:38:23.854593Z INFO setup{common_name=CN470 region_id=cn470_2}: chirpstack::region: Configuring region
2024-08-21T09:38:23.854704Z INFO setup{common_name=CN470 region_id=cn470_9}: chirpstack::region: Configuring region
2024-08-21T09:38:23.854883Z INFO setup{common_name=CN470 region_id=cn470_1}: chirpstack::region: Configuring region
2024-08-21T09:38:23.855024Z INFO setup{common_name=CN470 region_id=cn470_4}: chirpstack::region: Configuring region
2024-08-21T09:38:23.855129Z INFO setup{common_name=CN470 region_id=cn470_5}: chirpstack::region: Configuring region
2024-08-21T09:38:23.855282Z INFO setup{common_name=CN470 region_id=cn470_10}: chirpstack::region: Configuring region
2024-08-21T09:38:23.855426Z INFO chirpstack::backend::joinserver: Setting up Join Server clients
2024-08-21T09:38:23.855486Z INFO chirpstack::backend::roaming: Setting up roaming clients
2024-08-21T09:38:23.855517Z INFO chirpstack::adr: Setting up adr algorithms
2024-08-21T09:38:23.855594Z INFO chirpstack::integration: Setting up global integrations
2024-08-21T09:38:23.855629Z INFO chirpstack::integration::redis: Initializing Redis integration
2024-08-21T09:38:23.855668Z INFO chirpstack::integration::mqtt: Initializing MQTT integration
2024-08-21T09:38:23.886755Z INFO chirpstack::integration::mqtt: Connecting to MQTT broker server_uri=tcp://localhost:1883/ client_id=93ccfe0119a26cb2 clean_session=false
2024-08-21T09:38:23.886947Z INFO chirpstack::gateway::backend: Setting up gateway backends for the different regions
2024-08-21T09:38:23.886987Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_3 region_common_name=CN470
2024-08-21T09:38:23.887327Z INFO chirpstack::integration::mqtt: Starting MQTT event loop
2024-08-21T09:38:23.888914Z INFO chirpstack::integration::mqtt: Subscribing to command topic command_topic=application/+/device/+/command/+
2024-08-21T09:38:23.905845Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_3 server_uri=tcp://localhost:1883 clean_session=false client_id=be53341a5f4e7b1
2024-08-21T09:38:23.906126Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_6 region_common_name=CN470
2024-08-21T09:38:23.906452Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:23.908173Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_3 event_topic=$share/chirpstack/cn470_3/gateway/+/event/+
2024-08-21T09:38:23.925491Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_6 server_uri=tcp://localhost:1883 clean_session=false client_id=4679a6d22a27ba23
2024-08-21T09:38:23.925857Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_11 region_common_name=CN470
2024-08-21T09:38:23.926237Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:23.929085Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_6 event_topic=$share/chirpstack/cn470_6/gateway/+/event/+
2024-08-21T09:38:23.945436Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_11 server_uri=tcp://localhost:1883 clean_session=false client_id=fade5517ccb27df7
2024-08-21T09:38:23.945798Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_7 region_common_name=CN470
2024-08-21T09:38:23.946200Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:23.949279Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_11 event_topic=$share/chirpstack/cn470_11/gateway/+/event/+
2024-08-21T09:38:23.974741Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_7 server_uri=tcp://localhost:1883 clean_session=false client_id=29fb291808c20196
2024-08-21T09:38:23.975120Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_8 region_common_name=CN470
2024-08-21T09:38:23.975608Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:23.978837Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_7 event_topic=$share/chirpstack/cn470_7/gateway/+/event/+
2024-08-21T09:38:24.006818Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_8 server_uri=tcp://localhost:1883 clean_session=false client_id=285249f25b39f21d
2024-08-21T09:38:24.007223Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_0 region_common_name=CN470
2024-08-21T09:38:24.007261Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:24.011219Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_8 event_topic=$share/chirpstack/cn470_8/gateway/+/event/+
2024-08-21T09:38:24.038858Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_0 server_uri=tcp://localhost:1883 clean_session=false client_id=fcd31e9a8c80c8aa
2024-08-21T09:38:24.039242Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:24.039243Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_2 region_common_name=CN470
2024-08-21T09:38:24.041429Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_0 event_topic=$share/chirpstack/cn470_0/gateway/+/event/+
2024-08-21T09:38:24.071260Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_2 server_uri=tcp://localhost:1883 clean_session=false client_id=9453e3f146f79bb1
2024-08-21T09:38:24.071616Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:24.071620Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_9 region_common_name=CN470
2024-08-21T09:38:24.074830Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_2 event_topic=$share/chirpstack/cn470_2/gateway/+/event/+
2024-08-21T09:38:24.103334Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_9 server_uri=tcp://localhost:1883 clean_session=false client_id=95e8a7a1bd246c49
2024-08-21T09:38:24.103719Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:24.103780Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_1 region_common_name=CN470
2024-08-21T09:38:24.106606Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_9 event_topic=$share/chirpstack/cn470_9/gateway/+/event/+
2024-08-21T09:38:24.134817Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_1 server_uri=tcp://localhost:1883 clean_session=false client_id=90f3f45cc135d6dd
2024-08-21T09:38:24.135175Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_4 region_common_name=CN470
2024-08-21T09:38:24.135189Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:24.137950Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_1 event_topic=$share/chirpstack/cn470_1/gateway/+/event/+
2024-08-21T09:38:24.166222Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_4 server_uri=tcp://localhost:1883 clean_session=false client_id=4e691328f240e86b
2024-08-21T09:38:24.166668Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_5 region_common_name=CN470
2024-08-21T09:38:24.167120Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:24.170148Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_4 event_topic=$share/chirpstack/cn470_4/gateway/+/event/+
2024-08-21T09:38:24.199119Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_5 server_uri=tcp://localhost:1883 clean_session=false client_id=cdf94e7f102f10c0
2024-08-21T09:38:24.199520Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:24.199519Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_10 region_common_name=CN470
2024-08-21T09:38:24.201920Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_5 event_topic=$share/chirpstack/cn470_5/gateway/+/event/+
2024-08-21T09:38:24.231217Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_10 server_uri=tcp://localhost:1883 clean_session=false client_id=a45f479011d77c19
2024-08-21T09:38:24.231598Z INFO chirpstack::gateway::backend::mqtt: Starting MQTT event loop
2024-08-21T09:38:24.231618Z INFO chirpstack::downlink: Setting up Class-B/C scheduler loop
2024-08-21T09:38:24.231867Z INFO chirpstack::downlink: Setting up multicast scheduler loop
2024-08-21T09:38:24.231980Z INFO chirpstack::api: Setting up API interface bind=0.0.0.0:8080
2024-08-21T09:38:24.234102Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_10 event_topic=$share/chirpstack/cn470_10/gateway/+/event/+
2024-08-21T09:38:24.316800Z INFO chirpstack::api::backend: Backend interfaces API interface is disabled
分析:
2024-08-21T09:38:23.795756Z INFO chirpstack::cmd::root: Starting ChirpStack LoRaWAN Network Server version="4.9.0" docs="https://www.chirpstack.io/"
解释:ChirpStack LoRaWAN 网络服务器的启动信息。版本号是 4.9.0,官方文档链接为 ChirpStack Docs。
2024-08-21T09:38:23.795871Z INFO chirpstack::storage: Setting up PostgreSQL connection pool
解释:服务器正在设置 PostgreSQL 数据库的连接池。这是为了管理和优化与 PostgreSQL 数据库的连接,确保高效的数据存取。
2024-08-21T09:38:23.796386Z INFO chirpstack::storage: Applying schema migrations
解释:服务器正在应用数据库架构迁移。这通常包括更新数据库结构,以匹配新的应用程序版本或配置要求。
2024-08-21T09:38:23.852705Z INFO chirpstack::storage: Setting up Redis client
解释:正在设置与 Redis 的连接。Redis 是一个内存数据结构存储系统,通常用于缓存和消息传递。
2024-08-21T09:38:23.853188Z INFO chirpstack::region: Setting up regions
解释:正在配置 LoRaWAN 的区域设置。区域设置定义了 LoRaWAN 网络的频段和其他地域相关参数。
2024-08-21T09:38:23.853306Z INFO setup{common_name=CN470 region_id=cn470_3}: chirpstack::region: Configuring region
解释:正在配置区域 cn470_3,其通用名称为 CN470。这是 LoRaWAN 网络中定义的具体区域。
2024-08-21T09:38:23.855426Z INFO chirpstack::backend::joinserver: Setting up Join Server clients
解释:正在设置 Join Server 客户端。Join Server 是一个负责处理 LoRaWAN 设备加入网络请求的组件。
2024-08-21T09:38:23.855486Z INFO chirpstack::backend::roaming: Setting up roaming clients
解释:正在设置漫游客户端。漫游功能允许设备在不同 LoRaWAN 网络之间漫游。
2024-08-21T09:38:23.855517Z INFO chirpstack::adr: Setting up adr algorithms
解释:正在设置自适应数据速率(ADR)算法。ADR 用于优化设备的通信参数,以提高网络的效率和覆盖范围。
2024-08-21T09:38:23.855594Z INFO chirpstack::integration: Setting up global integrations
解释:正在设置全局集成。可能包括与其他系统或服务的集成,以扩展 ChirpStack 的功能。
2024-08-21T09:38:23.855629Z INFO chirpstack::integration::redis: Initializing Redis integration
解释:正在初始化与 Redis 的集成。这可能包括配置 Redis 作为数据存储或缓存的组件。
2024-08-21T09:38:23.855668Z INFO chirpstack::integration::mqtt: Initializing MQTT integration
解释:ChirpStack 正在初始化 MQTT 集成。MQTT 是一个轻量级的消息传输协议,用于在设备和服务器之间传递消息。
2024-08-21T09:38:23.886755Z INFO chirpstack::integration::mqtt: Connecting to MQTT broker server_uri=tcp://localhost:1883/ client_id=93ccfe0119a26cb2 clean_session=false
解释:ChirpStack 正在连接到 MQTT 经纪服务器,使用客户端 ID 93ccfe0119a26cb2。
clean_session=false 表示在断开连接后,MQTT 客户端会保留会话状态。
2024-08-21T09:38:23.886947Z INFO chirpstack::gateway::backend: Setting up gateway backends for the different regions
解释:ChirpStack 正在为不同的区域配置网关后端。每个区域可能有不同的网关配置要求,这一过程确保网关能够正确地处理区域内的通信。
2024-08-21T09:38:23.886987Z INFO chirpstack::gateway::backend: Setting up gateway backend for region region_id=cn470_3 region_common_name=CN470
解释:ChirpStack 正在为区域 cn470_3 配置网关后端。region_common_name=CN470 表示这是 CN470 频段的区域配置。这可能涉及到区域特定的网关设置,如频率计划或地域规则。
2024-08-21T09:38:23.887327Z INFO chirpstack::integration::mqtt: Starting MQTT event loop
解释:ChirpStack 正在启动 MQTT 事件循环。事件循环用于处理 MQTT 消息的接收和发送,这对实时数据流和设备通信至关重要。
2024-08-21T09:38:23.888914Z INFO chirpstack::integration::mqtt: Subscribing to command topic command_topic=application/+/device/+/command/+
解释:ChirpStack 正在订阅一个 MQTT 命令主题 application/+/device/+/command/+。这个主题用于接收来自应用程序的命令,+ 是通配符,表示它会匹配多个具体的主题。例如,它可以接收所有设备的命令。
2024-08-21T09:38:23.905845Z INFO chirpstack::gateway::backend::mqtt: Connecting to MQTT broker region_id=cn470_3 server_uri=tcp://localhost:1883 clean_session=false client_id=be53341a5f4e7b1
解释:ChirpStack 正在为区域 cn470_3 连接到 MQTT 经纪服务器。连接 URI 为 tcp://localhost:1883,clean_session=false 表示在断开连接后会保留会话状态,client_id=be53341a5f4e7b1 是客户端 ID。
CN470_0 到 CN470_11一样
2024-08-21T09:38:24.231618Z INFO chirpstack::downlink: Setting up Class-B/C scheduler loop
解释:ChirpStack 正在设置 Class-B 和 Class-C 的调度循环。这些调度循环用于处理 LoRaWAN 网络中设备的下行通信。Class-B 和 Class-C 是 LoRaWAN 设备的不同工作模式,Class-B 设备通过周期性的 beacon 信号来同步,而 Class-C 设备几乎总是监听,接受下行消息的时间窗口更多。
2024-08-21T09:38:24.231867Z INFO chirpstack::downlink: Setting up multicast scheduler loop
解释:ChirpStack 正在设置多播调度循环。多播调度用于在网络中一次性向多个设备发送下行消息,这对于群体通信或广播场景非常重要。
2024-08-21T09:38:24.231980Z INFO chirpstack::api: Setting up API interface bind=0.0.0.0:8080
解释:ChirpStack 正在设置 API 接口,绑定到 0.0.0.0:8080。这意味着 API 服务器将在所有网络接口的 8080 端口上监听请求,允许外部客户端通过该端口与 ChirpStack 进行通信。
2024-08-21T09:38:24.234102Z INFO chirpstack::gateway::backend::mqtt: Subscribing to gateway event topic region_id=cn470_10 event_topic=$share/chirpstack/cn470_10/gateway/+/event/+
解释:ChirpStack 正在订阅一个与网关事件相关的 MQTT 主题。该主题 region_id=cn470_10 指定了区域 cn470_10,event_topic=$share/chirpstack/cn470_10/gateway/+/event/+ 用于接收与网关事件相关的消息。这些事件消息可能包括网关的状态、设备的连接情况等。
2024-08-21T09:38:24.316800Z INFO chirpstack::api::backend: Backend interfaces API interface is disabled
解释:ChirpStack 的后台接口 API 被禁用。这可能意味着某些 API 功能或服务在当前配置中被禁用了,可能是因为它们不被使用或为了提高安全性。
^C2024-08-21T09:39:27.412624Z WARN chirpstack::cmd::root: Signal received, terminating process signal=2
解释:接收到终止信号(signal=2),通常是来自用户中断(Ctrl+C)的信号。ChirpStack 进程正在被终止。此日志条目记录了收到终止信号的情况,提示正在安全地关闭进程。
4、创建开机启动服务脚本
为了开机不要一个一个的去手动启动,而且大多数产品都是开机就可以自动运行自定义的程序的
网关桥就不用了,可直接设置开机自启
sudo systemctl enable chirpstack-gateway-bridge
创建个 start_chirpstack.sh 的脚本
sudo nano /usr/local/bin/start_chirpstack.sh
内容填写,全部都在后台运行,不然会影响下一条命令的,而且别忘了给权限
给权限:
sudo chmod 777 /usr/local/bin/start_chirpstack.sh
#!/bin/bash
# 切换到 SX1302 HAL 目录
cd /home/pi/liwei-workspace/sx1302_hal
# 启动 LoRa 数据包转发器
./packet_forwarder/lora_pkt_fwd -c global_conf.json &
# 启动 ChirpStack 服务
sudo chirpstack -c /etc/chirpstack/start-chirpstack-cn470/ &
然后把 start_chirpstack.sh 放在开机启动中,或者不创建脚本,直接把上面的命令放在rc文件中
sudo nano /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
# 在这里添加启动命令
sudo /usr/local/bin/start_chirpstack.sh &
exit 0
5、查看日志
查看网关桥日志
sudo systemctl restart chirpstack-gateway-bridge
通过 systemctl 启动的服务(如 chirpstack-gateway-bridge)可以使用 journalctl 查看其日志
sudo journalctl -f -n 100 -u chirpstack-gateway-bridge
查看SX1302的日志
可以重定向日志到文件
#!/bin/bash
# 重启 ChirpStack Gateway Bridge 服务并将日志输出到指定文件
sudo systemctl restart chirpstack-gateway-bridge > /var/log/chirpstack-gateway-bridge.log 2>&1 &
# 切换到 SX1302 HAL 目录
cd /home/pi/sx1302_hal
# 启动 LoRa 数据包转发器并将日志输出到指定文件
./packet_forwarder/lora_pkt_fwd -c global_conf.json > /var/log/lora_pkt_fwd.log 2>&1 &
# 启动 ChirpStack 服务并将日志输出到指定文件
sudo chirpstack -c /etc/chirpstack/start-chirpstack/ > /var/log/chirpstack.log 2>&1 &
# 查看 ChirpStack Gateway Bridge 的日志文件
cat /var/log/chirpstack-gateway-bridge.log
# 查看 LoRa 数据包转发器的日志文件
cat /var/log/lora_pkt_fwd.log
# 查看 ChirpStack 服务的日志文件
cat /var/log/chirpstack.log
# 实时查看 ChirpStack Gateway Bridge 的日志文件
tail -f /var/log/chirpstack-gateway-bridge.log
# 实时查看 LoRa 数据包转发器的日志文件
tail -f /var/log/lora_pkt_fwd.log
# 实时查看 ChirpStack 服务的日志文件
tail -f /var/log/chirpstack.log
也可以使用 screen 工具
# 启动一个新的 screen 会话
screen -S chirpstack
# 在 screen 会话中运行你的命令
sudo chirpstack -c /etc/chirpstack/start-chirpstack/
# 退出
exit
七:ChirpStack本地设备添加
1、添加配置文件和网关设备
创建一个test1

默认使用OTAA,记得打钩Class-C

增加网关,网关ID就是sx1302_hal文件下global_conf.json中的

2、添加设备
先创建个app1

增加设备


填写APPKEY

3、LoRaWAN终端设置
LoRWAN终端我用的唯传科技的M300C-L 公司官网:http://www.winext.cn/#/
下面的配置要和上面的 “ 2、添加设备“ 保 持一直,设置成OTAA模式的,然后重启

重启后设备的状态:

重启后网关接收到的:

4、LoRaWAN终端发数据测试
发送 你好 的 16进制数据

网关接收到数据,接收到的数据是Base64格式的,先转换成HEX格式的,然后再转换成字符串

Base64解码成HEX格式 网站:https://base64.us/

HEX转换成字符串格式 网站:https://www.bejson.com/convert/ox2str/

5、平台给LoRaWAN终端发送数据
平台发送数据到LoRaWAN终端

终端收到数据并发送ACK

平台收到ACK效验数据

6、mosquito 连接
a、先看一下 mosquitto.conf
cat /etc/mosquitto/mosquitto.conf
# 将你的本地配置放在 /etc/mosquitto/conf.d/ 目录下
# 配置文件的详细说明在 /usr/share/doc/mosquitto/examples/mosquitto.conf.example 中
# 指定 Mosquitto 进程的 PID 文件位置
pid_file /run/mosquitto/mosquitto.pid
# 启用持久化,以便在重启后恢复消息状态
persistence true
# 指定持久化数据的存储位置
persistence_location /var/lib/mosquitto/
# 指定日志文件的位置
log_dest file /var/log/mosquitto/mosquitto.log
# 包含 /etc/mosquitto/conf.d 目录中的所有配置文件
include_dir /etc/mosquitto/conf.d
# 指定 Mosquitto 监听的端口号 1883(MQTT 默认端口)全部ip地址
listener 1883
# 指定使用 MQTT 协议
protocol mqtt
# 表示不允许匿名访问(禁用匿名访问时需要进行身份验证)
# allow_anonymous false
# 指定了一个密码文件的位置,用于身份验证(如果启用身份验证)
# password_file /etc/mosquitto/pwfile
# 允许匿名访问,即不需要身份验证即可连接 Mosquitto
allow_anonymous true
b、重启 mosquito
sudo systemctl restart mosquitto
c、使用网络命令看下1883端口
sudo netstat -tuln | grep 1883
sudo ss -tuln | grep 1883
pi@raspberrypi:~ $ sudo netstat -tuln | grep 1883
tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN
tcp6 0 0 :::1883 :::* LISTEN
pi@raspberrypi:~ $ sudo ss -tuln | grep 1883
tcp LISTEN 0 100 0.0.0.0:1883 0.0.0.0:*
tcp LISTEN 0 100 [::]:1883 [::]:*
看到了我们的 mqtt 的 broker_host 是 0.0.0.0:8080
d、再看一下 region_cn470_0.toml 文件中的 mqtt 主题配置
cat /etc/chirpstack/start-chirpstack-cn470/region_cn470_0.toml
# MQTT 配置。
[regions.gateway.backend.mqtt]
# 主题前缀。
#
# 主题前缀可用于定义网关的区域。
# 注意,不需要在前缀后面添加斜杠 '/'。如果配置了前缀,斜杠 '/' 将自动添加到前缀中。
# topic_prefix = "cn470_0"
event_topic="gateway/+/event/+"
command_topic="gateway/{{gateway_id}}/command/{{command}}"
# 共享订阅名称。
#
# 如果多个 ChirpStack 实例共享相同的订阅名称,则 MQTT 代理只会将网关事件传递给一个订阅者。
# 如果您有一个生产环境和一个测试环境连接到同一个 MQTT 代理,请确保每个环境都有自己的订阅名称,例如:
# chirpstack_prod 和 chirpstack_tst。
share_name = "chirpstack"
# MQTT 服务器(例如 scheme://host:port,其中 scheme 可以是 tcp、ssl 或 ws)
# server = "tcp://localhost:1883"
server = "tcp://0.0.0.0:1883"
# 使用给定的用户名连接(可选)
username = ""
# 使用给定的密码连接(可选)
password = ""
e、使用 mosquitto_sub 订阅,根据自己的IP地址去订阅
具体的订阅内容:
v3:https://www.chirpstack.io/application-server/integrations/mqtt/
v4:https://www.chirpstack.io/docs/chirpstack/integrations/mqtt.html
mosquitto_sub -h localhost -p 1883 -t 'gateway/+/event/+'
mosquitto_sub -h 0.0.0.0 -p 1883 -t 'gateway/+/event/+'
mosquitto_sub -h 192.168.30.71 -p 1883 -t 'gateway/+/event/+'
mosquitto_sub -h 192.168.30.38 -p 1883 -t 'gateway/+/event/+'
-h localhost: 指定 MQTT 服务器的地址(在这里是本地服务器)。-p 1883: 指定 MQTT 服务器的端口。-t 'gateway/+/event/+': 订阅所有以gateway/开头、/event/后面跟任意事件类型的主题。
mqtt确实收到了数据:
f、在来看下我们树莓派上的网络端口:
用网络连接和监听端口的命令
netstat -tuln
pi@raspberrypi:~ $ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp6 0 0 ::1:6379 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:5432 :::* LISTEN
tcp6 0 0 :::1883 :::* LISTEN
tcp6 0 0 ::1:6010 :::* LISTEN
tcp6 0 0 ::1:6011 :::* LISTEN
udp 0 0 0.0.0.0:631 0.0.0.0:*
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp 0 0 0.0.0.0:45029 0.0.0.0:*
udp6 0 0 :::5353 :::*
udp6 0 0 :::1700 :::*
udp6 0 0 :::36774 :::*
f1、TCP 端口
- 127.0.0.1:6010 和 127.0.0.1:6011: 这是本地回环接口上的端口,通常用于本地应用或调试。
- 0.0.0.0:22: SSH 服务的默认端口,允许从任何网络接口进行连接。
- 127.0.0.1:5432: PostgreSQL 数据库服务的默认端口,仅允许本地连接。数据库连接地址
- 127.0.0.1:631: CUPS 打印服务的端口,仅允许本地连接。
- 0.0.0.0:8080: 允许从任何网络接口访问的 HTTP 服务端口,他就是 chirstack
- 0.0.0.0:1883: MQTT 服务的端口,允许从任何网络接口连接。mqtt 的 broker_host
- 127.0.0.1:6379: Redis 数据库服务的端口,仅允许本地连接。数据库连接地址
f2、TCP6 端口(IPv6)
- ::1:6379: Redis 数据库服务的 IPv6 地址。
- ::1:631: CUPS 打印服务的 IPv6 地址。
- :::22: SSH 服务的 IPv6 地址。
- ::1:5432: PostgreSQL 数据库服务的 IPv6 地址。
- :::1883: MQTT 服务的 IPv6 地址。
- ::1:6010 和 ::1:6011: 本地回环接口上的端口(IPv6)。
f3、UDP 端口
- 0.0.0.0:631: CUPS 打印服务的 UDP 端口,允许从任何网络接口进行连接。
- 0.0.0.0:5353: Multicast DNS (mDNS) 服务端口。
- 0.0.0.0:45029: 一个随机的高端口,通常用于临时服务。
- :::5353: mDNS 服务的 IPv6 地址。
- :::1700 和 :::36774: 可能是某些应用程序或服务使用的动态 UDP 端口。
1700 是 sx1302_hal/global_conf.json 中的 serv_port_up 和 serv_port_down 数据的端口
每一行的 Local Address 表示监听的本地地址和端口,Foreign Address 显示为 0.0.0.0:* 或 :::* 表示接受任何远程地址的连接。 State 列显示连接状态,LISTEN 表示端口正在等待传入的连接。
7、mqttx 连接
使用 mosquitto 49也可以的,不过我这样更加方便,更有利于查看。
在windows端安装mqttx工具或者paho mqtt
a、创建连接

b、用 mqttx 发送给终端节点数据

b1、主题
application/ff721c9a-d55e-4144-926c-7acfdf178ddb/device/ffffff100004bbea/command/down
消息是 json 格式,date是 base64编码后的数据 Hello Word
{
"devEui": "ffffff100004bbea",
"confirmed": true,
"fPort": 10,
"data": "SGVsbG8gV29ybGQ="
}
b2、终端也收到了数据

c、用终端节点发送数据

c1、平台接收到数据

c2、mqttx 也收到数据

八、TTN服务的连接
1、先创建账号
官网:https://id.thethingsnetwork.org/

2、登录到TTN
登录:https://eu1.cloud.thethings.network/console/gateways/001100

3、创建网关
注意网关号是否重复,如果重复,需要更改sx1302_hal文件下的global_conf中的gateway_ID号

下面这两个都选

都创建好了,重启下网关,再来刷新网页,网关连接成功

4、创建应用程序

5、添加设备

添加设备,配置设备


我这里的APPEUI在LoRaWAN终端配置错了,要重新配置一下,就是一个箭头错导致的

重启LoRaWAN节点模块,连接到TTN服务
6、LoRaWAN终端发数据测试
发送 你好 的 16进制数据

网关接收到数据,接收到的数据是Base64格式的,先转换成HEX格式的,然后再转换成字符串

Base64解码成HEX格式 网站:https://base64.us/

HEX转换成字符串格式 网站:https://www.bejson.com/convert/ox2str/

7、平台给LoRaWAN终端发送数据
平台发送数据

设备接收到数据

更多推荐

所有评论(0)