Опубликовать данные изображения на Mqtt брокере - PullRequest
0 голосов
/ 12 октября 2018

Я хочу отправить байтовый массив изображения подписчику через брокер mqtt.Но размер данных байтового массива изображения слишком велик для публикации в брокере mqtt, так как я могу отправить данные байтового массива изображения подписчику?

PicBitmap = ((BitmapDrawable)iVpic.getDrawable()).getBitmap();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PicBitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
picbyte = bos.toByteArray();

String s = Base64.encodeToString(picbyte,Base64.DEFAULT);
String pichex = toHexString(s);

String payload = pichex;
byte[] encodedPayload = new byte[0];
    try {
        encodedPayload = payload.getBytes("UTF-8");
        MqttMessage message = new MqttMessage(encodedPayload);
        message.setQos(qos);
        mqttClient.publish(topic, message);
    } catch (UnsupportedEncodingException | MqttException e) {
        e.printStackTrace();
    }

public static String toHexString(String input) {
    return String.format("%x", new BigInteger(1, input.getBytes()));
}

Мне нужно преобразовать байтовый массивв строку и шестнадцатеричный код ascii сначала, затем только публиковать на брокереНо строка, преобразованная из байтового объекта, слишком длинная, ее не удавалось опубликовать каждый раз, когда я пытаюсь опубликовать ее.

1 Ответ

0 голосов
/ 13 октября 2018
  1. Я не верю, что ваше фактическое изображение превышает 256 МБ максимального размера полезной нагрузки для сообщения MQTT.12-мегапиксельная jpeg составляет всего около 3,5 МБ, PNG без потерь будет около 7 МБ.( источник )

  2. Кодировка Base64 изображений увеличит его размер приблизительно на 1/3.Это не нужно, поскольку сообщения MQTT представляют собой просто поток байтов, поэтому нет необходимости кодировать изображение.(это все равно будет всего 9,3 МБ)

  3. Ваша функция toHexString() просто удваивает вашу полезную нагрузку без какой-либо выгоды.Результатом кодирования base64 уже является строка, преобразование каждого байта (представленного 1 символом), представляющего эту строку, в 2 символа (в диапазоне 0-9a-f) не делает ничего полезного.(все еще только 18.6mb)

Я отредактировал весь ненужный код, если у вас все еще есть проблема, задайте новый вопрос и включите трассировку стека из вывода e.printStackTrace(), чтобы мы моглипосмотрим, что является реальной проблемой.

PicBitmap = ((BitmapDrawable)iVpic.getDrawable()).getBitmap();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PicBitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
picbyte = bos.toByteArray();

try {
    MqttMessage message = new MqttMessage(picbyte);
    message.setQos(qos);
    mqttClient.publish(topic, message);
} catch (MqttException e) {
    e.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...