qlf00 2017-02-15
1、 什么是MQTT?
MQTT(MessageQueueing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是由IBM公司推出的一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。由于其开放、简单和易于实现所以能够应用在资源受限的环境中,对于M2M和物联网应用程序来说是一个相当不错的选择。
2、 为什么要用MQTT?
MQTT协议是针对如下情况设计的:
M2M(Machine to Machine) communication,机器端到端通信,比如传感器之间的数据通讯 因为是Machine to Machine,需要考虑: Machine,或者叫设备,比如温度传感器,硬件能力很弱,协议要考虑尽量小的资源消耗,比如计算能力和存储等 M2M可能是无线连接,网络不稳定,带宽也比较小
MQTT的特点:
1.发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。这一点很类似于1. 这里是列表文本XMPP,但是MQTT的信息冗余远小于XMPP.
2.对负载内容屏蔽的消息传输。
3.使用TCP/IP提供网络连接。主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。
4.三种消息传输方式QoS:
5.小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。这就是为什么在介绍里说它非常适合“在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。
6.使用Last Will和Testament特性通知有关各方客户端异常中断的机制。Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。Testament:遗嘱机制,功能类似于Last Will 。
3、 怎么使用MQTT
在mac上搭建MQTT服务器
$ brew install mosquitto
等待下载完成,服务会自动运行起来
mosquitto has been installed with a default configuration file. You can make changes to the configuration by editing: /usr/local/etc/mosquitto/mosquitto.conf To have launchd start mosquitto now and restart at login: brew services start mosquitto Or, if you don't want/need a background service you can just run: mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf
iOS client注册
#import "ViewController.h" #define kMQTTServerHost @"iot.eclipse.org" #define kTopic @"MQTTExample/Message" @interface ViewController () @property (weak, nonatomic) IBOutlet UILabel *showMessage; @property (nonatomic, strong) MQTTClient *client; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //1.在app登录后,后台返回 name+password+topic //2.name+password用于连接主机 //3.topic 用于订阅主题 UILabel *tempShowMessage = self.showMessage; NSString *clientID = [UIDevice currentDevice].identifierForVendor.UUIDString; self.client = [[MQTTClient alloc] initWithClientId:clientID]; //连接服务器 连接后,会通过block将连接结果code返回,然后执行此段代码块 //这个接口是修改过后的接口,修改后抛出了name+password [self.client connectToHost:kMQTTServerHost andName:@"cbt" andPassword:@"1223" completionHandler:^(MQTTConnectionReturnCode code) { if (code == ConnectionAccepted)//连接成功 { // 订阅 [self.client subscribe:kTopic withCompletionHandler:^(NSArray *grantedQos) { // The client is effectively subscribed to the topic when this completion handler is called NSLog(@"subscribed to topic %@", kTopic); NSLog(@"return:%@",grantedQos); }]; } }]; //MQTTMessage 里面的数据接收到的是二进制,这里框架将其封装成了字符串 [self.client setMessageHandler:^(MQTTMessage* message) { dispatch_async(dispatch_get_main_queue(), ^{ //接收到消息,更新界面时需要切换回主线程 tempShowMessage.text= message.payloadString; }); }]; } - (void)dealloc8 { // disconnect the MQTT client [self.client disconnectWithCompletionHandler:^(NSUInteger code) { // The client is disconnected when this completion handler is called NSLog(@"MQTT is disconnected"); }]; } @end