【问题标题】:Using aws ios iot sdk for our own mqtt server in ios在ios中为我们自己的mqtt服务器使用aws ios iot sdk
【发布时间】:2018-01-02 19:20:27
【问题描述】:

我们使用带有 ssl 配置的 AWS iOS IoT SDK。我们遵循https://github.com/awslabs/aws-sdk-ios-samples/tree/master/IoT-Sample/Swift 作为参考。 这里我们的服务器端点将是格式

https://xxxxxxxxxx.iot..amazonaws.com

我们以捆绑包的形式导入 pkcs12 文件,并能够连接、发布、订阅服务器。

后来我们考虑在我们的组织内有本地网络解决方案,我们为服务器的 MQTT 代理设置了 rabbitmq https://www.rabbitmq.com/ssl.html#keys-and-certs。目前,我们正在尝试使用 ec2 实例,后者将设置本地服务器。终点是

ssl://ec2-..compute.amazonaws.com:8883

现在我无法使用 aws iot ios sdk 连接到 rabbitmq 服务器。

但如果我使用https://github.com/emqtt/CocoaMQTT 示例,我可以连接到aws iot 服务器端点和rabbitmq 服务器端点。

我现在应该怎么做才能使用 aws iot ios sdk https://github.com/aws/aws-sdk-ios/tree/master/AWSIoT 连接到 rabbitmq 服务器端点。我应该在 sdk 中进行哪些编辑?

以下是尝试使用 aws iot ios sdk 连接到 rabbitmq 服务器时的日志。

2017-07-27 12:56:55:860 sample[2124:1004208] hostName: ec2-<ip>.<region>.compute.amazonaws.com
2017-07-27 12:56:55:861 sample[2124:1004208] URL: ssl://ec2-<ip>.<region>.compute.amazonaws.com
2017-07-27 12:56:55:875 sample[2124:1004208] -[MQTTSession initWithClientId:userName:password:keepAlive:cleanSession:willTopic:willMsg:willQoS:willRetainFlag:runLoop:forMode:] [Line 169], Thread:<NSThread: 0x170068000>{number = 1, name = main} 
2017-07-27 12:56:55:875 sample[2124:1004208] +[MQTTMessage connectMessageWithClientId:userName:password:keepAlive:cleanSession:willTopic:willMsg:willQoS:willRetain:] [Line 68], Thread:<NSThread: 0x170068000>{number = 1, name = main} 
2017-07-27 12:56:55:875 sample[2124:1004208] Creating MQTTMessage with raw data >>>>> <00044d51 54540406 003c0004 696f732d 0017746f 7069632f 77726974 652f736f 75726365 2f757365 7200787b 22636c69 5f657665 6e745f69 64223a22 636c695f 6576656e 745f7573 65725f31 35303131 34303431 352e3832 37393422 2c22736f 75726365 223a2273 6f757263 65222c22 73656e64 65725f69 64223a22 75736572 222c2265 76656e74 5f747970 65223a22 4c415354 5f57494c 4c5f4d45 53534147 45227d> <<<<<
2017-07-27 12:56:55:879 sample[2124:1004208] Initializing MQTTEncoder and MQTTDecoder streams
2017-07-27 12:56:55.882561+0530 sample[2124:1004208] ChatViewController: connection status = Connecting  1
2017-07-27 12:56:55:880 sample[2124:1004208] opening encoder stream.
2017-07-27 12:56:55:880 sample[2124:1004208] opening decoder stream.
2017-07-27 12:56:55:946 sample[2124:1004208] -[MQTTDecoder stream:handleEvent:] [Line 64] EventCode:1, stream: <__NSCFInputStream: 0x170112870>, Thread: <NSThread: 0x170068000>{number = 1, name = main}
2017-07-27 12:56:55:947 sample[2124:1004208] -[MQTTEncoder stream:handleEvent:] [Line 71] EventCode:1, Thread: <NSThread: 0x170068000>{number = 1, name = main}
2017-07-27 12:56:56.002911+0530 sample[2124:1004208] CFNetwork SSLHandshake failed (-9807)
2017-07-27 12:56:56:003 sample[2124:1004208] -[MQTTDecoder stream:handleEvent:] [Line 64] EventCode:8, stream: <__NSCFInputStream: 0x170112870>, Thread: <NSThread: 0x170068000>{number = 1, name = main}
2017-07-27 12:56:56:003 sample[2124:1004208] -[MQTTSession decoder:handleEvent:] [Line 471] eventCode:2
2017-07-27 12:56:56:004 sample[2124:1004208] MQTT session error, code: 3
2017-07-27 12:56:56:004 sample[2124:1004208] closing encoder stream.
2017-07-27 12:56:56:005 sample[2124:1004208] closing decoder stream.
2017-07-27 12:56:57:008 sample[2124:1004208] MQTTSessionDelegate handleEvent: 3
2017-07-27 12:56:57:008 sample[2124:1004208] MQTT session connection error
2017-07-27 12:56:57.010082+0530 sample[2124:1004287] Chat :Alive service stop
2017-07-27 12:56:57.010521+0530 sample[2124:1004208] ChatViewController: connection status = Disconnected  5
2017-07-27 12:56:57.016899+0530 sample[2124:1004208] Chat :viewDidDisappear
2017-07-27 12:56:57:009 sample[2124:1004208] setting up reconnectTimer.
2017-07-27 12:56:58:010 sample[2124:1004208] Trying to reconnect to session.
2017-07-27 12:56:58:011 sample[2124:1004208] Initializing MQTTEncoder and MQTTDecoder streams
2017-07-27 12:56:58:011 sample[2124:1004208] opening encoder stream.
2017-07-27 12:56:58:011 sample[2124:1004208] opening decoder stream.
2017-07-27 12:56:58:075 sample[2124:1004208] -[MQTTDecoder stream:handleEvent:] [Line 64] EventCode:1, stream: <__NSCFInputStream: 0x170112bd0>, Thread: <NSThread: 0x170068000>{number = 1, name = main}
2017-07-27 12:56:58:075 sample[2124:1004208] -[MQTTEncoder stream:handleEvent:] [Line 71] EventCode:1, Thread: <NSThread: 0x170068000>{number = 1, name = main}
2017-07-27 12:56:58.127802+0530 sample[2124:1004208] CFNetwork SSLHandshake failed (-9807)
2017-07-27 12:56:58:128 sample[2124:1004208] -[MQTTDecoder stream:handleEvent:] [Line 64] EventCode:8, stream: <__NSCFInputStream: 0x170112bd0>, Thread: <NSThread: 0x170068000>{number = 1, name = main}
2017-07-27 12:56:58:128 sample[2124:1004208] -[MQTTSession decoder:handleEvent:] [Line 471] eventCode:2
2017-07-27 12:56:58:128 sample[2124:1004208] MQTT session error, code: 3
2017-07-27 12:56:58:128 sample[2124:1004208] closing encoder stream.
2017-07-27 12:56:58:128 sample[2124:1004208] closing decoder stream.
2017-07-27 12:56:59:129 sample[2124:1004208] MQTTSessionDelegate handleEvent: 3
2017-07-27 12:56:59:130 sample[2124:1004208] MQTT session connection error
2017-07-27 12:56:59.131627+0530 sample[2124:1004299] Chat :Alive service stop
2017-07-27 12:56:59.132071+0530 sample[2124:1004208] ChatViewController: connection status = Disconnected  5

