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 <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服务器
  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

Markdown preferences pane
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容