首页 > 编程知识 正文

MQTT连接失败,阿里云mqtt接入

时间:2023-05-03 06:50:59 阅读:189027 作者:4293

关于The Client identifier is correct UTF-8 but not allowed by the Server连接报错解决 错误原因

如果是使用阿里云平台进行mqtt的设备连接,那么在导入PubSubClient库的时候进行设备mqtt连接的时候可能会出现如下的错误:
The Client identifier is correct UTF-8 but not allowed by the Server
因为在库里面默认的mqtt包和keepalive,以及超时的时间都比较小,很可能会还没连上就报错了。

阿里云物联网平台要求 CONNECT指令中需包含Keep Alive(保活时间)。保活心跳时间取值范围为30至1200秒。如果心跳时间不在此区间内,物联网平台会拒绝连接。建议取值300秒以上。如果网络不稳定,将心跳时间设置高一些。

解决方法:

进入目录: C:UsersadminDocumentsArduinolibrariesPubSubClientsrc
找到下面的.h文件对其进行参数修改

可修改参数如下:

// MQTT_VERSION : Pick the version//#define MQTT_VERSION MQTT_VERSION_3_1#ifndef MQTT_VERSION#define MQTT_VERSION MQTT_VERSION_3_1_1#endif // MQTT_MAX_PACKET_SIZE : Maximum packet size#ifndef MQTT_MAX_PACKET_SIZE#define MQTT_MAX_PACKET_SIZE 1024#endif // MQTT_KEEPALIVE : keepAlive interval in Seconds#ifndef MQTT_KEEPALIVE#define MQTT_KEEPALIVE 300#endif // MQTT_SOCKET_TIMEOUT: socket timeout interval in Seconds#ifndef MQTT_SOCKET_TIMEOUT#define MQTT_SOCKET_TIMEOUT 60#endif (附)阿里云设备连接

下面是可以通过修改三元组信息进行服务器连接的代码,可以直接通过Arduino进行烧录,仅做代码参考,具体连接教程可以看菜鸟哥的博客进行同步学习:https://blog.csdn.net/dpjcn1990/article/details/104561464

#include <ESP8266WiFi.h>#include <ArduinoJson.h>#include <PubSubClient.h>#include <WiFiClientSecure.h>const char* WIFI_SSID = "WiFi账号"; // WiFi账号const char* WIFI_PASSWORD = "WiFi密码"; // WiFi密码/******************产品/设备配置(每个人需要根据自己的产品设备信息去动态更换)**********************/#define PRODUCT_KEY "产品key" //产品key 从产品详情获取#define DEVICE_NAME "设备deviceName " //设备deviceName 从设备详情获取// 服务端相关#define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt.cn-shanghai.aliyuncs.com" //阿里云MQTT服务地址#define MQTT_PORT 1883 //MQTT服务端口// 校验三元组#define MQTT_CLIENT_ID DEVICE_NAME "|securemode=3,signmethod=hmacsha1|" //mqtt clientid#define MQTT_USERNAME DEVICE_NAME "&" PRODUCT_KEY //mqtt username#define MQTT_PASSWORD "password" //mqtt password 通过生成工具获得// 相关主题 自定义一个主题#define TOPIC1 "/" PRODUCT_KEY "/" DEVICE_NAME "/user/setledstatus"/*************************************************************************************************/void mqtt_callback (char* topic, byte* payload, unsigned int length);void doWiFiTick();void connect_wifi();void connectToMqtt();const __FlashStringHelper* connectErrorToString(int8_t code);WiFiClient client;PubSubClient mqttclient(MQTT_SERVER, MQTT_PORT, &mqtt_callback, client);bool ICACHE_FLASH_ATTR connectHTTPS() { Serial.print("connecting to "); Serial.println(MQTT_SERVER); if (!client.connect(MQTT_SERVER, MQTT_PORT)) { Serial.println(F("connection failed")); return false; } else { Serial.println(F("connection succeed")); return true; }}void setup() { // put your setup code here, to run once: delay(2000); Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); Serial.println("");}void loop() { // put your main code here, to run repeatedly: ESP.wdtFeed(); doWiFiTick(); if (WiFi.status() == WL_CONNECTED) { connectToMqtt(); mqttclient.loop(); } delay(2000);}/** * 功能:连接到WiFi热点 */void connect_wifi() { WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.print(F("nWiFi connected to ")); Serial.println(WIFI_SSID); Serial.print(F("IP address: ")); Serial.println(WiFi.localIP());}/** * 功能:连接到Mqtt */void connectToMqtt() { if (mqttclient.connected()) { return; } Serial.print(F("Connecting to MQTT... ")); int8_t ret; uint8_t retries = 3; while (!mqttclient.connect(MQTT_CLIENT_ID, MQTT_USERNAME,MQTT_PASSWORD)) { // connect will return true for connected Serial.println(connectErrorToString(mqttclient.state())); Serial.println(F("Retrying MQTT connection in 5 seconds...")); mqttclient.disconnect(); delay(5000); // wait 5 seconds retries--; if (retries == 0) { // basically die and wait for WDT to reset me while (1); } yield(); } Serial.println(F("Success!")); // 订阅主题 mqttclient.subscribe(TOPIC1);}/** * 功能:连接路由心跳函数 */void doWiFiTick() { static bool taskStarted = false; static bool startSTAFlag = false; static uint32_t lastWiFiCheckTick = 0; if (!startSTAFlag) { startSTAFlag = true; Serial.print("connect to ap:"); Serial.println(WIFI_SSID); WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.printf("Heap size:%drn", ESP.getFreeHeap()); } //未连接1s重连 if ( WiFi.status() != WL_CONNECTED ) { if (millis() - lastWiFiCheckTick > 1000) { lastWiFiCheckTick = millis(); Serial.print("."); } } //连接成功建立 else { if (taskStarted == false) { taskStarted = true; Serial.print("rnGet IP Address: "); Serial.println(WiFi.localIP()); } }}/** * 功能:MQTT回调 * 参数: * 1. topic 主题 * 2. payload 载体 * 3. length 载体长度 */void mqtt_callback (char* topic, byte* payload, unsigned int length) { byte *end = payload + length; for (byte *p = payload; p < end; ++p) { Serial.print(*((const char *)p)); } Serial.println(""); parseMqttResponse((char *)payload);}/** * 解析mqtt数据 */void parseMqttResponse(char* payload){ Serial.println("start parseOneNetMqttResponse"); StaticJsonBuffer<100> jsonBuffer; // StaticJsonBuffer 在栈区分配内存 它也可以被 DynamicJsonBuffer(内存在堆区分配) 代替 // DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.parseObject(payload); // Test if parsing succeeds. if (!root.success()) { Serial.println("parseObject() failed"); return ; } String deviceName = root["dn"]; int status = root["s"]; if(strcmp(DEVICE_NAME,deviceName.c_str())== 0){ if (status == 1) { digitalWrite(LED_BUILTIN, LOW); } else { digitalWrite(LED_BUILTIN, HIGH); } }}/** * 功能:打印错误 * 参数: * 1. code 错误码 */const __FlashStringHelper* connectErrorToString(int8_t code) { switch (code) { case 1: return F("The Server does not support the level of the MQTT protocol requested"); case 2: return F("The Client identifier is correct UTF-8 but not allowed by the Server"); case 3: return F("The MQTT service is unavailable"); case 4: return F("The data in the user name or password is malformed"); case 5: return F("Not authorized to connect"); case 6: return F("Exceeded reconnect rate limit. Please try again later."); case 7: return F("You have been banned from connecting. Please contact the MQTT server administrator for more details."); case -1: return F("Connection failed"); case -2: return F("Failed to subscribe"); case -3: return F("Connection Lost"); case -4: return F("Connection Timeout"); default: return F("Unknown error"); }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。