在树莓派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引擎,配置完之后才运行脚本,只是这里我顺便把脚本安装运行一块儿说了)