我想通过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转换的字符串太长,每次我尝试发布时都无法发布。
答案 0 :(得分:0)
我不认为您的实际图像大于MQTT消息的最大有效负载大小256mb。一个12兆像素的jpeg大约只有3.5mb,无损PNG约为7mb。 (source)
对图像进行Base64编码将increase的大小缩小大约1/3。因为MQTT消息只是字节流,所以不需要这样做,因此不需要对图像进行编码。 (仍然只有9.3mb)
您的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();
}