范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

工业物联网之从Modbus到Web数据可视化

  工业物联网是一个范围很大的概念,本文从数据可视化的角度介绍了一个最小化的工业物联网平台,从 Modbus 数据采集到前端数据可视化呈现的基本实现思路。这里面主要涉及基于 Modbus 通讯规约的数据采集、后台实时数据处理、前端实时数据接收、前端实时数据可视化显示。物联网平台架构主要参考了图扑物联工业物联网平台,并从中提取了部分功能进行介绍,前端数据可视化采用的是HT for Web。
  由于内容比较多,具体实现上涉及到前端工程师、后台工程师、数据采集工程师等多个开发角色的参与,所以本文重点介绍实现思路和 WebSocket 消息推送的实现,其它环节的具体实现细节作者会在其它文章中进行详细介绍。
  一、物联网平台架构
  物联网平台主要是B/S模式,图扑物联工业物联网平台采用的是微服务架构,本文主要涉及两个微服务:前置数据采集服务和 Web 实时消息推送服务。
  前置数据采集服务主要用于现场设备、仪器、仪表、传感器实时数据的采集,图扑物联工业物联网平台支持MQTT和透传云解析两种方式,透传云解析支持 Modbus 通讯规约。
  实时数据采集到平台后,需要推送到浏览器端进行显示,Web 实时消息推送服务采用 Web Socket 进行实时数据推送,可以确保数据的实时性和高效性。
  前端可视化技术采用的是HT for Web, HT for Web 是基于HTML5标准的企业应用图形界面一站式解决方案,其包含通用组件、拓扑组件和3D渲染引擎等丰富的图形界面开发类库。虽然 HT for Web 是商业软件但其提供的一站式解决方案可以极大缩短产品开发周期、减少研发成本、补齐我们在 Web 图形界面可视化技术上的短板。
  二、Modbus 数据采集
  Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有:
  公开发表并且无版权要求
  易于部署和维护
  对供应商来说,修改移动本地的比特或字节没有很多限制
  Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。
  目前主流的编辑语言都有 Modbus 开发库,由于 Modbus 相对比较简单,很多企业也选择自行开发实现。Modbus 数据采集属于后台通讯,数据采集到平台后首先会进行数据清理和预处理,过滤掉冗余和无效数据,形成实时数据。平台获取到实时数据后一般会做 3 项工作:
  1. 推送到 Web 前端进行显示
  2. 存储到时序数据库
  3. 判断是否产生告警
  三、将实时数据推送到 Web 前端
  基于 Web 的实时数据推送需要用到 WebSocket,初学者可以学习阮一峰老师的 WebSocket 教程。图扑物联的物联网平台基于 WebSocket 封装了一套消息传输协议,类似于一个消息中间件,前端部分可以订阅实时数据。考虑到海量实时数据的推送需求,将实时数据分为平台级、站点级、设备级,前端在订阅实时数据时,可以通过消息主题规则订阅不同级别的数据。平台侧在收到订阅请求时,可以主动推送一次实时数据。这样可以确保数据可视化界面在订阅实时数据成功后,第一时间显示出正确的界面。
  下面给出一个简化的 WebSocket 消息协议的客户端代码,大家可以在些基础上进行改造以适合自己的业务场景。
  消息主题正则表达式,用来匹配消息主题:
  1 const matchWildcard = function(str, rule) {
  2 return new RegExp("^" + rule.split("*").join(".*") + "#39;).test(str)
  3 }
  WebSocket 客户端,支持消息主题订阅、取消消息主题订阅、同一个消息主题支持多个订阅者:
  class WebSocketClient {
  constructor() {
  this.ws = null
  this.opts = {
  debug: false,
  autoReconnect: true,
  reconnectInterval: 10000,
  subscriber: {},
  }
  this.opened = false
  }
  connect() {
  if (!this.opened) {
  return
  }
  const url = "ws://www.iotopo.com/msg/v1"
  console.debug("websocket connect", url)
  let ws = this.ws = new WebSocket(url)
  ws.onmessage = event => {
  if (this.opts.debug) {
  console.log(event)
  }
  let data = JSON.parse(event.data)
  for (let topic in this.opts.subscriber) {
  if (matchWildcard(data.topic, topic)) {
  let listeners = this.opts.subscriber[topic]
  if (Array.isArray(listeners)) {
  listeners.forEach(cb => {
  if (typeof cb === "function") {
  cb(data.payload)
  }
  })
  }
  }
  }
  }
  ws.onopen = e => {
  if (this.opts.debug) {
  console.log(e)
  }
  // 执行订阅请求
  for (let topic in this.opts.subscriber) {
  this._sendSubscribe(topic)
  }
  if (typeof this.opts.onopen === "function") {
  this.opts.onopen(e)
  }
  }
  ws.onclose = e => {
  if (this.opts.debug) {
  console.log(e)
  }
  if (typeof this.opts.onclose === "function") {
  this.opts.onclose(e)
  }
  if (this.opened && this.opts.autoReconnect) {
  setTimeout(() => {
  this.connect()
  }, this.opts.reconnectInterval)
  }
  }
  ws.onerror = e => {
  if (this.opts.debug) {
  console.log(e)
  }
  if (typeof this.opts.onerror === "function") {
  this.opts.onerror(e)
  }
  }
  }
  open(opts) {
  if (!this.opened) {
  Object.assign(this.opts, opts || {})
  this.opened = true
  this.connect()
  }
  }
  close() {
  this.opened = false
  if (this.ws !== null) {
  this.ws.close()
  }
  this.ws = null
  }
  isOpened() {
  return this.opened
  }
  isConnected() {
  return this.ws !== null
  }
  _sendSubscribe(topic) {
  if (this.ws === null) {
  return Error("websocet not opened")
  }
  if (typeof topic !== "string") {
  return Error("topic should be a string value")
  }
  if (this.ws.readyState === WebSocket.OPEN) {
  let msg = {
  type: "subscribe",
  topic: topic,
  }
  this.ws.send(JSON.stringify(msg))
  } else {
  return Error("websocet not connected")
  }
  }
  subscribe(topic, cb) {
  if (this.opts.debug) {
  console.log("subscribe:", topic)
  }
  let listeners = this.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.ws === null) {
  return Error("websocet not opened")
  }
  if (typeof topic !== "string") {
  return Error("topic should be a string value")
  }
  let listeners = this.opts.subscriber[topic]
  if (cb) {
  if (Array.isArray(listeners)) {
  let idx = listeners.indexOf(cb)
  if (idx >= 0) {
  listeners.splice(idx, 1)
  }
  }
  } else {
  delete this.opts.subscriber[topic]
  }
  if (Array.isArray(listeners) && listeners == 0) {
  if (this.ws.readyState === WebSocket.OPEN) {
  let msg = {
  type: "unsubscribe",
  topic: topic,
  }
  this.ws.send(JSON.stringify(msg))
  } else {
  return Error("websocet not connected")
  }
  }
  }
  }
  用法举例:
  // 初始化客户端
  const ws = new WebSocketClient()
  // 与 WebSocket 服务器建议连接
  ws.open({
  debug: false
  })
  // 订阅消息
  ws.subscribe("/foo/bar/*", function(msg) {
  console.log("recv ws msg:", msg)
  })
  四、数据可视化界面实现
  基于 HT for Web 可以简单快速地搭建一个符合 HTML5 标准的可视化图形界面,通过 WebSocket 订阅实时数据,然后驱动图形界面的变化。数据驱动图形界面变化的实现方式很多,基本方法是采用数据绑定的方式,具体可以参考 HT for Web 的官方文档。
  在后面的文章中,作者会介绍一种基于 HT for Web 实现的业务数据和图形数据分离的数据绑定方法,这也是图扑物联的物联网平台采用的方式。
  ————————————————
  版权声明:本文为CSDN博主「YHFHing」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  原文链接:https://blog.csdn.net/u010199413/article/details/100572231

