阿里云Mqtt连接报错解决
关于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:\Users\admin\Documents\Arduino\libraries\PubSubClient\src
找到下面的.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 connectedSerial.println(connectErrorToString(mqttclient.state()));Serial.println(F("Retrying MQTT connection in 5 seconds..."));mqttclient.disconnect();delay(5000); // wait 5 secondsretries--;if (retries == 0) {// basically die and wait for WDT to reset mewhile (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:%d\r\n", ESP.getFreeHeap());}//未连接1s重连if ( WiFi.status() != WL_CONNECTED ) {if (millis() - lastWiFiCheckTick > 1000) {lastWiFiCheckTick = millis();Serial.print(".");}}//连接成功建立else {if (taskStarted == false) {taskStarted = true;Serial.print("\r\nGet 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");}
}
阿里云Mqtt连接报错解决相关推荐
- 解决阿里云企业邮箱发送错误码提示
阿里云企业邮箱错误代码提示原因及解决方法,阿小云分享阿里云企业邮箱使用过程中报错.错误原因及解决方法: 阿里云企业邮箱报错及解决方法 在使用企业邮箱时如发生相应的报错,可参见以下报错信息进行解决: 本 ...
- 记录一次阿里云服务器升级报错
记录一次阿里云服务器升级报错 ---Email:1261065212@qq.com 系统: # cat /etc/redhat-release CentOS Linux release 7.4.17 ...
- 移远BC35-G配置网络连接阿里云MQTT发送数据
移远BC35/BC26/BC28配置网络连接阿里云MQTT发送数据(一)精.防踩坑 硬件准备 接线部分 软件准备 烧录固件 QFlash 4.17烧录 阿里云准备 测试准备(AT指令) 连接阿里云 第 ...
- 【开源】手机APP通过IoT点亮LED灯(STM32+ESP8266+阿里云+MQTT+Android)
(STM32+ESP8266+阿里云+MQTT+Android) 本项目利用Android Studio编写了连接阿里云和MQTT的APP,并在UI界面简单设计了标题,连接按钮,点灯按钮,灭灯按钮.如 ...
- 阿里云安装Mysql报错
阿里云安装Mysql报错: The GPG keys listed for the "MySQL 5.7 Community Server" repository are alre ...
- pymysql模块操作数据库及连接报错解决方法
pymysql模块操作数据库及连接报错解决方法 参考文章: (1)pymysql模块操作数据库及连接报错解决方法 (2)https://www.cnblogs.com/zgngg/p/10607859 ...
- 亿佰特串口服务器接入阿里云MQTT协议的软件配置教程
在之前的文章中我们了解到虚拟串口软件作为TCP客户端来结合串口服务器使用,这一期我们来看一下串口服务器怎样接入阿里云物模型. 步骤详尽,一文读懂. 1.阿里云MQTT环境配置 ③点击"创建产 ...
- mqtt 发送消息过多_阿里云MQTT服务端注解式消息处理分发与同步调用实践小结
一.前言 前段时间公司预研了设备app端与服务端的交互方案,出于多方面考量最终选用了阿里云的微服务队列MQTT方案,基于此方案,本人主要实践有: 1. 封装了RocketMQ实现MQTT订阅与发布的实 ...
- 做了一个阿里云MQTT单片机编程小工具
做了一个阿里云MQTT单片机编程小工具,点击测试http://www.norra.cn:9091/ 传感云是采集.传输.存储.可视化.接口.APP.微信一体的传感器与应用服务平台,支持多种模式 ...
- 【STM32 x ESP8266】连接阿里云 MQTT 服务器(报文连接)
具体如何在阿里云创建一个 MQTT 服务器我就不写出来了,可以去百度一下(主要是我忘了,不好演示). 有关 MQTT 报文的一些标识在我前面的一篇文章中讲过,感兴趣的可以去看看(有关代码部分讲解的内容 ...
最新文章
- 如果只能通过IE写博客【Do we write blog just only with IE?】
- Liunx下MySQL常用命令
- day3-函数参数及调用
- Robots.txt和Robots META
- c++ 四种类型转换机制
- 启明智显分享| 2.4寸旋钮串口屏在健身器材上的应用
- python创建字符串数组_如何创建任意长度字符串的numpy数组?
- mysql select 使用_mysql select简单用法
- SAP Fiori Elements - how facet is loaded for my productive POC
- Logcat打印调试信息
- Win11系统如何刷新按钮
- JScript中的条件注释详解(转载自网络)
- mycat基础实验之主从配置读写分离和分表
- 在网页中插入背景音乐代码(html)
- 机器视觉需要掌握的知识
- 如何把控单元测试的粒度让你省时省力甚至一劳永逸建议一键收藏
- springboot集成es实现搜索功能
- [计算机网络]网络层IP协议 选路算法
- SAP ALV 导出 Excel 负号前置「实例」
- 交叉引用跳转不到后面_参考文献如何正确标注引用而不会变红?