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);
writeFixedLengthString(dos, entity.getMdcSn(), 20);
int length = 54 + (entity.getMsgBody() == null ? 0 : entity.getMsgBody().length);
dos.writeInt(Integer.reverseBytes(length));
dos.writeLong(Long.reverseBytes(entity.getTimeStamp()));
writeFixedLengthString(dos, entity.getTransId(), 36);
dos.writeShort(Short.reverseBytes(entity.getMsgType()));
int msgLen = entity.getMsgBody() == null ? 0 : entity.getMsgBody().length;
dos.writeInt(Integer.reverseBytes(msgLen));
dos.writeInt(Integer.reverseBytes(entity.getProtVer()));
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);
}
}
}
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);
System.out.println(payload);
}
}
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;
};
#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,
73, 0, 0, 0,
33, 227, 216, 122, 152, 1, 0, 0,
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,
1, 0,
19, 0, 0, 0,
1, 0, 0, 0,
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;
}