上篇实现了单片机控制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

烧录

能看到已经发过来了


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

我要赚赏金
