투케이2K

126. (TWOK/LOGIC) [Ios] NWConnection 사용해 Broker MQTT 연결 수행 시 MQTT Version 버전 지정 로직 본문

투케이2K 로직정리

126. (TWOK/LOGIC) [Ios] NWConnection 사용해 Broker MQTT 연결 수행 시 MQTT Version 버전 지정 로직

투케이2K 2024. 12. 2. 19:08

[로직 정리]

정리 로직 : Ios / 아이폰

상태 : [Ios] NWConnection 사용해 Broker MQTT 연결 수행 시 MQTT Version 버전 지정 로직

 

[설 명]

 

// --------------------------------------------------------------------------------------
[사전) 설정 및 정보 확인 사항]
// --------------------------------------------------------------------------------------

- Broker MQTT 통신을 수행하기 위한 IP , PORT 정보 확인 필요


- 사전) 위치 권한 설정 필요


- NWConnection 설명 :

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

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

  >> NWParameters 설정 가능 옵션 : 

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

  >> 참고 사이트 : https://developer.apple.com/documentation/network/nwconnection

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






// --------------------------------------------------------------------------------------
[로직 설명]
// --------------------------------------------------------------------------------------

1. 애플리케이션 실행 및 MQTT 통신을 수행할 수 있는 화면 진입


2. MQTT 클래스 화면에서 lazy 선언으로 NWProtocolTCP.Options , NWParameters 옵션 설정 수행 

  >> TimeOut 설정으로 연결 대기 제한 시간 설정


3. IP , PORT 정보 사용해 NWConnection 객체 초기화 URL 지정 및 설정한 옵션 값 지정 수행 >> 연결 요청 실시

  >> nwConnection?.start(queue: .global())


4. 연결 완료 상태를 감지하기 위한 stateUpdateHandler 이벤트 감지 핸들러 등록 및 ready 준비 완료 상태 확인


5. stateUpdateHandler 핸들러에서 준비 완료 상태가 된 경우 MQTT 연결 옵션을 설정하기 위한 send 정보 전달 수행

    /*
    // ---------------------------------------------
    // MARK: [최종 연결 요청 패킷 보내기]
    // ---------------------------------------------
    1. MQTT 버전 설명 :

        - 0x03 : MQTT 3.1   : MQIsdp
        - 0x04 : MQTT 3.1.1 : MQTT
        - 0x05 : MQTT 5.0   : MQTT
    // ---------------------------------------------
    2. Connect Flags 타입 종류 :

        - Bit : Name
        - 7 : User Name Flag
        - 6 : Password Flag
        - 5 : Will Retain
        - 4 : Will QoS
        - 3 : Will Flag
        - 2 : Clean Session
        - 1 : Reserved
    // ---------------------------------------------
    3. Keep Alive : 클라이언트와 브로커간 연결 상태 유지 값 : 해당 값 동안 들어온 패킷이 없으면 서버는 연결 중단 상태로 인지

        - Keep Alive 설정의 최대값은 65535초, 즉 18시간 12분 15초
        - 60 초 : 0x3C
        - 180 초 : 0xB4
    // ---------------------------------------------
    4. QoS : Application Message의 신뢰성을 보장하는 레벨입니다 (0, 1, 2)

        - 숫자가 커질수록 높은 신뢰성을 보장하지만 그만큼의 리소스를 소모합니다
    // ---------------------------------------------
    */


    // ---------------------------------------------
    var packet = [UInt8]()
    packet.append(0x10) // [CONNECT Control Packet type]
    let variableHeader: [UInt8] = [
        0x00, 0x04, // [Length of "MQTT 3.1.1"]
        0x4D, 0x51, 0x54, 0x54, // ["MQTT"] : "MQTT".utf8
        0x04,       // [Protocol Level (4 for MQTT 3.1.1)]
        0x02,       // [Connect Flags (Clean session)]
        0x00, 0xB4  // [Keep Alive (180 seconds)] : 클라이언트와 브로커간 연결 상태 유지 값 : Hex To Dec
    ]
    let clientIdBytes = Array(clientId.utf8) // [클라이언트 아이디]
    let payload = UInt16(clientIdBytes.count).bigEndianBytes + clientIdBytes
    let remainingLength = UInt8(variableHeader.count + payload.count)
    packet.append(remainingLength)
    packet.append(contentsOf: variableHeader)
    packet.append(contentsOf: payload)
    // ---------------------------------------------


    nwConnection?.send(content: Data(packet), completion: .contentProcessed { error in
        if let error = error {
            C_Broker_Mqtt_NWConnection_Client_Module.SETTING_ERROR_LOG = "[Error] : Mqtt Setting Send Connection Packet Error"
            
            S_Log._E_(description: "MQTT 연결 요청 패킷 전송 에러", data: [
                "M_LOG :: \(C_Broker_Mqtt_NWConnection_Client_Module.SEND_ERROR_LOG)",
                "Description :: \(error)"
            ])
            
            // [콜백 반환]
            completion(false)
            return
            
        } else {
            S_Log._W_(description: "MQTT 연결 요청 패킷 전송 성공", data: nil)
            
            // [콜백 반환]
            completion(true)
            return
            
        }
    })


6. 연결 요청 패킷 전달 후 error 없이 최종 성공 완료 된 경우 연결 완료 상태 Flag 플래그 값 True 변경 수행

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






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[Ios - NWConnection 설명 및 TCP IP 소켓 통신 연결 및 데이터 전송 방법]

https://blog.naver.com/kkh0977/223670153413


[Ios - NWConnection 사용해 TCP IP 소켓 통신 NWProtocolTCP.Options 옵션 설정 방법]

https://blog.naver.com/kkh0977/223672535940


[Ios - NWConnection 사용해 TCP IP 소켓 통신 연결 후 stateUpdateHandler 연결 상태 확인 방법]

https://blog.naver.com/kkh0977/223672601987


[Ios - NWConnection 사용해 Broker 브로커 MQTT 연결 방법]

https://blog.naver.com/kkh0977/223678381489


[Ios - NWConnection 사용해 Broker 브로커 MQTT 메시지 publish send 전송 방법]

https://blog.naver.com/kkh0977/223678384631


[Ios - NWConnection 사용해 Broker 브로커 MQTT 메시지 subscribe 구독 방법]

https://blog.naver.com/kkh0977/223678387123

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

 

반응형
Comments