Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

will message automatically call and facing error CocoaMQTT(error): Sending buffer is full, frame PUBLISH #606

Open
HardikKMT opened this issue Jul 22, 2024 · 1 comment

Comments

@HardikKMT
Copy link

HardikKMT commented Jul 22, 2024

Hello Team,

I am facing issue that CocoaMQTT(error): Sending buffer is full, frame PUBLISH and sometime automatically willMessage call again and again means connect then again call now again connect and again call team please help me.

@emqx-ci-robot @skidnight @snr_lab @ItAldoRaine @abhinavsigh89
@turtleDeng
@jan-bednar
@jmiltner
@manucheri
@cyrus Ingraham

@feng Lee
@ CrazyWisdom
@alex Yu
@ Leeway
I am stuck from last week so please help me.

I am using mqtt version 3.1.1
my code is as below
////
//// BLE_Manager.swift
//// Oom-Cardio Monitor
////
//// Created by projects on 22/06/23.
////

import Foundation
import CoreBluetooth
import DGCharts


    //import CocoaMQTT
import SwiftyJSON
import UIKit
import SwiftUI
import CocoaMQTT
import Combine

//extension Notification.Name {
//    static let didUpdateConnectionStatus = Notification.Name("didUpdateConnectionStatus")
//}

class BLEConnection : NSObject,CBCentralManagerDelegate,ObservableObject, CBPeripheralDelegate,CocoaMQTTDelegate {

    private var dateLive: Date?
    private var dateLiveOffline: Date?

// var hashMap: [Date: [String: Any]] = [:]
var hashMap: [Date: JSON] = [:]
var hashMapOffline: [Date: JSON] = [:]

    let OOM_CAM_SERVICE_UUID_FU = CBUUID(string: "f000ffd0-0451-4000-b000-000000000000")
    let OOM_CAM_NOTIFY_WRITE_UUID_FU = CBUUID(string: "f000ffd1-0451-4000-b000-000000000000")
    func scheduleLocalNotification(with message: String) {
            let content = UNMutableNotificationContent()
            content.title = "Connection Status"
            content.body = message
            content.sound = UNNotificationSound.default

            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
            let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

            UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
        }

        // Function to decode JSON string to AlertResponse
    func decodeAlertResponse(from jsonString: String) -> AlertResponse? {
        let decoder = JSONDecoder()
        guard let jsonData = jsonString.data(using: .utf8) else { return nil }
        do {
            let alertResponse = try decoder.decode(AlertResponse.self, from: jsonData)
            return alertResponse
        } catch {
            print("Decoding error: \(error)")
            return nil
        }
    }

    func getSerialNoInBytes1(isLive: Bool, reset: Bool = false) -> String {
        var stringBuilder = ""

        let standardHighSpeedSync = UserDefaults.standard.bool(forKey: "StandardHighSpeedSync")
            // console("EndlessService", "standardHighSpeedSync -> \(standardHighSpeedSync)")
            // console("EndlessService", "isLive -> \(isLive)")
        print("EndlessService standardHighSpeedSync \(standardHighSpeedSync)")
        print("EndlessService isLive \(isLive)")
        if isLive && !standardHighSpeedSync {
            stringBuilder.append("01")
            stringBuilder.append("01")
        } else if isLive && standardHighSpeedSync {
            stringBuilder.append("01")
            stringBuilder.append("02")
        } else {
            stringBuilder.append("02")
            stringBuilder.append("00")
        }
        
//        stringBuilder.append("01")
//        stringBuilder.append("01")

        if reset {
            stringBuilder.append("01")
        } else {
            stringBuilder.append("00")
        }

            // console("EndlessService", "bytes -> \(stringBuilder)")
        print("EndlessService stringBuilder \(stringBuilder)")
        return stringBuilder
    }

