最近在研究一些 LoRaWAN 新功能时又翻到了这个项目,发现一些新特性在这个项目中已经实现了,惊讶作者 brocaar 的效率之高。这一两年也陆续收到不少朋友对于这个项目的问题,索性我自己就着手记录一些笔记,帮助自己,也看看能否帮助到其他一些朋友。
从 17 年接触 LoRa 的时候,就听说了 LoRa Server 这个开源项目(19年11月改名叫 ChirpStack),国内相当多的厂家都在使用这个 Stack。它可能是最有影响力的 LoRaWAN 服务器开源项目。
我的大神同事毫不吝啬对这个开源项目的赞美,“你要是说 b 哥后面没有一个团队在帮他开发,打死我也不信。”
同时我还对另一个开源 NS 项目 The Things Network LoRaWAN Stack V3 进行了研究,从使用和代码等角度对该 Stack 进行了分析,详细可点此查看。
0.1 概览
ChirpStack project 是 LoRaWAN 服务器端的一个开源项目,包含了 LoRaWAN 服务器端所涉及的 NS、AS、GS、GEO Server 等一系列软件。它的组件完整,功能强大,是个值得学习的好项目。
0.1.1 ChirpStack 组件功能介绍
1.1 使用 Docker-Compose 快速部署 ChirpStack 项目
这篇笔记介绍如何使用 Docker-Compose 快速部署 ChirpStack 项目,主要是对官方 docker 快速教程的实践,增加了一些易错点的记录。
1.2 基础依赖工具准备
本篇笔记介绍开发所需的几个基础依赖工具。
1.3 源码编译安装
本篇笔记介绍如何进行几个组件的源码编译,对实际编译过程中的一些问题也做了记录。
1.4 配置运行
编译之后,这篇笔记介绍如何进行必要的配置,并让几个组件运行起来,包含实践过程一些小问题的解决记录。
2.1 使用 WebUI 创建 DEMO 应用
WebUI 上可以方便地创建一个基础应用所需的网关、应用、设备等信息,完成 DEMO 应用创建。
2.2 使用 Packet Forwarder 让网关接入
2.3 LoRaWAN 节点接入
WEB 创建完毕,搭建一套网关和节点测试下。
2.4 使用 RESTful JSON API
LoRa App Server 提供了两类 API 接口,其中 RESTful JSON API 提供了一个 console,在AS地址的基础上使用 /api 即可访问,罗列了 API 端点和文档介绍,测试起来非常方便。
2.4.1 JSON web-tokens 的使用
对 API 使用的 JWT 方案进行进一步的学习,学习其数据结构,使用编解码操作加深对 JWT 的理解。
2.5 使用 MQTT 工具进行数据上下行测试
上一节熟悉了 RESTful JSON API,并且用它进行了下行数据,但它无法接收上行数据。这里就得启用 MQTT,本篇笔记介绍该项目中 MQTT 的集成能力,演示如何使用 MQTT 工具进行数据上下行。
2.6 WebUI 中 Rest API 的调用逻辑分析
应用如何根据 AS 提供的北向 API 进行开发呢? 那么多的 API 都是怎么使用,这篇笔记梳理了主要API的调用逻辑。
2.7 JS编解码函数的使用
这一节笔记学习了一个强大的功能 JS 编解码函数,可以灵活将设备的原始数据转化为 JSON 格式数据。同时学习了必要的 JS 语法,并做了上下行的demo示例,供朋友们参考。
2.8 应用集成 InfluxDB
2.8.1 ChirpStack 容器连接本机 InfluxDB 容器的一个典型问题处理
2.9 使用 Grafana 做 LoRa 数据展现
为了对 LoRaWAN 系统中的节点和网关的指标进行可视化观察,ChirpStack 可以在应用集成中配置将数据的收发存储到 InfluxDB,再通过 Granfana 进行可视化观察。
当我们讨论源码分析时,我们具体要分析什么呢?最基础的是摸清具体实现脉络,帮助我们在以后使用中快速定位源码;主体脉络清晰之后再按需分析其中的组件;最后应该尽量抽象出作者的一些编程思路(组件选型的考量、利用到的语言特性),通过对优秀源码的分析,努力提高我们的编码水平。
App Server 和大家关系最紧密,因此首先拿 App Server 分析。这里先按照数据流来梳理脉络,接着对一些独立组件再进行分析。
3.1.1 初始化流程
3.1.2 上行数据流
3.1.3 下行数据流
3.1.4 MQTT 上下行流程
AS 对外开放了 MQTT 端口
在 AS 的北向,AS 提供了 gRPC 与 RESTful 两种接口。
3.2.1 北向 gRPC API
grpc 服务端 /lora-app-server/internal/api/external/application.go
3.2.2 北向 RESTful API
AS 提供了一套 RESTFul 和 gRPC API。
3.2.3 北向 API 鉴权组件
在 AS 的南向,AS 是采用 gRPC 与 NS 进行交互。
3.3.1 AS 与 NS 的交互流程
在 AS 的内部,核心功能是对节点数据进行处理。
3.4.1 节点 Payload 加解密
3.4.2 JavaScript 编解码组件
在 AS 外侧,提供了丰富的应用集成组件,实现了更多强大的功能。
3.5.1 集成组件 Http
3.5.2 集成组件 InfuluxDB
3.5.3 集成组件 Prometheus 监控
3.x.1 Web-interface 组件分析
go + react
3.x.2 swagger 界面分析
go + swagger
Network Server 是一个典型的 NS,是本项目最核心的组件。
de-duplication of received LoRaWAN frames
Authentication
LoRaWAN mac-layer (and mac-commands)
Communication with the ChirpStack Application Server
Scheduling of downlink frames
ChirpStack Gateway Bridge is a service which converts LoRa® Packet Forwarder protocols into a ChirpStack Network Server common data-format (JSON and Protobuf). T