MQTT总结
使用MQTT以订阅消息的方式保持客户端和服务端的通讯。MQTT 是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议
参考文档:
iOS MQTT----MQTTClient实战-看这篇的就够了 http://www.jianshu.com/p/80ea4507ca74
百度云MQTT服务:https://cloud.baidu.com/doc/IOT/Mqttclient.html#.E5.8F.91.E5.B8.83.E6.B6.88.E6.81.AF
MQTT机制
MQTT的机制是:客户端A、MQTT服务器、客户端B ,之间的通讯。初始化时,首先客户端A和客户端B同时向MQTT服务器订阅了主题,然后客户端B向MQTT服务器发布消息,MQTT检查到客户端A订阅了该主题,于是实现了A和B客户端之间的通讯。
通讯机制:
pver
应用场景
MQTT是一个设计得非常出色的传输层协议,在移动消息、物联网、车联网、智能硬件甚至能源勘探等领域有着广泛的应用。1个字节报头、2个字节心跳、消息QoS支持等设计,非常适合在低带宽、不可靠网络、嵌入式设备上应用。
iOS MQTT实战
导入MQTTClient框架
代码
MQTTCFSocket transport = [[MQTTCFSocketTransport alloc] init]; transport.host = MQTTHost; transport.port = MQTTPort; self.session = [[MQTTSession alloc] init]; self.session.tranport = transport; [self.session setPassword:MQTTPassWord]; [self.session setUserName:MQTTUserName]; [self.session connectAndWaitTimeout:1]; //订阅主题 + (void)subscribeTopic:(MQTTSession *)session ToTopic:(NSString *)topicUrl { [session subscribeToTopic:topicUrl atLevel:MQTTQosLevelAtMostOnce subscribeHandler:^(NSError *error, NSArray *gQoss) { if (error) { } else { } }]; } //实现session代理 - (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel *)qos retained:(BOOL)retained mid:(usigned int)mid { //这个是代理回调方法,接收的数据可以在这里进行处理。 }
over
常见问题
1.先说常用的属性,如果你一直把mqtt开着,你不处理,那么mqtt一直会有数据返回,我这边就是1秒一次,然后一堆数据....
在刚开始的时候,初始化了 MQTTSession 的对象,看截图
[self.mySession disconnect] 断开连接 对应的就是 [self.mySession connect] 重新连接
如果不需要mqtt了,记得close,不然mqtt还会返回数据.
[self.session unsubscribeTopic:topic]; //取消订阅主题 [self.session disconnect];//断开连接 [self.session close]; // mqtt 关闭
2、在正常情况下,你的mqtt成功订阅了主题,那么它会一直在监听服务器是否有数据返回,但是有的时候嘛,你会遇到下面这中情况,mqtt停止了,当然排除你自己 close的情况外.
这种情况就很坑爹啦,你用mqtt的目的是啥,就是要实时监控嘛。。。。
在我查询的资料中有几种解释:
前提是你家的服务器一直在发送数据,而不是停掉了
2.1 你的clientID,没有设置,简单说明,你有一个账号是老王,那么你登录了,你的同事也登录了,这个时候,mqtt会自动掉线。
self.mySession.clientId 有这个属性,我咨询过后台,说移动端要设置,设置成功就可以避免,但是如果你用的是,MQTTClient 这个,完全不用,因为别人已经处理好了,可以自己点击进去看看,那么如果你用的是其他的第三方,clientId需要取随机数,不能相同.
2.2 碰到上面这个问题咋办呢,MQTTClient 没有断线重连的机制,也可能是我没找到,哪位小伙伴看到了也麻烦告诉我一声.
这个时候,你需要监听消息的状态,就可以处理了,来看看,self.mySession.status的值
2.3 介绍两种监听方法:
KVO和定时器
over
MQTT.fx使用
MQTT.fx客户端可以用来作为 MQTT客户端使用,向MQTT代理服务器订阅主题和发布主题。
具体的配置如下:
MQTT服务器地址 1、Broker Address : testv2.wulian.cc MQTT服务器端口 2、Broker Port 客户端唯一id,iOS通过UDID获取,在订阅消息时需要用到 3、Client ID: General : User Credentials: 必须设置用户名和密码
over
搭建MQTT服务器 mosquito
官网:http://mosquitto.org/download/
$ brew install mosquittto $ vi /usr/local/Cellar/mosquitto/版本/etc/mosquitto/mosquitto.conf #配置文件
# ================================================================= # General configuration # ================================================================= # 客户端心跳的间隔时间 #retry_interval 20 # 系统状态的刷新时间 #sys_interval 10 # 系统资源的回收时间,0表示尽快处理 #store_clean_interval 10 # 服务进程的PID #pid_file /var/run/mosquitto.pid # 服务进程的系统用户 #user mosquitto # 客户端心跳消息的最大并发数 #max_inflight_messages 10 # 客户端心跳消息缓存队列 #max_queued_messages 100 # 用于设置客户端长连接的过期时间,默认永不过期 #persistent_client_expiration # ================================================================= # Default listener # ================================================================= # 服务绑定的IP地址 #bind_address # 服务绑定的端口号 #port 1883 # 允许的最大连接数,-1表示没有限制 #max_connections -1 # cafile:CA证书文件 # capath:CA证书目录 # certfile:PEM证书文件 # keyfile:PEM密钥文件 #cafile #capath #certfile #keyfile # 必须提供证书以保证数据安全性 #require_certificate false # 若require_certificate值为true,use_identity_as_username也必须为true #use_identity_as_username false # 启用PSK(Pre-shared-key)支持 #psk_hint # SSL/TSL加密算法,可以使用“openssl ciphers”命令获取 # as the output of that command. #ciphers # ================================================================= # Persistence # ================================================================= # 消息自动保存的间隔时间 #autosave_interval 1800 # 消息自动保存功能的开关 #autosave_on_changes false # 持久化功能的开关 persistence true # 持久化DB文件 #persistence_file mosquitto.db # 持久化DB文件目录 #persistence_location /var/lib/mosquitto/ # ================================================================= # Logging # ================================================================= # 4种日志模式:stdout、stderr、syslog、topic # none 则表示不记日志,此配置可以提升些许性能 log_dest none # 选择日志的级别(可设置多项) #log_type error #log_type warning #log_type notice #log_type information # 是否记录客户端连接信息 #connection_messages true # 是否记录日志时间 #log_timestamp true # ================================================================= # Security # ================================================================= # 客户端ID的前缀限制,可用于保证安全性 #clientid_prefixes # 允许匿名用户 #allow_anonymous true # 用户/密码文件,默认格式:username:password #password_file # PSK格式密码文件,默认格式:identity:key #psk_file # pattern write sensor/%u/data # ACL权限配置,常用语法如下: # 用户限制:user <username> # 话题限制:topic [read|write] <topic> # 正则限制:pattern write sensor/%u/data #acl_file # ================================================================= # Bridges # ================================================================= # 允许服务之间使用“桥接”模式(可用于分布式部署) #connection <name> #address <host>[:<port>] #topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix] # 设置桥接的客户端ID #clientid # 桥接断开时,是否清除远程服务器中的消息 #cleansession false # 是否发布桥接的状态信息 #notifications true # 设置桥接模式下,消息将会发布到的话题地址 # $SYS/broker/connection/<clientid>/state #notification_topic # 设置桥接的keepalive数值 #keepalive_interval 60 # 桥接模式,目前有三种:automatic、lazy、once #start_type automatic # 桥接模式automatic的超时时间 #restart_timeout 30 # 桥接模式lazy的超时时间 #idle_timeout 60 # 桥接客户端的用户名 #username # 桥接客户端的密码 #password # bridge_cafile:桥接客户端的CA证书文件 # bridge_capath:桥接客户端的CA证书目录 # bridge_certfile:桥接客户端的PEM证书文件 # bridge_keyfile:桥接客户端的PEM密钥文件 #bridge_cafile #bridge_capath #bridge_certfile #bridge_keyfile
启动mqtt服务器
直接运行命令行“
mosquitto -c /usr/local/Cellar/mosquitto/1.3.5/etc/mosquitto/mosquitto.conf -d
”即可开启服务如果没有将命令添加到环境变量,需要到sbin目录下执行以上命令。或者在终端执行sbin:
$ /usr/local/Cellar/mosquitto/1.4.11_2/sbin/mosquitto
如果不想用命令启动的话。也可以直接进入
/usr/local/Cellar/mosquitto/1.4.11_2/sbin
目录下,点击相应的脚本执行文件,就会自动启动。配置MQTT.fx客户端:
1、Host; 127.0.0.1 2、port: 1883 3、username 、password 可以不设置(mqtt服务器默认没有设置)
MQTT服务器端口被占用
$ lsof -i:1883 $ 1883端口被占用 $ sudo kill -9 PID #删除占用该端口的进程
over
常见问题
- MQTT.fix软件的使用。设置host、端口等参数、设置用户名密码等参数、连接、查看日志。
- MQTT服务器端口被占用。
- 客户端A、MQTT服务器、客户端B。三端通讯机制。
- MQTT.fix 其实是当做客户端用。物联app作为另一个客户端,必须删除transport和tls加密等信息。才能联通mqtt服务器。
MQTT客户端安装
- M*****QTT.**FX 是目前主流的mqtt客户端,可以快速验证是否可以与IoT Hub 服务交流发布或订阅消息。
MQTT.FX官网
MQTT.FX相关文档Looks kinda ugly though.
Block quotes can be nested.
Multiple Levels