深入解析ChirpStack LoRaWAN服务器:连接物联网的关键技术

文章目录

  • LoRaWan协议
  • 什么是ChirpStack 有什么用
  • 开源的LoRaWan Server
  • 搭建ChirpStack
  • 认识下各个组件
  • chirpstack v3
  • chirpstack-network-server
  • chirpstack-application-server
  • chirpstack-gateway-bridge
  • postgresql
  • redis
  • mosquitto
  • 部署说明
  • chirpstack v4
  • chirpstack
  • chirpstack-gateway-bridge-eu868
  • postgres
  • redis
  • mosquitto
  • 部署说明
  • 组件间的关系
  • 部署
  • ChirpStack Application Server模块功能
  • Organizations
  • Organization users
  • Organization API keys
  • Service-profiles
  • Device-profiles
  • Gateways
  • Applications
  • Devices
  • LoRaWan协议

    LoRaWAN(长程广域网,Long Range Wide Area Network)是一种低功耗、广域覆盖的无线通信协议,专为物联网(IoT)应用而设计。它采用低功耗、长距离通信技术,使得设备可以在低功耗条件下远距离传输数据,适用于各种用例,如智能城市、农业、工业自动化、环境监测等。它基于LoRa调制技术来实现的。
    这里稍微介绍下概念,由于本文主要介绍LoRaWan服务器,LoRaWan协议偏向设备传输层面,下篇文章讲到LoRaWan网关接入LoRaWan服务器的时候会再讲解LoRaWan协议。

    什么是ChirpStack 有什么用

    ChirpStack是一个开源的物联网(IoT)网络服务器,它提供了LoRaWAN协议的网络服务器功能。
    具体来说,ChirpStack是一个LoRaWAN网络服务器,用于管理和控制连接到LoRaWAN网络的终端设备、网关和应用程序。它允许用户建立、操作和维护自己的LoRaWAN网络,以支持各种物联网应用,如智能城市、农业、工业自动化和环境监测等。
    后面随着ChirpStack体系搭建起来,会讲解诸如应用创建、网关注册、设备注册、安全认证等各项功能,你便能对ChirpStack的作用有更深刻的理解。

    开源的LoRaWan Server

    当前开源的LoRaWan Server主要有:

  • chirpstack
  • lorawan-server
  • ttn
  • 其中chirpStackttn是Golang实现,lorawan-server是Erlang实现。

    搭建ChirpStack

    ChirpStack体系包括chirpstack-network-serverchirpstack-application-serverchirpstack-gateway-bridgepostgresqlredismosquitto
    上面是ChirpStack v3的组件,到ChirpStack v4已经将chirpstack-network-serverchirpstack-application-server合并起来变成chirpstack

    认识下各个组件

    chirpstack v3

    chirpstack-network-server

    ChirpStack网络服务器是LoRaWAN网络中的核心组件,负责处理网关接收到的设备的上行链路数据以及调度下行链路数据,即处理设备的注册和数据传输。它是整个LoRaWAN网络的中央协调器。
    https://github.com/brocaar/chirpstack-network-server

    chirpstack-application-server

    ChirpStack应用服务器是用于管理LoRaWAN应用的组件。它负责处理设备数据、解码Payload、处理应用逻辑、提供API以与应用程序集成(支持通过Web界面或API与应用服务器交互)等。
    https://github.com/brocaar/chirpstack-application-server

    chirpstack-gateway-bridge

    ChirpStack网关桥接器是用于将网关传输的数据转发到ChirpStack网络服务器的组件,可以将LoRa网关传输来的LoRa数据包转发器协议转换成ChirpStack网络服务器通用的数据格式(JSON和Protobuf)。它充当网关和网络服务器之间的中间件。

    LoRa网关的数据是加密的,我们在LoRa gateway log里不能具体看到数据样式,此时ChirpStack网关桥接器就可以将这种数据包转换成ChirpStack识别的数据格式,这也有利于用户的可观性。

    chirpstack-gateway-bridge有两种部署方式,一种是内置在网关内,另一种是ChirpStack网络服务一样和部署在服务器上。

    https://www.chirpstack.io/gateway-bridge/

    postgresql

    ChirpStack使用了PostgreSQL数据库来存储ChirpStack的各种数据,包括设备注册信息、设备数据等。

    redis

    用于存储ChirpStack的临时数据和缓存信息。

    mosquitto

    Mosquitto是一个MQTT协议的代理服务器,用于处理设备和ChirpStack组件之间的通信。它允许LoRaWAN网关和ChirpStack服务之间的消息传递。

    在LoRaWAN网关的数据包转发器配置可以选择MQTT for Chirpstack协议,给予其MQTT Broker Address MQTT Broker Port即可与ChirpStack服务进行通讯,即LoRaWAN网关与ChirpStack服务之间的通讯可以通过MQTT协议来传输。

    部署说明

    以上chirpstack v3组件的链接是组件项目开发版使用的
    chirpstack v3的提供了docker部署版:https://github.com/chirpstack/chirpstack-docker/tree/v3
    docker-compose.yml如下:

    version: "3"
    
    services:
      chirpstack-network-server:
        image: chirpstack/chirpstack-network-server:3
        volumes:
          - ./configuration/chirpstack-network-server:/etc/chirpstack-network-server
        depends_on:
          - postgresql
          - mosquitto
    
      chirpstack-application-server:
        image: chirpstack/chirpstack-application-server:3
        ports:
          - 8080:8080 #访问该端口即可访问到chirpstack的web界面
        volumes:
          - ./configuration/chirpstack-application-server:/etc/chirpstack-application-server
        depends_on:
          - chirpstack-network-server
    
      chirpstack-gateway-bridge:
        image: chirpstack/chirpstack-gateway-bridge:3
        ports:
          - 1700:1700/udp #将容器内的1700/udp端口映射到主机的1700/udp端口,用于接收来自LoRaWAN网关的数据。
        volumes:
          - ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
        depends_on: 
          - mosquitto
    
      postgresql:
        image: postgres:9.6-alpine
        environment:
          - POSTGRES_PASSWORD=root
        volumes:
          - ./configuration/postgresql/initdb:/docker-entrypoint-initdb.d
          - postgresqldata:/var/lib/postgresql/data
    
      redis:
        image: redis:5-alpine
        volumes:
          - redisdata:/data
    
      mosquitto:
        image: eclipse-mosquitto:2
        ports:
          - 1883:1883 #将容器内的1883端口映射到主机的1883端口,用于MQTT通信。
        volumes: 
          - ./configuration/eclipse-mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
    
    volumes:
      postgresqldata:
      redisdata:
    

    chirpstack v4

    chirpstack

    ChirpStack v4是ChirpStack的最新版本,它包括网络服务器、应用服务器和设备管理。它是一个综合的LoRaWAN解决方案,允许您构建和管理LoRaWAN网络。

    合并了ChirpStack v3的chirpstack-network-server和chirpstack-application-server,因此不需要在chirpstack-application-server上配置指定chirpstack-network-server了

    https://github.com/chirpstack/chirpstack

    chirpstack-gateway-bridge-eu868

    同chirpstack v3
    https://github.com/chirpstack/chirpstack-gateway-bridge

    postgres

    同chirpstack v3

    redis

    同chirpstack v3

    mosquitto

    同chirpstack v3

    部署说明

    以上chirpstack v4组件的链接是组件项目开发版使用的
    chirpstack v4的提供了docker部署版:https://github.com/chirpstack/chirpstack-docker/tree/v4
    docker-compose.yml如下:

    version: "3"
    
    services:
      chirpstack:
        image: chirpstack/chirpstack:4.0.0-test.12
        command: -c /etc/chirpstack
        restart: unless-stopped
        volumes:
          - ./configuration/chirpstack:/etc/chirpstack
          - ./lorawan-devices:/opt/lorawan-devices
        depends_on:
          - postgres
          - mosquitto
          - redis
        ports:
          - 8080:8080
    
      chirpstack-gateway-bridge-eu868:
        image: chirpstack/chirpstack-gateway-bridge:3
        ports:
          - 1700:1700/udp
        volumes:
          - ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
        depends_on: 
          - mosquitto
    
      postgres:
        image: postgres:11-alpine
        volumes:
          - ./configuration/postgresql/initdb:/docker-entrypoint-initdb.d
          - postgresqldata:/var/lib/postgresql/data
        environment:
          - POSTGRES_PASSWORD=root
    
      redis:
        image: redis:6-alpine
        volumes:
          - redisdata:/data
    
      mosquitto:
        image: eclipse-mosquitto:2
        ports:
          - 1883:1883
        volumes: 
          - ./configuration/eclipse-mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
    
    volumes:
      postgresqldata:
      redisdata:
    

    组件间的关系

    68747470733a2f2f7777772e6368697270737461636b2e696f2f7374617469632f696d672f6772617068732f6172636869746563747572652e646f742e706e67 (1).png
    如图所示
    LoRa Gateway可通过两种方式与ChirpStack交互,一种是在LoRa Gateway内置的ChirpStack Gateway Bridge转换数据格式并通过MQTT协议与MQTT broker交互,另一种是在服务器上单独部署ChirpStack Gateway Bridge,LoRa Gateway通过UDP协议与ChirpStack Gateway Bridge交互,ChirpStack Gateway Bridge再将转换完的数据与MQTT broker交互。这样子,ChirpStack Network Server即可直接与MQTT broker通过发布订阅消息来间接与LoRa Gateway实现通讯。
    ChirpStack Application Server与ChirpStack Network Server之间通过gRPC远程调用协议进行交互,例如接收ChirpStack Network Server收集的上行数据,向ChirpStack Network Server下行payload。
    ChirpStack Application Server可与其他外部组件集成,例如与外部MQTT broker集成,将数据发送到该MQTT broker上,通过HTTP的方式将数据通过POST请求发送到用户配置的端点的接口上,将数据写入时序数据库InfluxDB和关系型数据库PostgreSQL等。

    更多集成详细可参考:https://www.chirpstack.io/docs/chirpstack/integrations/index.html

    部署

    这里使用chirpstack v3。
    克隆chirpstack v3仓库文件下来

    git clone -b v3 https://github.com/chirpstack/chirpstack-docker.git
    

    image.png

    cd chirpstack-docker
    docker-compose up -d
    

    image.png
    查看运行状态,运行中

    docker-compose ps
    

    image.png
    打开部署服务器的ip 8080端口,进入ChirpStack应用程序服务器Web界面,默认账号密码都是admin
    登录后,我们可以看到如下画面:
    image.png
    首先,添加chirpstack网络服务器,方便我们后续上行接收和下行数据。
    由于部署的组件在同一docker网络下,则chirpstack应用服务器可以通过容器名chirpstack-network-server访问到chirpstack网络服务器。
    image.png
    此时,网络服务器默认使用的频段是EU868,我们可以进入目录文件configuration/chirpstack-network-server/chirpstack-network-server.toml

    chirpstack-network-server.toml用于确保网络服务器正确运行并与其他组件协同工作。根据你的需求和所使用的LoRaWAN频段,进行相应的配置调整等。

    修改网络服务器接收的频段配置:
    例如中国大陆使用的频段为CN_470_510

    [postgresql]
    dsn="postgres://chirpstack_ns:chirpstack_ns@postgresql/chirpstack_ns?sslmode=disable" #这一部分配置了与PostgreSQL数据库的连接信息,包括数据库连接字符串(DSN),用户名和密码等。ChirpStack Network Server使用PostgreSQL来存储和管理网络服务器的数据。
    
    [redis]
    url="redis://redis:6379" #这一部分配置了与Redis数据库的连接信息,包括Redis的URL。Redis通常用于缓存和存储临时数据,以提高性能和响应速度。
    
    [network_server]
    net_id="000000" #这一部分包含网络服务器的一般设置,如网络标识符(Net ID)。Net ID用于标识LoRaWAN网络的唯一标识符。
    
    [network_server.band]
    name="CN_470_510" #这里指定了LoRaWAN的频段或带宽
    
    [network_server.network_settings] #这一部分包含了有关网络设置的信息,如额外的通道配置
    #额外的通道(extra_channels)被配置为特定的频率范围和数据速率范围
      # [[network_server.network_settings.extra_channels]]
      # frequency=867100000
      # min_dr=0
      # max_dr=5
    
      # [[network_server.network_settings.extra_channels]]
      # frequency=867300000
      # min_dr=0
      # max_dr=5
    
      # [[network_server.network_settings.extra_channels]]
      # frequency=867500000
      # min_dr=0
      # max_dr=5
    
      # [[network_server.network_settings.extra_channels]]
      # frequency=867700000
      # min_dr=0
      # max_dr=5
    
      # [[network_server.network_settings.extra_channels]]
      # frequency=867900000
      # min_dr=0
      # max_dr=5
    
    [network_server.gateway.backend.mqtt]
    server="tcp://mosquitto:1883" #这一部分配置了与MQTT(消息队列遥测传输)后端的连接信息。ChirpStack Network Server使用MQTT与网关通信,以接收来自网关的设备数据。
    
    [join_server.default]#这里指定了默认的加入服务器(Join Server)的地址。加入服务器用于管理设备的入网和安全性。在这个例子中,加入服务器的地址是一个HTTP地址,用于与ChirpStack应用服务器通信。
    server="http://chirpstack-application-server:8003"
    
    

    ChirpStack Application Server模块功能

    Organizations

    组织下管理着users、Service-profiles、Device-profiles、Gateways、Application等模块,不同的组织管理着各自的这些模块,说白了就是不同的组织下的应用分类、设备集合、网关等相互隔离,自个管着自个的数据。
    例如现在有几家不同的企业承接了A园区的所有智慧厕所,A园区的技术团队掌管着这个ChirpStack服务器,A园区的管理员就可以为这几家不同的企业分别创建他们的Organization,例如有三家企业,分别为A-1、A-2、A-3
    image.png
    我们切换到不同的企业的Organization下,就可以看到他们所管理的网关、设备、用户等。

    Organization users

    每个组织可以添加自己的账号,并赋予权限。
    image.png

    Organization API keys

    通过添加这个API key,我们可以在服务器上调用chirpstack应用服务的接口。

    Service-profiles

    在创建Device-profilesGatewaysApplications时,需要先有Service-profiles。
    Service-profiles可以理解为用户和网络服务器之间的一个协同约定,通过Service-profiles可以配置启动的功能,例如启动网络地理定位等,还可以调节允许的数据速率、设备状态请求频率等。我的理解是通过这个配置文件,可以开启/限制来自网络数据的某些功能/特征。

    Device-profiles

    设备配置文件,定于了接入网络服务器的设备所需的功能和参数,这些元信息由终端设备制造商提供。
    主要包括:
    MAC version:终端设备支持的LoRaWAN版本
    ADR算法:控制设备数据速率
    LoRaWAN Regional Parameters revision:设备支持的区域参数规范的修订
    MaxEIRP :终端设备支持的最大 EIRP
    等等
    image.png
    我们重点是需要关注以下参数:

    JOIN-设备加入网络的方式:
    设备需要加入网络服务器,与服务建立通道后才能支持数据的上行下行。
    OTAA
    设备通过发送入网请求(Join)给网络服务器,该消息包含设备EUI和AppKey等信息来向网络服务器验证自己的身份,验证通过后,网络服务器会为设备分配设备标识符(DevAddr)和应用会话密钥(Application Session Key)等信息用于加密和解密设备和服务器之间的通信,完成后设备与网络服务器之间即建立会话。(AppKey需要在Device配置,接下来会讲到)
    image.png
    ABP
    设备无需入网请求,设备通过和网络服务器之间预设配置会话参数的方式来与网络服务器进行通信。设备在制造商生产和部署前会进行配置好设备地址(DevAddr)、网络会话密钥(NwkSKey)和应用会话密钥(AppSKey)等会话参数为与网络服务器直接建立通信会话(这些DevAddr NwkSKey AppSKey需要在Device配置,接下来会讲到)。
    另外需要指定制造商预设的LoRaWAN频段,例如923, 923, 923, 923, 924, 924, 924, 924
    image.png

    终端的工作模式:
    Class A
    终端不上报数据,服务器就无法主动进行下行传输,要求应用在终端上传数据的很短时间内进行服务器的下行传输,服务在其他时间进行的下行传输都得等终端的下一次上行。这是最省电的通信方式,也是默认的通信方式,但接收机会最少。
    Class B
    Class B在Class A基础上添加了时间同步和额外接收端口,设备除了会在按固定的接收端口等待网络服务器的响应外,还会再预定的时间间隔内打开额外的接收端口。
    image.png
    Class C
    基本一直打开着接收端口,只在发送时短暂关闭。意味着设备可以实时接收网络服务器的下行消息,但也会以牺牲功耗为代价。
    image.png

    Gateways

    这个即对应LoRa网关,例如承包园区公厕的企业在现场安装了LoRa网关来建立覆盖感应器通讯网络,那他们可以在Gateways上面创建一个虚拟的网关代表他们在现场对应的网关,并通过gatewayId与网络服务器上报的现场的gateway联系起来,可以检测网关活跃状态、接收/传送数据包数量、位置自发现’帧等信息。
    image.png
    image.png

    Applications

    Application可以用来管理不同设备集合,例如承包园区智慧公厕的几家企业,肯定是分别做不同的洗手间工程,那么每个企业(相当于每个Organization)可以在其Applications下创建不同的Application分别代表当前企业承接哪些洗手间,例如A-1企业为他承包的toilets1、toilets2创建了名字为toilets1、toilets2的Application,两个Application分别代表两个洗手间。
    image.png

    Devices

    这个Device即是在平台上模拟的对应现场的设备/感应器。
    image.png
    创建后,当选择的device-profile为OTAA模式时,需要填写Application Key,设备入网的时候,也会上传一个Application Key,如果设备的Application Key与我们在这里给它配置的Application Key一致的话,则设备会通过信赖,为设备分配相关参数,与网络服务器建立会话。
    image.png
    当选择的device-profile为ABP模式时,需要添加Device address、Network session key、Application session key,这个设备产商出厂时会写入设备中,需由设备厂商提供,然后往这里配置。
    image.png

    至此,LoRaWAN服务器ChirpStack服务平台相关配置工作已做完。将在下一章分享LoRaWAN网关接入ChirpStack服务器ChirpStack服务器集成SpringBoot服务形成一个基本的IOT数据链路体系。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 深入解析ChirpStack LoRaWAN服务器:连接物联网的关键技术

    发表评论