2. 配置LoRaWAN网络服务器(ChirpStack)

任务目标

本案例将完成LoRaWAN网络服务器ChirpStack的本地化部署与基础配置,使网关(Gateway)能够成功接入服务器,并完成一个终端设备(Device)的OTAA入网注册。最终通过ChirpStack Web界面确认网关状态为“online”、设备状态为“never seen”且已成功发送一次Join请求。

环境与依赖

  • 操作系统:Ubuntu 22.04 LTS(x86_64)或Debian 11
  • Docker Engine 20.10+ 与 Docker Compose v2
  • 已安装Mosquitto MQTT Broker(用于网关与ChirpStack之间的消息桥接,本案例使用ChirpStack内置的MQTT集成)
  • LoRaWAN网关(如SX130x系列),支持Semtech UDP Packet Forwarder协议

ChirpStack部署

使用Docker Compose一键部署ChirpStack v4组件(Network Server + Application Server + Gateway Bridge)。创建项目目录并编写配置文件:

mkdir -p /opt/chirpstack && cd /opt/chirpstack
cat > docker-compose.yml <<'EOF'
version: "3.8"

services:
  chirpstack:
    image: chirpstack/chirpstack:4.5.0
    container_name: chirpstack
    restart: unless-stopped
    command: -c /etc/chirpstack
    volumes:
      - ./configuration/chirpstack:/etc/chirpstack
      - ./lorawan-devices:/opt/lorawan-devices
    ports:
      - "8080:8080"   # Web界面
      - "8000:8000"   # gRPC API
    depends_on:
      - postgres
      - mosquitto
      - redis

  chirpstack-gateway-bridge:
    image: chirpstack/chirpstack-gateway-bridge:4.0.4
    container_name: chirpstack-gateway-bridge
    restart: unless-stopped
    command: -c /etc/chirpstack-gateway-bridge
    volumes:
      - ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
    ports:
      - "1700:1700/udp"  # Semtech UDP
    depends_on:
      - mosquitto

  chirpstack-rest-api:
    image: chirpstack/chirpstack-rest-api:4.4.0
    container_name: chirpstack-rest-api
    restart: unless-stopped
    command: --server bind :8090 --chirpstack-server server:8080
    ports:
      - "8090:8090"
    depends_on:
      - chirpstack

  postgres:
    image: postgres:14-alpine
    environment:
      POSTGRES_DB: chirpstack
      POSTGRES_USER: chirpstack
      POSTGRES_PASSWORD: chirpstack
    volumes:
      - postgresqldata:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    volumes:
      - redisdata:/data

  mosquitto:
    image: eclipse-mosquitto:2
    ports:
      - "1883:1883"
      - "9001:9001"
    volumes:
      - ./configuration/mosquitto:/mosquitto/config

volumes:
  postgresqldata:
  redisdata:
EOF

创建ChirpStack核心配置文件:

mkdir -p configuration/chirpstack configuration/chirpstack-gateway-bridge configuration/mosquitto

# ChirpStack Network Server配置
cat > configuration/chirpstack/chirpstack.toml <<'EOF'
[general]
log_level = 10

[postgres]
dsn = "postgres://chirpstack:chirpstack@postgres/chirpstack?sslmode=disable"

[redis]
servers = ["redis://redis:6379"]

[network_server]
net_id = "000000"
enabled = true

[network_server.band]
name = "EU_863_870"

[network_server.gateway]
enabled = true

[network_server.gateway.backend.mqtt]
server = "tcp://mosquitto:1883"
EOF

# Gateway Bridge配置(Semtech UDP转MQTT)
cat > configuration/chirpstack-gateway-bridge/chirpstack-gateway-bridge.toml <<'EOF'
[general]
log_level = 10

[integration.mqtt]
event_topic_template = "gateway/{{ .GatewayID }}/event/{{ .EventType }}"
state_topic_template = "gateway/{{ .GatewayID }}/state/{{ .StateType }}"
command_topic_template = "gateway/{{ .GatewayID }}/command/{{ .CommandType }}"

[integration.mqtt.marshaler]
name = "protobuf"

[backend]
type = "semtech_udp"

[backend.semtech_udp]
udp_bind = "0.0.0.0:1700"
EOF

# Mosquitto配置
cat > configuration/mosquitto/mosquitto.conf <<'EOF'
listener 1883
allow_anonymous true
EOF

启动服务并初始化数据库:

docker compose up -d
# 等待数据库就绪后执行迁移(首次启动自动执行)
docker compose logs -f chirpstack | grep -i "migration"

Web界面配置

  1. 浏览器访问 http://localhost:8080,使用默认管理员账号 admin / admin 登录。
  2. 创建网络服务器:Network Servers → Add,名称填 ns-1,服务器地址填 chirpstack:8000(Docker内部地址)。
  3. 创建服务配置文件:Service Profiles → Add,名称 sp-1,网络服务器选择 ns-1。
  4. 创建设备配置文件:Device Profiles → Add,名称 dp-1,网络服务器选 ns-1,LoRaWAN版本选 1.0.3,区域选 EU868,启用OTAA。

网关接入

在网关的Packet Forwarder配置中,将服务器地址指向运行ChirpStack的机器IP,UDP端口为 1700。以SX130x网关为例,修改 global_conf.json:

{
  "SX1301_conf": {
    "lorawan_public": true,
    "clksrc": 1
  },
  "gateway_conf": {
    "gateway_ID": "YOUR_GATEWAY_EUI",
    "server_address": "192.168.1.100",
    "serv_port_up": 1700,
    "serv_port_down": 1700
  }
}

重启网关进程后,在ChirpStack界面 Gateways 页面应看到新网关自动注册,状态显示为 online(绿色圆点)。

终端设备注册与验证

  1. 在 Applications 中创建应用 app-1,服务配置文件选 sp-1。
  2. 在应用中添加设备:Devices → Add,填入设备EUI(如 0102030405060708),设备配置文件选 dp-1。
  3. 进入设备详情,在 Activation 标签页生成AppKey(点击 Generate 按钮),记录生成的AppKey值。
  4. 将设备EUI、AppEUI(与应用EUI相同)和AppKey烧录到LoRa终端节点。

设备上电后发起Join请求,在ChirpStack设备详情页的 LoRaWAN frames 标签页应看到 JoinRequest 记录,设备状态变为 never seen(表示已收到Join但尚未完成激活)。若设备支持自动激活,状态将变为 online。

验证判定标准

  • Docker容器全部处于 Up 状态(docker compose ps 确认)。
  • ChirpStack Web界面可正常登录并完成上述配置。
  • 网关列表中出现目标网关且状态为 online,最后上报时间在1分钟以内。
  • 设备列表中出现目标设备,且设备详情页能看到来自该设备的JoinRequest帧记录。

若网关无法上线,检查防火墙是否放行UDP 1700端口,并确认网关的EUI与ChirpStack中显示的Gateway ID一致。若设备Join失败,核对AppKey是否与设备端一致,并确认设备发送频率符合EU868频段规划。