base64 - 在 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 代码,然后才在代理上发布。但是从字节数组转换的字符串太长,每次我尝试发布它都无法发布。
解决方案
我不相信您的实际图像大于 MQTT 消息的最大有效负载大小 256mb。一个 12 兆像素的 jpeg 大约只有 3.5mb,无损 PNG 大约是 7mb。(来源)
Base64 编码图像将使其大小增加大约 1/3。这不是必需的,因为 MQTT 消息只是字节流,因此无需对图像进行编码。(这仍然只有 9.3mb)
您的
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();
}
推荐阅读
- python - 如何在 PyQt5 中在 5 秒内隐藏状态栏?
- azure - 通过禁用 RaiseErrorIfClaimsPrincipalAlreadyExists 来允许“幂等注册”是否明智?
- python - 如何判断 setup() 是否正在读取 setup.cfg?
- npm - 如何在 npx 中指定路径(如 npm --prefix)?
- javascript - 用 javascript 点击时将表单替换为另一个表单
- php - 使用php解密AES中的字符串
- swift - 点击我的 textField 或使用 NS 通知使用键盘时,我的视图不断向上移动
- angular - Angular 单元测试 ngOnInit 订阅
- laravel - laravel 推送器套接字为空
- reactjs - 如何在 React 网络聊天中添加打字指示器