在Linux下使用Docker部署chirpstack
目录
一、前言
二、chirpstack
1、chirpstack是什么
2、chirpstack组件
3、为什么选择Docker部署
三、Linux下部署过程
四、web界面部署过程
一、前言
本篇文章我是在Linux下使用 Docker 进行部署chirpstack,chirpstack采用的是v4 版本,v4 版本 与 v3版本 相比,gRPC API 等做了一些改变,需要考虑兼容性。但是我们仅仅使用Docker部署chirpstack 其实就目录和web 界面发生了一些改变,配置逻辑是一样的,并没有太大改变。如果大家用的是 v3版本,哪里不懂也可以直接问我。
二、chirpstack
1、chirpstack是什么
ChirpStack 是一个开源的 LoRaWAN 网络服务器,可用于 设置私有或公共 LoRaWAN 网络。ChirpStack 提供了一个 Web 界面 用于管理网关、设备和应用程序。ChirpStack 提供了一个基于 gRPC 的 API,可以 用于集成或扩展 ChirpStack。
2、chirpstack组件
(1)ChirpStack Network Server: 简称NS,作用是确保 LoRaWAN 网络的正常运行和管理设备通信。其负责 LoRaWAN 网络的核心逻辑。它处理设备的加入过程、下行链路调度、设备活动状态跟踪等。它还负责处理从 LoRa 网关接收到的上行数据,并将下行数据发送到网关。
(2)ChirpStack Application Server: 简称AS,作用是管理和处理应用层数据,提供用户界面和 API 接口。其负责处理和管理 LoRaWAN 应用层数据。它允许用户定义应用程序、设备配置和数据解码器。它还提供 API 和 Web 界面,用于管理设备、监控网络流量、处理数据解码和发送应用层数据到外部应用程序。
(3)ChirpStack Gateway Bridge:它充当网关和网络服务器之间的中间件。该组件可以将LoRa网关传输来的LoRa数据包转发器协议转换成ChirpStack网络服务器通用的数据格式(JSON和Protobuf)。
(4)PostgreSQL:这是一个开源的关系型数据库管理系统,用于持续化存储 ChirpStack 的配置数据、设备信息、网关信息、应用程序数据等。
(5)Redis:这是一个开源的内存中数据结构存储系统,通常用作数据库、缓存和消息代理。ChirpStack 使用 Redis 来缓存和处理一些实时数据,提高系统性能和响应速度。
(6)Mosquitto:Mosquitto是一个MQTT协议的代理服务器,用于处理设备和ChirpStack组件之间的通信。它允许LoRaWAN网关和ChirpStack服务之间的消息传递。

注意一下Postgre SQL和 Redis 的区别,Postgre SQL基于磁盘存储数据,支持持久化存储,数据在磁盘上存储即使系统重启数据也不会丢失,性能相对较慢。Redis基于内存存储数据,支持高效的读写操作,性能极高。
3、为什么选择Docker部署
(1)简化部署过程:上文已讲过ChirpStack 是由多个服务组件组成的,Docker Compose 允许我们通过一个配置文件(docker-compose.yml)定义和运行多个容器,只需要一条命令(docker-compose up)即可启动所有服务。
(2)环境隔离:chirpstack的各个服务可以在独立的容器中运行,避免了依赖冲突和环境污染。
(3)可移植性: 使用 Docker,我们可以确保在开发环境、测试环境和生产环境中运行相同的代码和配置。这有助于避免在不同环境中出现的“环境问题”。
(4)集中配置:所有的服务配置集中在一个 docker-compose.yml 文件中,便于管理和版本控制。我们可以轻松地修改和更新配置。
三、Linux下部署过程
1、从 github 上拉取源代码
v4版本:(接下来以v4版本进行讲解)
git clone https://github.com/chirpstack/chirpstack-docker.git

v3版本:
git clone https://github.com/chirpstack/chirpstack-docker/tree/v3

2、修改 docker-compose.yml 配置文件
该文件是一个使用 Docker Compose 配置的多容器应用程序,用于部署 ChirpStack 物联网平台。涵盖了 ChirpStack 系统所需的所有主要组件,确保它们在 Docker 容器中协同工作。(注意,该配置文件通常只需要修改你想要的频段和端口,其他不用改变)
(1)chirpstack
这是 ChirpStack 应用服务器(一般不用进行修改)。
chirpstack:image: chirpstack/chirpstack:4command: -c /etc/chirpstackrestart: unless-stoppedvolumes:- ./configuration/chirpstack:/etc/chirpstack- ./lorawan-devices:/opt/lorawan-devicesdepends_on:- postgres- mosquitto- redisenvironment:- MQTT_BROKER_HOST=mosquitto- REDIS_HOST=redis- POSTGRESQL_HOST=postgresports:- 8080:8080
- image: 使用
chirpstack/chirpstack:4镜像。 - command: 指定配置文件路径为
/etc/chirpstack。 - restart: 设置为
unless-stopped,即除非手动停止,否则容器会自动重启。 - volumes: 挂载本地目录
./configuration/chirpstack到容器内的/etc/chirpstack,以及./lorawan-devices到容器内的/opt/lorawan-devices。 - depends_on: 依赖
postgres,mosquitto,redis三个服务。 - environment: 设置环境变量,包括
MQTT_BROKER_HOST,REDIS_HOST,POSTGRESQL_HOST。 - ports: 暴露端口
8080,将容器内的8080端口映射到主机的8080端口。
(2)chirpstack-gateway-bridge
这是 ChirpStack 网关桥接器服务(我这里采用的cn470_10频段)。
chirpstack-gateway-bridge:image: chirpstack/chirpstack-gateway-bridge:4restart: unless-stoppedports:- 1700:1700/udpvolumes:- ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridgeenvironment:- INTEGRATION__MQTT__EVENT_TOPIC_TEMPLATE=cn470_10/gateway/{{ .GatewayID }}/event/{{ .EventType }}- INTEGRATION__MQTT__STATE_TOPIC_TEMPLATE=cn470_10/gateway/{{ .GatewayID }}/state/{{ .StateType }}- INTEGRATION__MQTT__COMMAND_TOPIC_TEMPLATE=cn470_10/gateway/{{ .GatewayID }}/command/#depends_on:- mosquitto
- estart: 设置为
unless-stopped。 - ports: 暴露 UDP 端口
1700。 - volumes: 挂载本地目录
./configuration/chirpstack-gateway-bridge到容器内的/etc/chirpstack-gateway-bridge。 - environment: 设置环境变量,指定 MQTT 主题模板。
- depends_on: 依赖
mosquitto服务。
(3)chirpstack-gateway-bridge-basicstation
这是 ChirpStack 网关桥接器的基本站服务(注意修改command部分)。
chirpstack-gateway-bridge-basicstation:image: chirpstack/chirpstack-gateway-bridge:4restart: unless-stoppedcommand: -c /etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge-basicstation-cn470_10.tomlports:- 3001:3001volumes:- ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridgedepends_on:- mosquitto
- image: 使用
chirpstack/chirpstack-gateway-bridge:4镜像。 - restart: 设置为
unless-stopped。 - command: 使用配置文件
chirpstack-gateway-bridge-basicstation-cn470_10.toml。 - ports: 暴露端口
3001。 - volumes: 挂载本地目录
./configuration/chirpstack-gateway-bridge到容器内的/etc/chirpstack-gateway-bridge。 - depends_on: 依赖
mosquitto服务。
(4)chirpstack-rest-api
这是 ChirpStack 的 REST API 服务。
chirpstack-rest-api:image: chirpstack/chirpstack-rest-api:4restart: unless-stoppedcommand: --server chirpstack:8080 --bind 0.0.0.0:8090 --insecureports:- 8090:8090depends_on:- chirpstack
- image: 使用
chirpstack/chirpstack-rest-api:4镜像。 - restart: 设置为
unless-stopped。 - command: 指定 ChirpStack 服务器为
chirpstack:8080,绑定地址为0.0.0.0:8090,并启用不安全模式。 - ports: 暴露端口
8090。 - depends_on: 依赖
chirpstack服务。
(5)postgres
这是 PostgreSQL 数据库服务。
postgres:image: postgres:14-alpinerestart: unless-stoppedvolumes:- ./configuration/postgresql/initdb:/docker-entrypoint-initdb.d- postgresqldata:/var/lib/postgresql/dataenvironment:- POSTGRES_PASSWORD=root
- image: 使用
postgres:14-alpine镜像。 - restart: 设置为
unless-stopped。 - volumes: 挂载本地目录
./configuration/postgresql/initdb到容器内的/docker-entrypoint-initdb.d,以及挂载 Docker 卷postgresqldata到容器内的/var/lib/postgresql/data。 - environment: 设置环境变量
POSTGRES_PASSWORD为root。
(6)redis
这是 Redis 内存数据库服务。
redis:image: redis:7-alpinerestart: unless-stoppedcommand: redis-server --save 300 1 --save 60 100 --appendonly novolumes:- redisdata:/data
- image: 使用
redis:7-alpine镜像。 - restart: 设置为
unless-stopped。 - command: 运行
redis-server,并指定保存策略。 - volumes: 挂载 Docker 卷
redisdata到容器内的/data。
(7)mosquitto
这是 MQTT 消息代理服务。
mosquitto:image: eclipse-mosquitto:2restart: unless-stoppedports:- 1883:1883volumes: - ./configuration/mosquitto/config/:/mosquitto/config/
(8)Volumes
定义数据卷。
volumes:postgresqldata:redisdata:
- postgresqldata: 用于存储 PostgreSQL 数据。
- redisdata: 用于存储 Redis 数据。
3、docke-compose启动
sudo docker-compose up -d

