EC20连接阿里云操作流程,AT_MQTT协议连接,详细

实际开发环境:

1 阿里云平台创建产品

1.1 登录阿里云物联网平台,新用户首先注册账号

1.1.1 网址链接:https://help.aliyun.com/document_detail/73728.html?spm=a2c4g.11174283.6.571.3a8b1668Vmv5CZ,这个连接是阿里云物联网平台使用流程说明,可以在这里注册和登录账号

1.1.2 建议使用淘宝或支付宝账号注册登录

1.1.3 我这里使用的是淘宝账号登录,输入账号和密码

1.1.4 输入完账号,登记登录后,提示绑定有限,可以绑定或不绑定,选择下次再说

1.2.1 进入控制台创建产品

1.2.2 选择物联网平台

1.2.3 根据左侧导航栏选择产品,然后创建产品

1.2.4 创建产品

1.2.5 创建产品具体步骤如下图,操作完成后点击保存,这样一个产品及创建好了

1.2.6 创建好产品后,这里可以看到创建的所有的产品,点击查看,可以看到产品详情

1.2.7 产品详情如下图,我在功能定义里添加了一个保温温度

1.3.1创建设备,选择添加设备

1.3.2 添加设备操作详情,操作完成后选择确认

1.3.3 查看创建好的设备详情,现在的TPIC还是空白,带在后面的单片机程序中发送AT指令创建好主题后,这里便会显示出来,在物理型数据这里便会显示在之前添加的保温温度功能

到这里阿里云平台的操作就OK 了,接下来在开发板搭建开发环境

 

MQTT有关的AT指令的文档:

https://download.csdn.net/download/weixin_40593838/12825807

https://download.csdn.net/download/weixin_40593838/12825807

2 开发板环境搭建

开发板:合肥墨子号科技有限公司出品EC20,芯片:STM32F407VET6,EC20模组:Mini PCle EC20 Q1-A2053  EC20CEFAG-512-SGNS  本模块支持全网通,准备一张物联网4G卡,移动 联通 电信 任选,确保SIM卡可以使用

开发板使用的是MCU 的UART2与EC20通讯,所以首先要初始化UART1,波特率115200,

2.1 初始化代码如下

void uart2_init(u32 bound)
{
   //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
 
    //串口1对应引脚复用映射
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2
    
    //USART2端口配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2与GPIOA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //速度50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
    GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

   //USART2 初始化设置
    USART_InitStructure.USART_BaudRate = bound;//波特率设置
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
    USART_Init(USART2, &USART_InitStructure); //初始化串口2
    
    USART_Cmd(USART2, ENABLE);  //使能串口2 
    
    USART_ClearFlag(USART2, USART_FLAG_TC);
    
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启相关中断

    //Usart2 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口2中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器、

    
}

