m0_74075767 2024-05-20 09:53 采纳率: 66.7%
浏览 50
已结题

使用ESP8266连接阿里云出现问题

在使用Keil编写程序通过ESP8266连接阿里云平台时遇到问题,初始化过程中卡在了第八步无法连接,具体传输的at指令为"AT+MQTTCONN=0,"iot-06z00ia6orbs8ag.mqtt.iothub.aliyuncs.com",1883,1\r\n"
连接热点的AT指令能正常收到“OK”回复,并且关于MQTT的指令AT+MQTTCLIENTID=0,"k17fimjhRbe.MQTT|securemode=2\,signmethod=hmacsha256\,timestamp=1715136221700|"\r\n也能被正常识别


void esp8266_init(void)
{
    __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);                                                       //打开串口2接收中断
    
    printf("1.SETTING STATION MODE\r\n");
  OLED_printf(0,0,"1.SETTING STATION MODE                   ");
    while(esp8266_send_cmd((uint8_t *)"AT+CWMODE=1\r\n",strlen("AT+CWMODE=1\r\n"),"OK")!=0)
    {
        HAL_Delay(1000);
    }
    printf("2.CLOSE ESP8266 ECHO\r\n");
  OLED_printf(0,0,"2.CLOSE ESP8266 ECHO                     ");
    while(esp8266_send_cmd((uint8_t *)"ATE0\r\n",strlen("ATE0\r\n"),"OK")!=0)
    {
        HAL_Delay(1000);
    }
    printf("3.NO AUTO CONNECT WIFI\r\n"); 
  OLED_printf(0,0,"3.NO AUTO CONNECT WIFI                   ");
    while(esp8266_send_cmd((uint8_t *)"AT+CWAUTOCONN=0\r\n",strlen("AT+CWAUTOCONN=0\r\n"),"OK")!=0)
    {
        HAL_Delay(1000);
    }
    printf("4.RESET ESP8266\r\n");
  OLED_printf(0,0,"4.RESET ESP8266                          ");
    while(esp8266_reset() != 0)
    {
        HAL_Delay(5000);
    }
    printf("5.CONFIG WIFI NETWORK\r\n");
  OLED_printf(0,0,"5.CONFIG WIFI NETWORK                    ");
    while(esp8266_config_network() != 0)
    {
        HAL_Delay(8000);
    }
    printf("6.MQTT USER CONFIG\r\n");
  OLED_printf(0,0,"6.MQTT USER CONFIG                       ");
    while(esp8266_send_cmd((uint8_t *)"AT+MQTTUSERCFG=0,1,\"NULL\",\""MQTT_USER_NAME"\",\""MQTT_PASSWD"\",0,0,\"\"\r\n",
                          strlen("AT+MQTTUSERCFG=0,1,\"NULL\",\""MQTT_USER_NAME"\",\""MQTT_PASSWD"\",0,0,\"\"\r\n"),"OK")!=0)
    {
        HAL_Delay(2000);
    }
      OLED_printf(0,0,"7.MQTT CLIENTID                       ");
    while(esp8266_send_cmd((uint8_t *)MQTT_CLIENT_ID,strlen(MQTT_CLIENT_ID),"OK")!=0)
    {
        HAL_Delay(2000);
    }
    printf("8.CONNECT MQTT BROKER\r\n");
  OLED_printf(0,0,"8.CONNECT MQTT BROKER                    ");
    while(esp8266_connect_server() != 0)
    {
        HAL_Delay(8000);
    }
    printf("9.SUBSCRIBE TOPIC\r\n");
  OLED_printf(0,0,"8.SUBSCRIBE TOPIC                ");
    while(esp8266_send_cmd((uint8_t *)"AT+MQTTSUB=0,\""SUB_TOPIC"\",0\r\n",strlen("AT+MQTTSUB=0,\""SUB_TOPIC"\",0\r\n"),"OK")!=0)
    {
        HAL_Delay(2000);
    }
    printf("0.ESP8266 INIT OK!!!\r\n");
  OLED_printf(0,0,"0.ESP8266 INIT OK!!!                ");
}

以下为出问题的代码

uint8_t esp8266_connect_server(void)
{
    uint8_t retval=0;
    uint16_t count = 0;

    HAL_UART_Transmit(&huart2, (unsigned char *)BROKER_ASDDRESS,strlen(BROKER_ASDDRESS), 1000);

    
    while((receive_start == 0)&&(count<1000))    
    {
        count++;
        HAL_Delay(1);
    }
    
    if(count >= 1000)    
    {
        retval = 1;    
    }
    else    
    {
        HAL_Delay(5000);
        if(strstr((const char*)receive_buf, "OK"))    
        {
            retval = 0;    
        }
    else
    {
      retval = 1;    
    }
    }
  uart2_receiver_clear(receive_count);    
    return retval;
}

img

使用串口助手是可以成功通信的。
以下是一些信息的初始化:

#define WIFI_SSID        "kjpldzt"
#define WIFI_PASSWD      "111111111"

