前言

为了对 LoRaWAN 系统中的节点和网关的指标进行可视化观察,ChirpStack 引入了 Grafana。 Granfana 现在支持了多种数据库,最典型的是时序数据库 InfluxDB

ChirpStack 可以在应用集成中配置将数据的收发存储到 InfluxDB,再通过 Granfana 进行可视化观察。

在论坛中翻到 18年5月的时候B哥就发布了这个特性,当时貌似还很开心,这确实是一个很棒的功能。

在这篇笔记里先记录下如何使用 InfluxDB,下一篇再记录如何使用 grafana。

小能手最近在学习 ChirpStack 项目,应该是最有影响力的 LoRaWAN 服务器开源项目。它组件丰富,代码可读性强,是个很好的学习资料。更多学习笔记,可点此查看

1 功能说明

关于上下行数据的 measurement

measurement 的命名格式
All measurements are using the field names from the object element, joined by an underscode (_) in case the object element is nested. Payload data is prefixed by device_frmpayload_data.

所有 measurements 名称都是将 object 的几个元素用下划线来连接下来。其中的 Payload 数据是以 device_frmpayload_data 做前缀,同时要求 Payload 存入 InfluxDB 之前需要保证为 JSON 格式, 键为:object。

Payload 示例:

{
    "object": {
        "temperature_sensor": {
            "1": 23.5
        }
    }
}

这个示例 measurements 名称将为 device_frmpayload_data_temperature_sensor_1.

measurements 的 tag

每个 measurements 都有如下的 tag:

  • application_name
  • device_name
  • dev_eui
  • f_port (LoRaWAN port used for uplink)

其他类的 measurement

除了最核心的上下行数据之外,ChirpStack 还支持几类数据的记录:

  • Device uplink meta-data,为了监控扩频因子、信道等数据,每个上行数据都会记录到名为 device_uplink 的 measurement。 其中的 value 固定为 1。
  • Device battery level,从 mac 命令 DevStatusAns 中获得
  • Device margin status,从 mac 命令 DevStatusAns 中获得

2 具体操作

2.1 初始化并启动 InfluxDB 容器

# mkdir InfluxDB
# cd InfluxDB/
# sudo docker run --rm\
      -e INFLUXDB_DB=db0 -e INFLUXDB_ADMIN_ENABLED=true \
      -e INFLUXDB_ADMIN_USER=admin -e INFLUXDB_ADMIN_PASSWORD=supersecretpassword \
      -e INFLUXDB_USER=telegraf -e INFLUXDB_USER_PASSWORD=secretpassword \
      -v $PWD:/var/lib/influxdb \
      influxdb /init-influxdb.sh
# docker run --name=influxdb -d -p 8086:8086 -v $PWD:/var/lib/influxdb influxdb
# 

这里初始化了 db0 数据库,并且增加了用户 telegraf。详细的 InfluxDB 操作见教程 InfluxDB 基础概念及操作

2.2 webui 配置 InfluxDB

注意其中的 API endpoint (write) 中的 IP 一定要记得处理下,我是在相同的宿主机上运行了 InfluxDB 容器,不能采用默认的 localhost,必须配置为 Docker 网桥的地址,只有这样才能让 AS 的容器通过宿主机地址来与 InfluxDB 容器通信。

# ip a
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:5f:e8:7c:be brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

关于这个问题,我在下一篇笔记 2.8.1 ChirpStack 容器连接本机 InfluxDB 容器的一个典型问题处理 中有详细的记录。

2.3 设备上报数据

操作设备上报数据,我使用的是 2.7 JS编解码函数的使用 相同的程序,上报数据经过编解码后出来一个 temperature 的对象。

3 结果

设备数据上报后,AS 的日志打印如下:

time="2020-02-07T11:29:23Z" level=info msg="device updated" dev_eui=1219000000000003
time="2020-02-07T11:29:23Z" level=info msg="finished unary call with code OK" grpc.code=OK grpc.method=HandleUplinkData grpc.request.deadline="2020-02-07T11:29:24Z" grpc.service=as.ApplicationServerService grpc.start_time="2020-02-07T11:29:23Z" grpc.time_ms=4.927 peer.address="192.168.64.5:53871" span.kind=server system=grpc
time="2020-02-07T11:29:23Z" level=info msg="integration/mqtt: publishing message" qos=0 topic=application/2/device/1219000000000003/rx
time="2020-02-07T11:29:23Z" level=info msg="integration/influxdb: uplink measurements written" dev_eui=1219000000000003

我们登录 InfluxDB 查看相关 measurements。

device_frmpayload_data

因为我上传的 object 是 “object”:{“temperature”:104},所以相应的 measurements 为:device_frmpayload_data_temperature。

> use db0
Using database db0
> SELECT * FROM device_frmpayload_data_temperature
name: device_frmpayload_data_temperature
time                application_name dev_eui          device_name f_port value
----                ---------------- -------          ----------- ------ -----
1581074823742000000 demoapp          1219000000000003 ths_001     5      104
1581074843739000000 demoapp          1219000000000003 ths_001     5      104
1581074863740000000 demoapp          1219000000000003 ths_001     5      104
1581074883739000000 demoapp          1219000000000003 ths_001     5      104
1581074903742000000 demoapp          1219000000000003 ths_001     5      104
1581074923740000000 demoapp          1219000000000003 ths_001     5      104
1581074943744000000 demoapp          1219000000000003 ths_001     5      104
1581074963741000000 demoapp          1219000000000003 ths_001     5      104
1581074983740000000 demoapp          1219000000000003 ths_001     5      104
1581075003741000000 demoapp          1219000000000003 ths_001     5      104
1581075023754000000 demoapp          1219000000000003 ths_001     5      104
1581075043742000000 demoapp          1219000000000003 ths_001     5      104

device_uplink

> SELECT * FROM device_uplink
name: device_uplink
time                application_name dev_eui          device_name dr f_cnt frequency rssi snr  value
----                ---------------- -------          ----------- -- ----- --------- ---- ---  -----
1581074823742000000 demoapp          1219000000000003 ths_001     4  0     470300000 -113 -4.3 1
1581074843739000000 demoapp          1219000000000003 ths_001     4  1     470300000 -113 -4.3 1
1581074863740000000 demoapp          1219000000000003 ths_001     4  2     470300000 -113 -4.3 1
1581074883739000000 demoapp          1219000000000003 ths_001     4  3     470300000 -113 -4.3 1
1581074903742000000 demoapp          1219000000000003 ths_001     4  4     470300000 -113 -4.3 1
1581074923740000000 demoapp          1219000000000003 ths_001     4  5     470300000 -113 -4.3 1
1581074943744000000 demoapp          1219000000000003 ths_001     4  6     470300000 -113 -4.3 1
1581074963741000000 demoapp          1219000000000003 ths_001     4  7     470300000 -113 -4.3 1
1581074983740000000 demoapp          1219000000000003 ths_001     4  8     470300000 -113 -4.3 1
1581075003741000000 demoapp          1219000000000003 ths_001     4  9     470300000 -113 -4.3 1
1581075023754000000 demoapp          1219000000000003 ths_001     4  10    470300000 -113 -4.3 1
1581075043742000000 demoapp          1219000000000003 ths_001     4  11    470300000 -113 -4.3 1
> 

END


Logo

尧米是由西云算力与CSDN联合运营的AI算力和模型开源社区品牌,为基于DaModel智算平台的AI应用企业和泛AI开发者提供技术交流与成果转化平台。

更多推荐