簡體   English   中英

CocoaMQTT 初始化,似乎無法連接到 MQTT 代理

[英]CocoaMQTT init, Can't seem to connect to MQTT Broker

請原諒我是一個新手。 我上周初開始使用swift...

我正在嘗試制作一個使用 BLE 和/或 MQTT 通過代理與樹莓派對話的應用程序。 BLE 端沒問題,但 MQTT(當超出 BLE 范圍時)我遇到了麻煩。 這是在幾個類的快速文件中:

import Foundation
import CocoaMQTT

class MQTTManager{

    static let shared = MQTTManager()

    private var mqttClient: CocoaMQTT
   
    init() {
        let clientID = "swift-Trial-13579"
        let host = "IP.Goes.Here"
        let port = UInt16(1883)
        self.mqttClient = CocoaMQTT(clientID: clientID, host: host, port: port)
        self.mqttClient.username = "User"
        self.mqttClient.password = "Pass"
        self.mqttClient.keepAlive = 60
        self.mqttClient.connect()
        sendMessage(topic: "app/init", message: "init called")
        print("MQTT Init Called")
    }

    func sendMessage(topic:String, message:String){
        self.mqttClient.publish(topic, withString: message)
        print("publish MQTT called with message: \(message) and a topic of: \(topic)")
    }

}

class useProperties: ObservableObject{
    @Published var useMQTT = false
    @Published var recallMQTTScene = false
    @Published var MQTTScene = 0
    
    init(){
    }
}

然后我有 3 個視圖,ContentView

import SwiftUI
import CocoaMQTT

struct ContentView: View {
    
        
    @State public var Connection:Bool = false
    @State public var SceneMessqe: String = ""
    let MQTTHandle = MQTTManager()
    
// the main view actually is here
    var body: some View{
       // SceneButton(function: { self.MQTTPub})
        VStack{
            HStack {
                Text("MultiControl POC")
                    .font(.title)
                //.padding()

            }
            Spacer()
            mainSwitch()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(BLEManager())
    }
}

主開關

import SwiftUI
import CocoaMQTT

struct mainSwitch: View {
    
    @State public var Connection:Bool = false
    @State private var selection: String? = nil
    @StateObject var bleManager = BLEManager() // gets from environment.
    public var properties = useProperties()
    @State private var selectDeviceShown = false
    @State var isPresenting = false
    public var MQTTHandle = MQTTManager()
    
    var body: some View {
        VStack (spacing: 0){
            NavigationView{
            HStack {
                Spacer()
                NavigationLink(destination: sheetView(), isActive: $isPresenting) { EmptyView() }// added for nav but not working
                Menu("Menu") {
                    Button("BLE Setup", action: {
                        self.isPresenting = true // added to trigger nav not workinh
                        print("Setup button pressed")
                        //selectDeviceShown = true
                    })
                    Button("Reconnect", action: {
                        bleManager.myCentral.connect(bleManager.wrappedControllers[bleManager.currentSceneSwitchControllerUUID]!.wrappedPerh)
                    })
                    Button(action: {
                        MQTTManager.init()
                        Connection.toggle()
                        properties.useMQTT = true
                        print("connect/disconnect pressed useMQTT = \(properties.useMQTT)")
                        }, label: {
                            Text(Connection ? "MQTT Disconnect":"MQTT Connect")
                        })
                    Button("Cancel", action: {
                        print("oops")
                    })
                }
                .foregroundColor(Connection ? .green : .red)
                .padding(38)
                .overlay(
                    RoundedRectangle(cornerRadius: 15)
                        .stroke(lineWidth: 2)
                        .foregroundColor(Connection ? .green : .red)
            )
                Spacer()
                Spacer()
            }
            .fixedSize(horizontal: false, vertical: true)
            .frame(maxHeight: 10)
            .padding()
            }
            HStack{
                Spacer()
                VStack{
                    Spacer()
                    SceneButton(sceneName: "Scene 1", sceneNumber: 1)
                    Spacer()
                    SceneButton(sceneName: "Scene 3" , sceneNumber: 3)
                    Spacer()
                    SceneButton(sceneName: "Scene 5", sceneNumber: 5)
                    Spacer()
                }
                Spacer()
                VStack{
                    Spacer()
                    SceneButton(sceneName: "Scene 2", sceneNumber: 2)
                    Spacer()
                    SceneButton(sceneName: "Scene 4", sceneNumber: 4)
                    Spacer()
                    SceneButton(sceneName: "Off", sceneNumber: 6)
                    Spacer()
                }
                Spacer()
            }
            Spacer()
        }
        .environmentObject(useProperties())
        .environmentObject(BLEManager())
    }
}

struct mainSwitch_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            mainSwitch()
                .environmentObject(BLEManager())
                .environmentObject(useProperties())
        }
    }
}

