只收到部分消息

Recieves only partial messages

我正在使用 MQTT 从我的服务器获取一些数据到我的应用程序。为此,我正在使用 Dart 的 mqtt_client 包。

我发送的数据是json,但它是作为字符串发送的,所以我怀疑问题出在那里(如果我错了请纠正我)

我可以完全收到一些消息,但有些消息没有完全收到。我 运行 另一台机器上的 mosquitto 订阅者收听与应用程序相同的消息,但正在打印完整的消息。

Flutter代码(相关部分):

void mqttConnect() async {
  client = MqttServerClient(broker, '');
  client.port = port;
  client.logging(on: true);
  client.keepAlivePeriod = 60;
  client.onDisconnected = _onDisconnected;
  client.onConnected = _onConnected;

  final mqtt.MqttConnectMessage connMess = mqtt.MqttConnectMessage()
      .withClientIdentifier(clientIdentifier)
      .startClean() // Non persistent session for testing
      .keepAliveFor(60)
      .withWillQos(mqtt.MqttQos.atMostOnce);
  client.connectionMessage = connMess;

  try {
    await client.connect(username, passwd);
  } catch (e) {
    print(e);
    _disconnect();
  }

  // ignore: deprecated_member_use
  if (client.connectionState == mqtt.MqttConnectionState.connected) {
    connectionState = client.connectionState;
  } else {
    _disconnect();
  }

  client.updates.listen((List<MqttReceivedMessage<MqttMessage>> c) {
    final MqttPublishMessage message = c[0].payload;
    final payload =
        MqttPublishPayload.bytesToStringAsString(message.payload.message);
    print('Received message:$payload from topic: ${c[0].topic}>');

  });
}

预期消息:

{
  "Sensors": [
    {
      "Sensor_name": "esp3",
      "Sensor_ID": "sensor_f6c068b81a054824b824bc6a883d677d",
      "MAC_address": "00:CC:00:CC:00:CC",
      "Value1": {
        "Value_Name": "",
        "Value_ID": "value_923bd7c893284a74affbf02170dbe5f2",
        "Value": "",
        "Unit": ""
      },
      "Value2": {
        "Value_Name": "",
        "Value_ID": "value_69c5deffeb664953a09fc60c93c8f0a7",
        "Value": "",
        "Unit": ""
      },
      "Value3": {
        "Value_Name": "",
        "Value_ID": "value_1b40bd7c83654a3686bfce7fddf6015f",
        "Value": "",
        "Unit": ""
      },
      "Value4": {
        "Value_Name": "",
        "Value_ID": "value_e6cf1f5393914ce7ba5bbc94164d24ed",
        "Value": "",
        "Unit": ""
      },
      "Value5": {
        "Value_Name": "",
        "Value_ID": "value_07d549690750422fbd9fcc385b18d040",
        "Value": "",
        "Unit": ""
      },
      "Value6": {
        "Value_Name": "",
        "Value_ID": "value_cd24d78e90284745b852289973838e05",
        "Value": "",
        "Unit": ""
      }
    },
    {
      "Sensor_name": "esp4",
      "Sensor_ID": "sensor_a737e70afdbe491ca5b8a69da4f25e4c",
      "MAC_address": "00:DD:00:DD:00:DD",
      "Value1": {
        "Value_Name": "",
        "Value_ID": "value_1a420fc35c8142a7b73b6b473e75ff8e",
        "Value": "",
        "Unit": ""
      },
      "Value2": {
        "Value_Name": "",
        "Value_ID": "value_b11246b0fe1746dc849afa2f5dd2e35d",
        "Value": "",
        "Unit": ""
      },
      "Value3": {
        "Value_Name": "",
        "Value_ID": "value_d6c05f81205c439eb68f09ab3b1c080d",
        "Value": "",
        "Unit": ""
      },
      "Value4": {
        "Value_Name": "",
        "Value_ID": "value_c35860167f2546008e31a1ea3561b3fb",
        "Value": "",
        "Unit": ""
      },
      "Value5": {
        "Value_Name": "",
        "Value_ID": "value_f04f562130734192a295e3a8a085b4a5",
        "Value": "",
        "Unit": ""
      },
      "Value6": {
        "Value_Name": "",
        "Value_ID": "value_b4a7da43d54e487ba5122526e1948400",
        "Value": "",
        "Unit": ""
      }
    }
  ]
}

收到的消息:

{
  "Sensors": [
    {
      "Sensor_name":"esp3",
      "Sensor_ID":"sensor_f6c068b81a054824b824bc6a883d677d",
      "MAC_address":"00:CC:00:CC:00:CC",
      "Value1":{
        "Value_Name":"",
        "Value_ID":"value_923bd7c893284a74affbf02170dbe5f2",
        "Value":"",
        "Unit":""
      },
      "Value2":{
        "Value_Name":"",
        "Value_ID":"value_69c5deffeb664953a09fc60c93c8f0a7",
        "Value":"",
        "Unit":""
      },
      "Value3":{
        "Value_Name":"",
        "Value_ID":"value_1b40bd7c83654a3686bfce7fddf6015f",
        "Value":"",
        "Unit":""
      },
      "Value4":{
        "Value_Name":"",
        "Value_ID":"value_e6cf1f5393914ce7ba5bbc94164d24ed",
        "Value":"",
        "Unit":""
      },
      "Value5":{
        "Value_Name":"",
        "Value_ID":"value_07d549690750422fbd9fcc385b18d040",
        "Value":"",
        "Unit":""
      },
      "Value6":{
        "Value_Name":"",
        "Value_ID":"value_cd24d78e90284745b852289973838e05",
        "Value":"",
        "Unit":""
      }
    },
    {
      "Sensor_name":"esp4",
      "Sensor_ID":"sensor_a737e70afdbe491ca5b8a69da4f25e4c",
      "MAC_address":"00:DD:00:DD:00:DD",
      "Value1":{
        "Value_Name":"",
        "Value_ID":"value_1a420fc35c8142a7b73b6b473e75ff8e",
        "Value":"",
        "Unit":""
      },
      "Value2":{
        "Value_Name":"",
        "Value_ID":"value_b11246b0fe1746dc849afa2f5dd2e

正如我之前所说,如果我 运行 我的终端上有一个 mosquitto 订阅者,并且收听相同的主题,那么在终端上收到的消息是完整的。但是在应用程序上,它只收到部分。

并非所有邮件都会出现这种情况,只有少数邮件会出现这种情况。

Flutter 的print 文本长度有限,无法打印大字符串。 你应该分成块。

尝试使用这个助手:

void printWrapped(String text) {
  final pattern = RegExp('.{1,800}'); // 800 is the size of each chunk
  pattern.allMatches(text).forEach((match) => print(match.group(0)));
}

来源: