博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发中MQTTKit的TLS SSL支持方案
阅读量:6154 次
发布时间:2019-06-21

本文共 3086 字,大约阅读时间需要 10 分钟。

MQTTKit是一个基于Mosquitto库实现的MQTT协议网络库,但是已经停止更新很久了。日常开发的功能基本实现,但一直未支持TLS/SSL。最近我fork了这个项目并进行了修改,截止2017.5.23主要做了以下修改

  • 更新Mosquitto库
  • 完成了on_log的回调,可以查看Mosquitto内部的打印帮助调试
  • 增添了TLS/SSL的支持
  • 细节的完善 ...

后续我会检查原项目里未解决的issus,并将Mosquitto库已经支持的功能同步过来。项目地址。如果项目需要支持TLS/SSL,你无法直接导入三方框架直接使用,需要进行一些配置。这篇文章会介绍如何让MQTTKit在你的项目中支持TLS/SSL。并给出各种情况下的示例代码。

libmosquitto文件夹和MQTTKit文件导入项目,并设置全局宏WITH_TLS=1

这个时候你编译程序,会发现在
mosquitto_internal.h文件里报错
file <openssl.h> not founded。原因在这里 。Apple认为虽然
Openssl是一个应用非常广泛的开源库,但是版本更替其中的API一直变更无法稳定。出于这个原因,Openssl不再作为iOS的一部分,即使OS X仍然提供
Openssl,但已经废弃了
Openssl开源库。在应用开发中是非常不鼓励开发者使用
Openssl库。 但是如果我们确实要用的话,应该自己编译OpenSSL代码,然后静态链接。具体的操作如下:

  • 从打包下载源码,解压到桌面。cd进入目录下执行./build-libssl.sh。执行完成以后目录下多了两个文件夹。

  • 将图中标注的两个文件夹拖入工程。其中include包含的是头文件,lib包含的是library。

  • 加入工程之后我们需要在Build Setting中进行设置,在Header Search Paths中添加include文件夹的路径

Library Search Paths中检查是否有lib路径

至此,项目可以完整的运行起来。Mosquitto提供了。端口1883是普通的服务,无需用户名密码即可连接。以下提供了一个简单的连接测试代码。

- (void)testConnect{    client = [[MQTTClient alloc] initWithClientId:[NSString stringWithFormat:@"MQTTKitTests-%@", [[NSUUID UUID] UUIDString]]];        client.host = @"test.mosquitto.org";    client.port = 1883;        [client connectWithCompletionHandler:^(MQTTConnectionReturnCode code) {        if (code == 0)        {            NSLog(@"Connect Success");        }        else        {            NSLog(@"Connect Fail! State Code is %lu", (unsigned long)code);        }    }];}复制代码

端口8883是单向验证的接口,你需要验证服务器的连接,验证证书的。测试代码如下。我已经提前下好证书改名server.crt导入工程。

- (void)testTLSWithOneWayAuthentication{    client = [[MQTTClient alloc] initWithClientId:[NSString stringWithFormat:@"MQTTKitTests-%@", [[NSUUID UUID] UUIDString]]];        client.host = @"test.mosquitto.org";    client.port = 8883;        client.tlsCafile = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"crt"];        [client connectWithCompletionHandler:^(MQTTConnectionReturnCode code) {        if (code == 0)        {            NSLog(@"Connect Success");        }        else        {            NSLog(@"Connect Fail! State Code is %lu", (unsigned long)code);        }    }];}复制代码

端口8884需要双向验证,客户端也需要向服务器提供证书。这个比较麻烦的是需要我们自己生成私钥和证书,我之前操作的时候遇见了一些麻烦,会在另一篇文章详细介绍。这里提供一段测试代码,其中client.keyclient.crt是我已经生成的客户端私钥和证书

- (void)testTLSWithTwoWayAuthentication{    client = [[MQTTClient alloc] initWithClientId:[NSString stringWithFormat:@"MQTTKitTests-%@", [[NSUUID UUID] UUIDString]]];        client.host = @"test.mosquitto.org";    client.port = 8884;        client.tlsCerPath = [[NSBundle mainBundle] pathForResource:@"client" ofType:@"crt"];    client.tlsCerKeyPath = [[NSBundle mainBundle] pathForResource:@"client" ofType:@"key"];    client.tlsCafile = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"crt"];    client.tlsPeerCertVerify = YES;        [client connectWithCompletionHandler:^(MQTTConnectionReturnCode code) {        if (code == 0)        {            NSLog(@"Connect Success");        }        else        {            NSLog(@"Connect Fail! State Code is %lu", (unsigned long)code);        }    }];}复制代码

后续我会持续维护MQTTKit,如果在使用过程中仍有疑问,或者发现了任何bug,欢迎在和简书上一起讨论解决。

如果对你有所帮助,希望给我一个Star :)

转载地址:http://cxbfa.baihongyu.com/

你可能感兴趣的文章
Windows phone 8 学习笔记(3) 通信
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
linux后台运行程序
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
登记申请汇总
查看>>