最后是場景按鈕

import SwiftUI
import CocoaMQTT

struct SceneButton: View {
    
    var sceneName: String
    var sceneNumber: Int
    let properties = useProperties()
    @State private var isDisabled: Bool = true
    @State private var isDuringGesture: Bool = false
    @StateObject private var bleManager = BLEManager()
    let btnClr:Color = Color.orange
    let btnClrOutr:Color = Color.red
    let btnPressedClr:Color = Color.gray
    let MQTTHandle = MQTTManager()
    
    var body: some View {

        if (properties.useMQTT){
            Button(sceneName) {
                bleManager.writeToCharacteristicButtonPress(peripheral: bleManager.currentSceneSwitchControllerUUID, sceneToGoToo: (sceneNumber).description, setButtonPressed: true) // Note the number is the same number as the button.
                bleManager.writeToCharacteristicButtonPress(peripheral: bleManager.currentSceneSwitchControllerUUID, sceneToGoToo: (sceneNumber).description, setButtonPressed: false)
                print("BLE Button" + sceneName)
                print("\(properties.useMQTT)")
            }
            .foregroundColor(.white)
                .frame(minWidth: 100)
                .padding()
                .background(Color(red: 1, green: 0.1, blue: 0.1))
                .cornerRadius(10)
                .padding(10)
                .font(.title2)
                .font(.system(size: 20))
        }else{
            Button(sceneName) {
                print("\(properties.useMQTT)")
                MQTTHandle.sendMessage(topic: "apptest/scene", message: "\(sceneNumber)")
            }
                .frame(minWidth: 100)
                .padding()
                .background(Color(red: 0.40, green: 0.60, blue: 0))
                .cornerRadius(10)
                .padding(10)
        }
    }
}

struct SceneButton_Previews: PreviewProvider {
    static var previews: some View {
        SceneButton(sceneName: "Scene X", sceneNumber: 42) //, publishSceneMQTT: sceneHandle
            .environmentObject(BLEManager())
            .environmentObject(useProperties())
    }
}

目前,當應用程序加載時,它會多次調用 MQTT init,然后無法可靠連接,有時,可能有十分之一的連接發送一條消息,然后我無法發送更多。 理想情況下,它只會在我按下 mainSwitch 菜單中的連接按鈕時連接。 然而,每個按鈕 (SceneButton) 應該發布一些稍微不同的東西。

首先,它在開始時一直調用 init 是一個問題嗎?

其次,是否有明顯的我做錯了意味着它不能可靠地連接?

第三,(最不重要的)sceneButton 中的按鈕應該改變是使用 BLE 還是 MQTT,這個變量 useMQTT 在 mainSwitch 文件中設置。 但在sceneButton中沒有改變,我做錯了什么?

在任何地方都使用(!)不同的MQTTManager實例,因為通過init創建它,而不是您應該在任何地方使用MQTTManager.shared ,例如

struct ContentView: View {
    
        
    @State public var Connection:Bool = false
    @State public var SceneMessqe: String = ""
//    let MQTTHandle = MQTTManager()       // << not this !!
    let MQTTHandle = MQTTManager.shared    // << this one !!

因此,請檢查您的所有代碼並按上述方式進行修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM