一、前言
  时隔一年半,技术变化特别快,学习也要跟上才行。以前写过EMQ数据转存问题,当时用了比较笨的方法,通过写插件的方式,把MQTT里面的数据发送到数据库进行存储。当时也是为了学习erlang和emq。现在随着对物联网的深入,也结合实际需求,不停的学习。
下面将介绍我实验测试可行的物联网数据分析解决方案。采用的还是开源方案。通过订阅MQTT的根Topic,把所有物联网数据转存到InfluxDB时序数据库,然后通过Grafana进行图表显示。这应该是目前比较流行的方案。
二、安装InfluxDB
  InfluxDB是时序数据库,特别适合做数据监控和物联网数据存储。【也可以说适合我现在参与架构的物联网平台的技术选型】
  针对InfluxDB也没有什么可以多说的,详细可以查阅官方文档,或者网上的博客文章。我写的都是平时实践过程的操作记录,写博客,主要是为了以后忘记的时候,回看查阅用的。另一方面是加强跟同行读者交流的渠道。有一点要注意,一开始为了新,我用InfluxDB 2.0 版本,发现不行,那个太新的,很多对应的开发库没有完善好。所以还是采用InfluxDB 1.x版本。这样在spring boot 里面也有自带的starter库可以使用,操作起来特别方便。
  InfluxDB官方文档: https://docs.influxdata.com/influxdb/v1.7/   安装:

 wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
apt-get update
apt-get install influxdb

三、InfluxDB基础命令使用
  修改配置文件 /etc/influxdb/influxdb.conf

 [http]
enabled = true
bind-address = ":8086"
auth-enabled = false
log-enabled = true
write-tracing = false
pprof-enabled = true

  这里先设置不授权,等一下创建用户后,再修改为 auth-enabled=true,这个一般也是属于内部应用,不用ssl加密了。即使要也是通过Nginx进行反向代理。

  用户管理

 --显示所有用户:
show users
--新增用户:
--普通用户 (注意:用户名用双引号,密码用单引号)
create user "user" with password 'user'
--管理员用户
create user "admin" with password 'admin' with all privileges
--删除用户
drop user "user"

  创建好后,注意修改influxdb.conf 中的 auth-enable=true, 然后重启服务 service influxdb restart

 --创建数据库
create database wunaozai
--创建好后,就可以不用管了。一些简单的操作,可以参考其他博客资料。
--删除数据库
drop database wunaozai
--切换使用数据库
use wunaozai
 --显示所有表
show measurements
--新建表(往表里面插入数据,就是新建表了)
--插入数据的语法有点特殊,采用的是InfluxDB特有的语法:
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
insert wnztable,tag=mqtt value=
--删除表
drop measurements wunaozai

  其他的高级语法,不如查询还有策略就不展开,暂时不是重点,等以后深入研究后,在写博客介绍。

四、EMQ转存InfluxDB
  EMQ如何把消息转存到InfluxDB呢,就是本章节的重点,利用上一篇博客中提到的,SpringBoot客户端监听EMQ的根Topic,然后把需要进行转存的Topic及其对应的Payload,构造成InfluxDB表数据,然后插入到InfluxDB中。
  下面介绍一下用到的InfluxDB工具类
  先在pom.xml中引入InfluxDB相关jar包

 <!-- https://mvnrepository.com/artifact/org.influxdb/influxdb-java -->
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
<version>2.15</version>
</dependency>

  相关工具类代码

 import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;
import org.influxdb.dto.Point; /**
* 数据缓存至InfluxDB
* @author wunaozai
*
*/
public class InfluxDBService { private static String INFLUXDB_URL = "http://127.0.0.1:8086";
private static String INFLUXDB_USERNAME = "admin";
private static String INFLUXDB_PASSWORD = "admin";
private static String INFLUXDB_DATABASE = "wunaozai"; //注意这里对应数据库,一般要先在命令行中创建数据库
private static InfluxDB influxDB = null; private InfluxDBService(){ } public static InfluxDB getInstance(){
if(influxDB == null){
influxDB = InfluxDBFactory.connect(INFLUXDB_URL, INFLUXDB_USERNAME, INFLUXDB_PASSWORD);
influxDB.setDatabase(INFLUXDB_DATABASE);
influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
}
return influxDB;
}
public static int writePoint(Point point){
getInstance().write(point);
return 0;
}
}

  在上一篇博客中的MqttPushCallback.java中的

public void messageArrived(String topic, MqttMessage message);

  这个函数来转存。

     @Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
try{
System.out.println(topic);
String json = new String(message.getPayload());
MQTTProtocolVoModel protocol = BaseModel.parseJSON(json, MQTTProtocolVoModel.class); String cmd = protocol.getCmd();
String customer_id = protocol.getProfile().getCustomer_id(); //厂商ID
String product_id = protocol.getProfile().getProduct_id(); //产品ID
String device_sn = protocol.getProfile().getDevice_sn(); //设备ID
Map<String, String> para = protocol.getDatapoint().getPara();
Map<String, Object> fields = new HashMap<>(); //这里是客户端传过来的数据点,就是需要被显示和监控的数据
for (Map.Entry<String, String> entry : para.entrySet()) {
fields.put(entry.getKey(), entry.getValue());
}
Map<String, String> tag = new HashMap<>();
tag.put("customer_id", customer_id);
tag.put("product_id", product_id);
tag.put("device_sn", device_sn);
//这里可以添加很多Tag,为了简单演示,这里隐藏部分Tag
//构造数据点
Point point = Point.measurement("datapoint")
.tag(tag).fields(fields).build();
InfluxDBService.writePoint(point);
}catch (Exception e) {
e.printStackTrace();
}
}

  这里可以通过EMQ Dashboard自带的Websocket进行发送,也可以通过前面小节用到的PC工具,网上Web端MQTT客户也很多,可以通过任意MQTT工具进行测试。
  下面这个是查询InfluxDB得到的表数据。

