Tongxin UOS 시스템 개발 노트(8): Tongxin UOS에서 mqtt 기본 환경 컴파일 및 빌드(버전은 QMQTT::Client 사용)

기사가 원본 기사인 경우 재인쇄 시 원본 기사의 출처를 명시해 주시기
바랍니다 .

Red Fatty(Red Imitation)의 블로그 백과사전: 개발 기술 수집(Qt 실용 기술, Raspberry Pi, 3D, OpenCV, OpenGL, ffmpeg, OSG, 단일 칩 마이크로컴퓨터, 소프트웨어와 하드웨어의 결합 등 포함)은 지속적으로 수집되고 있습니다. 업데이트됨... (포털 클릭)

국산 Kylin 시스템 및 Tongxin UOS 시스템 개발

마지막 기사: " Tongxin UOS 시스템 개발 노트(7): linuxdeployqt를 사용하여 Tongxin UOS 시스템에서 qt 프로그램 출시 "
다음 기사: 계속 지켜봐 주십시오...


머리말

  Tongxin uos는 개발에 mqtt를 사용하며 mqtt를 다시 컴파일해야 합니다.이 기사에서는 Tongxin uos20에서 mqtt 소스 코드 컴파일 및 환경 구성에 대해 설명합니다.


알아채다

  여기에서 다운로드한 mqtt 버전은 다른 글과 다른데 여기서는 QMQTT::CLIENT를 사용하여 작동합니다.여기서 작성자는 Qt에 두 가지 버전이 있음을 알고 있습니다. 다른 클래스 및 방법에 따라 필요에 따라 선택하십시오)
  여기에 이미지 설명 삽입

  여기에 이미지 설명 삽입


관련 블로그

  " Mqtt Development Notes: Mqtt 서버 구성 "
  " Qt 개발 기술: mqtt 소개, QtMqtt 컴파일 및 개발 환경 구축 "
  " Mqtt Development Notes: Windows에서 C++ ActiveMQ 클라이언트 소개, 컴파일 및 사용 "


MQTT 프로토콜

소개

  MQTT(Message Queuing Telemetry Transport, Message Queuing Telemetry Transport Protocol)는 1999년 IBM에서 개발한 TCP/IP 프로토콜을 기반으로 하는 게시/구독(게시/구독) 모델을 기반으로 하는 "경량" 통신 프로토콜입니다. 출시된. MQTT의 가장 큰 장점은 매우 적은 코드와 제한된 대역폭으로 연결된 원격 장치에 대한 안정적인 실시간 메시지 서비스를 제공할 수 있다는 것입니다. 낮은 오버헤드, 낮은 대역폭의 인스턴트 메시징 프로토콜로서 사물 인터넷, 소형 장치 및 모바일 애플리케이션의 광범위한 애플리케이션을 보유하고 있습니다.

설계 원칙

  • 불필요한 기능을 추가하지 않고 능률화되었습니다.
  • 센서 간 메시지 전송을 용이하게 하는 발행/구독(Pub/Sub) 모드
  • 사용자가 주제를 동적으로 생성할 수 있도록 하여 운영 및 유지 비용이 들지 않습니다.
  • 전송 효율을 높이기 위해 전송량을 최소화합니다.
  • 낮은 대역폭, 긴 대기 시간, 불안정한 네트워크와 같은 요소를 고려하십시오.
  • 지속적인 세션 제어를 지원합니다.
  • 클라이언트 컴퓨팅 성능이 낮을 수 있음을 이해하십시오.
  • 서비스 품질 관리 제공
  • 데이터가 불가지론적이라고 가정하면 전송된 데이터의 유형과 형식은 유연성을 유지하는 데 필요하지 않습니다.

특징

1) 게시/구독 메시지 모드를 사용하여 일대다 메시지 게시 및 분리 애플리케이션 제공

  이것은 XMPP와 매우 유사하지만 XMPP는 XML 형식의 텍스트를 사용하여 데이터를 전송하기 때문에 MQTT의 정보 중복성은 XMPP보다 훨씬 작습니다.

2) 페이로드 콘텐츠 마스킹을 위한 메시지 전송

3) TCP/IP를 이용한 네트워크 연결 제공

  주류 MQTT는 데이터 푸시를 위한 TCP 연결을 기반으로 하지만 MQTT-SN이라는 UDP 기반 버전도 있습니다. 이 두 가지 버전은 서로 다른 연결 방법을 기반으로 하기 때문에 장단점이 당연히 다릅니다.

4) 메시지 게시 서비스 품질에는 세 가지 유형이 있습니다.

  • "최대 한 번" 메시지 게시는 기본 TCP/IP 네트워크에 전적으로 의존합니다. 메시지 손실 또는 중복이 발생할 수 있습니다. 이 수준은 환경 센서 데이터와 같은 상황에서 사용할 수 있습니다. 가까운 장래에 두 번째 전송이 있기 때문에 읽기 레코드가 손실되더라도 상관 없습니다. 이 방법은 주로 일반 APP 푸시용으로, 메시지 푸시 시 스마트 기기가 인터넷에 연결되어 있지 않은 경우 과거에 푸시가 수신되지 않았으며, 인터넷 연결 시 수신되지 않습니다. 다시.
  • "적어도 한 번"은 메시지가 도착하도록 하지만 메시지 중복이 발생할 수 있습니다.
  • "한 번만"은 메시지가 한 번만 도착하도록 합니다. 이 수준은 요구 사항이 엄격한 일부 청구 시스템에서 사용할 수 있습니다. 청구 시스템에서 메시지가 중복되거나 누락되면 잘못된 결과가 발생할 수 있습니다. 이 최고 품질의 메시지 게시 서비스는 인스턴트 메시징 APP 푸시에도 사용되어 사용자가 한 번만 수신하도록 할 수 있습니다.

5) 작은 전송, 낮은 오버헤드

  (고정 길이 헤더는 2바이트), 프로토콜 교환을 최소화하여 네트워크 트래픽을 줄입니다. "사물 인터넷 분야에서 센서와 서버 간의 통신 및 정보 수집"에 매우 적합합니다. 임베디드 장치의 컴퓨팅 성능과 대역폭은 상대적으로 약하므로 이 프로토콜을 사용하여 메시지를 전송하는 것이 완벽합니다.

6) 클라이언트의 비정상적인 중단 메커니즘.

  • 마지막 유언장: 마지막 유언장을 보낸 장치의 연결이 끊어졌음을 동일한 주제 아래의 다른 장치에 알리는 데 사용되는 마지막 유언장 메커니즘입니다.
  • 유언: Last Will과 기능이 유사한 유언 메커니즘.

게시/구독자 패턴

  MQTT는 클라이언트-서버 기반 메시지 발행/구독 전송 프로토콜입니다. MQTT 프로토콜은 가볍고 간단하며 개방적이며 구현하기 쉽습니다. 이러한 특성으로 인해 널리 적용할 수 있습니다. 많은 경우 M2M(Machine-to-Machine) 통신 및 사물 인터넷(IoT)과 같은 제한된 환경을 포함합니다. 그것은 위성 링크를 통해 통신하는 센서, 때때로 전화를 거는 의료 기기, 스마트 홈 및 일부 소형 장치에 광범위하게 사용됩니다.
  여기에 이미지 설명 삽입

  그림에서 MQTT에는 세 가지 역할이 있습니다.

  • Broker agent : 많은 사람들이 미들웨어로 이해하고 있습니다. 물론 그렇게 볼 수도 있습니다. 그는 미들웨어입니다. 정보를 가공하여 해당 가입자에게 보내기 위해 사용합니다.
  • 게시자 : 에이전트에 정보를 게시하는 데 사용됩니다. 참고: 발행자는 구독자가 될 수도 있습니다.
  • Subscriber : 정보를 받는 클라이언트입니다.

MQTT 서버

  MQTT 서버는 "메시지 브로커"(브로커)라고 하며 애플리케이션 또는 장치일 수 있습니다. 메시지 게시자와 구독자 사이에 있으며 다음을 수행할 수 있습니다.

  • 고객의 네트워크 연결을 수락합니다.
  • 고객이 공개한 애플리케이션 정보를 수락합니다.
  • 클라이언트의 구독 및 구독 취소 요청을 처리합니다.
  • 가입한 클라이언트에 애플리케이션 메시지를 전달합니다.

MQTT 프로토콜의 메서드

  일부 메서드(작업이라고도 함)는 특정 리소스에 대한 작업을 나타내기 위해 MQTT 프로토콜에 정의되어 있습니다. 이 리소스는 서버 구현에 따라 기존 데이터 또는 동적으로 생성된 데이터를 나타낼 수 있습니다. 일반적으로 리소스는 서버의 파일 또는 출력을 나타냅니다. 주요 방법은 다음과 같습니다.

  • Connect : 서버와의 연결을 기다리는 중
  • 연결 끊기 : MQTT 클라이언트가 작업을 완료할 때까지 기다린 후 서버에서 TCP/IP 세션 연결을 끊습니다.
  • 구독 : 구독이 완료될 때까지 기다립니다.
  • UnSubscribe : 서버가 클라이언트의 하나의 라이브 다중 및 주제 구독을 취소하기를 기다립니다.
  • Publish : MQTT 클라이언트는 메시지 요청을 전송하고 전송 후 애플리케이션 스레드로 리턴합니다.

Tongxin UOS 시스템 버전

  시스템 버전:
  여기에 이미지 설명 삽입


Qt는 Mqtt를 컴파일합니다(uos 시스템).

  Qt는 버전 5와 10에서 mqtt를 지원하기 시작했지만 설치 패키지에 통합되어 있지 않으므로 직접 다운로드하여 컴파일해야 합니다. (Qt5.9.3을 사용하여 mqtt를 실행할 수도 있습니다.)
  Qt에서 제공하는 qtmqtt 라이브러리는 큐 모드(point-to-point)를 지원하지 않으며 구독/게시자 모드만 지원합니다.

1단계: mqtt를 다운로드하고 대상 시스템에 복사 및 압축 해제(이 단계는 폐지됨)

  다운로드 주소: https://codereview.qt-project.org/admin/repos/qt%2Fqtmqtt
  , 일반 CSDN 주소: https://download.csdn.net/download/qq21497936/11211403
  지침:

git clone "https://codereview.qt-project.org/qt/qtmqtt"

   여기에 이미지 설명 삽입

  (PS: 현재 시간은 2023년 6월 16일입니다. 이때 다운로드한 qtmqtt는 CMakeList를 사용하여 버전을 구성하고 컴파일하도록 업데이트되었습니다. 블로거의 다른 블로거의 qtmqtt 버전은 .pro 버전입니다)
  여기에 이미지 설명 삽입

  여기에서 " Into the Pit 1 "을 확인하십시오. 우리는 qt5 버전이므로 git 다운로드는 쓸모가 없습니다. 이제 qt 소스 코드 다운로드로 전환하여 mqtt 모듈의 해당 버전을 다운로드하십시오.

2단계: mqtt 모듈 소스 코드를 다운로드하는 qt 소스 코드, 대상 시스템에 압축 해제

  여기에서 qtmqtt의 해당 버전을 다운로드하고 싶기 때문에 버전을 선택해야 합니다.
  좋지 않습니다. github에서 버전을 찾았습니다: https://github.com/emqx/qmqtt
  여기에 이미지 설명 삽입

  이것은 pro와 cmake를 모두 지원합니다. 다운로드하고 압축을 풉니다.
  여기에 이미지 설명 삽입

3단계: QtQCreator를 사용하여 프로 프로젝트 컴파일 열기

  여기에 이미지 설명 삽입

  릴리스에 맞게 조정된 이 오류는 블로그의 다른 버전에서 여기에서 컴파일된 오류와 일치하므로 새 것을 다운로드하고 잘못 시도했지만 동일한 것으로 판명되었습니다.
  여기에 이미지 설명 삽입

  삭제 후 mqtt 라이브러리를 별도로 빌드합니다. 동일합니다.
  여기에 이미지 설명 삽입

  조사 결과 Qt5Mqtt 파일이 생성되지 않는 것이 문제인 것으로 밝혀졌습니다. .../qtmqtt/src/mqtt/.pch 경로에 Qt5Mqtt 파일을 수동으로 생성하면 해결됩니다.
  여기에 이미지 설명 삽입

  그런 다음 쉽게 성공합니다.
  여기에 이미지 설명 삽입

  그런 다음 모듈화를 위해 디버그도 컴파일됩니다.


