关于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");
}
}
最后
以上就是淡定唇彩最近收集整理的关于阿里云Mqtt连接报错解决的全部内容,更多相关阿里云Mqtt连接报错解决内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复