ESP32 MQTT两次发布相同的消息,而不是两条不同的消息到不同主题

发布于 2025-02-01 03:04:51 字数 3901 浏览 5 评论 0 原文

我正在尝试通过MQTT从ESP32发送数据到我的计算机。我有两组不同的数据集,该数据是两个主题,即温度和重力。由于某种原因,它只会发布一条消息,但将其发送给经纪人两次,并首先发布任何消息。我不确定我会做些什么。

Arduino代码:

int parseTilt(String DevData) {
  String DevUUID, DevColour, DevTempData, DevGravityData;
  int colourInt;
  float DevTemp, DevGravity;

  // Determine the Colour
  colourInt = DevData.substring(6, 7).toInt();

  switch (colourInt) {
    case 1:
      DevColour = "Red";
      break;
    case 2:
      DevColour = "Green";
      break;
    case 3:
      DevColour = "Black";
      break;
    case 4:
      DevColour = "Purple";
      break;
    case 5:
      DevColour = "Orange";
      break;
    case 6:
      DevColour = "Blue";
      break;
    case 7:
      DevColour = "Yellow";
      break;
    case 8:
      DevColour = "Pink";
      break;
  }

  if (repeatColour != 0 && repeatColour != colourInt) {
    Serial.print(DevColour);
    Serial.println(" Tilt is being ignored.");
    return 0;
  }

  //Generate the UUID
  DevUUID += DevData.substring(0, 8);
  DevUUID += "-";
  DevUUID += DevData.substring(8, 12);
  DevUUID += "-";
  DevUUID += DevData.substring(12, 16);
  DevUUID += "-";
  DevUUID += DevData.substring(16, 20);
  DevUUID += "-";
  DevUUID += DevData.substring(20, 32);


  // Get the temperature
  DevTempData = DevData.substring(32, 36);
  DevTemp = strtol(DevTempData.c_str(), NULL, 16); // Temp in Freedumb units

  // Get the gravity
  DevGravityData = DevData.substring(36, 40);
  DevGravity = strtol(DevGravityData.c_str() , NULL, 16);

  Serial.println("--------------------------------");
  Serial.print("Colour: ");
  Serial.println(DevColour);
  Serial.print("Temp: ");
  if (Celsius) {
     Serial.print((DevTemp-32.0) * (5.0/9.0));
     Serial.println(" C");
  }
  else {
    Serial.print(DevTemp);
    Serial.println(" F");
  }
  Serial.print("Gravity: ");
  float DevGravityFormatted = (DevGravity / 1000);
  Serial.println(DevGravityFormatted);
  Serial.println(DevGravityFormatted, 3);
  Serial.println(DevGravityFormatted);
  Serial.println(DevData);
  Serial.println(DevData.substring(0,32));
  Serial.println(DevUUID);
  Serial.println("--------------------------------");


  client.loop();
  Serial.println(DevGravity, 16);
  char tempGravity[16];
  dtostrf(DevGravity, 16, 3, tempGravity);
  char tempTemp[5];
  dtostrf(DevTemp, 5, 2, tempTemp);
  Serial.println("tempGravity");
  Serial.println(tempGravity);
  Serial.println("tempTemp");
  Serial.println(tempTemp);
  client.publish("fermentation/temperature", tempTemp);
  client.loop();
  delay(500);
  client.publish("fermentation/gravity",tempGravity);
  client.loop();
  Serial.println("published");

  return 2;
}

以及我的计算机上的Python代码:

MQTT_SERVER = "192.168.1.69"
MQTT_PATH_1 = ('fermentation/gravity')
MQTT_PATH_2 = ('fermentation/temperature')


def on_connect(client, userdata, flags, rc):
    print('conncected, result: ' + str(rc))
    client.subscribe(MQTT_PATH_1)
    print('subscribed gravity')
    client.subscribe(MQTT_PATH_2)
    print('subscribed temperature')

def on_message(client, userdata, msg):
    temp = str(msg.payload).split("'")
    if msg.topic == MQTT_PATH_1:
        print('mqtt 1')
        print(msg.topic + ' ' + str(msg.payload))
    if msg.topic == MQTT_PATH_2:
        print('mqtt 2') 
        print(msg.topic + ' ' + str(msg.payload))
    else:
        print('else')
        print(msg.topic + ' ' + str(msg.payload))
    

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_SERVER, 1883, 60)

client.loop_forever()

输出出现: MQTT 2 发酵/温度B'75.00' MQTT 2 发酵/温度B'75.00'

不确定我在做什么错。请原谅Arduino代码,我是菜鸟。它是根据此代码进行的:

感谢您的帮助!

I'm trying to send data over MQTT from an ESP32 to my computer. I have two distinct sets of data going to two topics, temperature and gravity. For some reason, it will only publish one message, but send it twice to the broker and its whatever message is published first. I'm not sure what I could be doing differently.

Arduino code:

int parseTilt(String DevData) {
  String DevUUID, DevColour, DevTempData, DevGravityData;
  int colourInt;
  float DevTemp, DevGravity;

  // Determine the Colour
  colourInt = DevData.substring(6, 7).toInt();

  switch (colourInt) {
    case 1:
      DevColour = "Red";
      break;
    case 2:
      DevColour = "Green";
      break;
    case 3:
      DevColour = "Black";
      break;
    case 4:
      DevColour = "Purple";
      break;
    case 5:
      DevColour = "Orange";
      break;
    case 6:
      DevColour = "Blue";
      break;
    case 7:
      DevColour = "Yellow";
      break;
    case 8:
      DevColour = "Pink";
      break;
  }

  if (repeatColour != 0 && repeatColour != colourInt) {
    Serial.print(DevColour);
    Serial.println(" Tilt is being ignored.");
    return 0;
  }

  //Generate the UUID
  DevUUID += DevData.substring(0, 8);
  DevUUID += "-";
  DevUUID += DevData.substring(8, 12);
  DevUUID += "-";
  DevUUID += DevData.substring(12, 16);
  DevUUID += "-";
  DevUUID += DevData.substring(16, 20);
  DevUUID += "-";
  DevUUID += DevData.substring(20, 32);


  // Get the temperature
  DevTempData = DevData.substring(32, 36);
  DevTemp = strtol(DevTempData.c_str(), NULL, 16); // Temp in Freedumb units

  // Get the gravity
  DevGravityData = DevData.substring(36, 40);
  DevGravity = strtol(DevGravityData.c_str() , NULL, 16);

  Serial.println("--------------------------------");
  Serial.print("Colour: ");
  Serial.println(DevColour);
  Serial.print("Temp: ");
  if (Celsius) {
     Serial.print((DevTemp-32.0) * (5.0/9.0));
     Serial.println(" C");
  }
  else {
    Serial.print(DevTemp);
    Serial.println(" F");
  }
  Serial.print("Gravity: ");
  float DevGravityFormatted = (DevGravity / 1000);
  Serial.println(DevGravityFormatted);
  Serial.println(DevGravityFormatted, 3);
  Serial.println(DevGravityFormatted);
  Serial.println(DevData);
  Serial.println(DevData.substring(0,32));
  Serial.println(DevUUID);
  Serial.println("--------------------------------");


  client.loop();
  Serial.println(DevGravity, 16);
  char tempGravity[16];
  dtostrf(DevGravity, 16, 3, tempGravity);
  char tempTemp[5];
  dtostrf(DevTemp, 5, 2, tempTemp);
  Serial.println("tempGravity");
  Serial.println(tempGravity);
  Serial.println("tempTemp");
  Serial.println(tempTemp);
  client.publish("fermentation/temperature", tempTemp);
  client.loop();
  delay(500);
  client.publish("fermentation/gravity",tempGravity);
  client.loop();
  Serial.println("published");

  return 2;
}

And the python code on my computer:

MQTT_SERVER = "192.168.1.69"
MQTT_PATH_1 = ('fermentation/gravity')
MQTT_PATH_2 = ('fermentation/temperature')


def on_connect(client, userdata, flags, rc):
    print('conncected, result: ' + str(rc))
    client.subscribe(MQTT_PATH_1)
    print('subscribed gravity')
    client.subscribe(MQTT_PATH_2)
    print('subscribed temperature')

def on_message(client, userdata, msg):
    temp = str(msg.payload).split("'")
    if msg.topic == MQTT_PATH_1:
        print('mqtt 1')
        print(msg.topic + ' ' + str(msg.payload))
    if msg.topic == MQTT_PATH_2:
        print('mqtt 2') 
        print(msg.topic + ' ' + str(msg.payload))
    else:
        print('else')
        print(msg.topic + ' ' + str(msg.payload))
    

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_SERVER, 1883, 60)

client.loop_forever()

The output comes out to this:
mqtt 2
fermentation/temperature b'75.00'
mqtt 2
fermentation/temperature b'75.00'

Not sure what I'm doing wrong. Please excuse the arduino code, I'm a noob. It is adapted from this code: https://github.com/N3MIS15/ESP32-Tilt-Repeater/blob/master/ESP32-Tilt-Repeater.ino

Thanks for the help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文