微信公众号 | electronic造物实验室
阿里云物联网平台
新建设备
- 注册阿里云账号并搜索物联网服务。选择并进入物联网平台产品页。
- 点击管理控制台,进入物联网平台管理界面。
- 选择公共实例(如果尚未开通,需要先进行开通,具体步骤不再赘述),然后点击进入。
- 创建一个新的产品。填写产品名称、所属品类等必要信息,并完成产品创建步骤。
- 在创建完成的产品页面上,添加设备。输入设备名称并确认。
- 输入设备名称,输入完成后点击确认;
至此,阿里云物联网平台创建设备完成,接下来获取MQTT连接参数。
获取AT参数
创建设备成功后进入设备详情页,查看MQTT连接参数,并进行保存。
通过上述步骤,你可以获取到阿里云物联网平台上设备的MQTT连接参数,并进行保存。这些参数将用于在ESP-01S / ESP8266上配置AT指令,实现设备与物联网平台之间的通信。
AT指令介绍
AT命令,用来控制TE(TerminalEquipment)和MT(Mobile Terminal)之间交互的规则。AT指令可以参考乐鑫官方提供的AT 命令集。
连接阿里云AT指令介绍
- AT+RST 复位ESP-01S / ESP8266模块;
- AT+CWMODE=3 设置ESP模块为Station+SoftAP模式;
- AT+CWJAP=“SSID”,“PWD” 设置ESP模块连接无线网络 *注意双引号为英文;
- AT+MQTTUSERCFG=0,1,“NULL”,“username”,“password”,0,0,“” 设置 MQTT 用户属性;
- AT+MQTTCLIENTID=0,“clientId” 设置MQTT 的clientId参数;
- AT+MQTTCONN=0,“host”,1883,1 连接 MQTT Broker;
- AT+MQTTCLEAN 断开MQTT连接。
以上为连接阿里云MQTT服务器需要的配置命令,接下来在阿里云新建设备,获取AT指令需要填充的参数。
MQTT固件
ESP-01S 1M Flash固件下载1MB AT MQTT
ESP8266 4M Flash固件下载4MB AT MQTT
固件下载
硬件连接
USB转TTL推荐使用带有独立LDO的模块,因为ESP8266EX通讯时电流较大,如无独立LDO可能导致ESP8266EX掉电重启。
可以使用下图模块,带独立LDO,可以提供一定带负载能力;
下图模块不推荐使用,无独立LDO,3V3为CH340提供,带负载能力弱。
ESP-01烧录固件
VCC -----> TTL 3.3V
GND -----> TTL GND
TXD -----> TTL RXD
RXD-----> TTL TXD
EN-------> TTL 3.3V
RST ----> TTL RST
GPIO0 ---> GND
GPIO2 ---> 3.3V (不接也可以)
基本接法如下图所示:
ESP-01S烧录固件
VCC -----> TTL 3.3V
GND -----> TTL GND
TXD -----> TTL RXD
RXD-----> TTL TXD
RST ----> TTL RST
GPIO0 ---> GND
固件烧录
下载AT指令固件到本地后,需要使用乐鑫提供的flash_download_tool
工具。下载后直接解压即用,运行烧录工具。乐鑫官网 - 支持 - 相关下载 - 工具-Flash 下载工具
选择型号,选择ESP8266
打开烧录软件, 从"…“选择要烧录的bin文件: ESP8266-AT_MQTT-1M.bin;填写烧录地址"0x0000”;SPI MODE选择 “DOUT”;FLASH SIZE选择 “8Mbit”;"DoNotChgBin"不变;“COM” 选择你USBtoTTL的COM口;波特率默认即可。
上述配置完成后, 点击START开始烧录, 若一直停在等待上电同步可以就将RST连接GND再断开, 就可以开始下载了。
串口助手调试
在进行串口助手调试之前,需要进行正确的硬件连接。
硬件连接
对于ESP-01,需要使用两个上拉电阻将EN和RST引脚上拉到3.3V,如下图所示:
对于ESP-01S,只需要连接3.3V、RXD、TXD和GND即可。
测试指令
在串口软件中打开COM口,选择波特率115200,加回车换行;发送AT指令,并等待接收到回复的"OK"。
接下来将MQTT信息填充进AT命令中进行连接测试。
- AT+RST 复位ESP-01S / ESP8266模块;
- AT+CWMODE=3 设置ESP模块为Station+SoftAP模式;
- AT+CWJAP=“SSID”,“PWD” 设置ESP模块连接无线网络 *注意双引号为英文;
- AT+MQTTUSERCFG=0,1,“NULL”,“username”,“passwd”,0,0,“” 设置 MQTT 用户属性;
- AT+MQTTCLIENTID=0,“clientId” 设置MQTT 的clientId参数;
- AT+MQTTCONN=0,“host”,1883,1 连接 MQTT Broker;
- AT+MQTTCLEAN 断开MQTT连接。
AT+MQTTUSERCFG中的username和passwd与下图对应填写,AT+MQTTCLIENTID中的clientId也与下图对应,AT+MQTTCONN的host与下图mqttHostUrl对应。
需要注意AT+MQTTCLIENTID指令中的clientId中的逗号前需要加’ \ '符号进行转义,假设clientId为“a1Tt5hwk2af.Device1|securemode=2,signmethod=hmacsha256,timestamp=1685260171273|”,那么发送的AT指令应为AT+MQTTCLIENTID=0,“723712|securemode=2,signmethod=hmacsha256,timestamp=1685260171273|”
发送完以上指令后,在阿里云物联网平台中刷新设备网页,你将会看到设备已成功上线的信息。
[18:24:44.609]发→◇AT
□
[18:24:44.613]收←◆AT
OK
[18:30:14.787]发→◇ATE0
□
[18:30:14.791]收←◆ATE0
OK
[18:30:31.339]发→◇AT+CWMODE=3
□
[18:30:31.344]收←◆
OK
[18:31:21.198]发→◇AT+CWJAP="Xiaxxxx81","dsssxx1"
□
[18:31:22.397]收←◆WIFI CONNECTED
[18:31:23.908]收←◆WIFI GOT IP
OK
[19:24:10.517]发→◇AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
□
[19:24:10.530]收←◆
OK
[19:24:53.745]发→◇AT+MQTTUSERCFG=0,1,"NULL","Devixx1&a1Ttxxxaf","05314xxxxxxxxxxxxxxxxxxxxxxc5de74",0,0,""
□
[19:24:53.755]收←◆
OK
[19:25:09.562]发→◇AT+MQTTCLIENTID=0,"a1xxxxf.Device1|securemode=2\,signmethod=hmacsha256\,timestamp=1685260171273|"
□
[19:25:09.571]收←◆
OK
[19:25:21.162]发→◇AT+MQTTCONN=0,"a1xxxxxaf.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
□
[19:25:21.347]收←◆+MQTTCONNECTED:0,1,"a1Tt5wtm2af.iot-as-mqtt.cn-shanghai.aliyuncs.com","1883","",1
OK
可以看到设备已成功上线。
AT_Command移植
AT_Command由魔罗大佬开发,是一款管理AT命令通信交互组件, 适用于Modem、WIFI模块、蓝牙等使用AT命令或者ASCII命令行通信的场景。本次AT连接使用AT_Command移植到STM32F103C8T6进行运行。AT_Command Gitee链接
本次的项目环境为HAL库+CubeMx进行配置开发。
- 首先需要定义适配器,完成驱动接口及缓冲区设置
在wifi_uart.c文件中,进行了串口发送和接收回调的实现。
/\*
\* @brief 向串口发送缓冲区内写入数据并启动发送
\* @param[in] buf - 数据缓存
\* @param[in] len - 数据长度
\* @return 实际写入长度(如果此时缓冲区满,则返回len)
\*/
unsigned int wifi\_uart\_write(const void \*buf, unsigned int len)
{
unsigned int ret;
ret = ring\_buf\_put(&rbsend, (unsigned char \*)buf, len);
HAL\_UART\_Transmit(&wifi_uart,(unsigned char \*)buf,len,0xffff); // wifi串口数据发送
return ret;
}
/\*
\* @brief WIFI串口接收
\* @param[in] none
\* @return none
\*/
void WIFI\_UART\_RxCpltCallback(unsigned char \*data, uint8\_t len)
{
ring\_buf\_put(&rbrecv, data, len); /\*将数据放入接收缓冲区\*/
}
串口数据接收使用串口2(TX为PA2, RX为PA3)的是DMA+空闲中断的方式进行接收,在stm32f1xx_it.c
文件中:
/\*\*
\* @brief This function handles USART2 global interrupt.
\*/
void USART2\_IRQHandler(void)
{
/\* USER CODE BEGIN USART2\_IRQn 0 \*/
/\* USER CODE END USART2\_IRQn 0 \*/
HAL\_UART\_IRQHandler(&huart2);
/\* USER CODE BEGIN USART2\_IRQn 1 \*/
if(\_\_HAL\_UART\_GET\_FLAG(&huart2, UART_FLAG_IDLE) != RESET) // 空闲中断
{
\_\_HAL\_UART\_CLEAR\_IDLEFLAG(&huart2); // 清除空闲中断标志位
HAL\_UART\_DMAStop(&huart2); // 停止DMA接收
if( wifiConnectFlag == 0) // 未完成配置
WIFI\_UART\_RxCpltCallback(uart2_rx_buf, strlen(uart2_rx_buf)); // 数据处理函数
else // 配置完成 等待设备连接
wifi\_connnect\_calback(uart2_rx_buf, strlen(uart2_rx_buf));
memset(uart2_rx_buf, 0, strlen(uart2_rx_buf)); // 清除数据
HAL\_UART\_Receive\_DMA(&huart2, uart2_rx_buf, buf_size); // 重新打开DMA接收
}
/\* USER CODE END USART2\_IRQn 1 \*/
}
- 使用AT适配器创建AT通信对象,在
wifi.c
文件中:
static at_obj_t at;static at_obj_t at;
/*
* @brief wifi初始化 配置8266
*/
void wifi_init(void)
{
static char wifi_msg[128] = {0};
// WIFI 串口初始化
wifi_uart_init(115200);
at_obj_init(&at, &at_adapter);
// 关闭回显
at_send_singlline(&at, NULL, "ATE0"); // OK
// AT测试
at_send_singlline(&at, NULL, "AT"); // OK ERROR *
// 配置工作模式 AP模式
at_send_singlline(&at, NULL, "AT+CWMODE=3");
// 创建路由器
sprintf(wifi_msg, "AT+CWJAP=\"%s\",\"%s\"", SSID, PWD);
at_send_singlline(&at, NULL, wifi_msg);
// 设定域名
at_send_singlline(&at, NULL, "AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"");
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/8a3f05eecfdd2fa0ef7613d4cf0bebb2.png)
![img](https://img-blog.csdnimg.cn/img_convert/cb5d7df8e5e37cdda727a5ee2642bddf.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/052e21407be634ac1ed1c36b176260d8.png)
![img](https://img-blog.csdnimg.cn/img_convert/958a8c0409e3589d06360fc8db6d539d.png)
![img](https://img-blog.csdnimg.cn/img_convert/759b26ac6c41f5a887afe25b33f37a18.png)
![img](https://img-blog.csdnimg.cn/img_convert/caeb1eb552a9749e44d24a4f5f55c58b.png)
![](https://img-blog.csdnimg.cn/img_convert/0e81af25ed64c2d47045ad29c5d57e78.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
中...(img-9GzJ9cIX-1715606833387)]
[外链图片转存中...(img-1vHYXjWh-1715606833388)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!