我正在为Android开发一个Java应用程序。该应用程序可以与传感器设备通信,从设备接收记录的数据并将其发送到Azure IoT中心。然而,当我构造要发送到Azure的消息时,消息的大小比我试图发送的实际数据记录大三倍以上。来自设备的一个记录约为370 kb,而构造发送到Azure的消息最终约为1500 kb。我已经按照这个示例创建了将数据发送到Azure的代码部分:send event example
在将记录的数据发送到Azure之前,我构造了一个JSON对象,因为我还想在本地保存数据作为备份,以防Android无法与Azure建立连接。我希望我发送到Azure的数据(记录、记录时间、messageId、deviceId等)与本地保存的数据相同,以便稍后在必要时进行匹配。
下面是我的代码,用于构造我在发送到Azure的消息的正文中设置的JSON对象:
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 IoT中心消息的消息大小,最终大小是主体大小,消息系统属性和用户属性的值的总和,所以我理解发送到Azure的实际消息将大于我试图发送的数据主体,但我不明白为什么它最终会大得多。
如果有人能解释我为什么或有一个建议,以减少信息大小,这将是高度赞赏。
1条答案
按热度按时间dnph8jn41#
在修改我的消息大小之前。