这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 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 跳转至

回复

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