首页 > 解决方案 > 在 Mqtt 代理上发布图像数据

问题描述

我想通过 mqtt 代理将图像字节数组发送给订阅者。但是图片字节数组数据太大,无法在mqtt broker上发布,那么如何将图片字节数组数据发送给订阅者呢?

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 代码,然后才在代理上发布。但是从字节数组转换的字符串太长,每次我尝试发布它都无法发布。

标签: base64mqtt

解决方案


  1. 我不相信您的实际图像大于 MQTT 消息的最大有效负载大小 256mb。一个 12 兆像素的 jpeg 大约只有 3.5mb,无损 PNG 大约是 7mb。(来源

  2. Base64 编码图像将使其大小增加大约 1/3。这不是必需的,因为 MQTT 消息只是字节流,因此无需对图像进行编码。(这仍然只有 9.3mb)

  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();
}

推荐阅读