概述
实际开发环境:
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, 42CMNET 42, 42 42, 42 42,0rn");//接入APN,无用户名和密码
USART2_Write(USART2,"AT+QICSGP=1,1, 42CMNET 42, 42 42, 42 42,0rn",strlen("AT+QICSGP=1,1, 42CMNET 42, 42 42, 42 42,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, 42TCP 42, 42183.230.40.39 42,6002,0,1rn",strlen("AT+QIOPEN=1,0, 42TCP 42, 42183.230.40.39 42,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协议连接,详细所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复