emqx 使用端口_数据传输、存储、展现,EMQ X + TDengine 搭建 MQTT 物联网数据可视化平台...

物联网数据采集涉及到大量设备接入、海量的时序数据传输,EMQ X 消息中间件与 TDengine 大数据平台的组合技术栈完全能够胜任场景中的海量时间序列监测数据的传输、存储和计算。

数据入库后,往往需要其他方式如数据可视化系统将数据按照规则统计、展现出来,实现数据的监控、指标统计等业务需求,以便充分发挥数据的价值,TDengine 搭配开源软件 Grafana 可以快速搭建物联网数据可视化平台。

上述整套方案无需代码开发,涉及的产品均能提供开源软件、企业服务、云端 SaaS 服务不同层次的交付模式,能够根据项目需求实现免费版或企业版私有化落地以及云端部署。

fd533812f08d12f255fff09bfecfec14.png

3c916efe8d12fab99ec1dae5a0935405.png方案介绍9515ea3d5b0d98f7cea1d0b81909bee5.png

   EMQ X 简介

EMQ X(https://www.emqx.io/cn/) 是基于高并发的 Erlang/OTP 语言平台开发,支持百万级连接和分布式集群架构,发布订阅模式的开源 MQTT 消息服务器。EMQ X 内置了大量开箱即用的功能,其开源版 EMQ X Broker企业版 EMQ X Enterprise 均支持通过规则引擎将设备消息存储到 TDengine。

   TDengine 是什么

TDengine 是涛思数据专为物联网、车联网、工业互联网、IT 运维等设计和优化的大数据平台。除核心的快 10 倍以上的时序数据库功能外,还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的复杂度,且核心代码,包括集群功能全部开源。

TDengine 提供社区版、企业版和云服务版,安装/使用教程详见 TDengine 使用文档 (https://www.taosdata.com/cn/documentation20)。

   Grafana 简介

Grafana 是一个跨平台、开源的度量分析和可视化工具,可以查询处理各类数据源中的数据,进行可视化的展示。它可以快速灵活创建的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;支持 Graphite,TDengine、InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和 KairosDB 等数据源,支持数据项独立/混合查询展示;可以创建自定义告警规则并通知到其他消息处理服务或组件中。

3c916efe8d12fab99ec1dae5a0935405.png业务场景9515ea3d5b0d98f7cea1d0b81909bee5.png

本文模拟物联网环境数据采集场景,假设现有一定数据的环境数据采集点,所有采集点数据均通过 MQTT 协议传输至采集平台(MQTT Publish),主题设计如下:

sensor/data

传感器发送的数据格式为 JSON,数据包括传感器采集的温度、湿度、噪声音量、PM10、PM2.5、二氧化硫、二氧化氮、一氧化碳、传感器 ID、区域、采集时间等数据。

{    "temperature": 30,    "humidity" : 20,    "volume": 44.5,    "PM10": 23,    "pm25": 61,    "SO2": 14,    "NO2": 4,    "CO": 5,    "id": "10-c6-1f-1a-1f-47",    "area": 1,    "ts": 1596157444170}

现在需要实时存储以便在后续任意时间查看数据,提出以下的需求:

  • 每个设备按照每 5 秒钟一次的频率进行数据上报,数据库需存储每条数据以供后续回溯分析;

  • 通过可视化系统查看任意区域、任意时间区间内的指标数据,如平均值、最大值、最小值。

3c916efe8d12fab99ec1dae5a0935405.png环境准备9515ea3d5b0d98f7cea1d0b81909bee5.png

本文所用各个组件均有 Docker 镜像,除 EMQ X 需要修改少数配置为了便于操作使用下载安装外,TDengine 与 Grafana 均使用 Docker 搭建。

安装包资源与使用教程参照各自官网:

  • EMQ X:EMQ 官网 https://www.emqx.io

  • TDengine:涛思数据官网 https://www.taosdata.com/cn/

  • Grafana:Grafana 官网 https://grafana.com/

   安装 EMQ X

如果您是 EMQ X 新手用户,推荐通过 EMQ X 文档 (https://docs.emqx.io) 快速上手

访问 EMQ 官网 (https://www.emqx.io/downloads) 下载适合您操作系统的安装包,本文截稿时 EMQ X 开源版最新版本为 v4.1.2,下载 zip 包的启动步骤如下 :

## 解压下载好的安装包unzip emqx-macosx-v4.1.1.zipcd emqx## 以 console 模式启动 EMQ X 方便调试./bin/emqx console

启动成功后浏览器访问 http://127.0.0.1:18083 访问 EMQ X 管理控制台 Dashboard,使用 admin public 默认用户名密码完成初次登录。

   安装 TDengine

为了方便测试使用通过 Docker 进行安装(需映射网络端口),也可以使用安装包的方式进行安装:

## 拉取并启动容器docker run -d --name tdengine -p 6030-6041:6030-6041 tdengine/tdengine:latest## 启动后检查容器运行状态docker ps -a

   Grafana 安装

使用以下命令通过 Docker 安装并启动 Grafana:

docker run -d --name=grafana -p 3000:3000 grafana/grafana

启动成功后浏览器访问 http://127.0.0.1:3000 访问 Grafana 可视化面板,使用 admin admin 默认用户名密码完成初次登录,登录后按照提示修改密码使用新密码登录进入主界面:

3c916efe8d12fab99ec1dae5a0935405.png配置 EMQ X 存储数据到 TDengine9515ea3d5b0d98f7cea1d0b81909bee5.png

   TDengine 创建数据库与数据表

进入TDengine Docker 容器:

docker exec -it tdengine bash

创建 “test” 数据库:

taoscreate database test;

创建 sensor_data 表,关于 TDengine 数据结构以及 SQL 命令参见 TAOS SQL (https://www.taosdata.com/cn/documentation20/taos-sql/#表管理) :

use test;CREATE TABLE sensor_data (  ts timestamp,   temperature float,  humidity float,  volume float,  PM10 float,  pm25 float,  SO2 float,  NO2 float,  CO float,  sensor_id NCHAR(255),   area TINYINT,  coll_time timestamp);

   配置 EMQ X 规则引擎

打开 EMQ X Dashboared,进入 规则引擎 -> 规则 页面,点击 创建 按钮进入创建页面。

规则 SQL

规则 SQL 用于 EMQ X 消息以及事件筛选,以下 SQL 表示从 sensor/data 主题筛选出 payload 数据:

SELECT  payloadFROM  "sensor/data"

使用SQL 测试功能,输入测试数据进行筛选结果测试,测试有结果且输出内容如下,标明 SQL 编写正确:

{  "payload": "{\"temperature\":30,\"humidity\":20,\"volume\":44.5,\"PM10\":23,\"pm2.5\":61,\"SO2\":14,\"NO2\":4,\"CO\":5,\"id\":\"10-c6-1f-1a-1f-47\",\"area\":1,\"ts\":1596157444170}"}

6a54c171d8312c6aa07e7b801d3d9131.png

响应动作

为支持各种不同类型平台的开发,TDengine 提供符合 REST 设计标准的 API。通过 RESTful Connector (https://www.taosdata.com/cn/documentation20/connector/#RESTful-Connector) 提供了最简单的连接方式,即使用 HTTP 请求携带认证信息与要执行的 SQL 操作 TDengine。

使用 EMQ X 开源版中的发送到 Web 服务即可通过 RESTful Connector 写入数据到 TDengine。即将到来的 EMQ X 企业版 4.1.1 版本将提供原生更高性能的写入 Connector。

发送到 Web 服务需要两个数据,一个是关联资源,另一个是消息内容模板。

  • 关联资源:HTTP 服务器配置信息,此处为 TDengine 的 RESTful Connector

  • 消息内容模板:此处为携带数据的 INSERT SQL,注意我们应当在 SQL 中指定数据库名,字符类型也要用单引号括起来, 消息内容模板为:

INSERT INTO test.sensor_data VALUES(  now,  ${payload.temperature},  ${payload.humidity},  ${payload.volume},  ${payload.PM10},  ${payload.pm25},  ${payload.SO2},  ${payload.NO2},  ${payload.CO},  '${payload.id}',  ${payload.area},  ${payload.ts})

721ea969a2eadea41c7e2fb57618b1fd.png

创建过程

点击响应动作下的添加按钮,在弹出框内选择 发送数据到 Web 服务,点击 新建资源 新建一个 WebHook 资源。

84a82235eab2f7247d02ef33260b4950.png

资源类型选择 Webhook,请求 URL 填写 http://127.0.0.1:6041/rest/sql,请求方法选择 POST,还需添加 Authorization 请求头作为认证信息

Authorization 的值为 Basic + TDengine 的 {username}:{password} 经过 Base64 编码之后的字符串, 例如 root:taosdata 编码后为 cm9vdDp0YW9zZGF0YQ==,实际填入的值为:Basic cm9vdDp0YW9zZGF0YQ==

在响应动作创建页面选择新建的资源,并填入消息模板内容即可。

c90c9a8004e03f5eacac6c31c4563414.png

3c916efe8d12fab99ec1dae5a0935405.png生成模拟数据9515ea3d5b0d98f7cea1d0b81909bee5.png

以下脚本模拟了 10000 个设备在过去 24 小时内、每隔 5 秒钟上报一条模拟数据并发送到 EMQ X 的场景。

  • 总数据量:24 * 3600 / 5 * 10000 = 1.72 亿条

  • 消息 TPS:2000

读者安装 Node.js ,按需修改配置参数后可以通过以下命令启动:

npm install mqtt mockjs --save --registry=https://registry.npm.taobao.orgnode mock.js

附:模拟生成数据并发送到 EMQ X 代码,请根据集群性能调整相关参数

// mock.jsconst mqtt = require('mqtt')const Mock = require('mockjs')const EMQX_SERVER = 'mqtt://localhost:1883'const CLIENT_NUM = 10000const STEP = 5000 // 模拟采集时间间隔 msconst AWAIT = 5000 // 每次发送完后休眠时间,防止消息速率过快 msconst CLIENT_POOL = []startMock()function sleep(timer = 100) {  return new Promise(resolve => {    setTimeout(resolve, timer)  })}async function startMock() {  const now = Date.now()  for (let i = 0; i < CLIENT_NUM; i++) {    const client = await createClient(`mock_client_${i}`)    CLIENT_POOL.push(client)  }  // last 24h every 5s  const last = 24 * 3600 * 1000  for (let ts = now - last; ts <= now; ts += STEP) {    for (const client of CLIENT_POOL) {      const mockData = generateMockData()      const data = {        ...mockData,        id: client.clientId,        area: 0,        ts,      }      client.publish('sensor/data', JSON.stringify(data))    }    const dateStr = new Date(ts).toLocaleTimeString()    console.log(`${dateStr} send success.`)    await sleep(AWAIT)  }  console.log(`Done, use ${(Date.now() - now) / 1000}s`)}/** * Init a virtual mqtt client * @param {string} clientId ClientID */function createClient(clientId) {  return new Promise((resolve, reject) => {    const client = mqtt.connect(EMQX_SERVER, {      clientId,    })    client.on('connect', () => {      console.log(`client ${clientId} connected`)      resolve(client)    })    client.on('reconnect', () => {      console.log('reconnect')    })    client.on('error', (e) => {      console.error(e)      reject(e)    })  })}/*** Generate mock data*/function generateMockData() { return {   "temperature": parseFloat(Mock.Random.float(22, 100).toFixed(2)),   "humidity": parseFloat(Mock.Random.float(12, 86).toFixed(2)),   "volume": parseFloat(Mock.Random.float(20, 200).toFixed(2)),   "PM10": parseFloat(Mock.Random.float(0, 300).toFixed(2)),   "pm25": parseFloat(Mock.Random.float(0, 300).toFixed(2)),   "SO2": parseFloat(Mock.Random.float(0, 50).toFixed(2)),   "NO2": parseFloat(Mock.Random.float(0, 50).toFixed(2)),   "CO": parseFloat(Mock.Random.float(0, 50).toFixed(2)),   "area": Mock.Random.integer(0, 20),   "ts": 1596157444170, }}
3c916efe8d12fab99ec1dae5a0935405.png可视化配置9515ea3d5b0d98f7cea1d0b81909bee5.png

组件安装完成,模拟数据写入成功后,按照 Grafana 可视化界面的操作指引,完成业务所需数据可视化配置。

   添加数据源(Add data source)

添加数据源,即显示的数据源信息。选取 TDengine 类型数据源,输入连接参数进行配置,默认情况下,关键配置信息如下:

3e3bd6769fa1b3406804d467e977b983.png

   添加仪表盘(New Dashboard)

添加好数据源后,添加需要显示的数据仪表盘信息。仪表盘为多个可视化面板的集合,点击 New Dashboard 后,选择 + Query 通过查询来添加数据面板。

创建面板需要四个步骤,分别是 Queries(查询)Visualization(可视化)General(图表配置)Alert(告警),创建时间

   平均值面板

使用 Grafana 的可视化查询构建工具,查询出所有设备的平均值。

以下 SQL 按照指定时间段($form $to)、指定时间间隔($interval),查询出数据中关键指标的平均值:

select avg(temperature), avg(humidity), avg(volume), avg(PM10), avg(pm25), avg(SO2), avg(NO2), avg(CO)  from test.sensor_data where coll_time >= $from and coll_time < $to interval($interval)

Visualization 默认不做更改,General 里面修改面板名称为 历史平均值,如果需要对业务进行监控告警,可以在 Alert 里编排告警规则,此处仅做可视化展示,不使用此功能。

0092d1d5ba335639a36c74937daed2e2.png

完成创建后,点击左上角返回按钮,该 Dashboard 里成功添加一个数据面板。点击顶部导航栏保存图标,输入 Dashboard 名称完成 Dashboard 的创建。

   最大值、最小值面板

继续点击 Dashboard 的 Add panel 按钮,添加最大值、最小值图表。操作步骤同添加平均值,仅对查询中 SELECT 统计方法字段做出调整,调整为 AVG 函数为 MAXMIN

select max(temperature), max(humidity), max(volume), max(PM10), max(pm25), max(SO2), max(NO2), max(CO), min(temperature), min(humidity), min(volume), min(PM10), min(pm25), min(SO2), min(NO2), min(CO)  from test.sensor_data where coll_time >= $from and coll_time < $to interval($interval)

a28fd71560d4e50100b5cb5221831605.png

   仪表盘效果

保存仪表盘,拖拽调整每个数据面板大小、位置,最终得到一个视觉效果较好的数据仪表盘。仪表盘右上角可以选择时间区间、自动刷新时间,此时设备持续发送数据采集数据,仪表盘数据值会有所变动,实现了比较好的可视化效果。

abf245cb1b3615b5ed8d230a9f8354fa.png

3c916efe8d12fab99ec1dae5a0935405.png总结9515ea3d5b0d98f7cea1d0b81909bee5.png

至此我们借助 EMQ X + TDengine 完成了物联网数据传输、存储、展现整个流程的系统搭建,读者可以了解到 EMQ X 丰富的拓展能力与 TDengine 完备的大数据平台特性在物联网数据采集中的应用。深入学习掌握 Grafana 的其他功能后,用户可以定制出更完善的数据可视化乃至监控告警系统。

a6d5b611c506b100d97f076d9adcd5d3.png

 点击"阅读原文" ,了解更多

↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

站点CSS样式不起作用,或仅仅有一部分起作用?随手记

事件&#xff1a;网页中使用了相同的样式&#xff0c;下半部分正常显示&#xff0c;上半部分样式所有丢失不能显示。解决&#xff1a;改动了相应的CSS样式文件的编码 这个是最没有想到的解决的方法。怎样调试&#xff1a;通过右键页面查看编码为UTF-8 或 GBK 看到样式正常显示&…

大数据--循序渐进的大数据(2)

一、Hdfs 架构 访问 (1) ----nameNode(2) |||dataNode每隔一段时间secondaryNameNode会将fsimage和edits进行合并产生心得fsimage&#xff1b;1、Hdfs 适用场景数据密集型并行计算计算密集并行计算2、不适合的场景HDFS不合适大量小文件的储存HDFS适用于高吞吐量&#xff0c;…

virtualbox 启动时Kernel driver not installed (rc=-1908) 错误的解决方法

virtualbox 启动时Kernel driver not installed (rc-1908) 错误的解决方法 网上的方法各种各样&#xff0c;结果绕山绕水一点用没有&#xff0c;就下面这句就行 sudo /Library/Application\ Support/VirtualBox/LaunchDaemons/VirtualBoxStartup.sh restart昨天更新了下系统&a…

ios开发之-继承的实现运用

// // main.m // 继承 ////#import <Foundation/Foundation.h> #import "Animal.h" #import "Cat.h" #import "Dog.h" #import "FeedMan.h"int main(int argc, const char * argv[]) {// Animal * animal [Animal new]; /…

查找字段 如何 过滤

dm.ADOTbBug 使用Filter 属性的话&#xff0c;不能包括 查找字段。 方法1 在过滤事件里 使用查找字段。 http://www.itdelphi.com/delphibbs/doc/2001/558361.htm 方法2 就是使用查找字段对应的KeyFields 为字段名。 比如查找字段是 部门名称&#xff0c;对应的数据集里KeyFiel…

python字符串去头尾_带你认识优秀的python代码

有一串长的字符串names "LI XIA , ZHAO MING ,LAO WANG *,DA XIONG >,LI MEI MEI, CHANG JIANG,LI QIANG,ZHANG WU JI,ZHANG SAN FENG,DU GU QIU BAI,QIAO FENG"。要求&#xff1a;&#xff08;1&#xff09;过滤所有的名字&#xff0c;去掉每个名字左右的空格和…

python学习笔记之装饰器、递归、算法(第四天)

参考老师的博客&#xff1a; 金角&#xff1a;http://www.cnblogs.com/alex3714/articles/5161349.html 银角&#xff1a;http://www.cnblogs.com/wupeiqi/articles/4963027.html 一、冒泡算法实例&#xff1a; a [32,5,22,41,7,31,12,102,74,37,9,25] 1、方法1&#xff1a; c…

数字信号处理笔记1-信号与常见操作

年轻人&#xff0c;你对数学一无所知&#xff0c;你只是习惯了而已。 —冯诺伊曼 前言 本学期开始跟着实验室学习计算机视觉领域&#xff0c;而一个重要的基础知识就是《数字图像处理》&#xff0c;而数字信号处理作为一个大类&#xff0c;可以将数字图像处理理解为数字信号处…

[linux驱动]linux驱动模块

一&#xff0c;内核模块的概念 经常在内核驱动代码看到类似fs_init()等驱动初始化函数&#xff0c;那么这个和module_init()函数的差别在哪里&#xff0c;宏定义__define_initcall(level,fn)对于内核的初始化很重要&#xff0c;他指示编译器在编译的时候&#xff0c;将一系列初…

看我如何基于PythonFacepp打造智能监控系统

由于种种原因&#xff0c;最近想亲自做一个基于python&facepp打造的智能监控系统。 000&#xff1a;萌芽 1&#xff1a;暑假在家很无聊 想出去玩&#xff0c;找不到人。玩个lol&#xff08;已卸载&#xff09;&#xff0c;老是坑人。实在是无聊至极&#xff0c;不过&#x…

c++ 遍历所有点且距离最短_编程小白暑期进阶笔记41-C语言数据结构与算法图遍历的应用...

基于广度优先遍历算法的应用思考题&#xff1a;&#xff08;思考题答案&#xff1a;BFS(广度优先遍历)在一般的带权图中是不能解决最短路问题&#xff0c;了解BFS的都知道&#xff0c;BFS是根据节点到源节点之间的节点数遍历的&#xff0c;也就是先访问离源节点节点数最少的点。…

underscorejs-groupBy学习

2.18 groupBy 2.18.1 语法 _.groupBy(list, iteratee, [context]) 2.18.2 说明 把list分为多个集合&#xff0c;iterator为分组的依据,返回值为Object list可以是数组、对象、字符串或arguments等iteratee为分组的依据.iterator的参数(value, key, list)iterator如果是function…

关于@WebServlet(“LoginServlet“)404 报错的解决办法 “请求的资源[/test/LoginServlet] 不可用”

关于WebServlet&#xff08;“LoginServlet”&#xff09;404 报错的解决办法 “请求的资源[/test/LoginServlet] 不可用” *一切事物的开头总是困难这句话&#xff0c;在任何一种科学上都是适用的。 * ——马克思 一个困扰了我n天的问题&#xff0c;终于终于还是解决了&#…

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

ASP.NET MVCEF框架EasyUI实现权限管理系列(14)-主框架搭建 原文:ASP.NET MVCEF框架EasyUI实现权限管理系列(14)-主框架搭建ASP.NET MVCEF框架EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 (5):前台…

常用事务代码 sap_SAP_PS_事务代码

[转]SAP PS常用事务代码T-CODESAP项目系统(Project System&#xff0c;以下简称PS)模块作为传统的非常规模块(除FI、CO、MM、PP、SD之外的模块)之一&#xff0c;在最近几年在国内也得到的较为广泛的应用,与PS应用火热场景相对应的是PS内外部顾问的极度缺乏。这种缺乏一方面表现…

Java 冒泡排序的实现

实现原理&#xff1a; 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤&#xff0c;除了最后一个…

CLion for mac安装配置

前言 本文详细多图介绍 IntelliJ IDEA For Mac的激活教程&#xff0c;相当于永久激活 文件包百度云下载&#xff1a;(通过与熊论道网站解密&#xff09; 熊曰&#xff1a;呋溫捕嘿誘襲氏樣溫住既非破哮誒襲非捕溫肉性盜森魚非襲啽蜜呦訴嘿溫類盜山寶住出森非喜誘捕發嗥既肉嗅…

solr后台界面介绍——(十一)

1.加一个collection的方法 复制solr-home下的collection1&#xff0c;修改名字为collection2。并且修改collection2文件夹中配置文件core.properties中的名字为collection2&#xff0c;重启服务器。 2.后台界面介绍 Dashboard 仪表盘&#xff0c;显示了该Solr实例开始启动运行的…

功率信号与能量信号的超棒理解!

功率信号与能量信号的理解&#xff01; 功率信号和能量信号一直是一个令我疑惑的概念&#xff0c;一个无限一个为零。但是下面令我茅塞顿开&#xff01; &#xff5e;&#xff5e;&#xff5e;分割线啊分割线&#xff5e;&#xff5e;&#xff5e;

vscode终端不识别python_VSCode无法识别我的已安装Python包

Windows上的VSCode与Python。 Don安装的Python扩展&#xff0c;不确定它有什么不同&#xff0c;但考虑给我的环境使用VSCode for Python&#xff0c;在那个过程中&#xff0c;我安装了metapy包。我能够在VSCode中的终端窗口内运行此metapy&#xff0c;但不能在编辑器中运行PS C…