【问题讨论】:

    标签: ios mqtt aws-iot aws-sdk-ios


    【解决方案1】:

    你的目标是什么?您想要本地 MQTT 代理进行测试,还是想要运行自己的 MQTT 代理并使用 AWS iOS IoT 开发工具包连接到它?

    如果您想经营自己的经纪人,我建议您仔细考虑一下,因为规模化会变得很困难。我没有尝试对本地代理使用 AWS IoT 开发工具包,但您的日志显示 SSL 握手失败。我猜这是因为您的应用程序和 RabbitMQ 之间的相互身份验证由于服务器证书不匹配而失败。

    AWS IoT 使用相互身份验证而不仅仅是客户端身份验证来建立信任:http://docs.aws.amazon.com/iot/latest/developerguide/managing-device-certs.html

    您需要做两件事 1) 在 iOS 开发工具包中确定 AWS IoT 服务器 CA 的设置位置 (https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem) 并将其替换为您的 RabbitMQ 代理的 CA,2) 配置 RabbitMQ 以进行相互身份验证(如果支持)。

    祝你好运。

    【讨论】:

    • 感谢您的回答,是的,我想运行自己的 MQTT 代理并使用 AWS iOS IoT SDK 连接到它?我能够使用第三方库 CocoaMQTT 连接到我们自己的 MQTT 代理和 AWS IOT 服务器。但无法使用 AWS IOS IoT SDK 连接到我们自己的 MQTT 代理。这意味着通过在 AWS IOT IOS SDK 中编辑或配置某些内容,我应该能够连接到我们自己的 MQTT 代理,并且我能够使用 CocoaMQTT 连接到两者。我只是想知道,我应该为此改变什么?
    • 我不是 iOS 开发人员,但如果您在这里查看 SDK github.com/aws/aws-sdk-ios/blob/master/AWSIoT/Internal/MQTTSDK/… 的内部结构,您可以看到 MQTT 会话的配置位置以及 SSL 可以启用和禁用的位置。如果您禁用 SSL,那么连接是否有效?如果您不打算使用 AWS IoT 服务,我建议您使用另一个 MQTT 客户端。
    • 查看 RabbitMQ MQTT 插件文档rabbitmq.com/mqtt.html 看起来 RabbitMQ 默认使用用户名/密码进行身份验证。您是否启用了使用 SSL 客户端证书的身份验证?
    • 是的,我已启用 SSL 客户端身份验证,但它不起作用
    • 并且用户名存储在证书专有名称中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2017-08-01
    • 2013-04-09
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多