工业物联网之从Modbus到Web数据可视化
工业物联网是一个范围很大的概念,本文从数据可视化的角度介绍了一个最小化的工业物联网平台,从Modbus数据采集到前端数据可视化呈现的基本实现思路。这里面主要涉及基于Modbus通讯规约的数据采集、后台实时数据处理、前端实时数据接收、前端实时数据可视化显示。物联网平台架构主要参考了图扑物联工业物联网平台,并从中提取了部分功能进行介绍,前端数据可视化采用的是HTforWeb。
由于内容比较多,具体实现上涉及到前端工程师、后台工程师、数据采集工程师等多个开发角色的参与,所以本文重点介绍实现思路和WebSocket消息推送的实现,其它环节的具体实现细节作者会在其它文章中进行详细介绍。
一、物联网平台架构
物联网平台主要是BS模式,图扑物联工业物联网平台采用的是微服务架构,本文主要涉及两个微服务:前置数据采集服务和Web实时消息推送服务。
前置数据采集服务主要用于现场设备、仪器、仪表、传感器实时数据的采集,图扑物联工业物联网平台支持MQTT和透传云解析两种方式,透传云解析支持Modbus通讯规约。
实时数据采集到平台后,需要推送到浏览器端进行显示,Web实时消息推送服务采用WebSocket进行实时数据推送,可以确保数据的实时性和高效性。
前端可视化技术采用的是HTforWeb,HTforWeb是基于HTML5标准的企业应用图形界面一站式解决方案,其包含通用组件、拓扑组件和3D渲染引擎等丰富的图形界面开发类库。虽然HTforWeb是商业软件但其提供的一站式解决方案可以极大缩短产品开发周期、减少研发成本、补齐我们在Web图形界面可视化技术上的短板。
二、Modbus数据采集
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气SchneiderElectric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有:
公开发表并且无版权要求
易于部署和维护
对供应商来说,修改移动本地的比特或字节没有很多限制
Modbus允许多个(大约240个)设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。
目前主流的编辑语言都有Modbus开发库,由于Modbus相对比较简单,很多企业也选择自行开发实现。Modbus数据采集属于后台通讯,数据采集到平台后首先会进行数据清理和预处理,过滤掉冗余和无效数据,形成实时数据。平台获取到实时数据后一般会做3项工作:
1。推送到Web前端进行显示
2。存储到时序数据库
3。判断是否产生告警
三、将实时数据推送到Web前端
基于Web的实时数据推送需要用到WebSocket,初学者可以学习阮一峰老师的WebSocket教程。图扑物联的物联网平台基于WebSocket封装了一套消息传输协议,类似于一个消息中间件,前端部分可以订阅实时数据。考虑到海量实时数据的推送需求,将实时数据分为平台级、站点级、设备级,前端在订阅实时数据时,可以通过消息主题规则订阅不同级别的数据。平台侧在收到订阅请求时,可以主动推送一次实时数据。这样可以确保数据可视化界面在订阅实时数据成功后,第一时间显示出正确的界面。
下面给出一个简化的WebSocket消息协议的客户端代码,大家可以在些基础上进行改造以适合自己的业务场景。
消息主题正则表达式,用来匹配消息主题:
1constmatchWildcardfunction(str,rule){
2returnnewRegExp(rule。split()。join(。)39;)。test(str)
3}
WebSocket客户端,支持消息主题订阅、取消消息主题订阅、同一个消息主题支持多个订阅者:
classWebSocketClient{
constructor(){
this。wsnull
this。opts{
debug:false,
autoReconnect:true,
reconnectInterval:10000,
subscriber:{},
}
this。openedfalse
}
connect(){
if(!this。opened){
return
}
consturlws:www。iotopo。commsgv1
console。debug(websocketconnect,url)
letwsthis。wsnewWebSocket(url)
ws。onmessageevent{
if(this。opts。debug){
console。log(event)
}
letdataJSON。parse(event。data)
for(lettopicinthis。opts。subscriber){
if(matchWildcard(data。topic,topic)){
letlistenersthis。opts。subscriber〔topic〕
if(Array。isArray(listeners)){
listeners。forEach(cb{
if(typeofcbfunction){
cb(data。payload)
}
})
}
}
}
}
ws。onopene{
if(this。opts。debug){
console。log(e)
}
执行订阅请求
for(lettopicinthis。opts。subscriber){
this。sendSubscribe(topic)
}
if(typeofthis。opts。onopenfunction){
this。opts。onopen(e)
}
}
ws。onclosee{
if(this。opts。debug){
console。log(e)
}
if(typeofthis。opts。onclosefunction){
this。opts。onclose(e)
}
if(this。openedthis。opts。autoReconnect){
setTimeout((){
this。connect()
},this。opts。reconnectInterval)
}
}
ws。onerrore{
if(this。opts。debug){
console。log(e)
}
if(typeofthis。opts。onerrorfunction){
this。opts。onerror(e)
}
}
}
open(opts){
if(!this。opened){
Object。assign(this。opts,opts{})
this。openedtrue
this。connect()
}
}
close(){
this。openedfalse
if(this。ws!null){
this。ws。close()
}
this。wsnull
}
isOpened(){
returnthis。opened
}
isConnected(){
returnthis。ws!null
}
sendSubscribe(topic){
if(this。wsnull){
returnError(websocetnotopened)
}
if(typeoftopic!string){
returnError(topicshouldbeastringvalue)
}
if(this。ws。readyStateWebSocket。OPEN){
letmsg{
type:subscribe,
topic:topic,
}
this。ws。send(JSON。stringify(msg))
}else{
returnError(websocetnotconnected)
}
}
subscribe(topic,cb){
if(this。opts。debug){
console。log(subscribe:,topic)
}
letlistenersthis。opts。subscriber〔topic〕
if(!Array。isArray(listeners)){
listeners〔
cb
〕
this。opts。subscriber〔topic〕listeners
}else{
listeners。push(cb)
}
this。sendSubscribe(topic)
return{topic,cb}
}
unsubscribe({topic,cb}){
if(this。opts。debug){
console。log(unsubscribe:,topic)
}
if(this。wsnull){
returnError(websocetnotopened)
}
if(typeoftopic!string){
returnError(topicshouldbeastringvalue)
}
letlistenersthis。opts。subscriber〔topic〕
if(cb){
if(Array。isArray(listeners)){
letidxlisteners。indexOf(cb)
if(idx0){
listeners。splice(idx,1)
}
}
}else{
deletethis。opts。subscriber〔topic〕
}
if(Array。isArray(listeners)listeners0){
if(this。ws。readyStateWebSocket。OPEN){
letmsg{
type:unsubscribe,
topic:topic,
}
this。ws。send(JSON。stringify(msg))
}else{
returnError(websocetnotconnected)
}
}
}
}
用法举例:
初始化客户端
constwsnewWebSocketClient()
与WebSocket服务器建议连接
ws。open({
debug:false
})
订阅消息
ws。subscribe(foobar,function(msg){
console。log(recvwsmsg:,msg)
})
四、数据可视化界面实现
基于HTforWeb可以简单快速地搭建一个符合HTML5标准的可视化图形界面,通过WebSocket订阅实时数据,然后驱动图形界面的变化。数据驱动图形界面变化的实现方式很多,基本方法是采用数据绑定的方式,具体可以参考HTforWeb的官方文档。
在后面的文章中,作者会介绍一种基于HTforWeb实现的业务数据和图形数据分离的数据绑定方法,这也是图扑物联的物联网平台采用的方式。
版权声明:本文为CSDN博主YHFHing的原创文章,遵循CC4。0BYSA版权协议,转载请附上原文出处链接及本声明。
原文链接:https:blog。csdn。netu010199413articledetails100572231
法国一气象组织堵住亚马逊仓库,抗议黑五IT之家11月29日消息当地时间11月28日,黑色星期五前夕,法国一个名为地球之友的气候组织数十位法国示威者为了抗议黑色星期五,堵住了亚马逊在法国南部的仓库,要求停止黑色星期五……
亚洲首富今年身价暴增170亿美元,马云增加113亿北京时间24日消息,对于亚洲首富穆克什安巴尼(MukeshAmbani)来说,今年是丰收的一年。根据彭博亿万富翁指数,今年截至12月23日,这位印度大亨的财富增加了近17……
申通快递回应人已去世但药还没到分拣错了,已协商赔付IT之家12月25日消息近日IT之家报道了郑州殷先生为母亲寄抗癌药,但是人去世后快递仍未到这一新闻。最近申通快递的郑州南环公司在电话中表示,已经协商进行赔付。今年的12月……
视频网站超前点播热播剧,一夜可吸金数千万IT之家12月16日消息上周,腾讯视频、爱奇艺两大视频网站平台均在会员制基础上,推出了超前点播付费模式。会员用户可花费50元购买加速权益包,始终超前看6集《庆余年》。爱奇艺还可……
人民日报再评某视频花钱预点播收费套路层出不穷,令人生厌IT之家12月15日消息昨日晚间,人民日报就腾讯视频、爱奇艺两大视频网站平台均在会员制基础上推出的超前点播付费模式发表评论,称VIP之外设置VVIP,额外掏钱才能享受超前点播,……
央视网评会员再加点播费,别过早薅秃一只羊IT之家12月15日消息12月11日,腾讯视频、爱奇艺两大视频网站平台均在会员制基础上,推出了超前点播付费模式。会员用户可花费50元购买加速权益包,始终超前看6集《庆余年》,还……
买会员还要再花钱,人民日报批视频网站套路谁惯的?IT之家12月14日消息近日,腾讯视频、爱奇艺两大视频网站平台均在会员制基础上,推出了超前点播付费模式。会员用户可花费50元购买加速权益包,始终超前看6集《庆余年》,还可以3元……
乡下人家小学四年级语文说课稿一、教材分析:《乡下人家》编排在第六组,本组主题是走进田园,热爱乡村。意在让学生通过朗读,感受充满诗情画意的田园美景,体验自然质朴的田园生活,体会作者的表达方法,丰富自己……
课文鱼游到了纸上教学设计范文【教学设计说明】《鱼游到了纸上》是义务教育课程标准实验教科书语文四年级下册第七组的课文。课文记叙的是我去玉泉观鱼,认识了一位聋哑青年,发现他画的鱼栩栩如生,就像在纸……
日本一旅馆一晚只需8。4元,但要被全程网上直播IT之家11月16日消息近日,日本福冈县一旅馆推出特价房,住一晚只需130日元(约合8。4元),但入住后全程会被在YouTube上直播。据悉该旅馆房间内设施齐全,与普通的……
小学语文门前的小树死了优秀教案文本细读:这是一篇略读课文,作者针对城市树木惨遭破坏的现象,以一份调查报告的形式,从现象、调查、分析、建议四个方面,有详有略、主次分明地进行了阐述。我们可以清楚地听到作者……
阿里朱顺炎我为什么没马云成功?因为他在创造趋势12月22日午间消息,在今日的极客公园创新大会十周年上,阿里创新事业群总裁朱顺炎发表题为《大组织土壤中,创新如何发芽结果?》的演讲。朱顺炎表示,创业会经历几个阶段:做好小……
海南首个5G基站开通进入5G预商用时代IT之家11月19日消息根据海南日报的报道,11月16日,海南移动在海口开通海南省首个5G基站,标志着海南进入5G预商用时代。据报道,海南移动采用了4。9G频段,5G基站……
小米科技园第一场家宴正在筹备中,没有内定和后门IT之家11月21日消息每年年底,小米都会举行一场家宴。今年,小米将在小米科技园举行第一场家宴,小米公司新媒体总监陆柒柒表示,小米今年的家宴正在紧张筹备中。陆柒柒表示表示……
男子楼顶微博发帖直播轻生已被救下IT之家3月26日消息据红星视频消息,3月25日,成都天府软件园C7楼,一年轻男子翻过栏杆,坐在高楼边上,疑似有轻生的想法。据多名网友爆料,该男子通过微博,一直在直播此次……
音乐教学活动师公舞反思我设计的这次活动,结合班级的主题活动开展,现开展到民族村这个主题,而且南宁市也即将举办民歌节和东盟博览会。我们的祖国是一个民族众多、历史悠久的文明古国,各民族的文化丰富多彩,孩……
种子发芽实验说课稿尊敬的各位评委、老师大家好:你们好,今天我说课的内容是《种子发芽实验(一)》,下面我将从教材分析、学情分析、教学重难点、教学目标、教法学法、教学准备和教学过程等几个方面来……
高德地图上线春运交通预报系统可查交通预测,实时路况等IT之家1月10日消息据高德地图官方消息,高德地图今日上线了全国首个春运交通预报系统;春运交通预测、春运实时路况,春运热门迁徙路线随时可查。信息显示,春运交通预报系统是交……
京东禁止口罩涨价,一旦发现价格异常将下架处理IT之家1月22日消息今日中午,针对最近口罩等防护品的需求量激增,京东表示,其正积极从货源、仓储配送、平台管控等方面全力保障供应和价格稳定。京东指出,京东与如3M和霍尼韦……
优衣库工厂采用机器人分装T恤,已接近完全自动化IT之家12月26日消息据《英国金融时报》消息,近日优衣库的工厂引进了可以挑选T恤的机器人,目前工厂已接近完全自动化。早在去年,优衣库表示自家的东京旗舰仓库90的优衣库员……
阿里巴巴对外开源自研浸没式液冷数据中心技术2020年1月6日,阿里巴巴宣布将浸没式液冷数据中心技术规范向全社会开放。这项规范旨在用一套标准流程为下一代绿色基地型数据中心的建设提供设计依据,通过液冷技术的普及,降低全社会……
印度盛产CEO,报告称世界500强30的掌舵人为印度人IT之家1月3日消息近日据《哈佛商业评论》一项研究,世界500强企业中30的掌舵人是印度人。包括谷歌母公司Alphabet、微软、Adobe等全球知名企业。根据《哈佛商业……
神速!支付宝集五福开启半小时近7万人已集齐IT之家1月13日消息虽然支付宝集五福活动已经举办了好几年,但是网友对这项新年保留节目热情依旧未减。活动刚刚开启,就有IT之家网友向小编投稿称自己已经集齐了五福,坐等开奖。……
中南医院感染科桂希恩教授预计正月十五前武汉疫情将回落感谢IT之家网友刺客的线索投递!IT之家1月26日消息新型冠状病毒引发的肺炎疫情仍在全国持续蔓延,关于这场没有硝烟的战争会打多久,目前还没有定论。相信大家都希望疫情越早结……