实际开发环境:

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

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

  1. 物联网阿里云——Android Mqtt协议连接阿里云

    实现步骤: 一.云平台端 1.首先在阿里云物联网平台创建产品和设备,获取设备三元组 {       "ProductKey": "a1QRE182gGH",   ...

  2. NBIOT连接阿里云控制台(MQTT连接阿里云控制台)

    首先使用MQTT工具连接阿里云平台进行测试之后再使用NBIOT连接控制台,这里主要讲解MQTT连接阿里云的步骤 1.注册或登录阿里云账号 自行前往阿里云官网注册 2.进入物联网界面 首先点击阿里云旁边 ...

  3. 远程连接阿里云服务器一直显示连接失败原因

    1.背景 服务器为阿里云Windows Server 2019,想用Xshell7或PuTTY远程连接都连接失败 2.原因分析 1.查看本地电脑是否安装了ssh 步骤:Win+R,在弹出的窗口输入cm ...

  4. System学习笔记007---win10连接阿里云出现_远程连接提示要求的函数不受支持如何解决

    工具/原料 windows JAVA技术交流QQ群:170933152 windows专业或企业版 方法/步骤 远程连接时,突然无法正常连接,提示如下 win +R弹出运行窗口输入gpedit.msc ...

  5. 一篇教你xftp连接阿里云轻量级应用服务器。超级详细,避免踩坑

  6. 物联网基础:EC20 连接阿里云进行数据收发

    物联网产品框架:传统设备使用通信模组连接云服务器(即上云)做数据收发.本文将使用EC20 封装好的AT指令通过 MQTT 协议连接阿里云,简单的介绍下移远4G通信模块 EC20 是如何连接服务器进行数 ...

  7. 学习素材之USART篇——通过使用STM32与ESP8266(esp-01s)连接阿里云系列操作来了解USART协议和寄存器操作

    内容 通过使用STM32与ESP8266(esp-01s)连接阿里云系列操作来了解USART协议和寄存器操作 目录 USART详解 一.串口通讯协议简介 串口通讯的物理层 串口通讯的协议层 二.STM ...

  8. ESP32开发路程WIFI篇——极简连接WIFI,模拟设备连接阿里云,ESP32连接阿里云

    目录 极简连接WIFI 模拟设备连接阿里云 ESP32 连接阿里云 以下代码通过 Arduino 语言实现 极简连接WIFI #include <WiFi.h>// 这里添加要连的wifi ...

  9. 移远BC35-G配置网络连接阿里云MQTT发送数据

    移远BC35/BC26/BC28配置网络连接阿里云MQTT发送数据(一)精.防踩坑 硬件准备 接线部分 软件准备 烧录固件 QFlash 4.17烧录 阿里云准备 测试准备(AT指令) 连接阿里云 第 ...

最新文章

  1. python高级数据结构_Python高级数据结构(二)
  2. Visual Studio 2010生成SQL Server测试数据
  3. java 面试for循环_一个基础的for循环面试题
  4. websocket连接mysql_websocket 使用 spring 的service层 ,进而调用里面的 dao层 来操作数据库 ,包括redis、mysql等通用...
  5. DMAR(DMA remapping)与 IOMMU
  6. mysql的增量备份方法_mySQL 增量备份方案(转)
  7. Windows核心编程_Miniblin(5) 前后端交互数据
  8. html5如何将4张照片排列,如何将多张图片排列在一张图片呢?学会这两种技巧,轻松搞定...
  9. Windows下安装Redis图文教程
  10. 物联网行业的现状与思考
  11. 狄利克雷分布公式_Dirichlet Distribution(狄利克雷分布)与Dirichlet Process(狄利克雷过程)...
  12. 异地多活高可用架构设计实践与思考
  13. 大话西游之Office应用实例系列! 16
  14. Readiris Pro 17 for Mac(PDF和OCR图文识别软件)
  15. 【算法学习】求得一定数值范围内的所有质数
  16. .Header Manipulation漏洞
  17. AOP机制之环绕通知的见解
  18. 解决xxx by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the requested resource问题
  19. BI开发流程和ETL介绍
  20. 15.NAND FLASH驱动

热门文章

  1. 360文件粉碎机_电脑上的文件删除不了怎么办?电脑文件删除不了的解决办法
  2. 银河麒麟系统常见问题
  3. 怎么解决几何画板工具箱乱码
  4. sql 不使用引号、使用单引号或双引号的区别
  5. CAD平面图疑问答疑
  6. 计算机应用模块等级考试大纲,全国计算机信息高新技术考试办公软件应用模块高级操作员级考试考试大纲...
  7. oracle sql 季度的天数,sql 计算给定日期所在月与所在季度的天数的sql语句
  8. 2020年中国建筑信息模型(BIM)行业现状及竞争格局分析,未来将往6D方向发展「图」
  9. 基于商业地产的管理系统设计思路——空间管理(一)
  10. 《首先打破一切常规》读书心得