2.2 接下来初始化EC20模组,一定要插上SIM卡才可以初始化成功

    void  EC20_Init(void)
{
    //    printf("AT\r\n"); 
      USART2_Write(USART2,"AT\r\n",strlen("AT\r\n"));
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
        while(strx==NULL)
        {
                Clear_Buffer();    
                USART2_Write(USART2,"AT\r\n",strlen("AT\r\n"));
                delay_ms(500);
                strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
        }
        USART2_Write(USART2,"AT+QGPS?\r\n",strlen("AT+QGPS?\r\n"));//查询GPS上电情况
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+QGPS: 1");//返回上电正常
        if(strx==NULL)
        USART2_Write(USART2,"AT+QGPS=1\r\n",strlen("AT+QGPS=1\r\n"));//对模块进行上电
        delay_ms(100);
        USART2_Write(USART2,"AT+CSQ\r\n",strlen("AT+CSQ\r\n"));
        //printf("AT+CSQ\r\n"); //检查CSQ
        delay_ms(500);
    //    printf("ATI\r\n"); //检查模块的版本号
        USART2_Write(USART2,"ATi\r\n",strlen("ATi\r\n"));
        delay_ms(500);
        /
        USART2_Write(USART2,"AT+CPIN?\r\n",strlen("AT+CPIN?\r\n"));
        //printf("AT+CPIN?\r\n");//检查SIM卡是否在位
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+CPIN: READY");//查看是否返回ready
        while(strx==NULL)
        {
                Clear_Buffer();
                    USART2_Write(USART2,"AT+CPIN?\r\n",strlen("AT+CPIN?\r\n"));
                delay_ms(500);
                strx=strstr((const char*)RxBuffer,(const char*)"+CPIN: READY");//检查SIM卡是否在位,等待卡在位,如果卡识别不到,剩余的工作就没法做了
        }
        Clear_Buffer();    
        /
    //    printf("AT+CGREG?\r\n");//查看是否注册GPRS网络
        USART2_Write(USART2,"AT+CGREG?\r\n",strlen("AT+CGREG?\r\n"));
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+CGREG: 0,1");//,这里重要,只有注册成功,才可以进行GPRS数据传输。
        extstrx=strstr((const char*)RxBuffer,(const char*)"+CGREG: 0,5");//返回正常,漫游
        while(strx==NULL&&extstrx==NULL)
        {
                Clear_Buffer();
        //        printf("AT+CGREG?\r\n");//查看是否注册GPRS网络
                USART2_Write(USART2,"AT+CGREG?\r\n",strlen("AT+CGREG?\r\n"));
                delay_ms(500);
                strx=strstr((const char*)RxBuffer,(const char*)"+CGREG: 0,1");//,这里重要,只有注册成功,才可以进行GPRS数据传输。
                extstrx=strstr((const char*)RxBuffer,(const char*)"+CGREG: 0,5");//返回正常,漫游
        }
        Clear_Buffer();
    //    printf("AT+COPS?\r\n");//查看注册到哪个运营商,支持移动 联通 电信 
      USART2_Write(USART2,"AT+COPS?\r\n",strlen("AT+COPS?\r\n"));
        delay_ms(500);
        Clear_Buffer();
//        printf("AT+QICLOSE=0\r\n");//关闭socket连接
        USART2_Write(USART2,"AT+QICLOSE=0\r\n",strlen("AT+QICLOSE=0\r\n"));
      delay_ms(500);
        Clear_Buffer();
        //printf("AT+QICSGP=1,1,\042CMNET\042,\042\042,\042\042,0\r\n");//接入APN,无用户名和密码
        USART2_Write(USART2,"AT+QICSGP=1,1,\042CMNET\042,\042\042,\042\042,0\r\n",strlen("AT+QICSGP=1,1,\042CMNET\042,\042\042,\042\042,0\r\n"));
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"OK");//开启成功
        while(strx==NULL)
        {
                delay_ms(500);
                strx=strstr((const char*)RxBuffer,(const char*)"OK");开启成功
        }
        Clear_Buffer();
    //    printf("AT+QIDEACT=1\r\n");//去激活
        USART2_Write(USART2,"AT+QIDEACT=1\r\n",strlen("AT+QIDEACT=1\r\n"));
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"OK");//开启成功
        while(strx==NULL)
        {
                delay_ms(500);
                strx=strstr((const char*)RxBuffer,(const char*)"OK");//开启成功
        }
        Clear_Buffer();
    //    printf("AT+QIACT=1\r\n");//激活
        USART2_Write(USART2,"AT+QIACT=1\r\n",strlen("AT+QIACT=1\r\n"));
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"OK");//开启成功
        while(strx==NULL)
        {
                delay_ms(500);
                strx=strstr((const char*)RxBuffer,(const char*)"OK");//开启成功
        }
        Clear_Buffer();
    //    printf("AT+QIACT?\r\n");//获取当前卡的IP地址
        USART2_Write(USART2,"AT+QIACT?\r\n",strlen("AT+QIACT?\r\n"));
        delay_ms(500);
        Clear_Buffer();

}        

2.3 设置EC20采用MQTT协议连接服务器

void EC20_MQTTCONNECTServer(void)//连接MQTT服务器
{
      char *strx;
        USART2_Write(USART2,"AT+QICLOSE=0\r\n",strlen("AT+QICLOSE=0\r\n"));
      delay_ms(1000);
      delay_ms(1000);
      strx=strstr((const char*)RxBuffer,(const char*)"OK");//检查是否关闭成功
        while(strx==NULL)
        {
                strx=strstr((const char*)RxBuffer,(const char*)"OK");//检查是否关闭成功
                delay_ms(100);
        }
        Clear_Buffer();
        delay_ms(1000);
        USART2_Write(USART2,"AT+QIOPEN=1,0,\042TCP\042,\042183.230.40.39\042,6002,0,1\r\n",strlen("AT+QIOPEN=1,0,\042TCP\042,\042183.230.40.39\042,6002,0,2\r\n"));//TCP模式创建.采用MQTT方式去连接ONENET
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+QIOPEN: 0,0");//检查是否登陆成功
        while(strx==NULL)
        {
                strx=strstr((const char*)RxBuffer,(const char*)"+QIOPEN: 0,0");//检查是否登陆成功
                delay_ms(100);
        }

        delay_ms(500);
        Clear_Buffer();
}

2.4 以上连接EC20的基本初始化操作OK,接下来查询下联网状态等信息,

USART2_Write(USART2,"AT+CGATT?\r\n",strlen("AT+CGATT?\r\n")); //查询GPRS

USART2_Write(USART2,"AT+CREG?\r\n",strlen("AT+CREG?\r\n"));//查询网络注册信息

USART2_Write(USART2,"AT+CSQ\r\n",strlen("AT+CREG?\r\n"));//查询信号强度

发送这些命令要接收返回值,确保发送成功,发送命令间隔要有一定的延时

2.5 确保网络OK后,接下来配配置一些与阿里云相关的信息

USART2_Write(USART2,"AT+QMTCFG=\"aliauth\",0,\"ProductKey\",\"DeviceName\",\"DeviceSecret\"\r\n",strlen("AT+QMTCFG=\"aliauth\",0,\"ProductKey\",\"DeviceName\",\"DeviceSecret\"\r\n"));//配置阿里云上的设备信息