13万多买中大型SUV,入门车型就有2。0T8AT,奔腾T99值得入手吗?在一汽集团的众多品牌中,红旗和奔腾绝对算是嫡系,作为根正苗红的国产品牌,红旗主打高端,奔腾则走性价比路线,比如奔腾T99,它定位中大型SUV,但只需13万多就能入手,那么这款车值得哈弗H6S亮相成都车展,定位轿跑SUV,预售13。89万起哈弗H6是中国SUV市场金字塔般的存在,常年蝉联SUV销量冠军,为了维护自己的地位,也为了给消费者提供更多选择,哈弗推出了基于H6搭载的轿跑版车型,它就是哈弗H6S,新车将在成都车成都车展新款奥迪Q2L将正式上市日前,我们从一汽大众奥迪官方获悉,新款奥迪Q2L将在8月29日开幕的成都车展上正式上市,新车的外观有了明显变化,精致感时尚感更加出众。新车前脸的整体轮廓没有什么变化,但细节调整很多预售24。5万起,新款JEEP大指挥官将于成都车展正式上市,标配9AT成都车展是中国五大车展之一,影响力很大,所以很多车企会在成都车展发布新车并公布售价,日前我们从广汽菲克JEEP官方获悉,新款JEEP大指挥官将在8月29日的开幕成都车展上正式上市。大众探岳降4万,不到15万买合资中型SUV,值得入手吗?日前,我们从唐山某一汽大众4S店获悉,探岳的优惠达到了4万,入门车型裸车价不到15万,这个价格买一台合资中型SUV,而且还是大众出品,值得入手吗?探岳是一汽大众推出的第二款SUV车中国特供MPV!现代库斯途或17。88万起售,标配8AT,轴距3055mm国家推行二胎政策已经多年,现在又逐渐放开了三胎,所以功能性更强的MPV车型也得到了更高的关注,而车企的商业嗅觉是最敏感的,纷纷开始布局MPV市场,北京现代也在此大背景下推出了库斯途中国品牌高性能SUV,领克05将在成都车展首发,卖多少钱合适?2021成都车展开幕在即,国内外各大车企带来了很多重磅车型,作为国产高端品牌,领克也带来了多款新车型,领克05就是其中之一,它属于领克05的高性能版,也是领克品牌系列的第二款车型。别克英朗降4。5万,标配6AT,1。5L自吸和1。3T可选,哪个更值得买?在国内紧凑型轿车排行榜前十名单中,德系车和日系车依旧是最大赢家,而美系车只有别克英朗一款车上榜,7月份以17940辆排在第5名,之所以能达到如此成绩,其实完全是凭借大幅优惠换来的,说到做到!当库克还在爆料苹果12时,小米已经向第一冲刺了不知道大家还记不记得在去年Q2的手机销量榜单里,小米以3319万台的销量排在全球第四位置,这是值得自豪的。但是小米创始人却看到了另一个目标,那就是全球第三的苹果,他表示自己如果再努宁美漫威正版授权!小米有品众筹又一王炸,气质颜值暴涨每个男人的心底都有一个漫威宇宙,蜘蛛侠钢铁侠复仇者联盟黑豹这几部作品几乎如烙印般刻在心底作为一个重度漫威粉,最近竟然在小米有品众筹看到一款漫威正版联名主机宁美魔方主机,却着实让我吓小米有品掌上小钢炮,能照亮整座山,99元有3种终极形态男人至死是少年,不管年纪有多大,都无法磨灭那颗爱玩的心,因此市面上也推出了不少面向成年男人的玩家,EDC(EveryDayCarry)就是其中的代表。EDC玩具多种多样,最广泛的大
京东说好的不开除任何一个兄弟,如今全面开火大面积裁员裁员,从去年开始,一直是热搜榜永远离不开的话题,大厂小厂,上市企业非上市企业,无数的职场人员被动离开了自己喜爱的岗位,成为待业,灵活就业的一员,而在所有的裁员话题中,本次京东裁员最日本富士相机不倾听客户建议,此举很失望我给富士相机发出了一封邮件,非常令我失望。富士非常的傲慢,强调它的固件没有问题。刚刚升级1。31也没有修正它的错误。堪称日本富士牛逼之举。各位富士摄友,是否有我说的情况发生,请大家特斯拉的确能探测到鬼?说到特斯拉大家并不陌生,作为新能源界的领跑者,它有着非常靓丽的外观和优越的性能,用户的驾乘体验也是首屈一指的,虽然之前也出现过多起负面新闻,但它在全球用户心中任然是新能源汽车的首选关于黑洞的一项重大发现Giraffe和Unicorn恒星实为双星系统去年,俄亥俄州立大学的一个团队发现了一个据说是有史以来最小的黑洞之一,同时它也是离地球最近的黑洞距离只有1500光年。紧接着,研究人员又在约12000光年外发现了另一个天体,该天体别欺人太甚,我豁出去了,必须为京东和刘强东,讨个说法近日京东裁员登上了热搜,充斥着各种对刘强东的口诛笔伐,说什么刘强东抛弃了他的兄弟,刘强东捅了兄弟一刀,一时甚嚣尘上,过去多日,仍不见退热。声讨人群中不乏某狐,某易等传统互联网公司和为什么人类进化过程中的色盲基因没被淘汰?1774年,道尔顿宣布从他和其兄弟身上,发现了红绿色盲他们的颜色世界不是由三原色组成的,而只是由黄蓝两种颜色组成的。他们看不到红色和绿色。十九世纪,物理学家托马斯杨提出了一个大胆的小行星撞击中恐龙都灭绝了,蟑螂为何还能存活?为什么它们比地球上的人类寿命更长?6600万年前,当现在被称为希克苏鲁伯撞击器的岩石从外太空坠落并撞击地球时,蟑螂就在那里。这次撞击引发了一场大地震,科学家们认为它还引发了距撞击地鸿海一季度营收1。41万亿新台币,创历年同期新高台湾联合报4月5日消息,鸿海公布第一季度营收1。41万亿新台币,创历年同期新高,主要因为供应链情况较为稳定,带动四大产品线均较去年同期成长展望第二季度,鸿海能见度约与目前市场预期相河北2个项目入选国家新型数据中心典型案例新华社客户端河北频道4月5日电(高晓莉)近日,工业和信息化部公布2021年国家新型数据中心典型案例名单,河北省的中国联通廊坊云数据中心和廊坊万国云鑫智能数据分析应用平台云计算数据中让户外也有澎湃的音乐,SanagM11蓝牙音响,小体量大实力自己在用的蓝牙音响还是比较多的,不过最近还是入手了英国品牌Sanag的这款SanagM11蓝牙音响,这款音响无论从设计上,还是整体品质还是很打动我的。外包装采用了红蓝撞色设计,十分哈勃发现一颗以非常规方式形成的行星美国宇航局的哈勃太空望远镜直接拍摄了类似木星的原行星形成的证据,研究人员将其描述为激烈而剧烈的过程。这一发现支持了一个长期争论的关于像木星这样的行星如何形成的理论,称为磁盘不稳定性