글을 시작하기 전에, 네티즌 "Xiaolong"과 emqtt.io 그룹 네티즌 여러분께 감사드립니다. 저는 막 MQTT를 사용하기 시작했습니다. 이해가 안 되는 부분이 많습니다. emqtt.io 그룹에서 해결책에 대해 물었더니, "Xiaolong"이 MQTT 지식 포인트에 대해 자세히 설명해 주고 해결책을 제공해 주셔서 정말 감사합니다. 거기서 언급된 내용들이 초보자에게 여전히 매우 유용하다고 생각해서, 참고할 수 있도록 "Xiaolong"과의 채팅 기록을 요약해 드릴게요.
질문 1: MCU의 캐시와 처리 능력이 제한되어 있으면 메시지를 한 번에 전송하는 것이 불가능합니다. 이 경우 MQTT를 통해 메시지를 어떻게 게시하나요? 먼저, 퍼블리시 프로토콜의 헤더를 조립하고, 페이로드 길이를 기록한 뒤 TCP를 통해 전송한 뒤, 페이로드를 조금씩 전송합니다. 전체 페이로드 길이를 얻지 못하면 어렵습니다. 퍼블리시 프로토콜 리포트를 보내기 때문에, 서버가 헤드에서 페이로드 길이를 읽은 후, 필요한 길이에 도달할 때까지 계속 읽고, 그 후 퍼블리싱이 집계됩니다. 따라서 먼저 게시할 콘텐츠의 길이를 확인한 뒤, 게시 패킷 헤더를 그룹화하고, 페이로드 길이와 tcp:send(head)를 입력한 뒤, 페이로드를 한 번에 1k씩 보내거나, 일반 TCP에 따라 데이터를 보내고 게시가 끝나도 끝까지 보내는 것이 필요합니다. 다음 전송은 TCP 계층에 속하며, 개입할 필요가 없습니다. TCP 계층에서 전송이 실패하면 소켓에 문제가 있거나 연결이 끊어졌고, MQTT 서버에 다시 연결해야 합니다. 만약 연결이 완료되지 않으면 서버 세션도 종료되어 서버가 데이터를 받지 못한 상태입니다. 재연결하려면 메시지를 다시 보내야 하고, 연결이 끊긴 상태라면 다시 연결해야 합니다. 데이터를 다시 보내고 싶은지는 이전 데이터를 저장했는지에 따라 달라집니다. 또한 메시지가 중요하다면 qos=1 또는 2를 사용해 서버가 메시지를 받도록 할 수 있습니다. qos=1은 왕복 한 번, qos=2는 네 번의 왕복 여행이 필요합니다. qos=0은 매우 간단합니다. 보내기만 하면 상관없습니다.
질문 2: MQTT에 대한 오픈 소스 자료가 많은가요?
하이퍼링크 로그인이 보입니다.그런 게 정말 많아요
질문 3: 왜 MQTT는 일반적으로 영구 기능을 제공하지 않나요?
MQTT 프로토콜은 장치의 온라인 설계에 따라 설계되며, 데이터는 메모리에 저장됩니다
질문 4: MQTT가 메모리를 소모하나요?
MQTT는 메모리 소모가 더 많으며, emqtt의 측정 데이터는 38W, 메모리가 14G, CPU 15%입니다
질문 5: 세션과 내담자 간의 관계는 무엇인가요?
예를 들어, 클라이언트로서 보드가 MQTT 서버에 연결하기 위한 MQTT 연결 요청을 시작한다면, EMQTT 서버가 이 보드의 연결 요청을 받은 후 TCP 계층에서 보드와 TCP 연결을 설정하고, EMQTT 내에서 이 보드와 통신하는 프로세스가 생성되며, 세션이라는 프로세스도 생성됩니다. 이 sessoin은 이 보드의 구독을 관리하는 데 특화된 주제이며, 다른 보드들도 관심 있는 주제를 게시하면 해당 세션에 데이터를 전송합니다. 이 세션이 구독된 주제를 받고 클라이언트가 아직 살아 있음을 확인하면, 클라이언트가 더 이상 존재하지 않는 경우, 즉 보드와 서버가 고장 난 상태임이 확인되면 TCP를 통해 이 보드에 데이터를 전송합니다. 그 후 세션은 받은 구독 주제를 먼저 세션에 저장하고, 다음에 보드가 연결될 때는 cleansession=false가 되면 세션이 해제되지 않으며, 이번에 연결될 때 이전에 받은 구독 메시지가 보드로 전송되는데, 아마도 이것이 의미하는 바일 것입니다.
질문 6: emqtt는 연결된 클라이언트가 동일하다는 것을 어떻게 알 수 있나요?
연결할 때 클라이언트 ID를 설정해야 하며, 이 ID는 설정하지 않은 채로 두어도 됩니다. 설정하지 않으면 emqtt 서버 측에서 고유 ID가 자동으로 생성됩니다. 세션을 사용하려면 고유 ID가 있어야 하며, IMEI를 사용할 수 있습니다. 오프라인 메시지를 받아야 한다면 반드시 명확한 ID를 사용해야 합니다.
질문 7: emqtt의 세션 시간을 변경할 수 있나요?
세션 시간을 변경할 수 있는데, 지금은 48시간이고, 일주일로 바꿀 수도 있습니다. 영구적으로 원한다면 emqtt는 적합하지 않을 것 같습니다.
질문 8: emqtt의 접근 권한이 설정 파일에 적혀 있나요?
etc/acl.config
질문 9: emqtt의 분포는 무엇인가요?
분산 서버는 여러 서버를 연결하는 것을 의미하며, 모두 고장 나지 않은 상태에서 하나 이상의 서버를 연결해 emqtt가 정상적으로 동작할 수 있습니다. EMQTT 데이터는 여러 노드에 의해 공유되며, 노드에 문제가 발생하면 데이터는 손실되지 않지만 해당 노드의 세션 데이터는 손실됩니다.
|