在Mqtt代理上发布图像数据

时间:2018-10-12 16:10:39

标签: base64 mqtt

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

1 个答案:

答案 0 :(得分:0)

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

  2. 对图像进行Base64编码将increase的大小缩小大约1/3。因为MQTT消息只是字节流,所以不需要这样做,因此不需要对图像进行编码。 (仍然只有9.3mb)

  3. 您的toHexString()函数只是将您的有效载荷加倍而没有任何好处。 base64编码的输出已经是一个字符串,将表示该字符串的每个字节(以1个字符表示)转换为2个字符(在0-9a-f范围内)没有任何用处。 (仍然只有18.6mb)

如果您仍有问题,我已经编辑了所有不需要的代码,并提出了一个新问题,并包含了e.printStackTrace()输出中的stacktrace,以便我们了解真正的问题所在。

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