투케이2K

578. (ios/swift5) [간단 소스] NWConnection 사용해 Broker 브로커 MQTT 메시지 publish send 전송 방법 본문

IOS

578. (ios/swift5) [간단 소스] NWConnection 사용해 Broker 브로커 MQTT 메시지 publish send 전송 방법

투케이2K 2024. 12. 1. 00:25

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 

[소스 코드]

 

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Swift


- 개발 툴 : Xcode


- NWConnection 설명 :

  >> NWConnection 는 로컬 엔드포인트와 원격 엔드포인트 간의 양방향 데이터 연결 (TCP , UDP) 을 수행할 수 있습니다

  >> NWConnection 를 사용하기 위해서는 import Network 패키지 호출 정의가 필요합니다

  >> NWParameters 설정 가능 옵션 : 

   - tls
   - tcp
   - dtls
   - udp
   - quic
   - quicDatagram

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

// ----------------------------------------------------------
// MARK: - [SEARCH FAST] : observableSendData : 실시간 MQTT 메시지 전송 수행
// ----------------------------------------------------------
static var SEND_ERROR_LOG = ""
func observableSendData(topic:String, message:String, qos: UInt8, completion: @escaping (Bool)->()) {
    
    /*
    // -----------------------------------------
    [observableSendData 메소드 설명]
    // -----------------------------------------
    1. 실시간 MQTT 메시지 전송 수행
    // -----------------------------------------
    2. 호출 방법 :
        
        C_Broker_Mqtt_NMConnection_Client_Module().observableSendData(topic: "hello", message: "twok", qos: 0){(sendResult) in
            
            S_Log._F_(description: "MQTT 실시간 메시지 전송 확인", data: ["\(sendResult)"])

            if sendResult == true {
            
            }
            else {
            S_Log._F_(description: "MQTT 실시간 메시지 전송 에러 메시지", data: ["\(C_Broker_Mqtt_NMConnection_Client_Module.SEND_ERROR_LOG)"])
            }
            
        }
        
    // -----------------------------------------
    3. 필요 import :
        
        import Network
    // -----------------------------------------
    */
    
    
    // [변수 선언]
    C_Broker_Mqtt_NMConnection_Client_Module.SEND_ERROR_LOG = ""
    
    
    // [로직 처리 수행]
    DispatchQueue.global().sync {

        if C_Broker_Mqtt_NMConnection_Client_Module.connection != nil && C_Util().stringNotNull(str: topic)
            && C_Util().stringNotNull(str: message) == true && qos >= 0 {
            
            S_Log._F_(description: "MQTT 클라이언트 >> 특정 토픽 메시지 전송 수행", data: ["TOPIC :: \(topic)", "QOS :: \(qos)", "MSG :: \(message)"])
            

            // ---------------------------------------------
            // MARK: [패킷 데이터 전송 수행]
            // ---------------------------------------------
            /*
            var packet = [UInt8]()
            packet.append(0x30) // [PUBLISH Control Packet type]
            let topicBytes = Array(topic.utf8)
            let topicLength = UInt16(topicBytes.count).bigEndianBytes
            let messageBytes = Array(message.utf8)
            let remainingLength = UInt8(topicLength.count + topicBytes.count + messageBytes.count)
    
            packet.append(remainingLength)
            packet.append(contentsOf: topicLength)
            packet.append(contentsOf: topicBytes)
            packet.append(contentsOf: messageBytes)
            // */
            // ---------------------------------------------
            //*
            var packet = [UInt8]()
            let qosFlag = (qos & 0x03) << 1 // [QoS 는 고정 헤더의 2~3번째 비트에 위치]
        
            // [PUBLISH 고정 헤더 (Control Packet Type + Flags)]
            packet.append(0x30 | qosFlag)
        
            let topicBytes = Array(topic.utf8)
            let topicLength = UInt16(topicBytes.count).bigEndianBytes
            let messageBytes = Array(message.utf8)
        
            var remainingLength = topicLength.count + topicBytes.count + messageBytes.count
        
            // [QoS가 1 이상이면 Packet Identifier가 필요]
            if qos > 0 {
                remainingLength += 2
            }
        
            packet.append(contentsOf: self.encodeRemainingLength(remainingLength))
            packet.append(contentsOf: topicLength)
            packet.append(contentsOf: topicBytes)
        
            // [Packet Identifier (QoS 1 이상일 때 추가)]
            if qos > 0 {
                let packetId = UInt16.random(in: 1...UInt16.max)
                packet.append(contentsOf: packetId.bigEndianBytes)
            }
        
            packet.append(contentsOf: messageBytes)
            // */
            // ---------------------------------------------
            

            C_Broker_Mqtt_NMConnection_Client_Module.connection?.send(content: Data(packet), completion: .contentProcessed { error in
                if let error = error {
                    C_Broker_Mqtt_NMConnection_Client_Module.SEND_ERROR_LOG = "[Error] : Mqtt Publish Send Message Error"
                    
                    S_Log._D_(description: "MQTT 실시간 메시지 전송 에러", data: [
                        "M_LOG :: \(C_Broker_Mqtt_NMConnection_Client_Module.SEND_ERROR_LOG)",
                        "Description :: \(error)"
                    ])
                    completion(false) // [콜백 반환]
                    return
                    
                } else {
                    S_Log._D_(description: "MQTT 실시간 메시지 전송 성공", data: [
                        "message :: \(message)"
                    ])
                    completion(true) // [콜백 반환]
                    return
                    
                }
            })
            
        }
        else {
            C_Broker_Mqtt_NMConnection_Client_Module.SEND_ERROR_LOG = "[Error] : Publish Input Send Message Is Null"
            
            S_Log._D_(description: "MQTT 실시간 메시지 전송 에러", data: [
                "M_LOG :: \(C_Broker_Mqtt_NMConnection_Client_Module.SEND_ERROR_LOG)"
            ])
            completion(false) // [콜백 반환]
            return
        }
        
    }

}

// --------------------------------------------------------------------------------------
​

 

반응형
Comments