基于树莓派+STM32+OneNET云平台打造智能家居系统(四)OneNET云平台篇

4.1设备的注册
在进行OneNET平台开发者账号注册之后,进入开发者中心,进行项目应用以及设备的新建、添加数据流等操作。
基于树莓派+STM32+OneNET云平台打造智能家居系统(四)OneNET云平台篇_第1张图片

4.2应用的编辑
使用OneNET云平台所配备的应用编辑器功能,可以自定义的生成开发者所需要的应用。
基于树莓派+STM32+OneNET云平台打造智能家居系统(四)OneNET云平台篇_第2张图片

4.3触发器的使用
触发器功能同时也是该平台所赋予的功能,实现当数据超过阈值时,发出邮件提醒用户。
基于树莓派+STM32+OneNET云平台打造智能家居系统(四)OneNET云平台篇_第3张图片

4.4 与OneNET云平台交互控制程序(部分)

//==========================================================
//	函数名称:	ESP8266_GetIPD
//
//	函数功能:	获取平台返回的数据
//
//	入口参数:	等待的时间(乘以10ms)
//
//	返回参数:	平台返回的原始数据
//
//	说明:		不同网络设备返回的格式不同,需要去调试
//				如ESP8266的返回格式为	"+IPD,x:yyy"	x代表数据长度,yyy是数据内容
//==========================================================
unsigned char *ESP8266_GetIPD(unsigned short timeOut)
{
	char *ptrIPD = NULL;
	do
	{
		if(ESP8266_WaitRecive() == REV_OK)								//如果接收完成
		{
			ptrIPD = strstr((char *)esp8266_buf, "IPD,");				//搜索“IPD”头
			if(ptrIPD == NULL)											//如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
			{
				//UsartPrintf(USART_DEBUG, "\"IPD\" not found\r\n");
			}
			else
			{
				ptrIPD = strchr(ptrIPD, ':');							//找到':'
				if(ptrIPD != NULL)
				{
					ptrIPD++;
					return (unsigned char *)(ptrIPD);
				}
				else
					return NULL;	
			}
		}
		DelayXms(5);													//延时等待
	} while(timeOut--);
	return NULL;														//超时还未找到,返回空指针
}
//==========================================================
//	函数名称:	OneNet_RevPro
//
//	函数功能:	平台返回数据检测
//
//	入口参数:	dataPtr:平台返回的数据
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void OneNet_RevPro(unsigned char *cmd)
{
	EDP_PACKET_STRUCTURE edpPacket = {NULL, 0, 0, 0};	//协议包
	char *cmdid_devid = NULL;
	unsigned short cmdid_len = 0;
	char *req = NULL;
	unsigned int req_len = 0;
	unsigned char type = 0;
	short result = 0;
	char *dataPtr = NULL;
	char numBuf[10];
	int num = 0;
	type = EDP_UnPacketRecv(cmd);
	switch(type)							//判断是pushdata还是命令下发
	{
		case CMDREQ:									//解命令包
	    result = EDP_UnPacketCmd(cmd, &cmdid_devid, &cmdid_len, &req, &req_len);
			if(result == 0)					//解包成功,则进行命令回复的组包
			{
				EDP_PacketCmdResp(cmdid_devid, cmdid_len, req, req_len, &edpPacket);
				UsartPrintf(USART_DEBUG, "cmdid: %s, req: %s, req_len: %d\r\n", cmdid_devid, req, req_len);
			}
			
		break;	
		case SAVEACK:
		if(cmd[3] == MSG_ID_HIGH && cmd[4] == MSG_ID_LOW)
		{
UsartPrintf(USART_DEBUG, "Tips:	Send %s\r\n", cmd[5] ? "Err" : "Ok");
		}
			else
	UsartPrintf(USART_DEBUG, "Tips:	Message ID Err\r\n");
	break;
			
    default:
		result = -1;
		break;
	}
	
	ESP8266_Clear();									//清空缓存
	if(result == -1)
		return;
	dataPtr = strchr(req, ':');							//搜索':'
	if(dataPtr != NULL)									//如果找到了
	{
	dataPtr++;
	while(*dataPtr >= '0' && *dataPtr <= '9')//判断是否是下发的命令控制数据
		{
			numBuf[num++] = *dataPtr++;
		}
		num = atoi((const char *)numBuf);				//转为数值形式
		if(strstr((char *)req, "button"))				//搜索"button"
		{
			if(num == 1)						//控制数据如果为1,代表开
			{
				relay_on();
			}
			else if(num == 0)					//控制数据如果为0,代表关
			{
				relay_off();
			}
		}

	}
	
	if(type == CMDREQ && result == 0)			//如果是命令包 且 解包成功
	{
		EDP_FreeBuffer(cmdid_devid);						//释放内存
		EDP_FreeBuffer(req);
															//回复命令
		ESP8266_SendData(edpPacket._data, edpPacket._len);	//上传平台
		EDP_DeleteBuffer(&edpPacket);						//删包
	}

}

在此感谢OneNET云平台所给与的强大的开发平台。

你可能感兴趣的:(linux开发与学习相关,从零开始的嵌入式开发生涯,#,玩转树莓派)