详解LoRaWAN服务器ChirpStack:连接物联网的关键

2023-10-15 07:20

本文主要是介绍详解LoRaWAN服务器ChirpStack:连接物联网的关键,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


文章目录

  • 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:3volumes:- ./configuration/chirpstack-network-server:/etc/chirpstack-network-serverdepends_on:- postgresql- mosquittochirpstack-application-server:image: chirpstack/chirpstack-application-server:3ports:- 8080:8080 #访问该端口即可访问到chirpstack的web界面volumes:- ./configuration/chirpstack-application-server:/etc/chirpstack-application-serverdepends_on:- chirpstack-network-serverchirpstack-gateway-bridge:image: chirpstack/chirpstack-gateway-bridge:3ports:- 1700:1700/udp #将容器内的1700/udp端口映射到主机的1700/udp端口,用于接收来自LoRaWAN网关的数据。volumes:- ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridgedepends_on: - mosquittopostgresql:image: postgres:9.6-alpineenvironment:- POSTGRES_PASSWORD=rootvolumes:- ./configuration/postgresql/initdb:/docker-entrypoint-initdb.d- postgresqldata:/var/lib/postgresql/dataredis:image: redis:5-alpinevolumes:- redisdata:/datamosquitto:image: eclipse-mosquitto:2ports:- 1883:1883 #将容器内的1883端口映射到主机的1883端口,用于MQTT通信。volumes: - ./configuration/eclipse-mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.confvolumes: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.12command: -c /etc/chirpstackrestart: unless-stoppedvolumes:- ./configuration/chirpstack:/etc/chirpstack- ./lorawan-devices:/opt/lorawan-devicesdepends_on:- postgres- mosquitto- redisports:- 8080:8080chirpstack-gateway-bridge-eu868:image: chirpstack/chirpstack-gateway-bridge:3ports:- 1700:1700/udpvolumes:- ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridgedepends_on: - mosquittopostgres:image: postgres:11-alpinevolumes:- ./configuration/postgresql/initdb:/docker-entrypoint-initdb.d- postgresqldata:/var/lib/postgresql/dataenvironment:- POSTGRES_PASSWORD=rootredis:image: redis:6-alpinevolumes:- redisdata:/datamosquitto:image: eclipse-mosquitto:2ports:- 1883:1883volumes: - ./configuration/eclipse-mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.confvolumes: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数据链路体系。

这篇关于详解LoRaWAN服务器ChirpStack:连接物联网的关键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/216227

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (