MQTT总结

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实战
  1. 导入MQTTClient框架

  2. 代码

    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 {
      //这个是代理回调方法,接收的数据可以在这里进行处理。
    }
    
  3. 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     
# 话题限制:topic [read|write]     
# 正则限制:pattern write sensor/%u/data    
#acl_file    
    
# =================================================================    
# Bridges    
# =================================================================    
    
# 允许服务之间使用“桥接”模式(可用于分布式部署)    
#connection     
#address [:]    
#topic  [[[out | in | both] qos-level] local-prefix remote-prefix]    
    
# 设置桥接的客户端ID    
#clientid    
    
# 桥接断开时,是否清除远程服务器中的消息    
#cleansession false    
    
# 是否发布桥接的状态信息    
#notifications true    
    
# 设置桥接模式下,消息将会发布到的话题地址    
# $SYS/broker/connection//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服务器
  1. 直接运行命令行“mosquitto -c /usr/local/Cellar/mosquitto/1.3.5/etc/mosquitto/mosquitto.conf -d”即可开启服务

  2. 如果没有将命令添加到环境变量,需要到sbin目录下执行以上命令。或者在终端执行sbin:

    $ /usr/local/Cellar/mosquitto/1.4.11_2/sbin/mosquitto
    
  3. 如果不想用命令启动的话。也可以直接进入/usr/local/Cellar/mosquitto/1.4.11_2/sbin目录下,点击相应的脚本执行文件,就会自动启动。

  4. 配置MQTT.fx客户端:

    1、Host; 127.0.0.1
    2、port: 1883
    3、username 、password 可以不设置(mqtt服务器默认没有设置)
    
  5. MQTT服务器端口被占用

    $ lsof -i:1883
    $ 1883端口被占用
    $ sudo kill -9 PID #删除占用该端口的进程
    
  6. over

常见问题
  1. MQTT.fix软件的使用。设置host、端口等参数、设置用户名密码等参数、连接、查看日志。
  2. MQTT服务器端口被占用。
  3. 客户端A、MQTT服务器、客户端B。三端通讯机制。
  4. 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

MQTT总结_第1张图片
Markdown preferences pane

你可能感兴趣的:(MQTT总结)