学习笔记:百问网 7天物联网智能家居实战训练营
TCP连接流程
1.复位 AT+RST
2.模式设置 AT+CWMODE_DEF=1
3.WIFI连接 AT+CWJAP_DEF=“ssid”, “password”
4.查看IP AT+CIFSR
5.创建TCP连接 AT+CIPMUX=1AT+CIPSERVER=1,9999
6.发送数据 AT+CIPSEND=0,32 {“data”:“doorbell” ,“status”:“1”}
7.接收数据 IPD,0,26:{“dev”:“Ied”,“status”:“0”}
调试
升级St-link
根据学习手册上将STM32F103_MINI开发板升级为ST-Link,之后我们可以直接用ST-Link下载程序。
开发板连上ST-Link后,就可以直接用keil软件Download下载程序。
配置CubeMX
直接用CubeMX生成代码时,开发板的调试引脚会被CubeMX默认设置为GPIO,需要修改;而如果直接用keil编写代码,上电后就默认为调试引脚。
代码实现
-
验证AT指令是否发送成功,成功后继续发送下一个指令。发送正确指令,WIFI模块的回复是OK,错误指令则回复是ERROR。
-
attend:有些指令要等一段时间才会回复OK,因此在发送函数中要定义一个超时时间。
-
在
WIFI
模块接收的AT指令,需要通过换行符来区分每条指令,所以我们必须在每个指令的后面添加\r\n。 -
综上所述,需要编写一个合适的发送函数来发送数据,包括但不限于验证否发送成功、超时控制、检测换行符。
-
为了用手机上的小程序进行通信,我们必须打印出WIFI模块的IP地址,因此需要编写一个用于获取IP地址的函数。
-
同时还需要一个函数用于发送UDP数据,发送的数据是JSON格式的,与AT指令不同。
-
最后还要一个函数用于接收数据,点亮或者点灭开发板上的LED灯。
对应下面的代码
// 1.启动串口2接收(中断方式)
USART2_StartRx();
// 2.串口2发送AT指令,启动TCP服务
//USART2_Transmit(tx_data, sizeof(tx_data), 500);
ESP8266_SendCommand("AT+RST", "OK", 500);
HAL_Delay(1000);
ESP8266_SendCommand("AT+CWMODE=1", "OK", 500);
ESP8266_SendCommand("AT+CWJAP=\"100ask\",\"100ask100ask\"", "OK", 5000);
ESP8266_SendCommand("AT+CIPMUX=1", "OK", 500);
ESP8266_SendCommand("AT+CIPSERVER=1,9999", "OK", 500);
ESP8266_SendCommand("AT+CIFSR", "OK", 500);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// 3.1 按键按下,发送门铃信号
if (Key_GetFlag() == 1)
{
ESP8266_Send_TCP("{\"data\":\"doorbell\",\"status\":\"1\"}");
}
// 3.2 收到数据,控制灯
if (USART2_Receive(rx_data)) //接收到数据
{
if (strstr((char *)rx_data, "\"dev\":\"led\",\"status\":\"0\""))
{
printf("led off\n\r");
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
USART2_ClearBuf();
memset(rx_data, 0, 200);
}
else if (strstr((char *)rx_data, "\"dev\":\"led\",\"status\":\"1\""))
{
printf("led on\n\r");
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
USART2_ClearBuf();
memset(rx_data, 0, 200);
}
}
}
程序框架
笔记参考:百问网 物联网智能家居 DAY6的学习