四、web界面部署过程
1、访问 chirpstack(IP):8080,默认账号密码是admin

2、创建网关
接下来就正常给网关起名字,但是网关ID要记住,网关配置中需要修改相对应的ID。

3、添加设备文件
根据自己的要求进行填写。

4、配置AS

添加玩应用后,依次在应用中添加设备和多播设置等。

最后,运行网关,看网关是否能够连接到云服务器,并成功转发消息。
相关文章:
在Linux下使用Docker部署chirpstack
目录 一、前言 二、chirpstack 1、chirpstack是什么 2、chirpstack组件 3、为什么选择Docker部署 三、Linux下部署过程 四、web界面部署过程 一、前言 本篇文章我是在Linux下使用 Docker 进行部署chirpstack,chirpstack采用的是v4 版本,v4 版本 与…...
《昇思25天学习打卡营第14天|计算机视觉-ShuffleNet图像分类》
FCN图像语义分割&ResNet50迁移学习&ResNet50图像分类 当前案例不支持在GPU设备上静态图模式运行,其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端…...
将字符串写入结构体变量中
将字符串写入结构体变量中,主要涉及到结构体中字符数组(或指针)的使用。 一、使用字符数组 假设你有一个结构体,它包含一个字符数组来存储字符串: #include <stdio.h> #include <string.h> // 用于st…...
iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦
ChatGPT狂飙160天,世界已经不是之前的样子。 更多资源欢迎关注 7月6日消息,据DigiTimes最新报道,苹果将在iPhone 16 Pro中引入iPhone 15 Pro Max同款5倍光学变焦四棱镜潜望镜头。 报道称,目前苹果已经将模组订单交至大立光电和玉…...
PG在还没有pg_class的时候怎么访问基础系统表?
在没有pg_class的时候,数据库怎么访问系统表?这个问题可以分成两个阶段来看: 数据库簇初始化,此时一个database都没有,所以怎么构造和访问pg_class等系统表是一个问题私有内存初始化系统表。PG的系统表信息是放在back…...
UnityHub 无法添加模块问题
文章目录 1.问题描述2.问题解决 1.问题描述 在Hub中无法添加模块 2.问题解决 1、点击设置 2、设置版本安装位置 可以发现installs的安装位置路径设置不是unity安装位置,这里我们更改成自己电脑unity安装位置的上一级路径 添加模块正常:...
python04——类(基础new)
类其实也是一种封装的思想,类就是把变量、方法等封装在一起,然后可以通过不同的实例化对其进行调用操作。 1.类的定义 class 类名: 变量a def __init__ (self,参数2,参数2...):初始化函数!!&…...
【Python百日进阶-Web开发-Peewee】Day296 - 查询示例(五)聚合2、递归
文章目录 14.6.13 列出每个指定设施的预订总小时数 List the total hours booked per named facility14.6.14 列出每位会员在 2012 年 9 月 1 日之后的首次预订 List each member’s first booking after September 1st 201214.6.15 生成成员名称列表,每行包含成员总数 Produc…...
闲话银行家舍入法,以及在程序中如何实现
前言 相信对于四舍五入的舍入法,大家都耳熟能详,但对于银行家舍入法,可能就会比较少接触了! 可是在金融界,银行家舍入法可是大名鼎鼎的主角之一,主要应用于金融领域和涉及货币计算的场合。 那么…...
最短路径算法(算法篇)
算法之最短路径算法 最短路径算法 概念: 考查最短路径问题,可能会输入一个赋权图(也就是边带有权的图),则一条路径的v1v2…vN的值就是对路径的边的权求和,这叫做赋权路径长,如果是无权路径长就是单纯的路径上的边数。…...
昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别
1. 基于MindSpore实现BERT对话情绪识别 1.1 环境配置 # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2…...
反向散射技术(backscatter communication)
智能反射表面辅助的反向散射通信系统研究综述(知网) 1 反向散射通信技术优势和应用场景 反向散射通信技术通过被动射频技术发送信号,不需要一定配有主动射频单元,被认为是构建绿色节能、低成本、可灵活部署的未来物联网规模化应用关键技术之一,是实现“…...
致远CopyFile文件复制漏洞
复现版本 V8.0SP2 漏洞范围 V5&G6_V6.1至V8.0SP2全系列版本、V5&G6&N_V8.1至V8.1SP2全系列版本。 漏洞复现 上传文件 POST /seeyon/ajax.do?methodajaxAction&managerNameportalCssManager&rnd57507 HTTP/1.1 Accept: */* Content-Type: applicatio…...
MySQL 创建数据库
MySQL 创建数据库 在当今的数据驱动世界中,数据库是任何应用程序的核心组成部分。MySQL,作为一个流行的开源关系数据库管理系统,因其可靠性、易用性和强大的功能而广受欢迎。本文将详细介绍如何在MySQL中创建数据库,包括基础知识和最佳实践。 什么是MySQL数据库? MySQL…...
AbyssFish单连通周期边界多孔结构2D软件
软件介绍 AbyssFish单连通周期边界多孔结构2D软件(以下简称软件)可用于生成具备周期性边界条件的单连通域多孔结构PNG图片,软件可设置生成模型的尺寸、孔隙率、孔隙尺寸、孔喉尺寸等参数,并且具备孔隙形态控制功能。 软件生成的…...
Linux驱动开发-03字符设备驱动框架搭建
一、字符设备驱动开发步骤 驱动模块的加载和卸载(将驱动编译模块,insmod加载驱动运行)字符设备注册与注销(我们的驱动实际上是去操作底层的硬件,所以需要向系统注册一个设备,告诉Linux系统,我有…...
Zynq系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTX高速接口,提供8套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB自研…...
VS2019使用C#写窗体程序技巧(1)
1、打开串口 private void button1_Click(object sender, EventArgs e){myPort cmb1.Text;mybaud Convert.ToInt32(cmb2.Text, 10);databit 8;parity Parity.None;stopBit StopBits.One;textBox9.Text "2";try{sp new SerialPort(myPort, mybaud, parity, dat…...
Python爬虫-requests模块
前戏: 1.你是否在夜深人静的时候,想看一些会让你更睡不着的图片却苦于没有资源... 2.你是否在节假日出行高峰的时候,想快速抢购火车票成功..。 3.你是否在网上购物的时候,想快速且精准的定位到口碑质量最好的商品. …...
适用于PyTorch 2.0.0的Ubuntu 22.04上CUDA v11.8和cuDNN 8.7安装指南
将下面内容保存为install.bash,直接用bash执行一把梭解决 #!/bin/bash### steps #### # verify the system has a cuda-capable gpu # download and install the nvidia cuda toolkit and cudnn # setup environmental variables # verify the installation ######…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
