我是靠谱客的博主 老实枕头,最近开发中收集的这篇文章主要介绍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("ATrn"); 
      USART2_Write(USART2,"ATrn",strlen("ATrn"));
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
        while(strx==NULL)
        {
                Clear_Buffer();    
                USART2_Write(USART2,"ATrn",strlen("ATrn"));
                delay_ms(500);
                strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
        }
        USART2_Write(USART2,"AT+QGPS?rn",strlen("AT+QGPS?rn"));//查询GPS上电情况
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+QGPS: 1");//返回上电正常
        if(strx==NULL)
        USART2_Write(USART2,"AT+QGPS=1rn",strlen("AT+QGPS=1rn"));//对模块进行上电
        delay_ms(100);
        USART2_Write(USART2,"AT+CSQrn",strlen("AT+CSQrn"));
        //printf("AT+CSQrn"); //检查CSQ
        delay_ms(500);
    //    printf("ATIrn"); //检查模块的版本号
        USART2_Write(USART2,"ATirn",strlen("ATirn"));
        delay_ms(500);
        /
        USART2_Write(USART2,"AT+CPIN?rn",strlen("AT+CPIN?rn"));
        //printf("AT+CPIN?rn");//检查SIM卡是否在位
        delay_ms(500);
        strx=strstr((const char*)RxBuffer,(const char*)"+CPIN: READY");//查看是否返回ready
        while(strx==NULL)
        {
                Clear_Buffer();
                    USART2_Write(USART2,"AT+CPIN?rn",strlen("AT+CPIN?rn"));
                delay_ms(500);
                strx=strstr((const char*)RxBuffer,(const char*)"+CPIN: READY");//检查SIM卡是否在位,等待卡在位,如果卡识别不到,剩余的工作就没法做了
        }
        Clear_Buffer();    
        /
    //    printf("AT+CGREG?rn");//查看是否注册GPRS网络
        USART2_Write(USART2,"AT+CGREG?rn",strlen("AT+CGREG?rn"));
        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?rn");//查看是否注册GPRS网络
                USART2_Write(USART2,"AT+CGREG?rn",strlen("AT+CGREG?rn"));
                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?rn");//查看注册到哪个运营商,支持移动 联通 电信 
      USART2_Write(USART2,"AT+COPS?rn",strlen("AT+COPS?rn"));
        delay_ms(500);
        Clear_Buffer();
//        printf("AT+QICLOSE=0rn");//关闭socket连接
        USART2_Write(USART2,"AT+QICLOSE=0rn",strlen("AT+QICLOSE=0rn"));
      delay_ms(500);
        Clear_Buffer();
        //printf("AT+QICSGP=1,1,42CMNET42,4242,4242,0rn");//接入APN,无用户名和密码
        USART2_Write(USART2,"AT+QICSGP=1,1,42CMNET42,4242,4242,0rn",strlen("AT+QICSGP=1,1,42CMNET42,4242,4242,0rn"));
        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=1rn");//去激活
        USART2_Write(USART2,"AT+QIDEACT=1rn",strlen("AT+QIDEACT=1rn"));
        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=1rn");//激活
        USART2_Write(USART2,"AT+QIACT=1rn",strlen("AT+QIACT=1rn"));
        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?rn");//获取当前卡的IP地址
        USART2_Write(USART2,"AT+QIACT?rn",strlen("AT+QIACT?rn"));
        delay_ms(500);
        Clear_Buffer();

}        

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

void EC20_MQTTCONNECTServer(void)//连接MQTT服务器
{
      char *strx;
        USART2_Write(USART2,"AT+QICLOSE=0rn",strlen("AT+QICLOSE=0rn"));
      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,42TCP42,42183.230.40.3942,6002,0,1rn",strlen("AT+QIOPEN=1,0,42TCP42,42183.230.40.3942,6002,0,2rn"));//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?rn",strlen("AT+CGATT?rn")); //查询GPRS

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

USART2_Write(USART2,"AT+CSQrn",strlen("AT+CREG?rn"));//查询信号强度

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

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

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

{

ProductKey

DeviceName

DeviceSecret

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

}

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

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

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

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

3 功能测试

3.1 向云端发送数据

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

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

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

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

 

 

 

最后

以上就是老实枕头为你收集整理的EC20连接阿里云操作流程,AT_MQTT协议连接,详细的全部内容,希望文章能够帮你解决EC20连接阿里云操作流程,AT_MQTT协议连接,详细所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部