四、使用串口助手发送AT指令连接物联网平台
AT
//返回 OKAT+RST
//复位AT+RESTORE
//恢复出厂设置AT+CWMODE=1
//设置模式,可连接wifi热点AT+CWJAP="WIFI名字","WIFI密码"
//连接热点
例如:AT+CWJAP="qjl","11111111"
★坑3:wifi名字必须为英文!!频率为2.4G!如果是苹果手机,在个人热点处打开–最大兼容性。
AT+CWJAP?
//检测是否连接上热点AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
//连接阿里云的网站- //配置MQTT
(1)设置用户名、密码
使用指令:AT+MQTTUSERCFG=0,1,"NULL",“下图的用户名",“下图的密码”,0,0,""
例如:AT+MQTTUSERCFG=0,1,"NULL","LED1&a1n2p8YJOux","2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b",0,0,""
(2) 设置clientld
使用指令:AT+MQTTCLIENTID=0,"下图的clientld"
例如:AT+MQTTCLIENTID=0,"a1n2p8YJOux.LED1|securemode=2\,signmethod=hmacsha256\,timestamp=1709691140893|"
★坑4:下图的clientld复制完成后,要在“”里面的逗号前加上‘\’ 。如上述例子中一样!!
- //设置好信息后,连接MQTT。
使用指令:AT+MQTTCONN=0,"下图的mqttHostUrl",1883,1
例如:AT+MQTTCONN=0,"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
★坑5:总显示连接失败。
解决:看一下之前的手机热点是不是长时间没连接给自动关闭了,我当时就是这个地方出问题,所以才一直显示ERROR。
//连接成功后,发现物联网平台设备在线。
- 使用相应的Topic进行通信。
(1)订阅内容。
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
七、代码部分(完整工程代码私聊):
- usart.c
#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;
}
- usart.h
#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
- wifi.c
#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)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!