智能家居项目(十)

主程序代码初步编写,实现语音和网络线程

1.mainPro.c代码的编写:

主函数:

int main()
{
	pthread_t voiceThread;
	pthread_t socketThread;
	
	if(wiringPiSetup() == -1){
    	return -1;
	}

	//1.指令工厂初始化
	pCommandHead = addvoiceControlToInputCommanderLink(pCommandHead);
	pCommandHead = addsocketControlToInputCommanderLink(pCommandHead);

	//2.设备控制工厂初始化
	pDeviceHead = addBathroomLightToDeviceLink(pDeviceHead);
	pDeviceHead = addUpstairLightToDeviceLink(pDeviceHead);
	pDeviceHead = addLivingroomLightToDeviceLink(pDeviceHead);
	pDeviceHead = addRestaurantLightToDeviceLink(pDeviceHead);
	pDeviceHead = addfireAlarmToDeviceLink(pDeviceHead);
	
	//3.线程池建立
	// 3.1语音线程
	pthread_create(&voiceThread, NULL, voice_thread, NULL);
	// 3.2socket线程
	pthread_create(&socketThread, NULL, socket_thread, NULL);
	// 3.3摄像头线程

	// 3.4火灾线程


	pthread_join(voiceThread,NULL);
	pthread_join(socketThread,NULL);

	return 0;
}

2.找指令和找设备的函数

struct InputCommander* findCommandByName(char *name,struct InputCommander *phead)
{
	struct InputCommander *tmp = phead;
	if (phead == NULL){
		return NULL;
	}else{
		while (tmp != NULL){
			if(strcmp(name,tmp->commandName) == 0){
				return tmp;
			}
			tmp = tmp->next;
		}
		return NULL;
	}
}

struct InputCommander* findCommandByName(char *name,struct InputCommander *phead)
{
	struct InputCommander *tmp = phead;
	if (phead == NULL){
		return NULL;
	}else{
		while (tmp != NULL){
			if(strcmp(name,tmp->commandName) == 0){
				return tmp;
			}
			tmp = tmp->next;
		}
		return NULL;
	}
}

3.voice线程

void* voice_thread(void* datas)
{
	struct InputCommander *voiceHandler;
	int nread;
	
	voiceHandler = findCommandByName("voice",pCommandHead);
	if(voiceHandler == NULL){
		printf("find voiceHandler error!\n");
		pthread_exit(0);
	}else{
		if(voiceHandler->Init(voiceHandler,NULL,NULL) < 0){
			printf("voice init error!\n");
			pthread_exit(0);
		}else{
			printf("%s init success\n",voiceHandler->commandName);
		}
		while(1){
			nread = voiceHandler->getCommand(voiceHandler);
			if(nread == 0){
				printf("no data from voice!\n");
			}else{
				printf("do device control : %s\n",voiceHandler->command);
			}
		}
	}
}

4.socket线程以及读线程

void* read_thread(void* datas)
{	
	int n_read;

	memset(socketHandler->command,'\0',sizeof(socketHandler->command));
	n_read = read(c_fd,socketHandler->command,sizeof(socketHandler->command));
	if(n_read == -1){
		perror("read");
	}else if(n_read > 0){
		printf("get:%d,%s\n",n_read,socketHandler->command);
	}else{
		printf("client quit.\n");
	}

}

void* socket_thread(void* datas)
{
	int clen;
	pthread_t readThread;
	struct sockaddr_in c_addr;
	memset(&c_addr,0,sizeof(struct sockaddr_in));
	clen = sizeof(struct sockaddr_in);

	socketHandler = findCommandByName("socketServer",pCommandHead);
	if(socketHandler == NULL){
		printf("find socketHandler error!\n");
		pthread_exit(0);
	}else{
		printf("%s init success\n",socketHandler->commandName);
	}
	socketHandler->Init(socketHandler,NULL,NULL);
	while(1){
		c_fd = accept(socketHandler->sfd,(struct sockaddr *)&c_addr,&clen);
		pthread_create(&readThread, NULL, read_thread, NULL);
	}
}

5.mainPro.c全部的代码示例:

#include <pthread.h>
#include "controlDevices.h"
#include "inputCommand.h"

struct InputCommander    *pCommandHead   =  NULL;
struct Devices 		     *pDeviceHead   =  NULL;

struct InputCommander	 *socketHandler  =  NULL;
int c_fd;

struct Devices* findDeviceByName(char *name,struct Devices *phead)
{
	struct Devices *tmp = phead;
	if (phead == NULL){
		return NULL;
	}else{
		while (tmp != NULL){
			if(strcmp(name,tmp->deviceName) == 0){
				return tmp;
			}
			tmp = tmp->next;
		}
		return NULL;
	}
}

struct InputCommander* findCommandByName(char *name,struct InputCommander *phead)
{
	struct InputCommander *tmp = phead;
	if (phead == NULL){
		return NULL;
	}else{
		while (tmp != NULL){
			if(strcmp(name,tmp->commandName) == 0){
				return tmp;
			}
			tmp = tmp->next;
		}
		return NULL;
	}
}

void* voice_thread(void* datas)
{
	struct InputCommander *voiceHandler;
	int nread;
	
	voiceHandler = findCommandByName("voice",pCommandHead);
	if(voiceHandler == NULL){
		printf("find voiceHandler error!\n");
		pthread_exit(NULL);
	}else{
		if(voiceHandler->Init(voiceHandler,NULL,NULL) < 0){
			printf("voice init error!\n");
			pthread_exit(NULL);
		}else{
			printf("%s init success\n",voiceHandler->commandName);
		}
		while(1){
			nread = voiceHandler->getCommand(voiceHandler);
			if(nread == 0){
				printf("no data from voice!\n");
			}else{
				printf("do device control : %s\n",voiceHandler->command);
			}
		}
	}
}

