从 Arduino 发布 IFTTT JSON 失败

物联网 伊夫特
2021-06-26 17:36:29

我正在尝试使用 IFTTT 和 WebHook 将 JSON 格式的状态消息发送到 Google 工作表。

  1. IFTTT 配方在将所有 3 个单元格的值发布到 Google 工作表(Stringchar变量)时工作正常。

  2. JSON 消息不太长(尝试使用非常短的消息)。

  3. JSON 是使用ArduinoJSON创建的,并按预期作为 MQTT 消息发布。

  4. String变量(保存 JSON 消息)转换为char,也没有发送。

我猜它必须是JSON使用 IFTT + Webhooks发送格式。

我对吗?我怎样才能克服这个问题?

编辑 1

说明:makeIFTTTRequest获取一个字符串作为参数(已检查 - 并且工作正常)以将其发送给 IFTTT。

create_wakeStatus 以 JSON 格式生成该字符串(也已检查 - 并作为 MQTT 发送)

功能1:发送到IFTTT

template <typename T1, typename T2, typename T3>
void makeIFTTTRequest(T1 val1, T2 val2, T3 val3)
{
  Serial.print("Connecting to ");
  Serial.print(server);

  WiFiClient client;
  int retries = 5;
  while (!!!client.connect(server, 80) && (retries-- > 0))
  {
    Serial.print(".");
  }
  Serial.println();
  if (!!!client.connected())
  {
    Serial.println("Failed to connect...");
  }

  Serial.print("Request resource: ");
  Serial.println(resource);

  String jsonObject = String("{\"value1\":\"") + val1 + "\",\"value2\":\"" + val2 + "\",\"value3\":\"" + val3 + "\"}";

  client.println(String("POST ") + resource + " HTTP/1.1");
  client.println(String("Host: ") + server);
  client.println("Connection: close\r\nContent-Type: application/json");
  client.print("Content-Length: ");
  client.println(jsonObject.length());
  client.println();
  client.println(jsonObject);

  int timeout = 5 * 10; // 5 seconds
  while (!!!client.available() && (timeout-- > 0))
  {
    delay(100);
  }
  if (!!!client.available())
  {
    Serial.println("No response...");
  }
  while (client.available())
  {
    Serial.write(client.read());
  }

  Serial.println("\nclosing connection");
  client.stop();
}

功能二:

String create_wakeStatus()
{
  StaticJsonDocument<300> doc;
  // Constansts
  doc["deviceName"] = go2sleep.WakeStatus.name;
  doc["bootCount"] = go2sleep.WakeStatus.bootCount;
  doc["forcedAwake"] = go2sleep.WakeStatus.awake_duration;

  // Per wake cycle
  doc["sleepDuration"] = go2sleep.sleepduration;
  doc["Wake"] = go2sleep.WakeStatus.wake_clock;
  doc["SleepStart"] = go2sleep.WakeStatus.startsleep_clock;
  doc["nextWake"] = go2sleep.WakeStatus.nextwake_clock;
  doc["RTCdrift"] = go2sleep.WakeStatus.drift_err;
  doc["WakeErr"] = go2sleep.WakeStatus.wake_err;

  String output;
  serializeJson(doc, output);
  return output;
}

**编辑 2 **

功能3:

void postWake()
{
  char a[250];
  String output = create_wakeStatus();
  output.toCharArray(a, output.length() + 1);
  // makeIFTTTRequest(output,"A","B"); once tried as String and once as char ... both failed
  // makeIFTTTRequest(a,"blabla","blabla"); 
  iot.pub_ext(a, true);
}
0个回答
没有发现任何回复~