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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.