这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» STM32» STM32G070RB探测14-云服务器发送数据至ESP01S控制点灯

共3条 1/1 1 跳转至

STM32G070RB探测14-云服务器发送数据至ESP01S控制点灯

高工
2021-01-04 22:34:15 打赏
上篇实现了单片机控制8266连接wifi并发送数据到服务器,等于是已经摸到物联网的脚后跟了,今天我简单实现服务器下发指令,控制单片机开关灯,等于我们抱到了物联网的大腿.依然不用点点点,但我们分析一下云服务器下发指令时,8266会通过串口发送给单片机什么,然后我们根据这个内容,来接收数据,并判断数据,从而开关灯.

来,偷偷瞄一眼数据手册

当我们单链接的时候会如下图

分析一下子,首先有个固定的 +IPD, 然后有一个数据长度 即 3 然后是冒号: 后边的666则为发过来的数据

嚯,一下子就清晰了起来

弄个结构体

typedef struct { int16_t len; //网络数据长度 uint8_t *IPD_buff;//平台下发的数据 }IPD;

写个解析函数

/* 服务器下发解析函数 返回值为结构体 ipd_rx.len 非下发数据返回:0 解析失败返回:-1 正确解析返回:数据长度 */ IPD ESP8266_GetIPD(void) { IPD ipd; uint8_t i; char *ptrIPD = NULL; ipd.len = 0; ptrIPD = strstr((char *)usart1_rx.rx_buff, "+IPD,");//搜索“IPD”头 if(ptrIPD == NULL)//没找到直接退出 { ipd.len = 0; return ipd; } else { ptrIPD = strchr(ptrIPD, ',');//找到',' ptrIPD++; for(i=0;i<10;i++)//获取数据长度 { if((ptrIPD[i]>='0')&&(ptrIPD[i]<='9')) { ipd.len = ipd.len*10+(ptrIPD[i]-'0'); } else break; } ptrIPD = strchr(ptrIPD, ':');//找到':' if(ptrIPD != NULL) { ptrIPD++; ipd.IPD_buff = (uint8_t *)(ptrIPD); return ipd; } else { ipd.len = -1; return ipd; } } }

while(1)里添加判断函数

if(usart1_rx.flag)//接收到数据 { ipd_rx = ESP8266_GetIPD();//解析数据 if(ipd_rx.len>0)//判断是否为网络下发数据 { if(strstr((char *)ipd_rx.IPD_buff, "LED_ON"))//数据中有匹配"LED_ON" { printf("LED已打开\r\n"); HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET); } else if(strstr((char *)ipd_rx.IPD_buff, "LED_OFF"))//数据中有匹配"LED_OFF" { printf("LED已关闭\r\n"); HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET); } } Clear_Usart(&usart1_rx);//清空缓存 }
效果图下

当然我们也可以用手机控制 首先查一查手机的局域网ip

打开服务器

修改单片机所链接的服务器ip

烧录

能看到已经发过来了

发送也正常,今天就搞到这吧



专家
2021-01-05 08:12:28 打赏
2楼

效率帝


工程师
2021-01-06 23:41:36 打赏
3楼

感谢分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]