Я занимаюсь разработкой мобильного приложения, в котором необходимо реализовать mqtt.Мне нужно опубликовать данные в брокере mqtt, но они всегда не публикуются, когда я пытаюсь опубликовать данные изображения, которые являются байтовым массивом изображения.
При публикации не отображалось никаких ошибок, но не было опубликовано никаких данных на брокере, когда я пытался опубликовать сообщение.Сообщение может быть опубликовано только после удаления данных изображения из полезной нагрузки, которая представляет собой Pichex.
Все данные, опубликованные в брокере mqtt, необходимо преобразовать в шестнадцатеричный код ascii.Массив байтов изображения также необходимо преобразовать в шестнадцатеричный строковый код ascii перед публикацией в брокере, поскольку это является требованием проекта.
private void publish(){
String command = "000000";
String reserve = "303030303030303030303030303030303030303030303030";
String tag = "tag";
name = eTname.getText().toString();
price = eTprice.getText().toString();
type = TypeS.getSelectedItem().toString();
desc = eTdesc.getText().toString();
userid = MainActivity.getGetuserid();
String namehex = toHexString(name);
String pricehex = toHexString(price);
String typehex = toHexString(type);
String deschex = toHexString(desc);
String useridhex = toHexString(userid);
Bitmap PicBitmap = ((BitmapDrawable)iVpic.getDrawable()).getBitmap();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PicBitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] picbyte = bos.toByteArray();
String pichex = bytesToHex(picbyte);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
Date currentTime = Calendar.getInstance().getTime();
String currentTimeString = df.format(currentTime);
String payload = "{command:" + command + ", reserve:" + reserve + ", Client ID:" + serverConnectTo + ", Posted name:" + namehex +
", Posted Price:" + pricehex + ", Posted Type:" + typehex + ", Posted Description:" + deschex
+ ", Posted Picture:" + pichex + ", Date Time Posted:" + currentTimeString + ", User ID:" + useridhex + "}";
byte[] encodedPayload = new byte[0];
try {
encodedPayload = payload.getBytes();
MqttMessage message = new MqttMessage(encodedPayload);
message.setQos(qos);
mqttClient.publish(topic, message);
} catch (MqttException e) {
e.printStackTrace();
}
}
public static String toHexString(String input) {
return String.format("%x", new BigInteger(1, input.getBytes()));
}
public static String bytesToHex(byte[] in) {
final StringBuilder builder = new StringBuilder();
for(byte b : in) {
builder.append(String.format("%02x", b));
}
return builder.toString();
}
Значение шестнадцатеричной строки изображения, которое необходимо опубликоватьэто:
Это изображение, которое необходимо опубликовать
Размер изображения составляет около 100 КБ.
Сообщение может быть опубликовано только после удаления данных изображенияиз полезной нагрузки, которая является Pichex:
String payload = "{command:" + command + ", reserve:" + reserve + ", Client ID:" + serverConnectTo + ", Posted name:" + namehex + ", Posted Price:" + pricehex + ", Posted Type:" + typehex + ", Posted Description:" + deschex + ", Date Time Posted:" + currentTimeString + ", User ID:" + useridhex + "}";
Сообщение может быть получено подписчиком, если Pichex удален:
{command:000000, reserve:303030303030303030303030303030303030303030303030, Client ID:Server, Posted name:627572676572, Posted Price:392e3939, Posted Type:6e6f6f646c65, Posted Description:616a6468, Date Time Posted:2018-10-14 08.09.29, User ID:696b6f6d61}