Сообщение в Azure IoT в несколько раз превышает размер фактического тела сообщения

Я создаю приложение на Java для Android. Приложение может взаимодействовать с сенсорным устройством, получать записанные данные с устройства и отправлять их в центр Интернета вещей Azure. Однако когда я создаю сообщение для отправки в Azure, размер сообщения более чем в три раза превышает фактическую запись данных, которую я пытаюсь отправить. Размер одной записи с устройства составляет около 370 КБ, а размер сообщения, предназначенного для отправки в Azure, в конечном итоге составляет около 1500 КБ. Я использовал этот пример для создания части кода, отправляющей данные в Azure: пример отправки события

Перед отправкой записанных данных в Azure я создаю объект json, поскольку я также хочу сохранить данные локально в качестве резервной копии на случай, если Android не сможет установить соединение с Azure. Я хочу, чтобы данные (запись, время записи, идентификатор сообщения, идентификатор устройства и т. д.), которые я отправляю в Azure, были идентичны тем, что сохраняется локально, чтобы при необходимости я мог сопоставить их позже.

Вот мой код для создания объекта JSON, который я установил в теле сообщения в Azure:

public String createJson(ArrayList recSignal, String deviceId, String smartphoneId, int batterylevel) throws JSONException, UnsupportedEncodingException {

        JSONArray SysProp = new JSONArray();
        SysProp.put("SystemProperties");

        JSONObject SysPropValues = new JSONObject();
        try {
            SysPropValues.put("messageId", UUID.randomUUID().toString());
            SysPropValues.put("correlationId", "???");
            SysPropValues.put("connectionDeviceId", smartphoneId); //<-- name of smartphone device in the cloud
            SysPropValues.put("contentType", "UTF-8");
            SysPropValues.put("enqueuedTime", Instant.now().toString());
        } catch (
                JSONException e) {
            throw new JSONException(e);
        }
        SysProp.put(SysPropValues);

        JSONArray DeviceProp = new JSONArray();
        DeviceProp.put("DeviceProperties");

        JSONObject DevicePropValues = new JSONObject();
        try {
            DevicePropValues.put("deviceId", deviceId); //<-- MAC of the connected device
            DevicePropValues.put("deviceBatteryLevel", batterylevel);
        } catch (JSONException e) {
            throw new JSONException(e);
        }
        DeviceProp.put(DevicePropValues);

        JSONObject RecordingBody = new JSONObject();
        RecordingBody.put("Body", recSignal);

        JSONArray jsonmessage = new JSONArray();  //<-- json to be send to azure
        jsonmessage.put(SysProp);
        jsonmessage.put(DeviceProp);
        jsonmessage.put(RecordingBody);

        jsonmessagestring = jsonmessage.toString();

        Log.i("Service", "Size of JSON as string is: " + jsonmessagestring.getBytes("UTF-8").length/1000 + "kb");

        // *** HERE THE SIZE OF THE JSON OBJECT IS AROUND 370 KB ***

        return jsonmessagestring;

    }

Вот мой код для отправки в Azure. Это взято из примера, упомянутого ранее.

private boolean connectAndSend(String dataToSend, String connString, int numRepeatMessageSend) throws IOException, URISyntaxException, InterruptedException, IotHubClientException {

        DeviceClient client = new DeviceClient(connString, protocol);
        client.setMessageCallback(new MessageCallbackMqtt(), null);
        client.setConnectionStatusChangeCallback(new IotHubConnectionStatusChangeCallbackLogger(), new Object());
        Log.i("Service", "Successfully created an IoT Hub client with callback settings.");

        client.open(true);
        Log.i("Service", "Opened connection to IoT Hub.");


        // send message to azure
        Log.i("Service", "Constructing message to send to Azure");

        Message msg = new Message(dataToSend);
        msg.setContentType("application/json;charset=utf-8");
        boolean messageSend = false;

        Log.i("Service", "Size of message to send to azure is: " + Arrays.toString(msg.getBytes()).length()/1000 + "kb");
        
        // *** HERE THE SIZE OF THE MESSSAGE IS AROUND 1500 KB ***

        for (int i = 0; i < numRepeatMessageSend; i++) {
              try {
                   client.sendEvent(msg, D2C_MESSAGE_TIMEOUT_MILLISECONDS);
                   messageSend = true;
                   Log.i("Service", "Successfully send message to Azure");
                    
              } catch (IotHubClientException e) {
                   Log.i("Service", "Failed to send message to Azure. Status code: " + e.getStatusCode());
              }
        }

        // close the connection to client
        Log.i(TAG, "Closing client");
        client.close();
        return messageSend;
}

