Как отправлять объекты вместо строки в сообщениях mqtt?

В настоящее время я использую mqtt для связи между клиентом и сервером, а метод публикации mqtt принимает сообщение в виде байтов. Мне нужно отправить широту, долготу, адрес и т. д. в мою единственную публикацию mqtt и иметь возможность получать их на стороне сервера. Как я могу достичь этого?

Я использую клиентскую библиотеку wmqtt на стороне клиента (android) и клиентскую библиотеку paho на стороне сервера (jsp, сервлеты).

deviceloc d=new deviceloc();
d.id="1234";
d.add="hyder";
d.lat=17.5;
d.lon=78.5;
try {
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o=new ObjectOutputStream(b);
o.writeObject(d);
byte bytes[]=b.toByteArray();
MqttMessage data=new MqttMessage(bytes);
ByteArrayInputStream b1 = new ByteArrayInputStream(data.toString().getBytes());
ObjectInputStream o1 = new ObjectInputStream(b1);
Object obj1;
try {
obj1 = o1.readObject();
deviceloc dd=(deviceloc)obj1;
System.out.println(dd.id);
System.out.println(dd.add);
System.out.println(dd.lat);
System.out.println(dd.lon);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
catch(IOException e)
{
e.printStackTrace();
}

Я получаю исключение streamcorrupted


person Reva    schedule 27.02.2014    source источник


Ответы (1)


Сериализуйте свои объекты в строки xml (или CSV, или Json, или собственный формат). Сформируйте свое сообщение из этих строк. Отправьте свое сообщение в виде байтов. Обратный процесс на принимающей стороне.

person paulkayuk    schedule 27.02.2014
comment
Привет, paulkayuk, deviceloc d=new deviceloc(); d.id=mqttClientId; d.add=strAddress; d.lat=loc.getLatitude(); d.lon=loc.getLongitude(); ByteArrayOutputStream b = новый ByteArrayOutputStream(); ObjectOutputStream o=новый ObjectOutputStream(b); о.writeObject(d); байтовые байты[]=b.toByteArray(); mqttClient.publish(admin/location,bytes,MQTT_QUALITY_OF_SERVICE,MQTT_RETAINED_PUBLISH); вот как я отправляю сообщение. я десериализую на стороне сервера, но получаю сообщение об ошибке, так как класс clientsidepackagename.deviceloc не найден. как это исправить - person Reva; 27.02.2014
comment
ByteArrayInputStream b1 = новый ByteArrayInputStream(data.toString().getBytes()); ObjectInputStream o1 = новый ObjectInputStream(b1); deviceloc obj1=(deviceloc)o1.readObject(); Система.out.println(obj1.id); System.out.println(obj1.add); System.out.println(obj1.lat); System.out.println(obj1.lon); это то, что я делаю на стороне сервера - person Reva; 27.02.2014
comment
данные по второму комментарию имеют тип MQTTMessage, полученный на стороне сервера. Спасибо за ответ. - person Reva; 27.02.2014
comment
Я не уверен, что вы можете использовать сериализацию объектов Java между Android и Java, поскольку внутренние структуры объектов не обязательно совпадают между Dalvic и Java. Как предложил @paulkayuk, я бы использовал базовый текстовый формат для сериализации объекта. Это не обязательно должен быть XML, CSV или Json также будут работать в относительно простом случае, о котором вы упомянули. (Также вам лучше отредактировать свой вопрос, чтобы включить код, а не пытаться поместить его в комментарий) - person hardillb; 27.02.2014
comment
@hardillb Спасибо за ответ. я попытался разместить весь код на стороне сервера, как в приведенном выше коде. и я получаю StreamCorruptedException. - person Reva; 27.02.2014