基于树莓派/香橙派的智能家居项目(2、3 补充部分)

文章介绍了一个智能家居系统中用于控制灯光的函数,包括开启和关闭不同房间的灯光。此外,还讨论了如何通过链表管理输入设备,如添加设备节点和查找设备节点的功能。同时,提供了一个简单的客户端程序示例,用于测试socket连接。

前言:该部分是补充部分,主要是对于第二部分(输入部分)代码的相似处理的解释。其中相似的代码主要是灯光控制函数、添加设备节点函数、设备节点的查找函数。


灯光控制函数:


void voicLitCrl(char *strCommand)
{
	int str_status;
	
	struct controlDev* str_Dev = NULL;

	if(strcmp("get",strCommand) == 0){
		printf("Xiao Ai Ready\n");
	}
	else
	{
		if(strcmp("KYSD", strCommand) == 0){
			if((str_Dev = findDevName("showerRomLitght", pheadDev)) == NULL) return;
			str_Dev->open(str_Dev->pinNum);
			str_Dev->status = LOW;
			printf("ShowerRoom Light is opening\n");
		}

		if(strcmp("KWSD",strCommand) == 0){
			if((str_Dev = findDevName("bedRomLight", pheadDev)) == NULL) return;
			str_Dev->open(str_Dev->pinNum);
			str_Dev->status = LOW;
			printf("BedRoom Light is opening\n");
		}

		if(strcmp("KCTD",strCommand) == 0){
			if((str_Dev = findDevName("kitchenLight", pheadDev)) == NULL) return;
			str_Dev->open(str_Dev->pinNum);
			str_Dev->status = LOW;
			printf("KitchenRoom Light is opening\n");
		}

		if(strcmp("KELD",strCommand) == 0){
			if((str_Dev = findDevName("upstairLight", pheadDev)) == NULL) return;
			str_Dev->open(str_Dev->pinNum);
			str_Dev->status = LOW;
			printf("UpstairRoom Light is opening\n");
		}

		if(strcmp("GYSD",strCommand) == 0){
			if((str_Dev = findDevName("showerRomLitght", pheadDev)) == NULL) return;
			str_Dev->close(str_Dev->pinNum);
			str_Dev->status = HIGH;
			printf("ShowerRoom Light is closeing\n");
		}

		if(strcmp("GWSD",strCommand) == 0){
			if((str_Dev = findDevName("bedRomLight", pheadDev)) == NULL) return;
			str_Dev->close(str_Dev->pinNum);
			str_Dev->status = HIGH;			
			printf("BedRoom Light is closeing\n");
		}

		if(strcmp("GCTD",strCommand) == 0){
			if((str_Dev = findDevName("kitchenLight", pheadDev)) == NULL) return;
			str_Dev->close(str_Dev->pinNum);
			str_Dev->status = HIGH;			
			printf("KitchenRoom Light is closeing\n");
		}

		if(strcmp("GELD",strCommand) == 0){
			if((str_Dev = findDevName("upstairLight", pheadDev)) == NULL) return;
			str_Dev->close(str_Dev->pinNum);
			str_Dev->status = HIGH;			
			printf("UpstairRoom Light is closeing\n");
		}
	}
}

在语音模块处,我设置识别成功返回的字符串是:KYSD\n,识别成功后,找到相应的控制设备节点进行控制即可。


添加设备节点函数:

struct InputCommander* addVoiceInLink(struct InputCommander* phead)
{
	if(phead == NULL){
		phead = &voiceCol;
	}else{
		voiceCol.next = phead;
		phead = &voiceCol;
	}
	return phead; 
}

对于输入设备的管理采用链表的形式,链表的操作无非就是增删改查,上述代码是对于链表的创建,若链表是空的,现需要加入的结构体作为链表头;否则,插入至链表头前,作为新的链表头返回。


有添加,当然就需要用到查找,当相应的线程需要用到相对应的输入设备成员的结构体时,通过comName进行查找即可,代码如下:


struct InputCommander* findInputName(char *inputName, struct InputCommander* pheadInput)
{
	struct InputCommander* str = pheadInput;
	if(pheadInput == NULL){
		printf("%s :NULL\n", inputName);
	}else{
		while(str != NULL){
			if(strcmp(str->comName,inputName) == 0){
				return str;
			}
			str = str->next;
		}
	}
	return NULL;
}

对于参数传入需要传入需要查找的设备节点名:例如语音模块的.comName    = "voice",我需要传入voice,以及遍历所在链表来找到它。


补充:为了测试socket,补充一个 client.c 客户端程序:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>


/*Usage: ./file_name [ipAddr] [port]*/

int main(int argc, char **argv)
{
	if (argc != 3)
		printf("example: %s [ipAddr] [port]\n", argv[0]);
		exit(-1);

	int c_fd;
	int ret;	
	int size = sizeof(struct sockaddr_in);
	char msg[32] = {'\0'};

	
	struct sockaddr_in c_addr;	
	memset(&c_addr, 0, size);

	if((c_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		perror("socket\n");
		exit(-1);
	
	printf("1\n");
	c_addr.sin_family = AF_INET;
	c_addr.sin_port =htons(atoi(argv[2]));
	inet_aton(argv[1], &c_addr.sin_addr);

	if(connect(c_fd, (struct sockaddr *)&c_addr, size) == -1){
		perror("connect\n");
		exit(-1);
	}

	printf("connect...\n");

	while(1)
	{
		memset(msg, 0, sizeof(msg));
		gets(msg);
		write(c_fd, msg, sizeof(msg));
		fflush(stdout);
		sleep(1);
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值