第四章:网关与服务器搭建

4.1 LoRa网关硬件架构

聊到网关,我得先说说它的定位。说白了,网关就是LoRa网络里的“翻译官”和“中转站”。它一边听着成百上千个节点发来的微弱信号,一边把这些信号转成咱们熟悉的IP数据包,扔到互联网上去。

我最早接触LoRa网关时,总觉得它就是个高级点的WiFi路由器。后来踩了坑才明白——完全不是一回事。LoRa网关的核心是那颗多通道射频芯片,比如Semtech的SX1301或SX1302。它跟普通的单通道芯片不一样,能同时监听8个频点,还能处理扩频因子不同的信号。

网关硬件核心组件:

  • 主控芯片:通常是ARM Cortex-A系列(比如树莓派、i.MX6),负责运行网关软件和网络协议栈。
  • 射频基带芯片:SX1301/1302,这是LoRa网关的灵魂。它负责解调空中的LoRa信号。
  • 功率放大器(PA):把发射信号放大到合法功率(中国是≤500mW,也就是27dBm)。
  • 低噪声放大器(LNA):接收端用的,把微弱的节点信号放大到可处理的程度。
  • GPS模块:不是必须的,但有了它就能做时间同步,还能实现节点定位功能。

我个人习惯把网关分成两类:室内型工业型。室内型一般用树莓派加一个LoRa Hat,成本低、上手快,适合实验室和办公室场景。工业型则是金属外壳、IP67防护等级、支持PoE供电,适合工厂、仓库、户外这些环境。

我的经验:如果你只是做实验验证,买个树莓派4B加一个SX1302的扩展板就够了,总成本不到500块。但要是部署到生产环境,千万别省那个钱——工业级网关的稳定性和抗干扰能力,真不是树莓派能比的。我在一个化工厂项目里吃过这个亏,树莓派网关运行了三天就死机了,换了工业网关后稳如老狗。

4.2 ChirpStack开源服务器部署

网关硬件搞定了,接下来就是软件层面。LoRa网络服务器有很多选择,商业的有Aeolus、Actility,开源的则有ChirpStack、The Things Network。我个人最推荐ChirpStack,原因很简单:文档全、社区活跃、部署方便。

ChirpStack的架构分三层:

  • ChirpStack Gateway Bridge:运行在网关上,负责把LoRa数据包转成MQTT或HTTP格式。
  • ChirpStack Network Server:核心服务器,处理MAC层协议、数据去重、确认重传等。
  • ChirpStack Application Server:应用层接口,提供REST API和Web界面,方便你管理设备和查看数据。

部署方式我推荐用Docker Compose,一键搞定。下面是我常用的docker-compose.yml配置:

version: "3.7"

services:
  chirpstack-network-server:
    image: chirpstack/chirpstack-network-server:4
    ports:
      - "8000:8000"
    volumes:
      - ./configuration/chirpstack-network-server:/etc/chirpstack-network-server
    depends_on:
      - postgres
      - mosquitto

  chirpstack-application-server:
    image: chirpstack/chirpstack-application-server:4
    ports:
      - "8080:8080"
    volumes:
      - ./configuration/chirpstack-application-server:/etc/chirpstack-application-server
    depends_on:
      - chirpstack-network-server

  postgres:
    image: postgres:14-alpine
    environment:
      POSTGRES_PASSWORD: chirpstack
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data

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

嗯,这里要注意一点:配置文件里的区域参数一定要改。中国用的是CN470频段,跟欧洲的EU868、北美的US915都不一样。我曾经帮一个朋友排查问题,他部署好了服务器但节点死活连不上,折腾了两天才发现是频段配置错了。

避坑指南:ChirpStack默认配置是EU868。如果你在中国使用,必须修改chirpstack-network-server.toml中的[lorawan.region]cn470。同时,CN470有96个频点,但实际可用的是前48个(470.3MHz~476.9MHz),别搞错了。

4.3 网络配置实战

服务器跑起来了,接下来就是让网关和服务器“握手”。这个过程我拆成三步:

  1. 配置网关的LoRa参数:频点、扩频因子、带宽、编码率,这些得跟服务器一致。
  2. 配置网关的上行链路:网关通过什么方式把数据发给服务器?通常是MQTT或HTTP。
  3. 注册节点设备:在ChirpStack后台添加节点,分配DevEUI、AppEUI、AppKey。

先看网关配置。以树莓派加SX1302为例,配置文件一般在/etc/lora-gateway/global_conf.json。核心部分长这样:

{
  "SX130x_conf": {
    "lorawan_public": true,
    "clksrc": 0,
    "antenna_gain": 0,
    "tx_gain_lut": [
      {
        "rf_power": 27,
        "pa_gain": 2,
        "pwr_idx": 15
      }
    ]
  },
  "gateway_conf": {
    "gateway_ID": "B827EBFFFE123456",
    "server_address": "192.168.1.100",
    "serv_port_up": 1700,
    "serv_port_down": 1700
  }
}

这里gateway_ID是网关的唯一标识,一般用MAC地址生成。server_address填你ChirpStack服务器的IP。端口1700是LoRaWAN协议默认的UDP端口。

配置好之后,重启网关服务:

sudo systemctl restart lora-gateway-bridge
sudo systemctl status lora-gateway-bridge

如果看到日志里出现PULL_ACK received,说明网关跟服务器已经成功建立了连接。这时候去ChirpStack后台的“Gateways”页面,应该能看到网关在线了。

一个小技巧:我习惯在网关上跑一个tcpdump抓包,确认UDP数据包确实发到了服务器。命令是sudo tcpdump -i eth0 port 1700。如果看到有数据包发出去但服务器没收到,八成是防火墙或者NAT的问题。

最后一步,注册节点。在ChirpStack后台点“Devices”->“Add Device”,填入节点的DevEUI(8字节)、AppEUI(8字节)、AppKey(16字节)。这些参数在节点出厂时就有,或者你自己烧录时指定的。

注册完成后,给节点上电。如果一切正常,几秒钟后你就能在ChirpStack的“Device Data”页面看到节点上报的数据了。我第一次看到数据流出来的时候,说实话,挺激动的——从硬件到软件,整个链路终于跑通了。

总结一下关键点:

  • 网关硬件选型:实验用树莓派+SX1302,生产用工业级网关。
  • ChirpStack部署:Docker Compose最省事,记得改区域配置。
  • 网络配置:频点、端口、网关ID,一个都不能错。
  • 节点注册:DevEUI/AppEUI/AppKey三件套,缺一不可。

好了,网关和服务器这块就聊到这儿。下一章咱们会深入节点的固件开发,到时候我会分享一些调试技巧——嗯,那些坑我已经替你们踩过了。