MQTT 프로토콜 구현(一)

3778 단어 iossocket합의mqtt
MQTT 프로토콜 구현(一)
11년 동안'MQTT 프로토콜로 안드로이드 메시지 전송을 실현했다'는 글을 썼는데 그때는 전송 기능을 실현하기 위해 MQTT 프로토콜의 내용을 자세히 읽지 못했다.최근에 동료가 다시 이 협의를 제기하는 것을 보고 심혈을 기울여 실현하였다.MQTT 프로토콜은 tcp 프로토콜 위에 있는 것으로 TCP/IP 기반의 응용 프로토콜로 자신이 이전에 정리한 tcp 기반의 RHSocket 프레임워크를 검증할 수 있다.
MQTT 프로토콜 개요
MQTT(Message Queue Telemetry Transport), 원격 측정 전송 프로토콜, 구독/발표 모드를 제공하여 더욱 간략하고 가볍고 사용하기 쉽고 제한된 환경(대역폭이 낮고 네트워크 지연이 높으며 네트워크 통신이 불안정)을 대상으로 이동 인터넷 장면의 메시지 전송에 매우 효과적이다.
특징은 다음과 같습니다.
1. 게시/구독 메시지 모드를 사용하여 일대다 메시지 발표를 제공하고 응용 프로그램 결합을 접한다.
2. 부하 내용에 대한 차단된 메시지 전송.
3. TCP/IP를 사용하여 네트워크 연결을 제공합니다.
4. 서비스 품질을 발표하는 세 가지 메시지가 있다.'많게는 한 번','적어도 한 번','단 한 번'.
5. 전송 데이터가 작고(최소 고정 길이의 머리는 2바이트), 프로토콜 교환을 최소화하여 네트워크 데이터를 낮춘다.
구체적인 협의 내용은 ibm 사이트에서 배울 수 있다.http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html
공식 다운로드 주소:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/MQTT_V3.1_Protocol_Specific.pdf
네티즌의 블로그를 직접 읽을 수도 있다.http://www.blogjava.net/yongboy/archive/2014/02/07/409587.html
MQTT의 프로토콜 내용을 읽은 후에 앞에서 언급한 RHSocket 프레임워크에서 언급한 사용자 정의 프로토콜 내용과 유사하다는 것을 알 수 있습니다.
프로토콜 헤더(고정 헤더fixedheader, 가변 헤더variableheader)+내용(내용 캐리어payload).
헤드 고정(첫 번째 고정 프로토콜 바이트, 가변 길이 바이트)
첫 번째 바이트(8비트)
4개의 데이터 콘텐츠, 메시지 type, dup flag, QoS level,retain을 고정 반입했습니다.
0
1
2
3
4
5
6
7
0~3위, 이 4개bit는 메시지 type입니다.
4위, 이 1비트는 dup flag이다.
5위와 6위, 이 2비트는 QoS level이다.
7위, 이 비트는retain, 예약 비트입니다.
프로그램 정의는 다음과 같습니다.
/** message type */
typedef NS_ENUM(UInt8, RHMQTTMessageType) {
    RHMQTTMessageTypeConnect = 1,           //client request to connect to server
    RHMQTTMessageTypeConnAck = 2,           //connect acknowledgment
    RHMQTTMessageTypePublish = 3,           //publish message
    RHMQTTMessageTypePubAck = 4,            //publish acknowledgment
    RHMQTTMessageTypePubRec = 5,            //publish received (assured delivery part 1)
    RHMQTTMessageTypePubRel = 6,            //publish release (assured delivery part 2)
    RHMQTTMessageTypePubComp = 7,           //publish complete (assured delivery part 3)
    RHMQTTMessageTypeSubscribe = 8,         //client subscribe request
    RHMQTTMessageTypeSubAck = 9,            //subscribe acknowledgment
    RHMQTTMessageTypeUnsubscribe = 10,      //client unsubscribe request
    RHMQTTMessageTypeUnsubAck = 11,         //unsubscribe acknowledgment
    RHMQTTMessageTypePingReq = 12,          //ping request
    RHMQTTMessageTypePingResp = 13,         //ping response
    RHMQTTMessageTypeDisconnect = 14,       //client is disconnecting
    RHMQTTMessageTypeReserved = 15          //reserved
};
/** QoS(Quality of Service,    ) */
typedef NS_ENUM(UInt8, RHMQTTQosLevel) {
    RHMQTTQosLevelAtMostOnce = 0,               //    ,     ,<=1
    RHMQTTQosLevelAtLeastOnce = 1,              //    ,      ,>=1
    RHMQTTQosLevelExactlyOnce = 2,              //    ,      ,=1
    RHMQTTQosLevelReserved = 3                  //  ,    
};

가변 길이 바이트(가변 헤드와 프로토콜 내용의 길이를 합한 동적 계산은 최소 1바이트 0x7F, 최대 4바이트 0xFF, 0xFF, 0xFF, 0x7F)
0xff
0xff
0xff
0x7f
가변 헤드와 패키지 내용의 데이터 길이의 합이 127보다 크면 가변 길이의 바이트 수는 원래의 1바이트에서 수용 가능한 바이트로 최대 4바이트로 늘려야 한다.
왜 0xff가 아닌지,http://www.blogjava.net/yongboy/archive/2014/02/07/409587.html에는 MQTT 프로토콜 규정에 따른 것이라고 설명되어 있습니다.
가변 헤드, 가변 헤드, 협의에 따라 명령, 휴대하는 데이터 내용도 다르다.http://www.blogjava.net/yongboy/archive/2014/02/09/409630.html
후속은 절차를 통해 각각 설명한다.
포괄체의 내용은 위와 같다.
구체적인 내용은 학습 연결을 제공했으니 복사하지 않겠습니다, 하하.
관련 내용을 읽은 후에 MQTT 프로토콜의 필드 정의를 대충 알고 다음 편은 MQTT 프로토콜의 연결에서 착안하여 한 걸음 한 걸음 배워야 한다.
관련 코드가github에 제출되었습니다.https://github.com/zhu410289616/RHMQTTKit

좋은 웹페이지 즐겨찾기