Я прочитал здесь о размере сообщений Центра Интернета вещей Azure, что окончательный размер представляет собой сумму размера тела, значений свойств системы сообщений и свойств пользователя, поэтому я понимаю, что фактическое сообщение, отправляемое в Azure, будет больше, чем объем данных, который я пытаюсь отправить, но не понимаю, почему он оказывается настолько большим.

Если кто-нибудь сможет объяснить мне, почему или предложит уменьшить размер сообщения, я буду очень признателен.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Вы встраиваете дополнительные метаданные и структуру в свою полезную нагрузку JSON. Эти метаданные и структура включают такие свойства, как «SystemProperties» и «DeviceProperties», которые добавляются в ваше сообщение в виде массивов JSON.

Прежде чем изменить размер моего сообщения.

  • Здесь я упростил структуру сообщения JSON и удалил ненужные свойства и массивы.
public String createJson(ArrayList recSignal, String deviceId, String smartphoneId, int batterylevel) throws JSONException, UnsupportedEncodingException {

    JSONObject messageObject = new JSONObject();

    try {
        messageObject.put("messageId", UUID.randomUUID().toString());
        messageObject.put("correlationId", "???");
        messageObject.put("connectionDeviceId", smartphoneId);
        messageObject.put("contentType", "UTF-8");
        messageObject.put("enqueuedTime", Instant.now().toString());
        messageObject.put("deviceId", deviceId);
        messageObject.put("deviceBatteryLevel", batterylevel);
        messageObject.put("Body", recSignal);
    } catch (JSONException e) {
        throw new JSONException(e);
    }

    String jsonMessage = messageObject.toString();

    Log.i("Service", "Size of JSON as string is: " + jsonMessage.getBytes("UTF-8").length / 1000 + "kb");

    // *** NOW THE SIZE OF THE JSON OBJECT SHOULD BE SMALLER ***

    return jsonMessage;
}
  • Здесь я могу подключиться к созданному устройству на портале и успешно построить.

  • Здесь я могу получать сообщения в центр Azure IOT с обновленным кодом.

  • Ссылка взята из статьи «Отправка сообщений из облака на устройство с помощью IoT Hub (Java)».

Спасибо за ваш ответ @Suresh Chikkam. Правильно ли я понимаю, что эти метаданные всегда будут добавляться в сообщение? И что метаданные всегда будут включать свойства системы и устройства? Если это так, то окончательное сообщение, созданное для отправки, всегда будет немного больше предполагаемого сообщения. Я до сих пор не понимаю, как и почему мое сообщение в конечном итоге увеличилось примерно в 4 раза. Кажется, что добавлять ненужное количество метаданных.

koralræv 21.09.2023 10:58

@koralræv, да, к сообщению добавляются некоторые метаданные, включая свойства системы и устройства. Эти свойства необходимы для функционирования и маршрутизации сообщений в инфраструктуре Интернета вещей Azure. То, как вы сериализуете сообщение перед отправкой, также может повлиять на его размер. Убедитесь, что вы сериализуете его правильно, без ненужного форматирования.

Suresh Chikkam 21.09.2023 13:33

Другие вопросы по теме