赞
踩
AT
//返回 OKAT+RST
//复位AT+RESTORE
//恢复出厂设置AT+CWMODE=1
//设置模式,可连接wifi热点AT+CWJAP="WIFI名字","WIFI密码"
//连接热点AT+CWJAP="qjl","11111111"
AT+CWJAP?
//检测是否连接上热点AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
//连接阿里云的网站AT+MQTTUSERCFG=0,1,"NULL",“下图的用户名",“下图的密码”,0,0,""
AT+MQTTUSERCFG=0,1,"NULL","LED1&a1n2p8YJOux","2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b",0,0,""
AT+MQTTCLIENTID=0,"下图的clientld"
AT+MQTTCLIENTID=0,"a1n2p8YJOux.LED1|securemode=2\,signmethod=hmacsha256\,timestamp=1709691140893|"
AT+MQTTCONN=0,"下图的mqttHostUrl",1883,1
AT+MQTTCONN=0,"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
解决:看一下之前的手机热点是不是长时间没连接给自动关闭了,我当时就是这个地方出问题,所以才一直显示ERROR。
//连接成功后,发现物联网平台设备在线。
AT+MQTTSUB=0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",1
(2)发布内容,更改物联网平台数据,使用相应的Topic以及需要修改数据的参数名称。
AT+MQTTPUB=0,"/sys/a1n2p8YJOux/LED1/thing/event/property/post","{\"params\":{\"learningTime\":33}}",0,0
#include "usart1.h" #include "delay.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "stm32f10x.h" #include "wifi.h" #include "beep.h" u32 UART1_read_count = 0; //接收数据的个数 char ResultBuff[2] = {0}; //返回结果存放数组 #define MAX\_STRING\_LENGTH 250 char \*p; // 在全局范围定义一个数组来存储接收到的字符串 char receivedString[MAX_STRING_LENGTH]; static void NVIC\_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /\* 嵌套向量中断控制器组选择 \*/ NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2); /\* 配置USART为中断源 \*/ NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ; /\* 抢断优先级\*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /\* 子优先级 \*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /\* 使能中断 \*/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /\* 初始化配置NVIC \*/ NVIC\_Init(&NVIC_InitStructure); } void USART\_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 打开串口GPIO的时钟 DEBUG\_USART\_GPIO\_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE); // 打开串口外设的时钟 DEBUG\_USART\_APBxClkCmd(DEBUG_USART_CLK, ENABLE); // 将USART Tx的GPIO配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO\_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure); // 将USART Rx的GPIO配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO\_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure); // 配置串口的工作参数 // 配置波特率 USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE; // 配置 针数据字长 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 配置停止位 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(DEBUG_USARTx, &USART_InitStructure); // 串口中断优先级配置 NVIC\_Configuration(); // 使能串口接收中断 USART\_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); // 使能串口 USART\_Cmd(DEBUG_USARTx, ENABLE); } //空闲中断 void USART1\_IRQHandler(void)//串口中断服务函数 { u8 rxd = 0;//接收缓存 if (USART\_GetITStatus(USART1, USART_IT_RXNE) == SET) { USART\_ClearITPendingBit(USART1, USART_IT_RXNE); rxd = USART\_ReceiveData(USART1); Recive\_Data(rxd); } } /\* 1.功能:将阿里云下发的数据 存到 字符串数组中。 2.接收数据格式例子: +MQTTSUBRECV:0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",159,{"method":"thing.service.property.set","id":"1891523621","params":{"brightness":77,"learningTime":78,"powerstate":1,"AlarmFrequencyLevel":2},"version":"1.0.0"} 3.因为下发的数据格式第一个字符为'+',所以以'+'为开始接收标志的头。 \*/ void Recive\_Data(u8 rxd) { static u8 Start_recive = 0;//开始接收标志 static u8 stringIndex = 0; if(rxd=='+') //如果接收到 '+' { memset(receivedString,0,400); //清空接收数组 stringIndex=0; //字符串索引号,从0开始接收 Start_recive=1; //开始接收标志 } if(Start_recive == 1) { receivedString[stringIndex++] = rxd; if(stringIndex == MAX_STRING_LENGTH) { stringIndex=0; Start_recive=0; } } } /\* 1.功能:输入模块名称,返回该模块的值。用于读取阿里云平台模块的值。 2.订阅消息后接收的数据格式如下,用于理解代码: +MQTTSUBRECV:0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",159,{"method":"thing.service.property.set","id":"1891523621","params":{"brightness":77,"learningTime":78,"powerstate":1,"AlarmFrequencyLevel":2},"version":"1.0.0"} 3.如果输入模块名称不存在,则返回-1。 \*/ int Get\_Module\_Val(char \*Module_name) { int Module_Val=-1; if( (p=strstr(receivedString,Module_name) )!=NULL ) //判断receivedString中是否包含模块名。执行完此行代码后,指针p指向模块名的第一个字符!!! { p=p+strlen(Module_name)+strlen("\":"); //将指针后移至第一位值的位置。具体需要后移多少位到该位置,请分析开头注释2中数据格式。 Module_Val= \*p -'0'; //解析出该值。 while( (\*(p+1)-'0') >=0 && (\*(p+1)-'0')<=9 ) //用于判断模块的值,是一位数,还是两位数,还是更多位。直到不为0~9的值为止。 { Module_Val=Module_Val\*10+(\*(p+1)-'0'); //计算模块的值。 p++; //后移指针。 } } return Module_Val; } /\* 发送字符串,用于发送AT指令 \*/ void SendChar(char \*buff){ unsigned char i=0; while(buff[i]!='\0'){ while(USART\_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //等待接收完成标志 USART\_SendData(USART1,buff[i]); USART\_ClearFlag(USART1,USART_FLAG_TC); //清除完成标志 i++; } } //---------------------------------------------下面没用用到/ 备用---------------------- /\* 串口1发送一个字节 \*/ void usart1\_send\_byte(u8 data) { while(!(USART\_GetFlagStatus(USART1,USART_FLAG_TC)==SET)); //获取发送完成标志位 USART\_SendData(USART1,data); //传输数据 } /\* 串口1接收一个字节 \*/ char usart1\_read\_byte(void) { while(!(USART\_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)); //获取发送完成标志位 return USART\_ReceiveData(USART1); //返回数据 } /\* 发送命令字符串,参数:命令、预期返回结果 \*/ bool USRT\_Send\_ATCmd(char \*cmd,char \*result) { unsigned char i = 0; unsigned char ret = 0; while(1) { USART1\_Clear\_Buf(); SendChar(cmd); delay\_ms(100); if(NULL != strstr(ResultBuff,result)) { ret = SUCCESS; break; } else if(i++ >=10) { ret = ERROR; break; } } return ret; } /\* 清空数组 \*/ void USART1\_Clear\_Buf(void) { memset(ResultBuff, 0, strlen(ResultBuff)); UART1_read_count = 0; }
#ifndef \_\_USART1\_H #define \_\_USART1\_H #include "stm32f10x.h" #include "stdio.h" #define DEBUG\_USART1 1 #if DEBUG\_USART1 // 串口1-USART1 #define DEBUG\_USARTx USART1 #define DEBUG\_USART\_CLK RCC\_APB2Periph\_USART1 #define DEBUG\_USART\_APBxClkCmd RCC\_APB2PeriphClockCmd #define DEBUG\_USART\_BAUDRATE 115200 // USART GPIO 引脚宏定义 #define DEBUG\_USART\_GPIO\_CLK (RCC\_APB2Periph\_GPIOA) #define DEBUG\_USART\_GPIO\_APBxClkCmd RCC\_APB2PeriphClockCmd #define DEBUG\_USART\_TX\_GPIO\_PORT GPIOA #define DEBUG\_USART\_TX\_GPIO\_PIN GPIO\_Pin\_9 #define DEBUG\_USART\_RX\_GPIO\_PORT GPIOA #define DEBUG\_USART\_RX\_GPIO\_PIN GPIO\_Pin\_10 #define DEBUG\_USART\_IRQ USART1\_IRQn #define DEBUG\_USART\_IRQHandler USART1\_IRQHandler #endif void Recive\_Data(u8 rxd); //接收数据,将字符串数据存到数组中。 int Get\_Module\_Val(char \*Module_name); //获得模块的值 void USART\_Config(void); static void NVIC\_Configuration(void); char usart1\_read\_byte(void); //读取字节 void SendChar(char \*buff); //发送字符串 void usart1\_send\_byte(u8 data); //发送字节 void USART1\_Clear\_Buf(void); //清除buff #endif
#include "wifi.h" #include "usart1.h" //需要修改的内容: 在物联网平台查看MQTT参数 #define Device\_name "LED1" //设备名称 #define ProductKey "a1n2p8YJOux" //产品密钥 #define User\_Password "2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b" //用户密码 #define ClientId "a1n2p8YJOux.LED1|securemode=2\\,signmethod=hmacsha256\\,timestamp=1709691140893|" #define MqttHostUrl "a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com" //MQTT代理地址 #define Wifi\_Account "JL" //手机热点的账号 一定要是2.4Ghz频段 #define Wifi\_Password "88888888" //手机热点的密码 //不需要修改的内容: #define User\_Name ""Device\_name"&"ProductKey"" //用户账号 #define Publish\_TOPIC "/sys/"ProductKey"/"Device\_name"/thing/event/property/post" //发布Topic #define Subscribe\_TOPIC "/sys/"ProductKey"/"Device\_name"/thing/service/property/set" //订阅Topic /\* ESP8266连接阿里云的AT指令--连接方法一: (可用) void Esp8266\_ALiyun\_Init() //初始化wifi连接 { USRT\_Send\_ATCmd("AT\r\n","OK"); //测试 USRT\_Send\_ATCmd("AT+RST\r\n","OK"); //重启 // USRT\_Send\_ATCmd("AT+RESTORE\r\n","OK"); //回复出厂设置 USRT\_Send\_ATCmd("AT+CWMODE=1\r\n","OK"); //使用wifi USRT\_Send\_ATCmd("AT+CWJAP=\"JL\",\"88888888\"\r\n","WIFI CONNECTED"); //连接热点 USRT\_Send\_ATCmd("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"\r\n","OK"); //连接阿里云 USRT\_Send\_ATCmd("AT+MQTTUSERCFG=0,1,\"NULL\",\"LED1&a1n2p8YJOux\",\"2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b\",0,0,\"\"\r\n","OK");//设置MQTT的信息 USRT\_Send\_ATCmd("AT+MQTTCLIENTID=0,\"a1n2p8YJOux.LED1|securemode=2\\,signmethod=hmacsha256\\,timestamp=1709691140893|\"\r\n","OK"); //设置MQTT的信息 USRT\_Send\_ATCmd("AT+MQTTCONN=0,\"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,1\r\n","OK");//开始连接阿里云的MQTT } \*/ //ESP8266连接阿里云的AT指令---连接方法二: void Esp8266\_ALiyun\_Init() ## 最后 **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。** **深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。** **因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。** ![img](https://img-blog.csdnimg.cn/img_convert/5dab60ba274fafdb1e97baf522486c54.png) ![img](https://img-blog.csdnimg.cn/img_convert/07c3db3561bc6e7d4aeb45052f7421e3.jpeg) ![img](https://img-blog.csdnimg.cn/img_convert/192ef50b0428e9d5479e0b38e28da4b7.png) ![img](https://img-blog.csdnimg.cn/img_convert/451713bd9a74df0fb15cfbbb1433892d.png) ![img](https://img-blog.csdnimg.cn/img_convert/6536c4cfeb8fc7eeefd3b7de8d3a6c24.png) ![img](https://img-blog.csdnimg.cn/img_convert/2b87fe262328684054c5c21271dd01ca.png) ![](https://img-blog.csdnimg.cn/img_convert/790db0657bbf20f03f1e5a7efdf962bf.png) **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!** [**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289) **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!! 18866906)] [外链图片转存中...(img-lWYjG6K2-1715718866907)] [外链图片转存中...(img-rP5AVqz8-1715718866907)] [外链图片转存中...(img-4k0r1be1-1715718866908)] [外链图片转存中...(img-Hj32RUAu-1715718866908)] **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!** [**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289) **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。