Websocket通信协议在数字孪生中的应用

目录
  • 写在前面
  • 数字孪生中的通讯协议
    • Websocket 是什么
    • Websocket 配置
      • 基于 Node.js 的 Websocket 服务器搭建
    • 基于Vue 的 Websocket 客户端搭建
  • 通过 Websocket 更新 Echart 表格数据(基于 Vue + node)
    • 搭建 echart 柱状图结构
    • 添加柱状图初始化参数
    • 添加柱状图更新函数
    • 添加 Websocket 连接与接收数据函数
    • 向 Websocket Server 添加生成随机数据的函数
    • 添加数据监控函数,即数据更新函数
    • 将数据监控函数绑定到 Websocket 的 connection 事件回调中
    • 启动前端、后端,测试效果
  • 为何采用 Websocket 而不是 HTTP
    • 采用 HTTP
    • 采用 Websocket
  • 总结

写在前面

面试官:除了 HTTP,你还用过什么通信协议?

答:Websocket 在数字孪生中的应用

随着 数智化 转型的推进,越来越多行业开始加入 数智化改造 大军,所谓数智化,其实就是数据化、智能化,主要强调的是利用目前发展迅猛的计算机、网络技术、AI等先进技术,对传统行业进行改造、赋能,促进传统行业向先进技术靠拢,通过先进技术的赋能,使传统行业得到更快的发展。

而在这一波转型中,尤其亮眼的就要数 数字孪生 这个概念了,数字孪生在我看来,可以简单分两部分理解:
第一部分为同步孪生,即利用各种方式采集到的各种数据,通过糅合、整理,在计算机上模拟出与现实世界相同的东西,即 孪生,并且在现实世界发生变化时,孪生世界中的事物能够呈现相同的状态。

第二部分为预测孪生,即通过对于大量数据的采集、分析,能够对数据与事物发展的态势进行结合,建立模型,达到预测、模拟效果,提前预防灾难发生等。

目前来看,业界开发出来的数字孪生产品中,分为二维、三维、二维 + 三维这几种模式,其中二维数字孪生主要是将现实世界的数据做处理后,利用各种可视化表格进行展示,而三维数字孪生则是利用 WebGL、Three、UE4 等技术,将现实场景直接建模、完全孪生到计算机上,通过数据孪生,展示与现实场景相同的孪生场景。

数字孪生内容很多,本次先从简单的二维数字孪生的数据展示入手,介绍一下二维数据孪生应用最简单的模块。

数字孪生中的通讯协议

Websocket 是什么

WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议。WebSocket通信协议于2011年被[IETF]定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被 W3C 定为标准。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

Websocket 配置

本次以 Echarts 作为展示数据的表格,Node.js 服务器作为数据源,演示简单的数据更新通讯过程

基于 Node.js 的 Websocket 服务器搭建

创建 Websocket Server

// 引入 ws 模块
const WebSocket = require('ws');
// 创建 server 实例并监听 3000 端口
const server = new WebSocket.Server({host:'localhost',port:3000},()=>{
  console.log('WebsocketServer Start !')
});

添加客户端连接成功回调

当客户端对服务端发起连接时,服务端能够在 connection 事件中收到请求

server.on('connection',(client)=>{
  console.log('连接成功')
})

添加客户端消息回调

由于 Websocket 是全双工的,所以客户端和服务端都可以向对方发送消息,因此,我们需要添加消息回调,接收客户端发送的消息

server.on('connection',(client)=>{
  console.log('连接成功')
  // 添加消息回调
  client.on('message',(msg)=>{
    console.log(msg);
  })
})

基于Vue 的 Websocket 客户端搭建

客户端与服务端基本差不多,创建连接、添加连接回调、消息回调

var ws = new WebSocket("ws://localhost:3000");
//服务端向客户端连接执行
ws.onopen = ()=>{
  console.log('连接建立')
}
ws.onmessage = (msg) => {
  console.log('收到消息:', msg.data)
}

通过 Websocket 更新 Echart 表格数据(基于 Vue + node)

搭建 echart 柱状图结构

<template>
  <div id="Websocket-container"></div>
</template>

添加柱状图初始化参数

init(){
  var chartDom = document.getElementById('Websocket-container');
  this.myChart = echarts.init(chartDom);
  var option;
  option = {
    xAxis: {
      type: 'category',
      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    },
    yAxis: {
      type: 'value'
    },
    series: [
      {
        data: [120, 200, 150, 80, 70, 110, 130],
        type: 'bar',
        showBackground: true,
        backgroundStyle: {
          color: 'rgba(180, 180, 180, 0.2)'
        }
      }
    ]
  }
  option && this.myChart.setOption(option);
},

添加柱状图更新函数

update(newData) {
  let option = {
    series: {
      data: newData,
    }
  }
  this.myChart.setOption(option)
},

添加 Websocket 连接与接收数据函数