void* read_thread(void* datas)
{	
	int n_read;
	memset(socketHandler->command,'\0',sizeof(socketHandler->command));
	n_read = read(c_fd,socketHandler->command,sizeof(socketHandler->command));
	if(n_read == -1){
		perror("read");
	}else if(n_read > 0){
		printf("\nget:%d,%s\n",n_read,socketHandler->command);
	}else{
		printf("client quit.\n");
	}

}

void* socket_thread(void* datas)
{
	int n_read = 0;
	pthread_t readThread;
	struct sockaddr_in c_addr;
	memset(&c_addr,0,sizeof(struct sockaddr_in));
	int clen = sizeof(struct sockaddr_in);

	socketHandler = findCommandByName("socketServer",pCommandHead);
	if(socketHandler == NULL){
		printf("find socketHandler error!\n");
		pthread_exit(NULL);
	}else{
		printf("%s init success\n",socketHandler->commandName);
	}
	socketHandler->Init(socketHandler,NULL,NULL);
	while(1){
		c_fd = accept(socketHandler->sfd,(struct sockaddr *)&c_addr,&clen);
		pthread_create(&readThread, NULL, read_thread, NULL);
	}
}

int main()
{
	pthread_t voiceThread;
	pthread_t socketThread;
	
	if(wiringPiSetup() == -1){
    	return -1;
	}

	//1.指令工厂初始化
	pCommandHead = addvoiceControlToInputCommanderLink(pCommandHead);
	pCommandHead = addsocketControlToInputCommanderLink(pCommandHead);

	//2.设备控制工厂初始化
	pDeviceHead = addBathroomLightToDeviceLink(pDeviceHead);
	pDeviceHead = addUpstairLightToDeviceLink(pDeviceHead);
	pDeviceHead = addLivingroomLightToDeviceLink(pDeviceHead);
	pDeviceHead = addRestaurantLightToDeviceLink(pDeviceHead);
	pDeviceHead = addfireAlarmToDeviceLink(pDeviceHead);
	
	//3.线程池建立
	// 3.1语音线程
	pthread_create(&voiceThread, NULL, voice_thread, NULL);
	// 3.2socket线程
	pthread_create(&socketThread, NULL, socket_thread, NULL);
	// 3.3摄像头线程

	// 3.4火灾线程


	pthread_join(voiceThread,NULL);
	pthread_join(socketThread,NULL);

	return 0;
}


6.清空socketControl.c中socketGetCommand函数的代码,因为已经在mainPro.c中实现

7.主程序编译运行,测试网络功能
这里编译完了之后./a.out一直没有输出,运行的时候加一个sudo就可以了!!!
在这里插入图片描述
借助网络调试助手,看看socket是否可用
在这里插入图片描述
每次发送之后需要断开连接,然后重新连接再发送

在这里插入图片描述

上一篇:智能家居项目(九)
下一篇:智能家居项目(十一)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 智能家居系统一般可以使用不同的协议进行通信,而485协议和KNX是其中两种常见的选择。 485协议是一种串行通信协议,可实现设备之间的数据传输。它具有较长的传输距离,可达到1200米,适用于大型智能家居系统。485协议的特点是传输速率较低,但通信稳定可靠,并且成本相对较低。它能够连接多个设备,如传感器、控制器、触摸面板等,并实现设备之间的数据交换。 KNX(欧洲家庭电子系统标准)是一种开放的通信协议,旨在实现可互操作的智能家居系统。KNX系统可以集成多个不同的子系统,如照明、安全、暖通空调等,实现统一的管理和控制。KNX协议支持多种传输介质,如485、IP等,从而满足不同规模和需求的智能家居项目。KNX还具有灵活的扩展性和高度的互操作性,但相对而言,其成本较高。 选择使用485协议还是KNX协议取决于智能家居项目的具体需求和预算情况。如果是较小规模的家庭智能化系统,并且预算有限,485协议可能是更适合的选择。而如果需要一个更复杂、更灵活且高度互操作的智能家居系统,并且预算可以接受,那么KNX协议可能更适合。因此,在选择协议之前,我们需要明确智能家居项目的规模、功能需求以及项目预算等因素,并根据这些因素做出相应的选择。 ### 回答2: 智能家居系统通常可以使用多种协议来实现设备之间的连接与控制,其中包括485协议和KNX协议。 485协议是一种串行通信协议,通过一对差分信号线进行数据传输,具有较低的成本和可靠性,能够支持相对较短距离的数据传输,适合于小型智能家居系统。采用485协议的智能家居系统可以实现设备之间的互联和远程控制功能,例如开关控制、传感器数据采集等。然而,485协议的通信速率较低,一般只能达到数kbps,不适合大规模、复杂的智能家居系统。 相比之下,KNX协议是一种面向建筑自动化的通信协议,它基于总线结构,可以支持多种设备之间的通信与集成。KNX协议提供了更高的通信速率和更强的互操作性,可以实现更复杂、规模更大的智能家居系统。KNX协议具有良好的扩展性,适合于包括照明、安防、温控、窗帘控制等多种功能的智能家居系统。KNX协议的优点在于其开放性和标准化,它可以与各个厂商的设备进行兼容,便于系统的集成和升级。 综上所述,选择使用485协议还是KNX协议需要根据具体的智能家居系统要求来决定。如果系统规模较小且功能较简单,485协议是一个经济实用的选择。而如果系统规模较大、功能较复杂且需要与设备的互操作性较高,KNX协议则更为适合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeniusAng丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值