目錄
一、前言
二、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 數據。
四、web界面部署過程
1、訪問 chirpstack(IP):8080,默認賬號密碼是admin
2、創建網關
? ? ? ? ?接下來就正常給網關起名字,但是網關ID要記住,網關配置中需要修改相對應的ID。
3、添加設備文件
? ? ? ? 根據自己的要求進行填寫。
4、配置AS
? ? ? ? 添加玩應用后,依次在應用中添加設備和多播設置等。
?
? ? ? ? ?最后,運行網關,看網關是否能夠連接到云服務器,并成功轉發消息。