MQTT解析

Java

java 复制代码
package com.qqbot;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class MqttEntityEncoder {

    public static byte[] encode(MqttEntity entity) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);

        // 1. mdcSn[20]
        writeFixedLengthString(dos, entity.getMdcSn(), 20);

        // 2. length = 54 + msgLen
        int length = 54 + (entity.getMsgBody() == null ? 0 : entity.getMsgBody().length);
        dos.writeInt(Integer.reverseBytes(length)); // 小端写入

        // 3. timeStamp (uint64_t)
        dos.writeLong(Long.reverseBytes(entity.getTimeStamp()));

        // 4. transId[36]
        writeFixedLengthString(dos, entity.getTransId(), 36);

        // 5. msgType (uint16_t)
        dos.writeShort(Short.reverseBytes(entity.getMsgType()));

        // 6. msgLen (uint32_t)
        int msgLen = entity.getMsgBody() == null ? 0 : entity.getMsgBody().length;
        dos.writeInt(Integer.reverseBytes(msgLen));

        // 7. protVer (uint32_t)
        dos.writeInt(Integer.reverseBytes(entity.getProtVer()));

        // 8. msgBody[msgLen]
        if (entity.getMsgBody() != null) {
            dos.write(entity.getMsgBody());
        }

        dos.flush();
        return baos.toByteArray();
    }

    private static void writeFixedLengthString(DataOutputStream dos, String value, int fixedLength) throws IOException {
        byte[] bytes = value != null ? value.getBytes(StandardCharsets.UTF_8) : new byte[0];
        if (bytes.length > fixedLength) {
            dos.write(bytes, 0, fixedLength); // 截断
        } else {
            dos.write(bytes);                 // 写入实际内容
            for (int i = 0; i < fixedLength - bytes.length; i++) {
                dos.writeByte(0);             // 补0
            }
        }
    }

    public static void main(String[] args) throws IOException {
        MqttEntity entity = new MqttEntity();
        entity.setMdcSn("ABC123EFGGGHDDD");
        entity.setTimeStamp(System.currentTimeMillis());
        entity.setTransId("123e4567-e89b-12d3-a456");
        entity.setMsgType((short) 1);
        entity.setProtVer(1);
        entity.setMsgBody("hello mqtt test ddd".getBytes(StandardCharsets.UTF_8));

        byte[] payload = MqttEntityEncoder.encode(entity);
// payload 可直接通过 MQTT 或 TCP 发送
        System.out.println(payload);

    }
}

C++

c 复制代码
#include <iostream>
#include <cstdint>
#include <cstring>

#pragma pack(push, 1)
struct MqttStruct {
    char mdcSn[20];
    uint32_t length;
    uint64_t timeStamp;
    char transId[36];
    uint16_t msgType;
    uint32_t msgLen;
    uint32_t protVer;
    // msgBody follows
};
#pragma pack(pop)

int main() {
    uint8_t data[] = {
        65, 66, 67, 49, 50, 51, 69, 70, 71, 71, 71, 72, 68, 68, 68, 0, 0, 0, 0, 0, // mdcSn
        73, 0, 0, 0,                                                             // length = 73
        33, 227, 216, 122, 152, 1, 0, 0,                                         // timeStamp (小端)
        49, 50, 51, 101, 52, 53, 54, 55, 45, 101, 56, 57, 98, 45, 49, 50, 
        100, 51, 45, 97, 52, 53, 54, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                                   // transId 补齐到 36
        1, 0,                                                                    // msgType
        19, 0, 0, 0,                                                             // msgLen = 19
        1, 0, 0, 0,                                                              // protVer
        104, 101, 108, 108, 111, 32, 109, 113, 116, 116, 32, 116, 101, 115, 116, 32, 100, 100, 100
    };

    MqttStruct header{};
    std::memcpy(&header, data, sizeof(MqttStruct));

    std::cout << "mdcSn: " << std::string(header.mdcSn, 20) << std::endl;
    std::cout << "length: " << header.length << std::endl;
    std::cout << "timestamp: " << header.timeStamp << std::endl;
    std::cout << "transId: " << std::string(header.transId, 36) << std::endl;
    std::cout << "msgType: " << header.msgType << std::endl;
    std::cout << "msgLen: " << header.msgLen << std::endl;
    std::cout << "protVer: " << header.protVer << std::endl;

    const char* msgBody = reinterpret_cast<const char*>(data + sizeof(MqttStruct));
    std::cout << "msgBody: " << std::string(msgBody, header.msgLen) << std::endl;

    return 0;
}
相关推荐
大圣编程3 小时前
Java 多维数组详解
java·开发语言
万法若空6 小时前
【算法-查找】查找算法
java·数据结构·算法
HZZD_HZZD8 小时前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
山登绝顶我为峰 3(^v^)311 小时前
C/C++ 交叉编译方法
java·c语言·c++
一叶飘零_sweeeet11 小时前
Codex 与 Claude Code 深度拆解:两代 AI 编程智能体的技术本质与 Java 实战指南
java·ai·codex·claude code
Listen·Rain11 小时前
提示词和提示词模板
java·人工智能·spring boot
wuqingshun31415911 小时前
重写equals而不重写hashCode,会出什么问题?
java·开发语言
我今晚不熬夜12 小时前
Java语言实现Modbus协议通过用串口读取数据(以RTU为例)
java·网络协议
小锋java123412 小时前
Maven 4 要来了:15 年后,Java 构建工具迎来"彻底重构"
java·maven