1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;
3、使用 TCP/IP 提供网络连接;
4、有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;
首先推荐使用 MQTT-Client-FrameWork ,现在还一直维护,而且有什么问题提issue也有人回答,MQTT-Client-FrameWork 包提供的客户端类有 MQTTSession 和 MQTTSessionManager,建议使用后者维持静态资源,而且已经封装好自动重连等逻辑。初始化时需要传入相关的网络参数。具体如下:
---参数解释---
值为1,服务器需要立刻清理连接状态数据。
(tips:断线重连时 如果为yes,会自动订阅回消息,如果为no,则要手动订阅topic,不然会收不到消息)
双向认证方法:让后台生成 ca.crt 和 client.p12文件(client.p12文件由client.crt和client.key合成) 我使用的是自签证书
1.使用命令行把crt转化为der格式
// 获取服务器返回数据
另外提供一个未封装的session的双向认证方法:
参考:
新建一个类VPKCClientManagerVPKCClientManager.h代码如下
#import
#import "MQTTKit.h"
@interface VPKCClientManager : NSObject
+ (instancetype)sharedClient
- (void)subscribeMessageWithMessageHandler:(void(^)(NSDictionary*dict))messageHandler
@end
VPKCClientManager.m代码如下
#import "VPKCClientManager.h"
#define MQTT_HOST @"**************"//MQTT服务器网址 什么?你们后台不会搭建MQTT服务器 呵呵。。
static VPKCClientManager *instance = nil
@implementation VPKCClientManager
{
MQTTClient *client
}
+ (instancetype)sharedClient
{
//这里用到了单例 个人感觉不用也行
static dispatch_once_t onceToken
dispatch_once(&onceToken, ^{
instance = [[self alloc] init]
})
return instance
}
- (instancetype)init
{
if (self = [super init]) {
//这里我们选择了把deviceId作为mqtt的clientId port为端口号 username是用户名 password是密码
NSString *deviceId = [[NSUserDefaults standardUserDefaults]objectForKey:@"deviceId"]
NSString *clientId = [NSString stringWithFormat:@"kc-%@", deviceId]
client = [[MQTTClient alloc] initWithClientId:clientId]
client.port = 1883
client.username = @"kidcares"
client.password = @"12345"
}
return self
}
// 重点来了 这里是MQTT的订阅方法 在你需要的地方 调用就行
- (void)subscribeMessageWithMessageHandler:(void(^)(NSDictionary*dict))messageHandler
{
[client setMessageHandler:^(MQTTMessage *message){
id json = [NSJSONSerialization JSONObjectWithData:message.payloadoptions:NSJSONReadingAllowFragments error:nil]
messageHandler(json)
}]
[client connectToHost:MQTT_HOSTcompletionHandler:^(MQTTConnectionReturnCode code) {
if (code == ConnectionAccepted) {
[client subscribe:client.clientID withCompletionHandler:nil]
}
}]
}
@end
然后在你要用的控制器中导入#import "VPKCClientManager.h"
创建一个对象static VPKCClientManager *clientManager
clientManager = [VPKCClientManager sharedClient]//初始化
这里就是MQTT的订阅方法 这个方法执行后 在MQTT服务器上就可以看到你的设备 dict就是从MQTT服务器传下来的内容
[clientManager subscribeMessageWithMessageHandler:^(NSDictionary *dict) {
[clientManager subscribeMessageWithMessageHandler:^(NSDictionary *dict) {
for (id key in dict) {//因为MQTT可以有多种用处,为了区分各个功能这里我们选择了遍历dict 根据key来判断如何做出响应
if ([key isEqualToString:@"shoutResult"]) {
}
else if ([key isEqualToString:@"chat"])
{
NSDictionary * chat = [dict valueForKey:@"chat"]
playurl = [chat valueForKey:@"fileUrl"]//这里取出服务器文件的地址
time = [chat valueForKey:@"fileRunningTime"]
//这个是文件下载的封装方法 下面会有介绍
[self.audio downloadTaskURL:playurl completion:^(NSURL*fileplay) {
[selfperformSelectorOnMainThread:@selector(refreshtable:) withObject:fileplaywaitUntilDone:NO]//因为AFN下载涉及到多线程问题,如果不采用主线程加载,UI效果不会刷新
self.url = fileplay
}]
}
}
}]
1.推送的由来:
推送兴起于Email,用于提醒用户邮件的更新. 后续由于移动互联网的迅速发展,推送被广泛应用.
2.推送的原理:
推送的本质原理是客户端与服务器之间的长连接. 基于长连接,服务器可以主动向客户端推送消息, 客户端收到推送消息来展示给用户.
3.推送的实现方式:
方案1-push: 客户端与服务器维护一个TCP/IP的长连接,当有推送消息时,直接向客户端push.
方案2-pull: 客户端定时向服务器pull请求.
两种方式相比较而言, 方案1更合理更有效, 方案2会存在客户端不能长久在后台存活以及消耗电量以及消耗流量等问题.
4.iOS推送:
苹果官方推送: APNS. APNS是由苹果官方维护的, 属于系统级别,所以推送消息比较稳定.
iOS的所有推送信息, 都会发送到苹果服务器,然后由苹果服务器下发到客户端.
5.Android推送:
谷歌官方推送: FCM. FCM是由谷歌官方维护的,同iOS一样, 所有推送信息都会发送到谷歌服务器,再由谷歌下发到客户端.
由于谷歌推送不能在国内使用, 所以需要Android开发者自己去维护长连接.
6.Android推送开发:
方案1: MQTT推送, 此推送是由IBM提出的轻量级的推送, 客户端与服务器之间通过心跳包来监测对方是否存在,然后通过订阅&发布来实现消息的推送.但是缺点也很明显,当客户端被杀死后会无法收到推送.
方案2: 第三方推送, 如腾讯信鸽, 友盟+, 极光推送,小米推送等.目前很多Android的APP在国内都是使用第三方的推送.
方案3: 公司基于XMPP协议开发. 谷歌的推送也是基于XMPP协议开发的.
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)