#define MQTT_CLIENT_ID   "AT+MQTTCLIENTID=0,\"k17fimjhRbe.MQTT|securemode=2\\,signmethod=hmacsha256\\,timestamp=1715136221700|\"\r\n"   
#define MQTT_USER_NAME   "MQTT&k17fimjhRbe"
#define MQTT_PASSWD      "427442d303a6dac9ee88692e423be0ea3ccd8ec6313e2b19ad08dc24c4c35aac"
#define BROKER_ADDRESS  "AT+MQTTCONN=0,\"iot-06z00ia6orbs8ag.mqtt.iothub.aliyuncs.com\",1883,1\r\n"
#define SUB_TOPIC        "/sys/k17fimjhRbe/MQTT/thing/service/property/set"
#define PUB_TOPIC        "/sys/k17fimjhRbe/MQTT/thing/event/property/post"
#define JSON_FORMAT      "{\\\"params\\\":{\\\"temp\\\":%d\\,\\\"humi\\\":%d\\}\\,\\\"version\\\":\\\"1.0.0\\\"}"


  • 写回答

13条回答

  • 阿里嘎多学长 2024-05-20 09:53
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题:

    您提问的目的是解决在使用ESP8266模块通过Keil软件编写程序连接阿里云平台时遇到的连接问题。具体来说,程序在执行到连接MQTT服务器的步骤时无法成功连接,导致整个初始化过程卡住。

    图片内容:

    您上传的图片显示了使用串口助手成功发送AT指令并接收到"OK"响应的过程。具体指令包括配置MQTT用户信息、设置MQTT客户端ID以及尝试连接到MQTT服务器的指令。图片中还显示了CSDN用户名@mO_74075767。

    问题出现原因:

    1. 代码中的错误:在您的代码中,BROKER_ASDDRESS 应该是MQTT服务器的地址,但是在您的函数esp8266_connect_server中,这个字符串没有被正确地定义或初始化。
    2. AT指令格式错误:在您的代码中,AT指令"AT+MQTTCONN=0,"iot-06z00ia6orbs8ag.mqtt.iothub.aliyuncs.com",1883,1\r\n" 缺少了引号,正确的格式应该是"AT+MQTTCONN=0,\"iot-06z00ia6orbs8ag.mqtt.iothub.aliyuncs.com\",1883,1\r\n"
    3. 接收逻辑问题:您的接收逻辑依赖于receive_start标志和receive_buf缓冲区,如果这些没有正确设置或者数据没有正确接收,将导致无法检测到"OK"响应。

    问题解决方案:

    1. 修正AT指令格式:确保AT指令格式正确,特别是引号的使用。
    2. 初始化BROKER_ASDDRESS:确保BROKER_ASDDRESS变量被正确初始化为MQTT服务器的地址。
    3. 检查接收逻辑:确保receive_startreceive_buf能够正确地接收和解析来自ESP8266的响应。
    4. 增加错误处理:在无法连接时,打印出错误信息或者状态码,以便于调试。

    提供代码:

    由于我无法创建或提供文件,我将提供一段修改后的代码示例,您可以将其集成到您的项目中:

    // 确保BROKER_ADDRESS已经被正确定义和初始化
    #define BROKER_ADDRESS "AT+MQTTCONN=0,\"iot-06z00ia6orbs8ag.mqtt.iothub.aliyuncs.com\",1883,1\r\n"
    
    uint8_t esp8266_connect_server(void)
    {
        // ... 其他代码保持不变
        HAL_UART_Transmit(&huart2, (unsigned char *)BROKER_ADDRESS,strlen(BROKER_ADDRESS), 1000);
        // ... 其他代码保持不变
    
        // 确保receive_buf有足够的空间来存储接收到的数据
        char receive_buf[256]; // 根据需要调整缓冲区大小
        uint16_t receive_count = 0;
        
        // 接收数据的代码需要根据实际情况调整
        while((receive_start == 0)&&(count<1000)) {
            // 这里需要实现接收数据的逻辑
            // 例如,使用HAL_UART_Receive()来接收数据
            count++;
            HAL_Delay(1);
        }
    
        // 检查接收到的数据是否包含"OK"
        if(count < 1000 && strstr(receive_buf, "OK")) {
            retval = 0;
        } else {
            retval = 1;
        }
        
        // 清除接收缓冲区
        // uart2_receiver_clear(receive_count); // 确保这个函数存在并且能够正确工作
        
        return retval;
    }
    

    代码运行方式:

    • 确保Keil软件和ESP8266开发环境已经设置好。
    • 将修改后的代码集成到您的项目中。
    • 编译并下载到ESP8266模块上。
    • 使用串口助手或其他串口调试工具来监控通信过程。

    代码预期运行结果:

    如果代码修改正确,您应该能够看到ESP8266模块成功连接到阿里云MQTT服务器,并在串口助手或调试工具中接收到"OK"响应。

    推荐相关链接:

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月20日
  • 修改了问题 5月20日
  • 修改了问题 5月20日
  • 创建了问题 5月20日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 Ubuntu20.04无法连接GitHub
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥30 C++行情软件的tick数据如何高效的合成K线