{

ProductKey

DeviceName

DeviceSecret

//这里是创建产品的三元组信息

}

USART2_Write(USART2,"AT+QMTOPEN=0,\"iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883\r\n",strlen("AT+QMTOPEN=0,\"iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883\r\n"));//为MQTT客户机打开网络 //cn-shanghai 根据查看自己产品的区域,//1883 区域端口号

USART2_Write(USART2,"AT+QMTCONN=0,\"DeviceName\"\r\n",strlen("AT+QMTCONN=0,\"DeviceName\"\r\n"));//连接MQTT服务器

USART2_Write(USART2,"AT+QMTSUB=0,1,\"/ProductKey/DeviceName/user/get\",0\r\n",strlen("AT+QMTSUB=0,1,\"/ProductKey/DeviceName/user/get\",0\r\n"));//订阅服务器主题,这里订阅主题成功后可以在设备TOPIC查看,这里的主题功能是可以下发数据到设备

USART2_Write(USART2,"AT+QMTSUB=0,1,\"/sys/ProductKey/DeviceName/thing/event/property/post\",0\r\n",strlen("AT+QMTSUB=0,1,\"/sys/ProductKey/DeviceName/thing/event/property/post\",0\r\n"));//订阅上报主题,这里的功能是设备上报数据到云端

3 功能测试

3.1 向云端发送数据

USART2_Write(USART2,"AT+QMTPUBEX=0,0,0,0,\"/sys/ProductKey/DeviceName/thing/event/property/post\",40\r\n",strlen("AT+QMTPUBEX=0,0,0,0,\"/sys/ProductKey/DeviceName/thing/event/property/post\",40\r\n")); //选择主题,这里发送的数据长度是40,根据实际发送数据长度修改

USART2_Write(USART2,"{\"”params\":{\"HoldingTemperature\":40.1}}\r\n",strlen("{\"params\":{\"HoldingTemperature\":40.1}}\r\n"));//发送数据内容//HoldingTemperature:这个数据就是在创建产品时添加的自定义功能,JSON格式的应该是,"{\"params\":{\"HoldingTemperature\":40.1}}\r\n",还要注意发送数据的长度,应该与主题设置的发送长度一致

3.1 可以阿里云带的MQTT.fx软件进行测试,需要注意的时候在编译密码的时候输入Client ID 的时候只是ID,比如12345,而不是包含后面的其他信息,然后按照说明操作即可

链接:https://help.aliyun.com/document_detail/140507.html?spm=a2c4g.11186623.6.571.55977b7bSZse4x

 

 

 

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ESP32S3连接阿里云服务器可以使用ESP-IDF自带的MQTT客户端库,需要进行以下配置: 1. 在阿里云控制台创建一个MQTT实例,并获取到实例的Endpoint、Client ID、Username和Password。 2. 在ESP-IDF工程中,打开menuconfig界面,选择“Component Config” -> “ESP-MQTT” -> “MQTT Client Configuration”,进行如下配置: - MQTT Broker URI: 在此处输入阿里云MQTT实例的Endpoint,格式为“ssl://[Endpoint]:[Port]”,Port为1883或8883,如果使用SSL加密,需要选择8883端口。 - MQTT Client ID: 在此处输入阿里云MQTT实例的Client ID。 - MQTT Username: 在此处输入阿里云MQTT实例的Username。 - MQTT Password: 在此处输入阿里云MQTT实例的Password。 - MQTT Transport Type: 选择“MQTT_TRANSPORT_OVER_SSL”或“MQTT_TRANSPORT_OVER_TCP”,根据阿里云MQTT实例的协议类型选择。 3. 在代码中,使用esp_mqtt_client_init函数初始化MQTT客户端,并设置esp_mqtt_client_config_t结构体的相关参数,示例代码如下: ``` esp_mqtt_client_config_t mqtt_cfg = { .uri = "ssl://[Endpoint]:8883", .client_id = "[Client ID]", .username = "[Username]", .password = "[Password]", .transport = MQTT_TRANSPORT_OVER_SSL, //或MQTT_TRANSPORT_OVER_TCP }; esp_mqtt_client_handle_t mqtt_client = esp_mqtt_client_init(&mqtt_cfg); ``` 4. 在代码中,使用esp_mqtt_client_start函数启动MQTT客户端,示例代码如下: ``` esp_err_t err = esp_mqtt_client_start(mqtt_client); if (err != ESP_OK) { printf("MQTT client start failed: %s\n", esp_err_to_name(err)); } ``` 5. 在代码中,使用esp_mqtt_client_subscribe函数订阅MQTT主题,并使用esp_mqtt_client_publish函数发布MQTT消息,示例代码如下: ``` esp_mqtt_client_subscribe(mqtt_client, "/test/topic", 0); esp_mqtt_client_publish(mqtt_client, "/test/topic", "Hello, MQTT!", 0, 0, 0); ``` 以上就是ESP32S3连接阿里云服务器的MQTT客户端配置方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学徒666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值