网站内部优化建设,网站设计网站设计网站设计,网站建设与维护的不足,公司网站可以自己做吗也许很多人都好奇这个mqtt是什么东西#xff0c;其实在互联网上可能不会使用到它#xff0c;它是物联网上的东西#xff0c;也是一种通信协议跟websocket。但它也能在浏览器跟服务器上跑#xff0c;它的底层实现也是封装了websocket。 MQTT 
MQTT是一个客户端服务端架构的发… 也许很多人都好奇这个mqtt是什么东西其实在互联网上可能不会使用到它它是物联网上的东西也是一种通信协议跟websocket。但它也能在浏览器跟服务器上跑它的底层实现也是封装了websocket。 MQTT 
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范易于实现。这些特点使得它对很多场景来说都是很好的选择特别是对于受限的环境如机器与机器的通信M2M以及物联网环境IoT。 本协议运行在TCP/IP或其它提供了有序、可靠、双向连接的网络连接上。它有以下特点 
使用发布/订阅消息模式提供了一对多的消息分发和应用之间的解耦。 消息传输不需要知道负载内容。 提供三种等级的服务质量. 
“最多一次”尽操作环境所能提供的最大努力分发消息。消息可能会丢失。例如这个等级可用于环境传感器数据单次的数据丢失没关系因为不久之后会再次发送。“至少一次”保证消息可以到达但是可能会重复。“仅一次”保证消息只到达一次。例如这个等级可用在一个计费系统中这里如果消息重复或丢失会导致不正确的收费。 很小的传输消耗和协议数据交换最大限度减少网络流量 
异常连接断开发生时能通知到相关各方。 
常见API 
mqtt.connect()mqtt.Client()mqtt.Client#publish()mqtt.Client#subscribe()mqtt.Client#unsubscribe()mqtt.Client#end()mqtt.Client#removeOutgoingMessage()mqtt.Client#reconnect()mqtt.Client#handleMessage()mqtt.Client#connectedmqtt.Client#reconnectingmqtt.Client#getLastMessageId()mqtt.Store()mqtt.Store#put()mqtt.Store#del()mqtt.Store#createStream()mqtt.Store#close() 
使用 
import * as mqtt from mqtt/dist/mqtt
var clientMqtt  null //mqtt实例
let defalutTopic  export const connectMqtt  (baseURL, userId,uuid)  {return new Promise(async(resolve, reject)  {let message  {id: ${userId},type: login,msg: 0,optional:new Date(),deviceId:uuid}const options  {keepalive: 30,protocolId: MQTT,protocolVersion: 4,clean: true,reconnectPeriod: 3000,connectTimeout: 30 * 1000,clientId: mqtt  Math.random().toString(16).substr(2, 8),will: {topic: api/user/${userId}/login,payload: JSON.stringify(message),qos: 0,retain: false},rejectUnauthorized: false};if (!clientMqtt) {//如果没有clientMatt 说明还没链接  就链接一下clientMqtt  await mqtt.connect(baseURL, options);await  clientMqtt?.on(error, (error)  {clientMqtt?.end()reject(链接失败)})await clientMqtt?.on(connect, ()  {resolve(链接成功)});} else {//如果已经存在clientMqtt,就说明已经链接成功resolve(链接成功)}})
}订阅了才能接受信息 
export const subscribeMqtt  (topic  defalutTopic, qos  1)  {return new Promise((resolve, reject)  {clientMqtt?.subscribe(topic, qos, (err)  {if (err) {reject(订阅失败)} else {// console.log(topic, 订阅);resolve(订阅成功)}});})
}取消订阅 
export const unSubscribeMqtt  (unTopic)  {return new Promise((resolve, reject)  {clientMqtt?.unsubscribe(unTopic, (err)  {if (err) {reject(失败)} else {console.log(unTopic, 取消订阅);resolve(取消成功)}})})
}topic 发布 
export const pubilshMqtt  (topic, message)  {let options  {qos: 0,retain: false,}return new Promise((resolve, reject)  {clientMqtt?.publish(topic, JSON.stringify(message), { ...options }, (error)  {if (error) {reject(发布信息失败)} else {resolve(发布信息成功)}})})
}结束 
export const endMqtt  async ()  {return new Promise((resolve, reject)  {clientMqtt?.end((error)  {if (error) {reject(关闭失败)} else {clientMqtt  nullresolve(关闭成功)}})})
}消息接收 
export const messageMqtt  (reciveMessageMqtt)  {clientMqtt?.on(message,(topic, message,packet)  {if (packet.length0) {reciveMessageMqtt(topic, JSON.parse(message))}})
}注意 
on.(message)这个方法与其它的是不同的它会保存在clientMqtt中直到clientMqtt实例销毁。不然就会叠加消息这个bug我找了两天。 
WebSocket 
WebSocket 是一种网络通信协议很多高级功能都需要它。 
初次接触 WebSocket 的人都会问同样的问题我们已经有了 HTTP 协议为什么还需要另一个协议它能带来什么好处 
答案很简单因为 HTTP 协议有一个缺陷通信只能由客户端发起。举例来说我们想了解今天的天气只能是客户端向服务器发出请求服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。HTTP 协议的这种单向请求的特点注定了如果服务器有连续的状态变化客户端要获知就非常麻烦。我们只能使用“轮询”每隔一段时候就发出一个询问了解服务器有没有新的信息。最典型的场景就是聊天室。 
轮询的效率低非常浪费资源因为必须不停连接或者 HTTP 连接始终打开。因此工程师们一直在思考有没有更好的方法。WebSocket 就是这样发明的。 
简介 
WebSocket 协议在2008年诞生2011年成为国际标准。所有浏览器都已经支持了。 
它的最大特点就是服务器可以主动向客户端推送信息客户端也可以主动向服务器发送信息是真正的双向平等对话属于服务器推送技术的一种。WebSocket 允许服务器端与客户端进行全双工full-duplex的通信。举例来说HTTP 协议有点像发电子邮件发出后必须等待对方回信WebSocket 则是像打电话服务器端和客户端可以同时向对方发送数据它们之间存着一条持续打开的数据通道。 
其他特点包括 
1建立在 TCP 协议之上服务器端的实现比较容易。 
2与 HTTP 协议有着良好的兼容性。默认端口也是80和443并且握手阶段采用 HTTP 协议因此握手时不容易屏蔽能通过各种 HTTP 代理服务器。 
3数据格式比较轻量性能开销小通信高效。 
4可以发送文本也可以发送二进制数据。 
5没有同源限制客户端可以与任意服务器通信完全可以取代 Ajax。 
6协议标识符是ws如果加密则为wss对应 HTTPS 协议服务器网址就是 URL。 
ws://example.com:80/some/pathWebSocket 握手 
浏览器发出的 WebSocket 握手请求类似于下面的样子 
GET / HTTP/1.1
Connection: Upgrade
Upgrade: websocket
Host: example.com
Origin: null
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ
Sec-WebSocket-Version: 13上面的头信息之中有一个 HTTP 头是Upgrade。HTTP1.1 协议规定Upgrade字段表示将通信协议从HTTP/1.1转向该字段指定的协议。Connection字段表示浏览器通知服务器如果可以的话就升级到 WebSocket 协议。Origin字段用于提供请求发出的域名供服务器验证是否许可的范围内服务器也可以不验证。Sec-WebSocket-Key则是用于握手协议的密钥是 Base64 编码的16字节随机字符串。 
服务器的 WebSocket 回应如下。 
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://example.com/上面代码中服务器同样用Connection字段通知浏览器需要改变协议。Sec-WebSocket-Accept字段是服务器在浏览器提供的Sec-WebSocket-Key字符串后面添加 RFC6456 标准规定的“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”字符串然后再取 SHA-1 的哈希值。浏览器将对这个值进行验证以证明确实是目标服务器回应了 WebSocket 请求。Sec-WebSocket-Location字段表示进行通信的 WebSocket 网址。 
完成握手以后WebSocket 协议就在 TCP 协议之上开始传送数据。 
客户端的简单示例 
WebSocket 的用法相当简单。 
下面是一个网页脚本的例子基本上一眼就能明白。 
var ws  new WebSocket(wss://echo.websocket.org);ws.onopen  function(evt) {console.log(Connection open ...);ws.send(Hello WebSockets!);
};ws.onmessage  function(evt) {console.log(Received Message:   evt.data);ws.close();
};ws.onclose  function(evt) {console.log(Connection closed.);
};客户端 API 
浏览器对 WebSocket 协议的处理无非就是三件事。 
建立连接和断开连接发送数据和接收数据处理错误 
构造函数 WebSocket 
WebSocket对象作为一个构造函数用于新建WebSocket实例。 
var ws  new WebSocket(ws://localhost:8080);执行上面语句之后客户端就会与服务器进行连接。 
webSocket.readyState 
readyState属性返回实例对象的当前状态共有四种。 
CONNECTING值为0表示正在连接。OPEN值为1表示连接成功可以通信了。CLOSING值为2表示连接正在关闭。CLOSED值为3表示连接已经关闭或者打开连接失败。 
下面是一个示例。 
switch (ws.readyState) {case WebSocket.CONNECTING:// do somethingbreak;case WebSocket.OPEN:// do somethingbreak;case WebSocket.CLOSING:// do somethingbreak;case WebSocket.CLOSED:// do somethingbreak;default:// this never happensbreak;
}webSocket.onopen 
实例对象的onopen属性用于指定连接成功后的回调函数。 
ws.onopen  function () {ws.send(Hello Server!);
}如果要指定多个回调函数可以使用addEventListener方法。 
ws.addEventListener(open, function (event) {ws.send(Hello Server!);
});webSocket.onclose 
实例对象的onclose属性用于指定连接关闭后的回调函数。 
ws.onclose  function(event) {var code  event.code;var reason  event.reason;var wasClean  event.wasClean;// handle close event
};ws.addEventListener(close, function(event) {var code  event.code;var reason  event.reason;var wasClean  event.wasClean;// handle close event
});webSocket.onmessage 
实例对象的onmessage属性用于指定收到服务器数据后的回调函数。 
ws.onmessage  function(event) {var data  event.data;// 处理数据
};ws.addEventListener(message, function(event) {var data  event.data;// 处理数据
});注意服务器数据可能是文本也可能是二进制数据blob对象或Arraybuffer对象。 
ws.onmessage  function(event){if(typeOf event.data  String) {console.log(Received data string);}if(event.data instanceof ArrayBuffer){var buffer  event.data;console.log(Received arraybuffer);}
}除了动态判断收到的数据类型也可以使用binaryType属性显式指定收到的二进制数据类型。 
// 收到的是 blob 数据
ws.binaryType  blob;
ws.onmessage  function(e) {console.log(e.data.size);
};// 收到的是 ArrayBuffer 数据
ws.binaryType  arraybuffer;
ws.onmessage  function(e) {console.log(e.data.byteLength);
};webSocket.send() 
实例对象的send()方法用于向服务器发送数据。 
发送文本的例子。 
ws.send(your message);发送 Blob 对象的例子。 
var file  document.querySelector(input[typefile]).files[0];
ws.send(file);发送 ArrayBuffer 对象的例子。 
// Sending canvas ImageData as ArrayBuffer
var img  canvas_context.getImageData(0, 0, 400, 320);
var binary  new Uint8Array(img.data.length);
for (var i  0; i  img.data.length; i) {binary[i]  img.data[i];
}
ws.send(binary.buffer);webSocket.bufferedAmount 
实例对象的bufferedAmount属性表示还有多少字节的二进制数据没有发送出去。它可以用来判断发送是否结束。 
var data  new ArrayBuffer(10000000);
socket.send(data);if (socket.bufferedAmount  0) {// 发送完毕
} else {// 发送还没结束
}webSocket.onerror 
实例对象的onerror属性用于指定报错时的回调函数。 
socket.onerror  function(event) {// handle error event
};socket.addEventListener(error, function(event) {// handle error event
});WebSocket 服务器 
WebSocket 协议需要服务器支持。各种服务器的实现可以查看维基百科的列表。 
常用的 Node 实现有以下三种。 
µWebSocketsSocket.IOWebSocket-Node 
具体的用法请查看它们的文档本教程不详细介绍了。 
总结 
相同点 
MQTT 和 WebSocket 都是应用层协议目前底层都是使用 TCP 协议确保可靠传输数据都规定了自己的报文消息结构都支持双向通信都使用二进制编码有别于 HTTP 这一类基于文本编码的协议都是公开标准 
不同 
通信模型不同WebSocket 是一种简单的报文协议着重解决浏览器和服务端不能进行双向通信的问题。MQTT 则是一种比较复杂的消息协议。报文结构不同虽然两都均使用二进行编码但 WebSocket 的报文要远比 MQTT 简单。消息收发方式不同。WebSocket 收发消息不需要对方确认。MQTT 收发消息需要根据投递级别进行确认。保活机制不同。WebSocket 只规定了 ping/pong 两种报文但并不强制要求定时收发心跳包。MQTT 则有明确的心跳协商机制。 
最后 
MQTT 主要应用在物联网等场景WebSocket 因为有配套的浏览器API主要应用在 Web 开发领域。但两者均为通用的应用层协议可以在任何相关的场景使用。MQTT和WebSocket都是面向报文的二进制传输协议。WebSocket更简单更灵活MQTT相对复杂但功能强大。大家可以根据自己的使用场景按需选择。 
参考链接 
Ryan Stewart, Real-time data exchange in HTML5 with WebSocketsMalte Ubl  Eiji KitamuraIntroducing WebSockets: Bringing Sockets to the WebJack Lawson, WebSockets: A GuideMichael W., Starting with Node and Web SocketsJesse Cravens, Introduction to WebSocketsMatt West, An Introduction to WebSocketsMaciej Sopyło, Node.js: Better Performance With Socket.IO and doTJos Dirksen, Capture Canvas and WebGL output as video using websocketsFionn Kellehe, Understanding Socket.IOHow to Use WebSocketsWebSockets - Send  Receive Messages 文章转载自: http://www.morning.mgbcf.cn.gov.cn.mgbcf.cn http://www.morning.smhtg.cn.gov.cn.smhtg.cn http://www.morning.zknjy.cn.gov.cn.zknjy.cn http://www.morning.pxwjp.cn.gov.cn.pxwjp.cn http://www.morning.lqlfj.cn.gov.cn.lqlfj.cn http://www.morning.ngcw.cn.gov.cn.ngcw.cn http://www.morning.ljfjm.cn.gov.cn.ljfjm.cn http://www.morning.zylzk.cn.gov.cn.zylzk.cn http://www.morning.spftz.cn.gov.cn.spftz.cn http://www.morning.rlhjg.cn.gov.cn.rlhjg.cn http://www.morning.nrtpb.cn.gov.cn.nrtpb.cn http://www.morning.wnnlr.cn.gov.cn.wnnlr.cn http://www.morning.gfjgq.cn.gov.cn.gfjgq.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.xhgxd.cn.gov.cn.xhgxd.cn http://www.morning.msbct.cn.gov.cn.msbct.cn http://www.morning.fbxdp.cn.gov.cn.fbxdp.cn http://www.morning.bhpjc.cn.gov.cn.bhpjc.cn http://www.morning.xkyst.cn.gov.cn.xkyst.cn http://www.morning.jwxnr.cn.gov.cn.jwxnr.cn http://www.morning.chtnr.cn.gov.cn.chtnr.cn http://www.morning.pbmg.cn.gov.cn.pbmg.cn http://www.morning.ssqrd.cn.gov.cn.ssqrd.cn http://www.morning.cbqqz.cn.gov.cn.cbqqz.cn http://www.morning.nzwp.cn.gov.cn.nzwp.cn http://www.morning.wwjft.cn.gov.cn.wwjft.cn http://www.morning.gzzxlp.com.gov.cn.gzzxlp.com http://www.morning.ltxgk.cn.gov.cn.ltxgk.cn http://www.morning.xmwdt.cn.gov.cn.xmwdt.cn http://www.morning.spbp.cn.gov.cn.spbp.cn http://www.morning.zzbwjy.cn.gov.cn.zzbwjy.cn http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.juju8.cn.gov.cn.juju8.cn http://www.morning.hlyfn.cn.gov.cn.hlyfn.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.jypsm.cn.gov.cn.jypsm.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.nxdqz.cn.gov.cn.nxdqz.cn http://www.morning.rmxwm.cn.gov.cn.rmxwm.cn http://www.morning.lwxsy.cn.gov.cn.lwxsy.cn http://www.morning.fqtdz.cn.gov.cn.fqtdz.cn http://www.morning.kzdgz.cn.gov.cn.kzdgz.cn http://www.morning.sqtsl.cn.gov.cn.sqtsl.cn http://www.morning.sqhtg.cn.gov.cn.sqhtg.cn http://www.morning.dycbp.cn.gov.cn.dycbp.cn http://www.morning.zmwzg.cn.gov.cn.zmwzg.cn http://www.morning.chkfp.cn.gov.cn.chkfp.cn http://www.morning.gtjkh.cn.gov.cn.gtjkh.cn http://www.morning.rhqr.cn.gov.cn.rhqr.cn http://www.morning.gbfck.cn.gov.cn.gbfck.cn http://www.morning.cttti.com.gov.cn.cttti.com http://www.morning.qqhfc.cn.gov.cn.qqhfc.cn http://www.morning.jhzct.cn.gov.cn.jhzct.cn http://www.morning.wsgyq.cn.gov.cn.wsgyq.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.yqqgp.cn.gov.cn.yqqgp.cn http://www.morning.bnzjx.cn.gov.cn.bnzjx.cn http://www.morning.xmtzk.cn.gov.cn.xmtzk.cn http://www.morning.wxckm.cn.gov.cn.wxckm.cn http://www.morning.rfljb.cn.gov.cn.rfljb.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.gpnwq.cn.gov.cn.gpnwq.cn http://www.morning.qlhkx.cn.gov.cn.qlhkx.cn http://www.morning.mhmsn.cn.gov.cn.mhmsn.cn http://www.morning.kkrnm.cn.gov.cn.kkrnm.cn http://www.morning.nlgyq.cn.gov.cn.nlgyq.cn http://www.morning.fbdkb.cn.gov.cn.fbdkb.cn http://www.morning.rwbh.cn.gov.cn.rwbh.cn http://www.morning.phwmj.cn.gov.cn.phwmj.cn http://www.morning.yrjxr.cn.gov.cn.yrjxr.cn http://www.morning.jcrlx.cn.gov.cn.jcrlx.cn http://www.morning.pbtdr.cn.gov.cn.pbtdr.cn http://www.morning.dygsz.cn.gov.cn.dygsz.cn http://www.morning.kpcdc.cn.gov.cn.kpcdc.cn http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn http://www.morning.wkcl.cn.gov.cn.wkcl.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.yszrk.cn.gov.cn.yszrk.cn http://www.morning.qztdz.cn.gov.cn.qztdz.cn