在树莓派400(Ubuntu)上搭建EMQ X + TDengine + Grafana 搭建 MQTT 物联网数据可视化平台(一)

Source

在树莓派400上搭建EMQ X + TDengine + Grafana 搭建 MQTT 物联网数据可视化平台详细步骤之(一)

前言
经过两周的努力和朋友的帮助下,终于在树莓派400上安装好了数据可视化平台,初步掌握了数据通过EMQ X写入TD以及Grafana的可视化操作,由于知识水平有限,如有不足之处敬请批评指正。附官方搭建平台文档(官方文档很详细,但是对于我这种新手来说有些地方不是那么详细,看不太懂)

一、硬件准备

树莓pi400、显示器和HDMI线,树莓pi400上安装的是ubuntu-20.10-preinstalled-desktop-arm64+raspi.img镜像操作系统,通过烧录工具烧录进TF卡,这个过程如果网速好的话大概20分钟左右就可以完成,TF卡烧录完毕就可以直接插进树莓pi进行系统设置了!(这里注意在语言设置时选择汉语(简体))
Ubuntu镜像下载地址

二、软件下载

(一)TDengine服务器的安装与启动

1.使用tar包下载,注意选对安装包(我的是aarch64)
下载网址选择最新版本
2.解压安装包sudo tar -xzvf TDengine-server-2.0.16.0-Linux-aarch64.tar.gz
3.进入解压后的文件夹(直接从桌面进入,双击解压后文件夹,然后在终端中打开也可以)

cd  /TDengine-server-2.0.16.0
sudo ./install.sh

安装完毕后显示
在这里插入图片描述
4.这里说明一下FQDN配置,我这个是单点连接,我就直接跳过了,官方文档上说过要配置FQDN,通过编辑hosts文件,我的没有配置仅做前期试验,后期想要配置也可以,附上官方FQDN配置文档
5.开始启动:显示为绿色字体active即可

sudo systemctl start taosd
sudo systemctl ststus taosd

6.输入taos

这个版本是我很早之前装的
7.具体使用方法参考官方文档到此TDengine的安装部署与启动已经完成,我们继续下一步安装。

(二)EMQ X的安装与启动

1.官网下载相应的aarch64安装包(推荐下载zip包较方便)官方下载,说明一下我这里选择的是开源版,因为企业版需要申请账号和下载申请License,企业版也就这一点不同,申请试用方法

在这里插入图片描述
**详细安装步骤同虚拟机上安装步骤
2.解压安装包sudo unzip emqx-ee-ubuntu20.04-4.2.3-aarch64.zip
3.解压后进入/bin文件下进行

./emqx console(然后ctrl+c,选择a,然后enter)
./emqx start //耐心等待一会儿,启动成功显示EMQ X Broker 4.2.7 is started successfully!
./emqx_ctl status  //耐心等待一会儿,查询服务器状态运行显示  
                   //Node 'emqx@127.0.0.1'is started  emqx 4.2.7 is running

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

(三)Grafana的安装与启动

1.下载选择相应的安装包,有deb和tar包,我下载的是tar包,官方下载速度特别慢,建议换源下载,我是直接在火狐网页上下载的,没有用命令下载。
官方下载
如下Standalone Linux Binaries(ARM64)SHA256:

wget https://dl.grafana.com/oss/release/grafana-7.4.2.linux-arm64.tar.gz
tar -zxvf grafana-7.4.2.linux-arm64.tar.gz

或者Ubuntu and Debian(ARM64)SHA256:

sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_7.4.2_arm64.deb
sudo dpkg -i grafana_7.4.2_arm64.deb

2.解压之后进入/bin文件夹下打开终端,命令一通输入:

sudo systemctl enable grafana-server#设置开机启动
sudo systemctl start grafana-server#耐心等待一会儿
sudo systemctl status grafana-server#显示绿色字体active,然后按ctrl+z退出
sudo ./grafana-server#启动Grafana

在这里插入图片描述

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

(四)node.js的安装(运行脚本)

说明一下,这个起初我也不太明白,我搜了一些安装的资料,如参照别人的详细安装,使用第三种方法就行,输入以下命令:
使用ubuntu自带apt安装,安装后使用node -v查看版本(缺啥软件就装啥就行了!!!)

sudo apt install nodejs
sudo apt install npm

然后是对脚本的修改,输入以下命令来创建mock.js(这个脚本文件可以放在emqx的bin文件夹下)

sudo gedit mock.js

然后把官方文档里的脚本命令添加进去,注意这里有一处改动,即把第4行命令“const CLIENT_NUM = 1000”中的1000改为5,这是因为1000个客户端连接系统会崩掉,没有那么强大,改为5个左右就成功运行了,其他地方不要动!

// mock.js
const mqtt = require('mqtt')
const Mock = require('mockjs')
const EMQX_SERVER = 'mqtt://localhost:1883'
const CLIENT_NUM = 5 //改为5
const STEP = 5000 // 模拟采集时间间隔 ms
const AWAIT = 5000 // 每次发送完后休眠时间,防止消息速率过快 ms
const 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,
 }
}

启动运行脚本命令:

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

(注意此时还没有配置EMQ X引擎,配置完之后才运行脚本,只是这里我顺便把脚本安装运行一块儿说了)

在树莓派400(Ubuntu)上搭建EMQ X + TDengine + Grafana 搭建 MQTT 物联网数据可视化平台(二)