开发者社区 问答 正文

当点击开关的时候显示 :数据下发超时请检查设备

当我没按开关的时候,串口开始打印的数字是0000,按下后,开关又自动回弹了,同时显示数据下发超时请检查设备,打印的数字是1111(证明这个过程数据已经传输了过来),当我再按下开关的时候,也收到数据了,打印的数字还是1111,显示数据下发超时请检查设备。 以下是我的代码:

#include <ESP8266WiFi.h> #include<ArduinoJson.h> #include"AliyunIoTSDK.h" static WiFiClient espClient;

#define PRODUCT_KEY " #define DEVICE_NAME " #define DEVICE_SECRET #define REGION_ID "cn-shanghai"

#define WIFI_SSID "14101" #define WIFI_PASSWD "123456789+"

int c;

void wifiInit(const char *ssid, const char *passphrase) { WiFi.mode(WIFI_STA); WiFi.begin(ssid, passphrase); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("WiFi not Connect"); } Serial.println("Connected to WiFi"); }

void setup() { Serial.begin(9600); delay(200); wifiInit(WIFI_SSID, WIFI_PASSWD);

AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID); AliyunIoTSDK::bindData("switch1", switch1Callback);

}

void loop() { AliyunIoTSDK::loop(); if(c==1){ Serial.println("1111"); } else{ Serial.println("0000");
} delay(1000); }

void switch1Callback(JsonVariant p) { int Switch1 = p["switch1"]; if (Switch1 == 1) { Serial.println("dddd1"); c=1; } else { Serial.println("dddd0"); } }

展开
收起
游客gmi6lezohlc6s 2023-05-26 16:40:59 1337 分享 版权
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    根据您提供的代码,可能是以下几个问题导致出现 "数据下发超时请检查设备" 的提示信息:

    WiFi 连接不稳定或者网络延迟过高。由于 AliyunIoTSDK 使用的是 MQTT 协议进行数据传输,而 MQTT 协议对网络的稳定性和延迟要求比较高,如果 WiFi 连接不稳定或者网络延迟过高,可能会导致数据下发失败。建议检查一下 WiFi 连接是否稳定,并且尝试将设备靠近 WiFi 路由器以减少延迟。

    设备与阿里云物联网平台之间的 MQTT 连接出现了问题。在您的代码中,AliyunIoTSDK::loop() 函数用于维持 MQTT 连接,如果连接出现了问题,可能会导致数据下发失败。建议检查一下设备与阿里云物联网平台之间的 MQTT 连接是否正常,例如检查设备是否正确接入了网络,以及是否使用了正确的 ProductKey、DeviceName、DeviceSecret 和 RegionId等参数。

    代码逻辑问题。在您的代码中,只有当 c 的值等于 1 时才会输出 "1111",否则输出 "0000"。但是根据您的描述,无论是否按下开关,c 的值似乎都为 1,这可能是代码逻辑出现了问题。建议检查一下代码逻辑,确保开关状态能够正确地映射到 c 的值上。

    针对以上问题,您可以尝试进行以下修复:

    检查 WiFi 连接是否稳定,尝试将设备靠近 WiFi 路由器以减少延迟。

    检查设备与阿里云物联网平台之间的 MQTT 连接是否正常,确保使用了正确的 ProductKey、DeviceName、DeviceSecret 和 RegionId 参数。

    检查代码逻辑是否正确,确保开关状态能够正确地映射到 c 的值上。

    希望这些提示能够对您有所帮助。如有需要,您可以提供更多相关信息,以便更进一步进行分析和帮助。

    2023-05-27 21:59:22
    赞同 展开评论
  • 云端行者觅知音, 技术前沿我独行。 前言探索无边界, 阿里风光引我情。

    从代码看,可能是以下问题:

    1. 在loop函数中,您使用了一个变量c来判断开关状态,但是没有对其进行初始化。建议在setup函数中c初始化为0。

    2. 在switch1Callback函数中,您获取开关状态的方式可能存在问题。根据您的代码,开关状态是从Json对象中获取的,但是您没有对其进行类型转换。建议使用p.as()的方式将JsonVariant对象转换为int类型。

    3. 在loop函数中,您使用了delay函数来控制程序的执行时间。这种方式可能会导致程序阻塞,影响程序的响应速度。建议使用非阻塞的方式来控制程序的执行时间,例如使用is函数。

    4. 在loop函数中,您每次都会打印一次开关状态。这种方式可能会导致串口输出过于频繁影响程序的性能。建议使用一个变量来记录上一次的开关状态,只有当开关状态发生变化时才进行打印。

    2023-05-26 17:31:11
    赞同 展开评论
问答分类:
C++
问答地址: