MQTT和Websocket的区别是什么

MQTT和Websocket的区别是什么

MQTT 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如:

①网络代价昂贵,带宽低、不可靠②在嵌入设备中运行,处理器和内存资源有限。

该协议的特点有:

①使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。

②对负载内容屏蔽的消息传输。

③使用 TCP/IP 提供网络连接。

④有三种消息发布服务质量:

⑤至多一次,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

⑥至少一次,确保消息到达,但消息重复可能会发生。

⑦只有一次,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

⑧小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。

⑨使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

WebSocket则提供使用一个TCP连接进行双向通讯的机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯的机制。

本质上来说,WebSocket是不限于HTTP协议的,但是由于现存大量的HTTP基础设施,代理,过滤,身份认证等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP连接建立后的握手消息是基于HTTP的,由服务器判断这是一个HTTP协议,还是WebSocket协议。 WebSocket连接除了建立和关闭时的握手,数据传输和HTTP没丁点关系了。

由此可知两者的应用场景不一样:

MQTT是为了物联网场景设计的基于TCP的Pub/Sub协议,有许多为物联网优化的特性,比如适应不同网络的QoS、层级主题、遗言等等。

WebSocket是为了HTML5应用方便与服务器双向通讯而设计的协议,HTTP握手然后转TCP协议,用于取代之前的Server Push、Comet、长轮询等老旧实现。

两者之所有有交集,是因为一个应用场景:如何通过HTML5应用来作为MQTT的客户端,以便接受设备消息或者向设备发送信息,那么MQTT over WebSocket自然成了最合理的途径了。

怎么将消息发送到mqtt代理服务器

通过Cocoa Pods添加MQTTKit

MQTTKit在github上链接,down下来。

cd到工程目录,输入pod install,用xcode打开工程的打开xcworkspace扩展名的文件。

如果不是MQTTKit存在更新的版本,则输入pod update。

新建一个MQTT的服务请求

NSString *clientID = ...

MQTTClient *client = [[MQTTClient alloc] initWithClientId:clientID];

发送消息,每次发送消息包括目标host和本地MQTT消息.具体MQTT格式消息见代码。这里Host可以是Server的IP,不需要host表解析。

// connect to the MQTT server

[self.client connectToHost:@iot.eclipse.org

completionHandler:^(NSUInteger code) {

if (code == ConnectionAccepted) {

// when the client is connected, send a MQTT message

[self.client publishString:@Hello, MQTT

toTopic:@/MQTTKit/example

withQos:AtMostOnce

retain:NO

completionHandler:^(int mid) {

NSLog(@message has been delivered);

}];

}

}];

订阅主题并接受MQTT格式的消息,这部分在viewdidload中实现。

// define the handler that will be called when MQTT messages are received by the client

[self.client setMessageHandler:^(MQTTMessage *message) {

NSString *text = [message.payloadString];

NSLog(@received message %@, text);

}];

// connect the MQTT client

[self.client connectToHost:@iot.eclipse.org

completionHandler:^(MQTTConnectionReturnCode code) {

if (code == ConnectionAccepted) {

// when the client is connected, subscribe to the topic to receive message.

[self.client subscribe:@/MQTTKit/example

withCompletionHandler:nil];

}

}];

断开连接

[self.client disconnectWithCompletionHandler:^(NSUInteger code) {

// The client is disconnected when this completion handler is called

NSLog(@MQTT client is disconnected);

}];

整个连接建立、发送消息、接受消息、断开连接都是通过Block的消息机制来实现,因此需要对block有很好地理解。