initWebsocket(){
  var ws = new WebSocket("ws://localhost:3000");
  //服务端向客户端连接执行
  ws.onopen = ()=>{
    console.log('连接建立')
  }
  ws.onmessage = (msg) => {
    console.log('收到消息:', msg.data)
    this.update(JSON.parse(msg.data))
  }
}

向 Websocket Server 添加生成随机数据的函数

通过生成随机的数据,模拟现实中数据的变化,并推送到前端

function createDatas(){
  let arr = []
  for(let i=0;i<7;i++){
    arr.push(Math.floor(Math.random()*100))
  }
  console.log(arr)
  return arr
}

添加数据监控函数,即数据更新函数

// 每 5s 想前端更新一次
function startMonitor(client){
  setInterval(() => {
    let newDatas = createDatas()
    client.send(JSON.stringify(newDatas))
  }, 1000 * 5);
}

将数据监控函数绑定到 Websocket 的 connection 事件回调中

server.on('connection',(client)=>{
	console.log('连接成功')
  // 添加消息回调
  client.on('message',(msg)=>{
		console.log(msg);
	})
  // 开始数据监听,当数据更新时想客户端推送数据
  startMonitor(client)
})

启动前端、后端,测试效果

为何采用 Websocket 而不是 HTTP

首先我们知道对于数字孪生这样的应用场景,实时同步现实数据到孪生世界是必要的环节,而当数据发送变化时,孪生世界如果想要做到立即响应,那么就需要立刻通过网络获取数据

采用 HTTP

HTTP 作为单工通讯,服务器无法主动推送数据到前端,那么只能采用轮询的方式,而采取这样子的方式有一个矛盾点存在,一方面,为了更加实时的获取到最新的数据,轮询的间隔时间应该尽可能小,而另一方面,由于发送 HTTP 会耗费大量的流量,所以轮询时间应该尽可能大,从而节省流量的浪费,因此,采取 HTTP 轮询的方式很难拿出可靠、高效的方案

采用 Websocket

Websocket 作为全双工的通讯方式,它能够做到当服务器检测到数据更新的时候,主动向客户端推送数据,而在没有数据更新的时候,网络带宽完全是空闲的,不会像采用 HTTP 一样,中间会有无数次无意义的数据请求,所以采取 Websocket 才是更加合理的数据更新方式

总结

通过对于数字孪生应用场景的学习和实践,能够了解到与以往习惯的通过 HTTP 接口获取数据并进行渲染所不同的方式,也看到了更多的可能,对于数字孪生,这里所介绍的 Websocket 可能连冰山一角都算不上,希望继续深入研究,探索更多、更深入的 数字孪生相关的技术,更多关于Websocket数字孪生的资料请关注我们其它相关文章!

(0)

相关推荐

  • 如何在CocosCreator中使用http和WebSocket

    CocosCreator版本2.3.4 一.HttpGET Get方式,客户端请求本机地址3000端口,并携带参数url和name,服务端收到后返回name参数. cocos客户端: //访问地址 let url = "http://127.0.0.1:3000/?url=123&name=321"; //新建Http let xhr = new XMLHttpRequest(); //接收数据 xhr.onreadystatechange = function () { if

  • vue常用的数字孪生可视化的自适应方案

    目录 写在前面 各自适应方案对比 百分比自适应方案 Rem + Resize 写在前面 前面博主写过一篇文章 面试官:除了 HTTP,你还用过什么通信协议?(Websocket 在数字孪生中的应用),简述了数字孪生产品的数据更新机制,对于数字孪生产品来说,数据非常重要,孪生世界的数据呈现可以反映现实世界的真实情况,而在数据展示中,除了数据更新机制之外,还有一个非常非常重要的东西,那就是可视化表格的展现,而由于数字孪生可视化界面主要用于展示数据,因此在大部分应用场景中,它经常被放到各式各样的展示屏

  • 一文教你如何优雅的使用WebSocket

    目录 简介 特性 使用场景 具体实现 一.首先是服务端代码,这里我用的是nodejs. 二.然后是客户端代码 总结 简介 websocket是基于TCP的一种双向通信协议.在此之前,一直是采用轮询的方式进行双向通信,这种方式效率低下还非常浪费资源.为了解决这种问题,websocket应运而生. 特性 双向通信:websocket使得客户端跟服务端之间交换数据变得更加简单.允许服务器主动向客户端推送数据.浏览器只需要和服务器完成一次握手,就可以创建持久性的连接,并进行双向数据传输. 实时性强: 服

  • vue发送websocket请求和http post请求的实例代码

    先给大家介绍下vue发送websocket请求和http post请求 直接上代码: pdf.vue <script> import SockJS from 'sockjs-client'; import Stomp from 'stompjs'; import qs from "qs" export default { name: "pdf", data() { return { newsData: [], tagGuid_mx: "&quo

  • Go 实现 WebSockets之创建 WebSockets

    目录 前言 建立 HTTP 服务器 发起握手 WebSockets 的用例 总结 前言 上一篇文章Go 实现 WebSockets和什么是 WebSockets我们先介绍了什么是 WebSockets 协议.本篇文章将来介绍如何利用 Go 来实现一个 WebSockets.要基于 net/http 库编写一个简单的 WebSocket 响应服务器,我们需要: 建立握手 从客户端接收数据帧 向客户端发送数据帧 关闭握手 WebSockets 无需客户端事先请求即可从服务器传输数据,允许来回传递消息

  • Websocket通信协议在数字孪生中的应用

    目录 写在前面 数字孪生中的通讯协议 Websocket 是什么 Websocket 配置 基于 Node.js 的 Websocket 服务器搭建 基于Vue 的 Websocket 客户端搭建 通过 Websocket 更新 Echart 表格数据(基于 Vue + node) 搭建 echart 柱状图结构 添加柱状图初始化参数 添加柱状图更新函数 添加 Websocket 连接与接收数据函数 向 Websocket Server 添加生成随机数据的函数 添加数据监控函数,即数据更新函数

  • C语言从猜数字游戏中理解数据结构

    目录 1 猜数字游戏-问题描述 2 问题分析 3 问题解决 3.1 猜一次 3.2 直到猜到为止 3.3 限定猜10次 3.4 处理特殊情况 3.5 猜下一个数 1 猜数字游戏-问题描述 这个游戏一点都不陌生,猜价格是一度很火的综艺节目.很多老师也用这个案例作为课堂案例.在这里,我想把重点放到“思维层面上”,即:为什么要这样写代码,就实现了猜数字游戏的功能. 我们先来说真人版的猜数字游戏: A:心里默默出一个数字(约定一个范围,假设[1-100]之间),开始猜把 B猜:50 A: 大了 B猜:2

  • Vue实现数字输入框中分割手机号码的示例

    需求 在移动端弹出系统数字键盘,输入手机号码的时候,使用344形式分割. 分析: 首先,如果要在移动端弹出数字键盘,并且还可以有空格,那么就要使用type="phone"的input框 如果要实现输入的时候增加空格,删除的时候减少空格,那么就要使用watch 手机号码为11位,加上两个空格,最多13位,因此要限定长度 代码实现 <body> <div id="app"> <!-- 类型为phone,最大长度为13 --> <

  • 如何用PHP websocket实现网页实时聊天

    前言 最近艰难地"挤"出了一点时间,完善了很早之前做的 websocket "请求-原样返回"服务器,用js完善了下客户端功能,把过程和思路分享给大家,顺便也普及一下 websocket 相关的知识,当然现在讨论 websocket 的文章也特别多,有些理论性的东西我也就略过了,给出参考文章供大家选择阅读. 正文开始前,先贴一张聊天室的效果图(请不要在意CSS渣的页面): websocket 简介 WebSocket 不是一门技术,而是一种全新的协议.它应用 TCP

  • SQL Server中检查字段的值是否为数字的方法

    最近有一个项目,需要检查某个字符型字段的值是否为数字,由于数据行是海量,所以需要通过SQL语句来筛查,这里拿来做个备忘. 用到的函数为IsNumeric,具体语句如下所示: 复制代码 代码如下: SELECT * FROM 表 WHERE IsNumeric(需要检查的字段名) = 0 ISNUMERIC  确定表达式是否为一个有效的数字类型.       语法    ISNUMERIC   (   expression   )       参数    expression       要计算的

  • 如何理解python中数字列表

    数字列表和其他列表类似,但是有一些函数可以使数字列表的操作更高效.我们创建一个包含10个数字的列表,看看能做哪些工作吧. # Print out the first ten numbers. numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for number in numbers: print(number) range() 函数 普通的列表创建方式创建10个数是可以的,但是如果想创建大量的数字,这种方法就不合适了.range() 函数就是帮助我们生成大量数

  • vue 项目中使用websocket的正确姿势

    1. 在utils下新建websocket.js文件 // import { showInfoMsg, showErrorMsg } from '@/utils/popInfo' import ElementUI from 'element-ui'; function initWebSocket(e) { console.log(e) const wsUri = WS_API + "/webSocket/" + e; this.socket = new WebSocket(wsUri)

  • vue项目中使用websocket的实现

    什么是websocket? “WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输.在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送.

  • 详解javaScript中Number数字类型的使用

    目录 前言 Number数字 自带属性值 基础使用 总结 源码地址 前言 Number和Math都属于JavaScript中的内置对象,Number数字类型作为基础数据类型,我们在开发过程中会经常用到,包括数字精度的格式化,还有字符串转换成数字等操作. Number数字 自带属性值 Number.EPSILON 两个可表示(representable)数之间的最小间隔. Number.MAX_SAFE_INTEGER JavaScript 中最大的安全整数 (2^53 - 1). Number.

随机推荐