qt에 mqtt 모듈 배포

  여기에는 세 가지 방법이 있는데, 첫 번째는 소스 코드를 프로젝트에 직접 대체하는 방법, 두 번째는 모듈 형태로 qt 설치 디렉토리에 직접 배포하는 방법, 세 번째는 라이브러리 및 헤더 파일을 직접 추가하는 방법입니다. 첫 번째 방법은 Qt 설치 라이브러리의 설치 디렉토리에 추가하고, 두 번째 방법은 " Qt Development Technology: Introduction to mqtt, QtMqtt Compilation and Development Environment Construction "에서 확인하실 수 있습니다.
  이전에 라이브러리로 컴파일할 수 있으므로 코드를 소스 코드에 직접 통합할 수 있습니다.

1단계: 새 mqttClientDemo 프로젝트 생성

  여기에 이미지 설명 삽입

2단계: 소스 코드에서 mqtt 모듈을 추출하고 통합합니다.

  qtmqtt 소스 코드 중 하나를 추출하여 새 프로젝트의 모듈에 일반 코드 모듈로 추가하고 qmqtt.pri 파일을 가져옵니다.
  여기에 이미지 설명 삽입

3단계: 컴파일 및 오류 보고, 네트워크 모듈 추가

  QHostAddress를 찾을 수 없고 네트워크 모듈 모듈이 누락되었으며 네트워크 모듈이 추가되었다는 컴파일 오류가 보고되었습니다.

QT += network

  추출된 소스 코드의 .pri에 다음을 추가합니다.
  여기에 이미지 설명 삽입

  그런 다음 컴파일하십시오.

4단계: 컴파일 및 오류 보고, 함수 정의를 찾을 수 없음

  여기에 이미지 설명 삽입

  " Entering the Pit 2 "를 확인하십시오. 이전에는 PRIVATE_HEADERS를 사용하여 라이브러리였기 때문에 이제 소스 코드 통합이며 아래와 같이 HEADERS로 대체됩니다.
  여기에 이미지 설명 삽입

  헤더 파일을 내보내십시오.
  여기에 이미지 설명 삽입

  컴파일을 계속하십시오.

5단계: 컴파일 및 전달

  여기에 이미지 설명 삽입

  소스 코드는 컴파일에 통합되고 전달되므로 이후에 시스템 또는 버전을 변경하기 위해 mqtt 모듈을 추가할 때 다시 컴파일할 필요가 없으므로 작성자에게 더 적합합니다.

6단계: 배포 모듈 최적화

  새 mqttClientManager 관리 모듈을 만들고(빈 관리 클래스를 사용하여 먼저 자리를 차지함) 이 모듈을 사용하여 mqtt 소스 코드를 포함합니다.
  여기에 이미지 설명 삽입


모듈식 배포

  여기에 이미지 설명 삽입


프로젝트 템플릿

  여기에 이미지 설명 삽입


구덩이 속으로

항목 1: 최신 버전 다운로드는 qt5를 지원하지 않지만 qt6은 지원합니다.

질문

  최신 버전의 Git은 qt5를 지원하지 않지만 qt6은 지원합니다.
  여기에 이미지 설명 삽입

이유

  Q6은 컴파일을 위해 cmake로 변경, qt5는 qmake, 작성자는 qt5

해결하다

  이 버전의 mqtt는 포기하고 qt5를 지원하는 마지막 mqtt 버전을 찾습니다.

항목 2: mqtt 헤더 파일을 찾을 수 없습니다.

질문

  소스 코드가 포함되어 있지만 찾을 수 없습니다.

이유

  개인 헤더 파일 매크로를 헤더 파일 매크로로 변경하려면

해결하다

  여기에 이미지 설명 삽입

구덩이 3: 이전 버전은 qt5.12.8 컴파일에 통합하려고 시도했지만 실패했습니다.

문제와 원인

  여기에 이미지 설명 삽입

해결하다

  해결할 필요가 없으며 문제가 있음을 나타냅니다. 해당 버전을 다운로드하십시오.


마지막 기사: " Tongxin UOS 시스템 개발 노트(7): linuxdeployqt를 사용하여 Tongxin UOS 시스템에서 qt 프로그램 출시 "
다음 기사: 계속 지켜봐 주십시오...


기사가 원본 기사인 경우 재인쇄 시 원본 기사의 출처를 명시해 주시기
바랍니다 .

추천

출처blog.csdn.net/qq21497936/article/details/131455493