Docker与ChirpStack在LoRaWan云服务中的应用研究
2022-08-26倪峰金海峰苏春芳
倪峰,金海峰,苏春芳
(江阴职业技术学院 计算机科学系,江苏 江阴 214405)
0 引 言
LoRa与NB-IoT是目前窄带物联网领域的研究与应用热点。LoRa一种低功耗的广域物联网技术,它采用了扩频调制技术,可实现超远距离的无线传输,且兼顾了低功耗的需求,在智能建筑、智慧城市、智能制造等领域有着广阔的应用前景。Cisco、IBM和Semtech共同发起了LoRaAlliance联盟,制定了LoRaWan标准规范。国内的中兴通讯、腾讯、阿里等企业也纷纷加入LoRaWan的阵营,成立了CLAA联盟,制定适合中国国情的技术标准,成为全球最大的LoRa物联网生态圈。LoRa工作在非授权频段,按照LoRaWan Regional Parameters标准,中国地区有2个ISM免费频段,分别为CN779-787和CN470-510,其中CN779-787最大功率仅为10 dBm,实际利用价值不高,CN470-510最大发射功率可达17 dBm,是部署LoRaWan的最佳频段。
如图1所示,LoRa节点与LoRa网关之间组成星型拓扑结构,网关负责节点数据的透传,网关与LoRaWan Server之间通过IP网络进行通信,LoRaWanServer负责网关接入控制、LoRaWan协议解析、RF数据包的收发、数据加密与解密、数据存储、应用层下行指令的转发等工作。部分网关内嵌了LoRaWanServer功能,但功能较弱。目前TTN、腾讯云、阿里云、华为云等物联网开发平台提供LoRaWanServer功能,也可搭建开源的云服务器如ChirpStack。ChirpStack的前身为著名的开源项目LoRaServer,可通过租用阿里的ECS云服务器、腾讯的CVM云服务器等进行公有云的搭建部署,并实现域名访问,也可在内部网络中搭建私有云平台。ChirpStack的使用非常灵活,且安全性高,主要包括PostgreSQL、Redis、Mosquitto等软件模块,一般部署在Linux环境中,但安装较为烦琐,后续维护卸载不便,为此国内的锐米通信等曾发布开源的LoRaServer一键安装包。随着Docker容器技术的发展,提供了更为便捷、轻量化、可移植的解决方案,在本地配置好的镜像可部署在其他Linux版本的环境中,系统耦合度低,轻便灵活,因此Docker技术目前成为LoRaWan云平台构建的研究热点。本文使用Docker容器技术在Ubuntu上安装部署ChirpStack环境,硬件层选用南京易通汇联的TJ81 LoRa网关和XC20 LoRa节点,节点使用ClassA工作模式,选用OTAA入网方式,网关接收通道的中心频点为475 MHz,发射通道中心频点505 MHz,发射和接收通道左右各5 MHz的带宽。客户端可通过MQTT协议或访问ChirpStack提供的Restful API实现数据的上下行。
图1 LoRa的网络架构
1 基于Docker的ChirpStack云平台构建
虚拟化实现了在当前操作系统中模拟运行其他操作系统的功能,传统的虚拟化技术如VMWare、VisualBox等,依赖于物理CPU和内存,是硬件级别的虚拟化,存在占用资源多、运行慢等缺点。而Docker容器并非模拟完整的操作系统,通过Linux提供的命名空间对不同的容器进行隔离,实现了操作系统级别的虚拟化,通过开源的应用程序容器引擎,将程序和依赖包整合在一个文件中,运行此文件生成一个虚拟容器,程序在此虚拟容器中运行,可发布到任何Linux环境中,容器使用沙箱机制,容器之间不存在任何接口,容器性能开销较低。
Docker由镜像、容器、仓库三部分构成,镜像是一个最小root文件系统,是静态的概念,而容器则是镜像运行时的实体,仓库是代码控制中心,用于保存镜像。如图2所示,Docker使用C/S架构,Docker客户端与本地或者远端主机的守护进程进行通信,守护进程负责构建和维护容器,当需要构建Docker容器时,守护进程从仓库中拉取镜像,镜像可以存放在Docker官方提供的DockerHub中,也可以存放在私有仓库中。守护进程得到镜像后,生成Container容器,容器拥有独立的root文件、进程空间等,用户程序可以在容器中独立运行。也可以将构建好的镜像推送到仓库中,便于在其他主机上部署和使用。
图2 Docker的架构
Docker存储库中保存了安装Docker所需组件,可通过HTTPS方式从Docker存储库上拉取安装包自动安装,安装需要root权限,主要流程如图3所示,相关命令由于篇幅所限不再赘述。
图3 Ubuntu下Docker组件安装流程
安装完Docker后,从github上拉取ChirpStack代码到本机,完成ChirpStack组件的安装。拉取成功后会在用户目录下生成chirpstack-docker目录,在该目录下运行sudo docker-compose up命令,在容器中运行ChirpStack组件。
2 ChirpStack云平台的配置与部署
在Docker容器中运行ChirpStack相应组件,容器中运行了以下进程:(1)chirpstack-network-server:LoRaWan网络服务器。(2)chirpstack-gateway-bridge:LoRaWan网关通信。(3)chirpstack-application-server:LoRaWan应用服务器。(4)mosquitto:MQTT消息代理。(5)redis:会话存储。(6)postgresSQL:数据存储。
按照LoRaWan标准约定,中国地区使用470~510 MHz的频率范围,本文使用的TJ81网关遵循相关协议,因此需要设置相应参数,将chirpstack-docker/dockercompose-env.yml配置文件中的NETWORK_SERVER__BAND__NAME字段以及chirpstack-docker/configuration/chirpstack-network-server/chirpstack-network-server.toml中的network_server.band字段的默认值EU868(欧洲)修改为CN_470_510(中国),并将默认的欧洲频段删除。
ChirpStack提供Web界面便于用户自定义配置,主要业务流程如图4所示。创建Network-server后需将访问地址修改为chirpstack-network-server:8000。创建Gateway-profiles后将其与Network-server关联,同时设置网关监听信道号。本文使用的TJ81 LoRa网关设置的起始频点为472.3 MHz,按照LoRaWan Regional Parameters V1.0标准的约定,设置Gateway-profile对应的信道号为10至17,共8个信道号,匹配TJ81网关所监听的8个物理信道,上行频率范围:472.3 MHz~473.7 MHz,下行频率范围:502.3 MHz~503.7 MHz,信道频率间隔200 kHz。Service-profiles负责管理服务配置文件,用于定义用户和组织在网络服务器上能使用的功能。Device-profiles负责设置设备功能和启动参数,设置LoRaWan MAC version为目前流行的1.0.2版本,设置LoRaWanRegionalParametersversion为版本A。LoRa节点支持OTAA和ABP两种入网方式。OTAA入网方式需要节点向NS发送Joinrequest报文,报文中包含DevEUI、AppEUI和AppKey三个参数,DevEUI为节点的身份唯一标识,AppEUI为应用ID,AppKey用于节点计算会话秘钥。节点发送的Joinrequest报文经网关透传至NS后,若NS判断为合法请求,则会下发Joinaccept报文,经网关转发至节点,节点从中解析出devAddr、appSkey和nwkSkey,其中devAddr为LoRa节点的唯一短地址,其余两个参数用于数据加密使用。相对而言,ABP的入网方式则简单许多,直接将devAddr、appSkey和nwkSkey这三个参数配置给ABP终端节点,这三个加密参数将固定不变,相对而言OTAA终端节点每次入网时会动态改变加密参数,安全性高。可见OTAA入网方式相对复杂,安全性高,而ABP方式简化入网方式,安全性相对较弱,但由于OTAA入网方式需要接收NS的Joinaccept报文,在一些信号较弱的环境中,可能会导致数据丢包的情况发生,而采用ABP入网方式相对稳定,故这两种入网方式有各自的优缺点。节点设备有ClassA、ClassB和ClassC三种类型,ClassA数据上行后短暂打开2个接收窗口,其余时间一直处于休眠状态,优点是省电,但下行数据的实时性受限,若错过本次接收窗口时间,需等到下次数据上行时才能接收下行数据。ClassB具备ClassA的特点,可根据网关接收的时间同步Beacon信标打开接收窗口,其余时间休眠,下行数据的延迟问题有所提高,设备相对省电。ClassC设备的接收窗口时刻处于打开状态,能实时接收下行数据,但最为耗电。本文使用的XC20节点采用ClassA工作模式,采用OTAA入网方式,故在此步骤完成相应设置。接下来创建和命名网关,将网关设备与先前创建的Network-server、Service-profile、Gateway-profile相关联,并输入网关设备的ID。最后创建Application,命名并关联Serviceprofile,并将节点设备添加到Application中,为节点设备配置DevEUI和AppKey,并关联对应的Device-profile。当节点入网后,可在Application中查看到入网数据信息。
图4 ChirpStack部署流程
3 节点数据上下行验证
本文中LoRa节点型号为XC20,使用STM32L431CBT6作为主控芯片,使用SEMTECH的SX1278无线扩频芯片,最大发射功率19 dBm,RSSI -140 dBm,半双工通信,通信距离超过3千米,通过UART进行AT指令交互。网关型号为TJ81,使用SX1301无线扩频芯片,8路上行通道、1路下行通道,半双工通信,最大发射功率24 dBm。网关的起始频点、ID、服务器IP等必须与ChirpStack配置信息一致。先进行入网状态查询,向节点发送“AT+JOIN?”,若返回“+JOIN:1”表示入网成功,可进行数据收发,若返回“+JOIN:0”表示入网失败,则需进行检查排故。入网成功后可进行数据的传输,数据将进行BASE64加密,向节点发送“AT+UNCONMSG=数据”或“AT+CONMSG=数据”即可将数据经网关转发至ChirpStack,区别在于是否需要对上行数据进行应答。如图5所示,节点上行数据后,可在Application中对应的节点下的LoRaWan Frames内实时查阅节点上行数据。如需进行数据下行,则需借助MQTT协议实现,通过MQTTBox工具,可实现Topic的推送和订阅,进行数据的上下行。也可通过MQTT协议开发用户层应用程序。
图5 LoRaWan节点入网与数据响应
4 结 论
本文通过Docker容器技术将ChirpStack部署在Ubuntu系统下,实现了LoRaWan云服务,对比分析了Docker技术与VM技术的特点,对ChirpStack云服务的部署进行了详细阐述,对LoRa节点的入网方式和工作模式进行了分析和选型,实现LoRa节点数据的上下行。经验证,ChirpStack在Docker容器中运行稳定,可方便的部署在本地或阿里云等服务器上。后续将对LoRa的传感层数据采集与传输以及应用层程序的开发做进一步研究。