2. LoRaWAN 网关选址与覆盖预估
任务目标
本案例将完成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界面配置
- 浏览器访问
http://localhost:8080,使用默认管理员账号admin/admin登录。 - 创建网络服务器:Network Servers → Add,名称填
ns-1,服务器地址填chirpstack:8000(Docker内部地址)。 - 创建服务配置文件:Service Profiles → Add,名称
sp-1,网络服务器选择ns-1。 - 创建设备配置文件: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(绿色圆点)。
终端设备注册与验证
- 在 Applications 中创建应用
app-1,服务配置文件选sp-1。 - 在应用中添加设备:Devices → Add,填入设备EUI(如
0102030405060708),设备配置文件选dp-1。 - 进入设备详情,在 Activation 标签页生成AppKey(点击 Generate 按钮),记录生成的AppKey值。
- 将设备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频段规划。