首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ios中使用MQTT实现Swift MQTT协议

在ios中使用MQTT实现Swift MQTT协议
EN

Stack Overflow用户
提问于 2020-01-07 14:52:47
回答 1查看 1.2K关注 0票数 0

我正在尝试实现MQTT协议的实时位置更新使用蚊子api。我已经设置了本地服务器,在终端消息是发送以及接收良好,但没有发送在我的项目中。这是我的code.and,我分享的终端屏幕很短。

enter image description here

代码语言:javascript
复制
import UIKit
import CocoaMQTT



    func mqttSetUp()
    {
        let clientID = "mosq-irTRTw6KH28CzBbUPC" //+ "tutzqscv"//String(ProcessInfo().processIdentifier)
        let mqtt = CocoaMQTT(clientID: clientID, host: "/usr/local/etc/mosquitto/mosquitto.conf", port: 1883)
        mqtt.username = "p2"
        mqtt.password = "c1"
        mqtt.willMessage = CocoaMQTTWill(topic: "/will", message: "dieout")
        mqtt.keepAlive = 60
        mqtt.delegate = self
        mqtt.disconnect()
        mqtt.connect()
    }

    func TRACE(_ message: String = "", fun: String = #function) {
        let names = fun.components(separatedBy: ":")
        var prettyName: String
        if names.count == 2 {
            prettyName = names[0]
        } else {
            prettyName = names[1]
        }

        if fun == "mqttDidDisconnect(_:withError:)" {
            prettyName = "didDisconect"
        }
        print("[TRACE] [\(prettyName)]: \(message)")
    }
}
extension ViewController: CocoaMQTTDelegate
{
    func mqtt(_ mqtt: CocoaMQTT, didUnsubscribeTopic topic: String)
    {
        print("topic==>\(topic)")
    }


    // Optional ssl CocoaMQTTDelegate
    func mqtt(_ mqtt: CocoaMQTT, didReceive trust: SecTrust, completionHandler: @escaping (Bool) -> Void) {
        TRACE("trust: \(trust)")

        completionHandler(true)
    }

    func mqtt(_ mqtt: CocoaMQTT, didConnectAck ack: CocoaMQTTConnAck) {
        TRACE("ack: \(ack)")

        if ack == .accept {
            mqtt.subscribe("chat/room/animals/client/+", qos: CocoaMQTTQOS.qos1)
        }
    }

    func mqtt(_ mqtt: CocoaMQTT, didStateChangeTo state: CocoaMQTTConnState) {
        TRACE("new state: \(state)")
    }

    func mqtt(_ mqtt: CocoaMQTT, didPublishMessage message: CocoaMQTTMessage, id: UInt16) {
        TRACE("message: \(message.string!.description), id: \(id)")
    }

    func mqtt(_ mqtt: CocoaMQTT, didPublishAck id: UInt16) {
        TRACE("id: \(id)")
    }

    func mqtt(_ mqtt: CocoaMQTT, didReceiveMessage message: CocoaMQTTMessage, id: UInt16 ) {
        TRACE("message: \(message.string!.description), id: \(id)")

        let name = NSNotification.Name(rawValue: "MQTTMessageNotification")
        NotificationCenter.default.post(name: name, object: self, userInfo: ["message": message.string!, "topic": message.topic])
    }

    func mqtt(_ mqtt: CocoaMQTT, didSubscribeTopics success: NSDictionary, failed: [String]) {
        TRACE("subscribed: \(success), failed: \(failed)")
    }

    func mqtt(_ mqtt: CocoaMQTT, didSubscribeTopic topics: [String]) {
        TRACE("topic: \(topics)")
    }

    func mqttDidPing(_ mqtt: CocoaMQTT) {
        TRACE()
    }

    func mqttDidReceivePong(_ mqtt: CocoaMQTT) {
        TRACE()
    }

    func mqttDidDisconnect(_ mqtt: CocoaMQTT, withError err: Error?) {
        TRACE("\(err.debugDescription)")
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-01-07 15:00:16

创建Mqtt Siglton类

代码语言:javascript
复制
import UIKit
import CocoaMQTT

class MQTT {

    var objMQTTClient : CocoaMQTT?

    static let shared = MQTT()
    private init() {}
}

请为MQTT中的pass创建dicPayload

代码语言:javascript
复制
func publishMQTTMessage() {

      var dicPayload = [String : Any]()
      dicPayload["sender_id"] = <Pass Sender Id>
      dicPayload["recv_id"] = <Pass reciver Id>
      dicPayload["message"] = <message>
      dicPayload["chat_type"] = <userChatType>
      dicPayload["message_type"] = <messageType>

      MQTT.shared.MQTTPublishWithTopic(dicPayload, appDelegate.loginUser.userId, CMQTTUSERTOPIC)

 }

使用MQTT主题发布消息

代码语言:javascript
复制
func MQTTPublishWithTopic(_ payload:[String : Any], _ id:Any?, _ topic : String?)
{
    let jsonData = try? JSONSerialization.data(withJSONObject: payload, options: [])
    let jsonString = String(data: jsonData!, encoding: .utf8)
    objMQTTClient?.publish(topic!, withString: jsonString!)
    print("message publish")

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59623538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档