新能源电动车监控数据上报
1. 搭建ECS实例环境
搭建ECS实例环境
本步骤需要在ECS控制台操作,开通ECS实例,并完成相关配置。
登录ECS控制台,按照页面引导购买ECS实例。
说明:购买ECS实例过程中,镜像选择CentOS 7.3 64位。
设置安全组,开通3000、1883、1880端口的访问。
2. 开通Lindorm数据库
开通Lindorm数据库
本步骤需Lindorm控制台操作,开通Lindorm实例,并完成相关配置。
登录Lindorm控制台,在实例列表页,单击创建,按照页面引导购买Lindorm实例。
说明:
选择 “时序节点规格(OpenTSDB API)”,设置节点数为2。
Lindorm数据库的地域,需与ECS实例保持一致。
若选择“一键开通并克隆”,则Lindorm数据库会完成克隆,可跳过此步骤。您可前往Lindorm控制台的实例页,查看实例信息。
通过克隆,自动生成的实例备注名默认为InstanceforTest。
配置白名单:进入Lindorm实例的访问控制页面,将ECS绑定的公网IP添加入Lindorm的白名单中。
开通公网访问:进入Lindorm实例的数据库连接页面,选择时序引擎,单击开通外网地址。
3. 搭建车辆数据接收环境
搭建车辆数据接收环境
本步骤需要在ECS控制台操作,登录开通的ECS,搭建mqtt服务器。
登录ECS控制台,在实例列表页,选择开通的ECS,单击远程连接-立即登录,输入密码后,登录ECS。
依次输入如下命令,搭建mqtt服务器。
说明:请逐条复制命令运行。
echo “安装openssl、gcc、g++” sudo yum install openssl-devel sudo yum -y install gcc+ gcc-c++ echo “下载mosquitto安装包” wget http://mosquitto.org/files/source/mosquitto-1.6.8.tar.gz echo '解压' tar -zxvf mosquitto-1.6.8.tar.gz echo '进入mosquitto-1.6.8' cd mosquitto-1.6.8 echo '编译' make echo '安装' sudo make install echo '创建配置文件' mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf echo '创建用户组及用户' sudo groupadd mosquitto sudo useradd -g mosquitto mosquitto -s /sbin/nologin echo '启动运行mqtt服务器' mosquitto -c /etc/mosquitto/mosquitto.conf -d echo 'ps查看' ps -aux | grep mosquitto echo “如果出现找不到libmosquitto.so.1的情况,执行下面两步命令” sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1 sudo ldconfig echo “测试mosquitto安装是否正常” echo “另外启动一个shell,订阅消息,可以收到发送的消息” mosquitto_sub -t rimelink echo “发送消息” mosquitto_pub -t rimelink -h localhost -m 'hello, mosquitto'
4. 搭建车辆数据转存流程
搭建车辆数据转存流程
本步骤需要在ECS控制台操作,登录开通的ECS,安装Node-RED,搭建车辆数据的转存流程。
在ECS服务器上,安装Node-RED。
说明:请逐条复制运行。
wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz xz -d node-v12.16.1-linux-x64.tar.xz tar -xvf node-v12.16.1-linux-x64.tar cp -arp node-v12.16.1-linux-x64 /usr/local/ echo '安装node.js' sudo yum install nodejs echo '安装node-red' npm install -g --unsafe-perm node-red echo “重新生成node和npm的软链接” rm -f /usr/bin/npm /usr/bin/node ln -s /usr/local/node-v12.16.1-linux-x64/bin/npm /usr/bin/npm ln -s /usr/local/node-v12.16.1-linux-x64/bin/node /usr/bin/node echo '运行node-red' nohup node-red > node-red.log 2>&1 &
配置数据转存流程。
1) 在浏览器中输入http://{公网IP:1880},登录Node-RED控制台,复制如下JSON,导入转存流程模板。
[{'id':'99bd800f.7ed3','type':'tab','label':'mqtt2Lindorm','disabled':false,'info':''},{'id':'329162c1.3169ce','type':'mqtt in','z':'99bd800f.7ed3','name':'BEV','topic':'topic','qos':'2','datatype':'utf8','broker':'cb1d3631.5b6b28','nl':false,'rap':false,'rh':'0','x':610,'y':500,'wires':[['60757334.92409c']]},{'id':'60757334.92409c','type':'function','z':'99bd800f.7ed3','name':'MQTT to Lindorm','func':'var tokens = msg.topic.split('/'); var dest = tokens[tokens.length-1]; let ts = Date.now(); console.log(ts); msg.headers = { 'Content-type' : 'application/json' } msg.payload = '[{\'metric\':\'vehicle\', \'tags\':{\'sensor_a1\':\'a1\'},\'timestamp\':' + ts + ', \'fields\':' + msg.payload + '}]' ; console.log(msg.payload); return msg;','outputs':1,'noerr':0,'initialize':'','finalize':'','libs':[],'x':910,'y':460,'wires':[['5571d60f.d66b48']]},{'id':'5571d60f.d66b48','type':'http request','z':'99bd800f.7ed3','name':'','method':'POST','ret':'txt','paytoqs':'ignore','url':'http://ld-bp1ef09pjj62026vx-proxy-tsdb.lindorm.rds.aliyuncs.com:8242/api/mput','tls':'','persist':true,'proxy':'','authType':'','x':1180,'y':400,'wires':[['341c1a02.fd2f36']]},{'id':'341c1a02.fd2f36','type':'debug','z':'99bd800f.7ed3','name':'','active':true,'tosidebar':true,'console':false,'tostatus':false,'complete':'true','targetType':'full','statusVal':'','statusType':'auto','x':1370,'y':500,'wires':[]},{'id':'cb1d3631.5b6b28','type':'mqtt-broker','z':'99bd800f.7ed3','name':'225','broker':'8.136.192.53','port':'1883','clientid':'node-red','usetls':false,'verifyservercert':true,'protocolVersion':'4','keepalive':'15','cleansession':true,'birthTopic':'','birthQos':'0','birthRetain':'false','birthPayload':'','birthMsg':{},'closeTopic':'','closeRetain':'false','closePayload':'','closeMsg':{},'willTopic':'','willQos':'0','willRetain':'false','willPayload':'','willMsg':{},'sessionExpiry':''}]
导入后,选择mqtt2Lindorm流程,显示的转存模板如下:
2) 修改节点配置,编辑mqtt-broker节点,填入mosquitto IP地址(即公网IP地址,端口号默认1883)。
3) 编辑http 请求节点,配置Lindorm数据库连接信息:数据库URL地址,数据库用户名和密码。
说明:
数据库URL地址,可进入Lindorm数据库实例详情的数据库连接-时序引擎,进行用户名和密码的创建或查看。
数据库URL地址,可进入Lindorm数据库实例详情的数据库连接-时许引擎页面获取。
4) 点击部署,完成车辆数据转存流程的部署。
5. 模拟车辆数据写入,自动同步至Lindorm
模拟车辆数据写入,自动同步至Lindorm
本步骤需要在ECS控制台操作。登录开通的ECS,在Node-RED上模拟车辆数据写入。
您可以在Node-RED上执行如下命令,构造车辆模拟数据:
mosquitto_pub -h {公网IP} -t topic -m '{'lon': 223.573209,'lat': 45.674483,'enginStatus': 0,'acOnOff': 0,'sunRoof': 0,'frontFogLightStatus': 0,'dippedLightStatus': 0,'rearFogLightStatus': 0,'turnLightStatus': 0,'highBeamLightStatus': 0,'leftFrontDoorStatus': 0,'rightRearDorrStatus': 0 }'
说明:您也可以执行以下命令,下载并运行脚本,不断地写入模拟数据。
wget https://database-experience.oss-cn-shanghai.aliyuncs.com/write.sh; chmod 777 write.sh; nohup sh write.sh > /dev/null 2>&1 &
说明:全量模拟数据格式如下:
名称 |
类型 |
是否必填(Y/N) |
说明 |
statusCode |
String |
Y |
(200成功,非200失败) |
statusMessage |
String |
Y |
状态描述 |
data |
Object |
N |
业务数据 |
lon |
String |
Y |
经度 |
单位:千万分之一度 |
|||
lat |
String |
Y |
纬度 |
单位:千万分之一度 |
|||
timestamp |
String |
Y |
上报时间 |
enginStatus |
String |
Y |
发动机状态: |
0:default |
|||
5:not run |
|||
6:run |
|||
7:cranking |
|||
acOnOff |
String |
Y |
空调开启/关闭 |
0:关 |
|||
1:开 |
|||
sunRoof |
String |
Y |
天窗状态 |
0:未知位置 |
|||
1:关闭 |
|||
2:开启 |
|||
3:全开 |
|||
frontFogLightStatus |
String |
Y |
前雾灯状态 |
0:OFF |
|||
1:ON |
|||
dippedLightStatus |
String |
Y |
近光灯状态 |
0:OFF |
|||
1:ON |
|||
rearFogLightStatus |
String |
Y |
后雾灯状态 |
0:OFF |
|||
1:ON |
|||
turnLightStatus |
String |
Y |
转向灯状态 |
0:灯灭 |
|||
1:右转向灯亮 |
|||
2:左转向灯亮 |
|||
3:双灯亮(危险警报灯) |
|||
highBeamLightStatus |
String |
Y |
远光灯状态 |
0:OFF |
|||
1:ON |
|||
leftFrontDoorStatus |
String |
Y |
左前门状态 |
0:Unlock |
|||
1:Lock |
|||
rightRearDorrStatus |
String |
Y |
右后门状态 |
0:Unlock |
|||
1:Lock |
|||
trunkDoor |
String |
Y |
后备门状态 |
0:Unlock |
|||
1:Lock |
|||
leftRearDoorStatus |
String |
Y |
左后门状态 |
0:Unlock |
|||
1:Lock |
|||
rightFrontDoorStatus |
String |
Y |
右前门状态 |
0:Unlock |
|||
1:Lock |
|||
frDoorLock |
String |
Y |
前右门锁状态 |
0:unlock |
|||
1:lock |
|||
rlDoorLock |
String |
Y |
后左门锁状态 |
0:unlock |
|||
1:lock |
|||
rrDoorLock |
String |
Y |
后右门锁状态 |
0:unlock |
|||
1:lock |
|||
flDoorLock |
String |
Y |
前左门锁状态 |
0:unlock |
|||
1:lock |
|||
centrolLockStatus |
String |
Y |
中控锁状态(删除) |
0:Unlock |
|||
1:Lock |
|||
frontLeftWindow |
String |
Y |
左前窗状态 |
0:window close(车窗关闭) |
|||
1:window breathe(透气窗) |
|||
2:window open(车窗打开) |
|||
frontRightWindow |
String |
Y |
右前窗状态 |
0:window close(车窗关闭) |
|||
1:window breathe(透气窗) |
|||
2:window open(车窗打开) |
|||
rearLeftWindow |
String |
Y |
左后窗状态 |
0:window close(车窗关闭) |
|||
1:window breathe(透气窗) |
|||
2:window open(车窗打开) |
|||
rearRightWindow |
String |
Y |
右后窗状态 |
0:window close(车窗关闭) |
|||
1:window breathe(透气窗) |
|||
2:window open(车窗打开) |
|||
tireLeftFrontPressureStatus |
String |
Y |
左前轮胎压状态 |
0:Normal |
|||
1:Over-pressure |
|||
2:Under-pressure |
|||
3:Reserved |
|||
tireRightFrontPressure |
String |
Y |
右前轮胎压 |
单位:1.373Kpa |
|||
无效值:0xFF |
|||
tireRightFrontPressureStatus |
String |
Y |
右前轮胎压状态 |
0:Normal |
|||
1:Over-pressure |
|||
2:Under-pressure |
|||
3:Reserved |
|||
tireLeftRearPressure |
String |
Y |
左后轮胎压 |
单位:1.373Kpa |
|||
无效值:0xFF |
|||
tireLeftRearPressureStatus |
String |
Y |
左后轮胎压状态 |
0:Normal |
|||
1:Over-pressure |
|||
2:Under-pressure |
|||
3:Reserved |
|||
tireLeftFrontPressure |
String |
Y |
左前轮胎压 |
单位:1.373Kpa |
|||
无效值:0xFF |
|||
tireRightRearPressure |
String |
Y |
右后轮胎压 |
单位:1.373Kpa |
|||
无效值:0xFF |
|||
tireRightRearPressureStatus |
String |
Y |
右后轮胎压状态 |
0:Normal |
|||
1:Over-pressure |
|||
2:Under-pressure |
|||
3:Reserved |
|||
remainingFuel |
String |
Y |
剩余油量 |
单位:1L |
|||
数值范围: |
|||
totalMileage |
String |
Y |
总计里程 |
单位:Km |
|||
数值范围: |
|||
无效值:1000000~16777215 |
|||
remainingMileage |
String |
Y |
续航里程 |
单位:Km |
|||
数值范围: |
|||
averageFuel |
String |
Y |
平均油耗 |
单位:L/100km |
|||
数值范围: |
|||
精度: 0.1 |
|||
无效值:201~255 |
|||
validEngineCoolerTemperature |
String |
Y |
发动机冷却液温度有效位 |
0:Not valid |
|||
1:Valid |
|||
engineCoolerTemperature |
String |
Y |
发动机冷却液温度 |
单位:℃ |
|||
偏移量:-40 |
|||
无效值:0xFF |
|||
validSpeed |
String |
Y |
车速有效位 |
0:Not valid |
|||
1:Valid |
|||
speed |
String |
Y |
车身速度 |
单位:0.05625km/h |
|||
无效值:0x1901~0x1FFF |
|||
pm25Status |
String |
Y |
PM2.5过滤状态 |
0:reserve |
|||
1:优 |
|||
2:良 |
|||
3:差 |
|||
4:关闭 |
|||
5~7:reserve |
|||
stealAlarmStatus |
String |
Y |
盗警状态 |
0: Disarmed |
|||
1: Armed |
|||
2: Prearmed |
|||
3: Alarmed' |
|||
alarmType |
String |
Y |
警情类型 |
1:碰撞上报 |
|||
2:侧翻(预留) |
|||
3:盗警 |
|||
4:欠压 |
|||
5:断电 |
|||
6: 儿童遗忘报警 |
|||
alarmTimestamp |
String |
Y |
警情上报时间戳 |
6. (可选)对接Grafana,可视化展示数据
(可选)对接Grafana,可视化展示数据
安装并启动Grafana服务。
1)在ECS服务器上,运行如下命令,安装Grafana。
wget https://database-experience.oss-cn-shanghai.aliyuncs.com/grafana-6.2.2-1.x86_64.rpm; yum install grafana-6.2.2-1.x86_64.rpm
2)执行如下命令,启动Grafana服务。
service grafana-server start
接入Lindorm数据库的时许引擎数据源。
1)登录Grafana。在浏览器中输入Grafana登录页面的URL地址:ECS公网地址:3000。
例如:ECS 的公网地址是 xxx.xx.xx.xxx,那么在浏览器中输入地址http://xxx.xx.xx.xxx:3000
登录名:admin
密码:admin
2)在Grafana中创建一个数据源。创建时,如下设置需指定信息,其他设置采用默认值即可。
数据库类型:OpenTSDB。
HTTP URL:Lindorm数据库的VPC网络地址。可进入数据库控制台的实例详情-基础信息-查看VPC网络查看。
OpenTSDB版本:==2.3。
Resolution:millisecond。
3)单击Save&Test。
说明:若界面上弹出提示语Data source is working,则表明Grafana已经成功连接上指定的数据库实例。
创建展示数据的监控视图,查看数据大盘(dashboard)。
说明:
本案例已为您提供监控视图模板,您可直接导入模板,一键生成数据大盘。
您也可访问参考文档,手动搭建数据大盘。
1)下载监控视图模板(点击下载)。
2)单击 + > Import,进入模板导入页面。
3)单击Upload .json File,上传模板文件后,单击Import,完成导入。
效果图如下:
实验链接:https://developer.aliyun.com/adc/scenario/60678b87284a42e59926ca2b432657fd