Я новичок в MQTT и Android Open Accessory "AOA". читая учебник, я понял, что перед любой попыткой записи в переменную типа ByteArrayOutputStream, однако, сначала в эту переменную следует записать 0 или 0x00.
Это какая-то инициализация? Ниже приведен пример этого:
EX_1
variableHeader.write(0x00);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8").length);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8"));
EX_2
public static byte[] connect() throws UnsupportedEncodingException, IOException {
String identifier = "android";
ByteArrayOutputStream payload = new ByteArrayOutputStream();
payload.write(0);
payload.write(identifier.length());
}
Ответ 1 · рейтинг 2 · Boann
Это не какая-либо инициализация, необходимая ByteArrayOutputStream. Вызов write(0) просто вставляет 0-байт в качестве первого байта в массиве байтов.
Вместо этого байт должен иметь значение для протокола MQTT. Я не знаком с этим, но краткий обзор спецификация протокола MQTT показывает, что строки кодируются путем записи байтов строки в UTF-8 с префиксом 2-байтового поля длины, старшим байтом вперед.
В обоих приведенных вами примерах строки записываются, но записывается только один байт длины. Таким образом, байт 0 должен быть байтом другой длины. Я уверен, что это так. Код немного неаккуратный: он предполагает, что строки в вашем случае имеют длину менее 256 байт, поэтому всегда можно предположить, что верхний байт длины равен 0.
Если есть вероятность того, что "имя протокола" будет 256 байтов или больше, то правильный способ написать этот код:
variableHeader.write(0x00);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8").length);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8"));
было бы:
byte[] stringBytes = PROTOCOL_NAME.getBytes("UTF-8");
variableHeader.write(stringBytes.length >> 8); // upper length byte
variableHeader.write(stringBytes.length & 0xFF); // lower length byte
variableHeader.write(stringBytes); // actual data