    func mqtt(_ mqtt: CocoaMQTT, didConnectAck ack: CocoaMQTTConnAck) {
            //        TRACE("ack: \(ack)")
        print("ack: \(ack)")
        reconnectAttempts = 0
        if ack == .accept {
            mqtt.subscribe("oom/ecg/ecg-position/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
            mqtt.subscribe("oom/ecg/processedDataThreeSec/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
            mqtt.subscribe("oom/ecg/processedData/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
            mqtt.subscribe("oom/ecg/ecgConnectionStatus/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
            mqtt.subscribe("oom/ecg/recordingLength/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
            mqtt.subscribe("oom/ecg/promptArrhythmiaCount/"+patientMongoId, qos: CocoaMQTTQoS.qos0)
            mqtt.subscribe("oom/ecg/promptArrhythmia/"+patientMongoId, qos: CocoaMQTTQoS.qos0)
        }
    }
    func mqtt(_ mqtt: CocoaMQTT, didDisconnectWithError err: Error?) {
           print("MQTT disconnected with error: \(String(describing: err))")
           
           // Attempt to reconnect if the disconnection was unexpected
           if reconnectAttempts < maxReconnectAttempts {
               reconnectAttempts += 1
               print("Attempting to reconnect (\(reconnectAttempts)/\(maxReconnectAttempts))...")
               mqtt.autoReconnectTimeInterval = UInt16(reconnectAttempts * 5) // Exponential backoff
               mqtt.connect()
           } else {
               print("Max reconnect attempts reached. Could not reconnect to MQTT broker.")
           }
       }
    func mqtt(_ mqtt: CocoaMQTT, didStateChangeTo state: CocoaMQTTConnState) {
            //        TRACE("new state: \(state)")
        let date = Date()

        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd hh:mm a"
        let result = formatter.string(from: date)
        print("new state: : \(state.description)")
        print("new state date: : \(result)")
        mqttConnectionStatus=state.description
        if(state.description=="connected"){
            if(connectedDevicePeri != nil){
                print("new state: : again \(state.description)")
                sendBluetoothStatus(value: "Connected")
                lastDataArray=0
                let hexa = getSerialNoInBytes1(isLive: true)
                peripheralWriteDataClear(peripheral: (connectedDevicePeri)!, command: (hexStringToByteArray(hexa)))

            }
                //            65c49aea29f6a5db52a526e2�

// mqtt.subscribe("oom/ecg/ecg-position/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
// mqtt.subscribe("oom/ecg/processedDataThreeSec/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
// mqtt.subscribe("oom/ecg/processedData/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
// mqtt.subscribe("oom/ecg/ecgConnectionStatus/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
// mqtt.subscribe("oom/ecg/recordingLength/"+patientMongoId, qos: CocoaMQTTQoS.qos1)
// mqtt.subscribe("oom/ecg/promptArrhythmiaCount/"+patientMongoId, qos: CocoaMQTTQoS.qos0)
// mqtt.subscribe("oom/ecg/promptArrhythmia/"+patientMongoId, qos: CocoaMQTTQoS.qos0)
// sendBluetoothStatus(value: "Connected")
// mqtt.subscribe("oom/ecg/ecg-position/"+patientMongoId, qos: CocoaMQTTQoS.qos1)

        }
        else{
            if(state.description=="disconnected"){
                //TODO here set islive not send command
                let hexa = getSerialNoInBytes1(isLive: false)
                if(connectedDevicePeri != nil){
                    peripheralWriteDataClear(peripheral: (connectedDevicePeri)!, command: (hexStringToByteArray(hexa)))
                }
            }
        }
    }

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

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

    func mqtt(_ mqtt: CocoaMQTT, didReceiveMessage message: CocoaMQTTMessage, id: UInt16 ) {
            //        TRACE("message: \(message.string.description), id: \(id)")
//        print("message data: \(message), id: \(id)")
//        print("message topic name: \(message.topic), id: \(id)")
            //        print("message data: \(message), id: \(id)")

            // Directly use the payload without optional binding
        if(message.topic==("oom/ecg/ecgConnectionStatus/"+patientMongoId)){

            let payloadBytes = message.payload
            let payloadData = Data(payloadBytes)

            if let payloadString = String(data: payloadData, encoding: .utf8) {
//                print("ecgConnectionStatus Received message payload as string: \(payloadString)")
                    //                let json = JSON(parseJSON: payloadString)
                let json = JSON(parseJSON: payloadString)
//                print("ecgConnectionStatus json string \(json)")


                if json["status"].stringValue != nil {
//                    print("status \(json["status"])")
                    delegate?.ecgConnectionStatus(json["status"].stringValue)
                }

            }
        }
        else if(message.topic==("oom/ecg/ecg-position/"+patientMongoId)){

            let payloadBytes = message.payload
            let payloadData = Data(payloadBytes)

            if let payloadString = String(data: payloadData, encoding: .utf8) {
//                print("ecg-position Received message payload as string: \(payloadString)")
                    //                let json = JSON(parseJSON: payloadString)
//                delegate?.positionValueFun(payloadString)

            }
        }


        else if(message.topic==("oom/ecg/promptArrhythmiaCount/"+patientMongoId)){

            let payloadBytes = message.payload
            let payloadData = Data(payloadBytes)

            if let payloadString = String(data: payloadData, encoding: .utf8) {
//                print("promptArrhythmiaCount Received message payload as string: \(payloadString)")
                    //                let json = JSON(parseJSON: payloadString)

//                if json["status"].stringValue != nil {
                        //                    print("status \(json["status"])")
                    delegate?.alertCountValueData(payloadString)
//                }
            }
        }

        else if(message.topic==("oom/ecg/promptArrhythmia/"+patientMongoId)){

            let payloadBytes = message.payload
            let payloadData = Data(payloadBytes)

//            if let payloadString = String(data: payloadData, encoding: .utf8) {
//                print("promptArrhythmia Received message payload as string: \(payloadString)")
//
//                    // Decode the JSON string to AlertResponse
//                if let alertResponse = decodeAlertResponse(from: payloadString) {
//                    print("Decoded AlertResponse: \(alertResponse)")
//                    delegate?.alertObjectPass(alertResponse)
//                } else {
//                    print("Failed to decode AlertResponse from payload string")
//                }
//            }
            if let payloadString = String(data: payloadData, encoding: .utf8) {
//                print("promptArrhythmia Received message payload as string: \(payloadString)")
                if let alert = try? JSONDecoder().decode(AlertResponse.self, from: Data(payloadString.utf8)) {
//                    viewModel?.updateAlertObject(alert)
                    delegate?.alertObjectPass(alert)
                }
            }

        }

        else if(message.topic==("oom/ecg/processedData/"+patientMongoId)){
//            print("connected processdata")
            let payloadBytes = message.payload
            let payloadData = Data(payloadBytes)

            if let payloadString = String(data: payloadData, encoding: .utf8) {
//                print("Received message payload as string: \(payloadString)")
                let json = JSON(parseJSON: payloadString)
//                print("processedData json string \(json)")

                    //                if (!jsonObject.getString("Arrhythmia")
                    //                                                .equals("Artifacts")
                    //                                        ) binding?.tvThreasold?.text = jsonObject.getString("Arrhythmia")
                if(json["Arrhythmia"].stringValue != nil && !json["Arrhythmia"].stringValue.isEmpty){
                    delegate?.arrethemiaValueFun(json["Arrhythmia"].stringValue)
                    if(json["Arrhythmia"].stringValue != "Normal") {
                        if json["Arrhythmia"].stringValue != "Artifacts" {
                            delegate?.arrethemiaColor(Color.red)
                        }
                    }
                    else
                    {
                     if json["Arrhythmia"].stringValue != "Artifacts" {
                         delegate?.arrethemiaColor(Color.black)
                     }
                    }
                }

                if(json["MI"].stringValue != nil && !json["MI"].stringValue.isEmpty){
                    delegate?.MIValueFun(json["MI"].stringValue)
                }
            }
        }

        else if(message.topic==("oom/ecg/recordingLength/"+patientMongoId)){
                //            print("connected processdata")
            let payloadBytes = message.payload
            let payloadData = Data(payloadBytes)
//            print("Received recordingLength payloadData \(payloadData)")
            if let payloadString = String(data: payloadData, encoding: .utf8) {
//                print("Received recordingLength message payload as string: \(payloadString)")
                let formattedDuration = formatDuration(from: payloadString) // Assume "1.5" is your payload string
//                print("formattedDuration\(formattedDuration)")
                delegate?.recordingTimeValue(formattedDuration)
//                let json = JSON(parseJSON: payloadString)
//                print("processedData json string \(json)")
            }
        }

        else if(message.topic==("oom/ecg/processedDataThreeSec/"+patientMongoId)){
            let payloadBytes = message.payload
            let payloadData = Data(payloadBytes)

            if let payloadString = String(data: payloadData, encoding: .utf8) {
//                print("Received message payload as string: \(payloadString)")
                let json = JSON(parseJSON: payloadString)
//                print("json string \(json)")
                let HR = json["HR"].intValue
//                print("HR Value\(HR)")


                    //                HRValueAppend()
                    //                delegate?.HRValueAppend(HR)

                delegate?.hrValueData(HR)

                if json["RRInterval"] != nil {
                    let RRValue = json["RRInterval"].doubleValue
                    if RRValue <= 0 {
                            // Set the text to "-" if RRInterval is less than or equal to 0
                        delegate?.rrValueData("-")
                    } else {
                            // Convert RRInterval to seconds and format the text to display with 2 decimal places
                        let d = RRValue / 1000
                        let formattedString = String(format: "%.2f", d)
//                        print("formattedString\(formattedString)")
                        delegate?.rrValueData(formattedString)

                    }
                } else {
                        // Handle the case where RRInterval key doesn't exist
//                    print("RRInterval key doesn't exist")
                    delegate?.rrValueData("-")
                }

                if json["PRInterval"] != nil {
                    let PRInterval = json["PRInterval"].doubleValue
                    if PRInterval <= 0 {
                            // Set the text to "-" if RRInterval is less than or equal to 0
                        delegate?.prValueData("-")
                    } else {
                            // Convert RRInterval to seconds and format the text to display with 2 decimal places
                        let d = PRInterval / 1000
                        let formattedString = String(format: "%.2f", d)
//                        print("formattedString PRInterval\(formattedString)")
                        delegate?.prValueData(formattedString)
                    }
                } else {
                        // Handle the case where RRInterval key doesn't exist
//                    print("PRInterval key doesn't exist")
                    delegate?.prValueData("-")
                }

                if json["QTInterval"] != nil {
                    let QTInterval = json["QTInterval"].doubleValue
                    if QTInterval <= 0 {
                            // Set the text to "-" if RRInterval is less than or equal to 0
                        delegate?.qtValueData("-")
                    } else {
                            // Convert RRInterval to seconds and format the text to display with 2 decimal places
                        let d = QTInterval / 1000
                        let formattedString = String(format: "%.2f", d)
//                        print("formattedString QTInterval\(formattedString)")
                        delegate?.qtValueData(formattedString)
                    }
                } else {
                        // Handle the case where RRInterval key doesn't exist
//                    print("QTInterval key doesn't exist")
                    delegate?.qtValueData("-")
                }

                if json["QRSComplex"] != nil {
                    let QRSComplex = json["QRSComplex"].doubleValue
                    if QRSComplex <= 0 {
                            // Set the text to "-" if RRInterval is less than or equal to 0
                        delegate?.qrValueData("-")
                    } else {
                            // Convert RRInterval to seconds and format the text to display with 2 decimal places
                        let d = QRSComplex / 1000
                        let formattedString = String(format: "%.2f", d)
//                        print("formattedString QRSComplex\(formattedString)")
                        delegate?.qrValueData(formattedString)
                    }
                } else {
                        // Handle the case where RRInterval key doesn't exist
//                    print("QRSComplex key doesn't exist")
                    delegate?.qrValueData("-")
                }


                if json["PRseg"] != nil {
                    let PRseg = json["PRseg"].doubleValue
                    if PRseg <= 0 {
                            // Set the text to "-" if RRInterval is less than or equal to 0
                        delegate?.prSegValueData("-")
                    } else {
                            // Convert RRInterval to seconds and format the text to display with 2 decimal places
                        let d = PRseg / 1000
                        let formattedString = String(format: "%.2f", d)
//                        print("formattedString PRseg\(formattedString)")
                        delegate?.prSegValueData(formattedString)
                    }
                } else {
                        // Handle the case where RRInterval key doesn't exist
//                    print("PRseg key doesn't exist")
                    delegate?.prSegValueData("-")
                }


                if json["STseg"] != nil {
                    let STseg = json["STseg"].doubleValue
                    if STseg <= 0 {
                            // Set the text to "-" if RRInterval is less than or equal to 0
                        delegate?.stSegValueData("-")
                    } else {
                            // Convert RRInterval to seconds and format the text to display with 2 decimal places
                        let d = STseg / 1000
                        let formattedString = String(format: "%.2f", d)
//                        print("formattedString STseg\(formattedString)")
                        delegate?.stSegValueData(formattedString)
                    }
                } else {
                        // Handle the case where RRInterval key doesn't exist
//                    print("STseg key doesn't exist")
                    delegate?.stSegValueData("-")
                }




            } else {
//                print("Failed to convert message payload to string")

            }



        }

    }

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

    func mqtt(_ mqtt: CocoaMQTT, didUnsubscribeTopics topics: [String]) {
//        print("topic: \(topics)")
    }

    func mqttDidPing(_ mqtt: CocoaMQTT) {
//        print("mqttDidPing")
    }

    func mqttDidReceivePong(_ mqtt: CocoaMQTT) {
//        print("mqttDidReceivePong")
    }

    func mqttDidDisconnect(_ mqtt: CocoaMQTT, withError err: Error?) {
        print("mqttDidDisconnect")
        let hexa = getSerialNoInBytes1(isLive: false)
        if(connectedDevicePeri != nil){
            peripheralWriteDataClear(peripheral: (connectedDevicePeri)!, command: (hexStringToByteArray(hexa)))
        }
    }
    func mqtt(_ mqtt: CocoaMQTT, didReceiveTrust trust: SecTrust, completionHandler: @escaping (Bool) -> Void) {
        print("didReceiveTrust callled...")
            completionHandler(true)
        }

    var isBtnTrigger: Bool = false
    var mqttConnectionStatus=""
    var patchevent:Int = 0
    var findIntervals: [FindInterval] = []
    var findIntervals_threesec: [FindInterval] = []
    var findIntervalsOffline: [FindInterval] = []
    var positionXYZlist: [PositionXYZ] = []
    var positionXYZlistOffline: [PositionXYZ] = []
        //27 number patch
        //let patientMongoId:String="65c49aea29f6a5db52a526e2"
        //66 patch
    var patientMongoId:String=""
    var rpmMongoId:String=""
    var kitMongoId:String=""
//    let defaultHost = "oomcardiodev.projectkmt.com"

// let defaultHost = "oomcardiotest.projectkmt.com"
// var mqtt: CocoaMQTT5?

    var mqtt: CocoaMQTT?
    
//    var mqttDelivery: CocoaM
    var centralManager:CBCentralManager?
    @Published var bleDevices:Array<CBPeripheral> = []
    @Published var isConnected:Bool = false
    var serialNumber:String = ""
    var connectedDevice:CBPeripheral?
    var manufactureData:Any?
    var characteristic1801:CBCharacteristic?
    var characteristic1807:CBCharacteristic?
    var writeCharacteristic1802:CBCharacteristic?
    
    var firmwareUpdateService:CBService?
    var firmWareUpdateCharacteristices:CBCharacteristic?
    
    var OADService:CBService?
    var OADCharacteristices1:CBCharacteristic?
    var OADCharacteristices3:CBCharacteristic?
    var OADCharacteristices5:CBCharacteristic?
    
    var ydata:Array<Double> = [1,1.2,1.3,1.0,1,1.0,]
    @Published var chartData: [(wave:Int,voltage:Double)] = []
    @Published var dataValues:ChartDataEntry = ChartDataEntry(x: 0, y: 0)

    var dataPublisher: AnyPublisher<ChartDataEntry, Never> {
        $dataValues.eraseToAnyPublisher()
    }

    @Published var scanning:Bool = true
    var removeDataSize:Int?=1000;
    @Published  var connectedDevicePeri: CBPeripheral? = nil
    var wave1: Double = 0
    var wave1one: Double = 0
    var wave1Two: Double = 0
    var wave1Tthree: Double = 0
    var wave1Four: Double = 0
    var wave1Five: Double = 0
    var wave1Six: Double = 0
    var wave1Seven: Double = 0
    var wave1Eight: Double = 0
    var wave1Nine: Double = 0
    var wave1Ten: Double = 0
    var wave1Eleven: Double = 0
    var wave1Twelve: Double = 0

    weak var delegate: BLEManagerDelegate?
    weak var delegateFlashMemory: BLEManagerDelegate?
    weak var delegateSyncPending: BLEManagerDelegate?

    weak var delegate12lead: BLEManagerDelegate?
    weak var delegate12lead2: BLEManagerDelegate?
    weak var delegate12lead3: BLEManagerDelegate?

    weak var delegate12leadv1: BLEManagerDelegate?
    weak var delegate12leadv2: BLEManagerDelegate?
    weak var delegate12leadv3: BLEManagerDelegate?
    weak var delegate12leadv4: BLEManagerDelegate?
    weak var delegate12leadv5: BLEManagerDelegate?
    weak var delegate12leadv6: BLEManagerDelegate?
    weak var delegate12leadvavr: BLEManagerDelegate?
    weak var delegate12leadvavl: BLEManagerDelegate?
    weak var delegate12leadvavf: BLEManagerDelegate?

    var forcefullyDisconnect: Bool? = false

// var mqttSession: MQTTSession!

    private var mTimer10Sec:Timer?
    private var mTimer3Sec:Timer?
    private var mTimer1Sec:Timer?
    private var mTimerOffline15Sec:Timer?

    var userObject:UserData?=nil

    var createdDate:Date?=nil

    let encoder = JSONEncoder()

    var ecgVersion:String=""

    var isInternetConnected = true

    //position custom
    var position: Int? = 0
    let positionDetection = PositionDetection()

    @Published var flashValue: Int = 0
    @Published var lastDataArray: Int64 = 0
    @Published var dataArray: Int64 = 0
    
    var reconnectAttempts = 0
        let maxReconnectAttempts = 10

    func formatDuration(from payload: String) -> String {
        guard let random = Double(payload) else { return "Invalid input" }
        let durationInMilliseconds = random * 60 * 60
        var seconds = Int(durationInMilliseconds)

        let days = seconds / (24 * 3600)
        seconds %= 24 * 3600
        let hours = seconds / 3600
        seconds %= 3600
        let minutes = seconds / 60
        seconds %= 60

        var stringBuilder = ""
        if days > 0 {
            stringBuilder += " Day: \(days)"
        }
        if hours > 0 {
            stringBuilder += " Hour: \(hours)"
        }
        if minutes > 0 {
            stringBuilder += " Min: \(minutes)"
        }
        if seconds > 0 {
            stringBuilder += " Sec: \(seconds)"
        }

        return stringBuilder
    }
    func mqttSetting() {

        print("mqttSetting ...\(patientMongoId)")
        let msg: [String: Any] = ["status": "Disconnected", "reason": 6]
            //        for MQTT 3.1.1
        let clientID = "CocoaMQTT-" + String(ProcessInfo().processIdentifier)
//        mqtt = CocoaMQTT(clientID: clientID, host: defaultHost, port: 1883)
        mqtt = CocoaMQTT(clientID: clientID, host: Constants.defaultHost, port: UInt16(Constants.port))

// mqtt!.logLevel = .debug
mqtt!.username = Constants.mqttUsername
mqtt!.password = Constants.mqttPassword
// mqtt!.username = "kmt"
// mqtt!.password = "Kmt123"

        do {
            let jsonData = try JSONSerialization.data(withJSONObject: msg, options: [])
            if let jsonString = String(data: jsonData, encoding: .utf8) {

// print("JSON string:", jsonString)
mqtt!.willMessage = CocoaMQTTMessage(topic: "oom/ecg/ecgConnectionStatus/"+patientMongoId, string: jsonString, qos: .qos1,retained:true)
}
} catch {
print("Error converting to JSON:", error)
}

// mqtt?.deliverTimeout
mqtt!.keepAlive = 60
// mqtt!.keepAlive = 10
mqtt!.delegate = self
mqtt!.autoReconnect = true
// mqtt!.cleanSession=false
mqtt!.autoReconnectTimeInterval = 5
// Configure additional settings for stability
mqtt!.enableSSL = false // Disable SSL for testing (if applicable)
// mqtt!.cleanSession = true // Ensure a clean session
mqtt!.cleanSession = false // Ensure a clean session
// mqtt!.autoReconnectTimeInterval = 60
// mqtt!.autoReconnectTimeInterval = 10
// mqtt!.logLevel = .debug
// mqtt!.didConnectAck
// mqtt!.top

            //        mqtt.bufferSize = 2048
        mqtt?.allowUntrustCACertificate = true
        reconnectAttempts = 0
        _ = mqtt!.connect()

            ///MQTT 5.0
            //        let clientID = "CocoaMQTT-" + String(ProcessInfo().processIdentifier)
            //        mqtt = CocoaMQTT5(clientID: clientID, host: Constants.defaultHost, port: UInt16(Constants.port))
            //
            //        let connectProperties = MqttConnectProperties()
            //        connectProperties.topicAliasMaximum = 0
            //        connectProperties.sessionExpiryInterval = 0
            //        connectProperties.receiveMaximum = 500
            //        connectProperties.maximumPacketSize = 500
            //        mqtt!.connectProperties = connectProperties
            //
            //        mqtt!.logLevel = .debug
            //        mqtt!.username = Constants.mqttUsername
            //        mqtt!.password = Constants.mqttPassword
            //        mqtt!.willMessage = CocoaMQTT5Message(topic: "/will", string: "dieout")
            //        mqtt!.keepAlive = 60
            //        mqtt!.delegate = self
            //        mqtt!.autoReconnect = true
            //        mqtt!.cleanSession=false
            //
            ////        mqtt!.allowUntrustCACertificate = true
            //
            //        _ = mqtt!.connect()

    }
    func  disconnectMQTTCall(){
        
        print("disconnectMQTTCall call")
        if mqtt !== nil {
            mqtt?.disconnect()
        }
        if mTimer1Sec !== nil {
            print("disconnectMQTTCall mTimer1Sec")
            mTimer1Sec?.invalidate()
            mTimer1Sec = nil
        }
        if mTimer10Sec !== nil {
            mTimer10Sec?.invalidate()
            mTimer10Sec = nil
        }

        if mTimer3Sec !== nil {
            mTimer3Sec?.invalidate()
            mTimer3Sec = nil
        }
        if mTimerOffline15Sec !== nil {
            mTimerOffline15Sec?.invalidate()
            mTimerOffline15Sec = nil
        }
        findIntervals.removeAll()
        positionXYZlist.removeAll()
        scanning=false

    }
    func  logoutFromMQTTCall(){
        print("logoutFromMQTTCall call")
        patchevent = 4
        sendBluetoothStatus(value: "Disconnected")
    }


    func randomStringWithLength(_ len: Int) -> String {
        let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

        var randomString = String()
        for _ in 0..<len {
            let length = UInt32(letters.count)
            let rand = arc4random_uniform(length)
            let index = String.Index(encodedOffset: Int(rand))
            randomString += String(letters[index])
        }
        return String(randomString)
    }
    func closeApplication(ackgroundTaskIdentifier: UIBackgroundTaskIdentifier?){
        print("AppDelegate terminate call...closeApplication")
        patchevent=0
//        DispatchQueue.main.async {
        sendBluetoothStatusKill(value: "Disconnected",ackgroundTaskIdentifier: ackgroundTaskIdentifier)
//        }
    }

Thanks in Advance

@andypiper
Copy link
Contributor

Please remove me from your issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants