目录

一:硬件

二:系统

1、安装树莓派OS(Debian)

三:SSH连接树莓派-配置树莓派引脚

1、SSH连接树莓派

2、配置树莓派

四:sx1302_hal

1、叙述模块

2、驱动sx1302网关模块

2.1、修改文件,适配自己的机器

2.1.1、reset_lgw.h修改

2.1.2、global_conf.json修改

a、global_conf.json中文注释

2.1.3、global_conf.json配置说明

a:设置基站的接收频点

b:设置基站的ID

c:如何设置基站的LoRaWAN NS指向

d:如何设置基站的发射功率

2.1.4、loragw_i2c修改

2.1.5、编译运行sx1302_hal代码

2.1.6、sx1302启动信息

a、我的启动信息:

b、接收到 LoRaWAN 模块的入网 JOIN 信息:

c、接收到 LoRaWAN模块的数据信息:

五:了解一下chirpstack

ChirpStack 版本对比

六:开始搭建ChirpStack

1、安装准备

 a、开始安装 mosquitto 、 postgresql 、Redis 

b、配置一下 postgresql 数据库

c、创建一个用于认证的角色,允许登录并设置密码

d、创建一个名为 chirpstack 的数据库,并指定该角色为数据库的所有者

e、切换到 chirpstack 数据库

f、在 chirpstack 数据库中创建 pg_trgm 扩展,用于支持三元组操作CREATE EXTENSION pg_trgm;

g、退出 psql 命令行界面

2、chirpstack_gateway_bridge 安装

a、下载安装包

b、下载后安装

c、安装成功

​编辑d、修改配置文件

e、启动网关桥:

3、ChirpStack安装

a、下载安装包

b、下载后安装

c、安装成功

d、修改配置文件

e、启动ChirpStack

d、分析启动日志

 

一:硬件

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程序运行的所有配置参数,其中几点是我们平时会比较常用到的:

  1. 如何修改基站的接收频点
  2. 如何设置基站的ID
  3. 如何设置基站的LoRaWAN NS指向
  4. 如何设置基站的发射功率

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

    故此条配置的含义是:

    1. 此频点可接收多个SF
    2. 此频点为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的时候可能会被清除,为了保险起见,等编译后再改个名就行了。

  1. make clean all ->此步骤会把代码编译成可执行文件

  2. 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 

  3. 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终端发送数据

平台发送数据

设备接收到数据

 

 

 

 

 

 

 

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