参考资料:
  https://www.cnblogs.com/jason1990/p/11076310.html
  https://blog.csdn.net/caodanwang/article/details/51967393
  https://docs.influxdata.com/influxdb/v1.7/
  https://www.cnblogs.com/shhnwangjian/p/6897216.html

本文地址: https://www.cnblogs.com/wunaozai/p/11160730.html

物联网架构成长之路(33)-EMQ数据存储到influxDB的更多相关文章

  1. 物联网架构成长之路(31)-EMQ基于HTTP权限验证

    看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...

  2. 物联网架构成长之路(3)-EMQ消息服务器了解

    1. 了解 物联网最基础的就是通信了.通信协议,物联网协议好像有那么几个,以前各个协议都有优劣,最近一段时间,好像各大厂商都采用MQTT协议,所以我也不例外,不搞特殊,采用MQTT协议,选定了协议,接 ...

  3. 物联网架构成长之路(4)-EMQ插件创建

    1. 说明 以下用到的知识,是建立在我目前所知道的知识领域,以后如果随着知识的拓展,不一定会更新内容.由于不是EMQ公司的人,EMQ的文档又很少,很多知识点都是靠猜的.2. 一些资料 架构设计 htt ...

  4. 物联网架构成长之路(7)-EMQ权限验证小结

    1. 前言 经过前面几小节,讲了一下插件开发,这一小节主要对一些代码和目录结构进行讲解,这些都是测试过程中一些个人经验,不一定是官方做法.而且也有可能会因为版本不一致导致差异. 2. 目录结构 这个目 ...

  5. 物联网架构成长之路(5)-EMQ插件配置

    1. 前言 上一小结说了插件的创建,这一节主要怎么编写代码,以及具体流程之类的.2. 增加一句Hello World 修改 ./deps/emq_plugin_wunaozai/src/emq_plu ...

  6. 物联网架构成长之路(6)-EMQ权限控制

    1. 前言 EMQTT属于一个比较小众的开源软件,很多资料不全,很麻烦,很多功能都是靠猜测,还有就是看官方提供的那几个插件,了解. 2. 说明 上一小节的插件 emq_plugin_wunaozai ...

  7. 物联网架构成长之路(25)-Docker构建项目用到的镜像1

    0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...

  8. 物联网架构成长之路(34)-物联网数据可视化grafana展示

    一.前言 前面介绍了利用后台业务服务器监听EMQ的Topic,作为EMQ的一个客户端方式来保存数据.然后将数据保存到时序数据库InfluxDB中.本小节就简单介绍一下如何安装和使用,及如何利用Graf ...

  9. 物联网架构成长之路(32)-SpringBoot集成MQTT客户端

    一.前言 这里虽然是说MQTT客户端.其实对于服务器来说,这里的一个具有超级权限的MQTT客户端,就可以做很多事情.比如手机APP或者网页或者第三方服务需要发送数据到设备,但是这些又不是设备,又不能让 ...

随机推荐

  1. 对systemV和systemd的简单理解(服务方面)

    在CentOS7(RHEL7)以后,服务从原来的由systemV管理机制升级到了systemd. 在sysV中,所有的服务脚本都放在/etc/rc.d/init.d/中,可以使用/etc/rc.d/i ...

  2. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 8

    23.5.2  架构详解 本例的实现最重要的就是服务层的设计,有两个配置文件config.php和api.php,其中文件config.php是全局的配置文件,用于整个程序全局需要的参数设置.可以根据 ...

  3. linux系列之常用运维命令整理笔录

    目录 本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍 ...

  4. 拎壶学python3-----(3)python之while循环用法

    一.下边我们看一个简单的while循环 那怎么计数呢就让输入三次三次后退出: 二. 关于计数这个问题我们一起看一下 (1)关于计数如下: 我们发现这个计数根本停不下来,怎么才能搞成我们想要的计数次数呢 ...

  5. mysql常用命令杂记

    查看版本 mysqladmin -uRootmaster -pRootmaster@777 versionselect version() 查看Log_bin是否开启 show variables l ...

  6. [转]使用IConfigureNamedOptions和ConfigureAll配置命名选项

    这是我上一篇关于在ASP.NET Core 2.x中使用多个强类型设置实例的后续文章.在文章的结尾,我介绍了命名选项的概念,该选项已添加到ASP.NET Core 2.0中.在本文中,我将详细介绍如何 ...

  7. Redis for OPS 05:哨兵HA Sentinel

    写在前面的话 上一节的主从环境能够解决我们保证数据安全性的问题,但是却无法解决我们在主节点挂掉的时候服务继续使用的问题,同时也不能自动切换新的主. 我们运维的目的肯定是希望即使主库挂掉一个,服务依旧能 ...

  8. [算法]LeetCode 152:乘积最大子序列

    题目描述: 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6.示 ...

  9. Core源码(三) Lazy<T>

    Lazy<T>解决什么问题? 1.大对象加载 考虑下面的需求,有个对象很大,创建耗时,并且要在托管堆上分配一大块空间.我们当然希望,用到它的时候再去创建.也就是延迟加载,等到真正需要它的时 ...

  10. .NET Core CSharp初级篇 1-2 循环与判断

    .NET Core CSharp初级篇 1-2 本节内容循环与判断 循环 循环是一个在任何语言都是极为重要的语法,它可以用于很多东西,例如迭代数组等等.在C#中,语法层面的循环有:for , fore ...