智能家居(工厂模式)

该博客介绍了智能家居控制系统的框架设计,包括设备控制结构、输入命令处理和特定功能如灯光控制、火焰传感器及语音识别模块。通过创建设备链表和输入命令结构,实现了对不同设备的控制,并通过串口读取声音指令。进一步添加了socket服务器功能,以实现网络通信。最终,通过多线程分别处理语音和网络数据,构建了一个集成了语音和网络控制的智能家居系统。
摘要由CSDN通过智能技术生成

摘自:智能家居
作者:LEO-max
发布时间: 2021-03-05 00:38:07
网址:https://blog.csdn.net/zouchengzhi1021/article/details/114375529?spm=1001.2014.3001.5502

目录

主流程设计框架及某一功能框架编写

头文件:
	contrlDevices.h
	InputCommand.h
源文件:
	mainPro.c
	bathroomLight.c
	Camera.c
	fire.c
	livingroomLight.c
	lock.c
	restaurantLight.c
	socketContrl.c
	upstairLight.c
	usartContrl.c
	voiceContrl.c

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
InputCommand.h框架
struct InputCommander
{
	char commandName[128];	//名字
	char command[32];		//指令
	int (*Init)(char* name, char* ipAddress, char* port);	//操作函数
	int (*getCommand)(char* cmd);	//获得数据

	char log[1024];
	
	struct InputCommander* next;
};

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
contrlDevices.h框架
struct Devices
{
	char devicesName[128];
	int status;				//状态

	int (*open)();			//打开
	int (*close)();			//关闭
	int (*devicesInit)();	//初始化
	
	int (*readStatus)();	//读状态
	int(*changeStatus)(int status);		//改变状态

	struct Devices* next;
};

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
bathroomLight.c框架
#include "contrlDevices.h"

int bathroomLightOpen()
{
	
}

int bathroomLightClose()
{

}

int bathroomLightCloseInit()
{

}

int bathroomLightCloseStatus(int status)
{

}

struct Devices bathroomLight
{
	.name = "bathLight",
	.open = bathroomLightOpen,
	.close = bathroomLightClose,
	.deviceInit = bathroomLightCloseInit,
	.changeStatus = bathroomLightCloseStatus
};

struct Devices* addBathroomLightToDeviceLink(struct Devices* phead)
{
	if (phead == NULL) {
		return &bathroomLight;
	}
	else {
		bathroomLight.next = phead;	//	头插法
		phead = &bathroomLight
	}
};

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

四盏灯、火焰传感器及主程序代码(继电器输入控制)

bathroomLight.c
#include "contrlDevices.h"

int bathroomLightOpen(int pinNum)	//打开
{
	digitalWrite(pinNum, LOW);	//低电平开启
}

int bathroomLightClose(int pinNum)	//关闭
{
	digitalWrite(pinNum, HIGH);	//高电平关闭
}

int bathroomLightCloseInit(int pinNum)	//初始化
{
	pinMode(pinNum, OUTPUT);
	digitalWrite(pinNum, HIGH);
}

int bathroomLightCloseStatus(int status)	//保存
{

}

struct Devices bathroomLight =
{
	.devicesName = "bathLight",
	.pinNum = 22,
	.open = bathroomLightOpen,
	.close = bathroomLightClose,
	.deviceInit = bathroomLightCloseInit,
	.changeStatus = bathroomLightCloseStatus
};

struct Devices* addBathroomLightToDeviceLink(struct Devices* phead)
{
	if (phead == NULL) {
		return &bathroomLight;
	}
	else {
		bathroomLight.next = phead;	//	头插法
		phead = &bathroomLight;
	}
};

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
upstairLight.c
#include "contrlDevices.h"

int upstairsLightOpen(int pinNum)	//打开
{
	digitalWrite(pinNum, LOW);	//低电平开启
}

int upstairsLightClose(int pinNum)	//关闭
{
	digitalWrite(pinNum, HIGH);	//高电平关闭
}

int upstairsLightCloseInit(int pinNum)	//初始化
{
	pinMode(pinNum, OUTPUT);
	digitalWrite(pinNum, HIGH);
}

int upstairsLightCloseStatus(int status)	//保存
{

}

struct Devices upstairsLight =
{
	.devicesName = "upstairsLight",
	.pinNum = 21,
	.open = upstairsLightOpen,
	.close = upstairsLightClose,
	.deviceInit = upstairsLightCloseInit,
	.changeStatus = upstairsLightCloseStatus
};

struct Devices* addUpstairsLightToDeviceLink(struct Devices* phead)
{
	if (phead == NULL) {
		return &upstairsLight;
	}
	else {
		upstairsLight.next = phead;	//	头插法
		phead = &upstairsLight;
	}
};

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
livingroomLight.c
#include "contrlDevices.h"

int livingroomLightOpen(int pinNum)	//打开
{
	digitalWrite(pinNum, LOW);	//低电平开启
}

int livingroomLightClose(int pinNum)	//关闭
{
	digitalWrite(pinNum, HIGH);	//高电平关闭
}

int livingroomLightCloseInit(int pinNum)	//初始化
{
	pinMode(pinNum, OUTPUT);
	digitalWrite(pinNum, HIGH);
}

int livingroomLightCloseStatus(int status)	//保存
{

}

struct Devices livingroomLight =
{
	.devicesName = "livingroomLight",
	.pinNum = 23,
	.open = livingroomLightOpen,
	.close = livingroomLightClose,
	.deviceInit = livingroomLightCloseInit,
	.changeStatus = livingroomLightCloseStatus
};

struct Devices* addLivingroomLightToDeviceLink(struct Devices* phead)
{
	if (phead == NULL) {
		return &livingroomLight;
	}
	else {
		livingroomLight.next = phead;	//	头插法
		phead = &livingroomLight;
	}
};

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
restaurantLight.c
#include "contrlDevices.h"

int livingroomLightOpen(int pinNum)	//打开
{
	digitalWrite(pinNum, LOW);	//低电平开启
}

int livingroomLightClose(int pinNum)	//关闭
{
	digitalWrite(pinNum, HIGH);	//高电平关闭
}

int livingroomLightCloseInit(int pinNum)	//初始化
{
	pinMode(pinNum, OUTPUT);
	digitalWrite(pinNum, HIGH);
}

int livingroomLightCloseStatus(int status)	//保存
{

}

struct Devices livingroomLight =
{
	.devicesName = "livingroomLight",
	.pinNum = 23,
	.open = livingroomLightOpen,
	.close = livingroomLightClose,
	.deviceInit = livingroomLightCloseInit,
	.changeStatus = livingroomLightCloseStatus
};

struct Devices* addLivingroomLightToDeviceLink(struct Devices* phead)
{
	if (phead == NULL) {
		return &livingroomLight;
	}
	else {
		livingroomLight.next = phead;	//	头插法
		phead = &livingroomLight;
	}
};

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
fire.c
#include "contrlDevices.h"


int fireStatusRead(int pinNum)
{
	return digitalWrite(pinNum, HIGH);
}

int fireInit(int pinNum)	//初始化
{
	pinMode(pinNum, INPUT);
	digitalWrite(pinNum, HIGH);
}


struct Devices fire =
{
	.devicesName = "fire",
	.pinNum = 25,
	.deviceInit = fireInit,
	.readStatus = fireStatusRead
};

struct Devices* addFireToDeviceLink(struct Devices* phead)
{
	if (phead == NULL) {
		return &fire;
	}
	else {
		fire.next = phead;	//	头插法
		phead = &fire;
	}
};

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
mainPro.c
#include <stdio.h>
#include <string.h>
#include "contrlDevices.h"

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

int main()
{
	//char* name = "bathroomLight";
	char name[128];
	struct Devices* tmp = NULL;

	if (wiringPiSetup() == -1) {
		return -1;
	}
	struct Devices* pdeviceHead = NULL;
	pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);
	pdeviceHead = addUpstairsLightToDeviceLink(pdeviceHead);
	pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);
	pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);
	pdeviceHead = addFireToDeviceLink(pdeviceHead)

	//struct Devices* tmp = findDeviceByName(name, pdeviceHead);
	while(1){
		printf("Inupt:\n");
		scanf("%s", name);
		tmp = findDeviceByName(name, pdeviceHead);

		if (tmp != NULL) {
			tmp->deviceInit(tmp->pinNum);
			tmp->open(tmp->pinNum);
	}

	// 1.指令工厂初始化
	
	// 2.设备控制工厂初始化

	// 3.线程池建立
	// 3.1 语音线程
	// 3.2 socket线程
	// 3.3 摄像头线程
	// 3.4 火灾线程
	
	return 0;
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
contrlDevices.h
#include <wiringPi.h>
#include <stdlib.h>

struct Devices
{
	char devicesName[128];
	int status;				//状态
	int pinNum;

	int (*open)(int pinNum);			//打开
	int (*close)(int pinNum);			//关闭
	int (*deviceInit)(int pinNum);	//初始化
	
	int (*readStatus)();	//读状态
	int(*changeStatus)(int status);		//改变状态

	struct Devices* next;
};

struct Devices* addRestaurantLightToDeviceLink(struct Devices* phead);
struct Devices* addLivingroomLightToDeviceLink(struct Devices* phead);
struct Devices* addBathroomLightToDeviceLink(struct Devices* phead);
struct Devices* addUpstairsLightToDeviceLink(struct Devices* phead);
struct Devices* addFireToDeviceLink(struct Devices* phead)


 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

添加声音识别模块的串口读取功能

voiceContrl.c
#include "InputCommand.h"
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int voiceInit(struct InputCommander *voicer, char* ipAddress, char* port)
{
	int fd;

	if ((fd = serialOpen(voicer->deviceName, 9600)) == -1) {	//初始化串口,波特率9600
		exit(-1);
	}
	voicer->fd = fd;
	return fd;
}

int voiceGetCommand(struct InputCommander* voicer)
{
	int nread = 0;
	nread = read(voicer->fd, voicer->command, sizeof(voicer->command));
	if (nread == 0) {
		printf("usart for voice read over time\n");
	}
	else {
		return nread;
	}
}

struct InputCommander voiceContrl = 
{
	.commandName = "voice",
	.deviceName = "/dev/ttyAMAO",
	.command = {'\0'},
	.Init = voiceInit,
	.getCommand = voiceGetCommand,
	.log = {'\0'},
	.next = NULL
};

struct InputCommander* addVoiceContrlToCommandLink(struct InputCommander* phead)
{
	if (phead == NULL) {
		return &voiceContrl;
	}
	else {
		voiceContrl.next = phead;	//	头插法
		phead = &voiceContrl;
	}
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
InputCommand.h
#include "InputCommand.h"
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int voiceInit(struct InputCommander *voicer, char* ipAddress, char* port)
{
	int fd;

	if ((fd = serialOpen(voicer->deviceName, 9600)) == -1) {	//初始化串口,波特率9600
		exit(-1);
	}
	voicer->fd = fd;
	return fd;
}

int voiceGetCommand(struct InputCommander* voicer)
{
	int nread = 0;
	nread = read(voicer->fd, voicer->command, sizeof(voicer->command));
	if (nread == 0) {
		printf("usart for voice read over time\n");
	}
	else {
		return nread;
	}
}

struct InputCommander voiceContrl = 
{
	.commandName = "voice",
	.deviceName = "/dev/ttyAMAO",
	.command = {'\0'},
	.Init = voiceInit,
	.getCommand = voiceGetCommand,
	.log = {'\0'},
	.next = NULL
};

struct InputCommander* addVoiceContrlToCommandLink(struct InputCommander* phead)
{
	if (phead == NULL) {
		return &voiceContrl;
	}
	else {
		voiceContrl.next = phead;	//	头插法
		phead = &voiceContrl;
	}
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
mainPro.c
#include <stdio.h>
#include <string.h>
#include "contrlDevices.h"
#include "InputCommand.h"

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

int main()
{
	//char* name = "bathroomLight";
	char name[128];
	struct Devices* tmp = NULL;

	if (wiringPiSetup() == -1) {
		return -1;
	}
	struct Devices* pdeviceHead = NULL;
	struct InputCommander* pcommandHead = NULL;
	pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);
	pdeviceHead = addUpstairsLightToDeviceLink(pdeviceHead);
	pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);
	pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);
	pdeviceHead = addFireToDeviceLink(pdeviceHead);
	pcommandHead = addVoiceContrlToCommandLink(pcommandHead);

	//struct Devices* tmp = findDeviceByName(name, pdeviceHead);
	while(1){
		printf("Inupt:\n");
		scanf("%s", name);
		tmp = findDeviceByName(name, pdeviceHead);

		if (tmp != NULL) {
			tmp->deviceInit(tmp->pinNum);
			tmp->open(tmp->pinNum);
	}

	// 1.指令工厂初始化
	
	// 2.设备控制工厂初始化

	// 3.线程池建立
	// 3.1 语音线程
	// 3.2 socket线程
	// 3.3 摄像头线程
	// 3.4 火灾线程
	
	return 0;
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

添加socket服务器功能

socketContrl.c
#include "InputCommand.h"
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>

int socketInit(struct InputCommander* socketMes, char* ipAddress, char* port)
{
	int s_fd;
	int c_fd;

	struct sockaddr_in s_addr;
	/*struct sockaddr_in c_addr;*/

	//做初始化
	memset(&s_addr, 0, sizeof(struct sockaddr_in));
	/*memset(&c_addr, 0, sizeof(struct sockaddr_in));*/

	// socket
	s_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (s_fd == -1) {
		perror("socket");
		exit(-1);
	}

	s_addr.sin_family = AF_INET;
	s_addr.sin_port = htons(atoi(socketMes->port));
	inet_aton(socketMes->ipAddress, &s_addr.sin_addr);

	// bind
	bind(s_fd, (struct sockaddr*) & s_addr, sizeof(struct sockaddr_in));

	//listen
	listen(s_fd, 10);
	socketMes->sfd = s_fd;
	return s_fd;
}

int socketGetCommand(struct InputCommander* socketMes)
{
	int c_fd;
	int n_read;
	struct sockaddr_in c_addr;
	memset(&c_addr, 0, sizeof(struct sockaddr_in));
	int clen = sizeof(struct sockaddr_in);
	c_fd = accept(socketMes->sfd, (struct sockaddr*) & c_addr, &clen);

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

	return n_read;
}

struct InputCommander socketContrl =
{
	.commandName = "socketServer",
	.command = {'\0'},
	.port = "8088",
	.ipAddress = "192.168.4.126",
	.Init = socketInit,
	.getCommand = socketGetCommand,
	.log = {'\0'},
	.next = NULL
};

struct InputCommander* addSocketContrlToCommandLink(struct InputCommander* phead)
{
	if (phead == NULL) {
		return &socketContrl;
	}
	else {
		socketContrl.next = phead;	//	头插法
		phead = &socketContrl;
	}
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
InputCommand.h
#include <wiringPi.h>
#include <stdlib.h>

struct InputCommander
{
	char commandName[128];	//名字
	char deviceName[128];
	char command[32];		//指令
	int (*Init)(struct InputCommander* voicer, char* ipAddress, char* port);	//操作函数
	int (*getCommand)(struct InputCommander* voicer);	//获得数据
	char log[1024];
	int fd;
	char  port[12];
	char ipAddress[32];
	int sfd;
	struct InputCommander* next;
};

struct InputCommander* addVoiceContrlToCommandLink(struct InputCommander* phead);
struct InputCommander* addSocketContrlToCommandLink(struct InputCommander* phead);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
mainPro.c
#include <stdio.h>
#include <string.h>
#include "contrlDevices.h"
#include "InputCommand.h"

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

int main()
{
	//char* name = "bathroomLight";
	char name[128];
	struct Devices* tmp = NULL;

	if (wiringPiSetup() == -1) {
		return -1;
	}
	struct Devices* pdeviceHead = NULL;
	struct InputCommander* pcommandHead = NULL;
	pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);
	pdeviceHead = addUpstairsLightToDeviceLink(pdeviceHead);
	pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);
	pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);
	pdeviceHead = addFireToDeviceLink(pdeviceHead);
	pcommandHead = addVoiceContrlToCommandLink(pcommandHead);
	pcommandHead = addSocketContrlToCommandLink(pcommandHead);

	//struct Devices* tmp = findDeviceByName(name, pdeviceHead);
	while(1){
		printf("Inupt:\n");
		scanf("%s", name);
		tmp = findDeviceByName(name, pdeviceHead);

		if (tmp != NULL) {
			tmp->deviceInit(tmp->pinNum);
			tmp->open(tmp->pinNum);
	}

	// 1.指令工厂初始化
	
	// 2.设备控制工厂初始化

	// 3.线程池建立
	// 3.1 语音线程
	// 3.2 socket线程
	// 3.3 摄像头线程
	// 3.4 火灾线程
	
	return 0;
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

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

socketContrl.c
#include "InputCommand.h"
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int socketInit(struct InputCommander* socketMes, char* ipAddress, char* port)
{
	int s_fd;
	int c_fd;

	struct sockaddr_in s_addr;
	/*struct sockaddr_in c_addr;*/

	//做初始化
	memset(&s_addr, 0, sizeof(struct sockaddr_in));
	/*memset(&c_addr, 0, sizeof(struct sockaddr_in));*/

	// socket
	s_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (s_fd == -1) {
		perror("socket");
		exit(-1);
	}

	s_addr.sin_family = AF_INET;
	s_addr.sin_port = htons(atoi(socketMes->port));
	inet_aton(socketMes->ipAddress, &s_addr.sin_addr);

	// bind
	bind(s_fd, (struct sockaddr*) & s_addr, sizeof(struct sockaddr_in));

	//listen
	listen(s_fd, 10);
	printf("socket Server listening\n");
	socketMes->sfd = s_fd;
	return s_fd;
}

int socketGetCommand(struct InputCommander* socketMes)
{
	int c_fd;
	int n_read=0;
	struct sockaddr_in c_addr;
	memset(&c_addr, 0, sizeof(struct sockaddr_in));
	int clen = sizeof(struct sockaddr_in);
	c_fd = accept(socketMes->sfd, (struct sockaddr*) & c_addr, &clen);

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

	return n_read;
}

struct InputCommander socketContrl =
{
	.commandName = "socketServer",
	.command = {'\0'},
	.port = "8088",
	.ipAddress = "192.168.4.126",
	.Init = socketInit,
	.getCommand = socketGetCommand,
	.log = {'\0'},
	.next = NULL
};

struct InputCommander* addSocketContrlToCommandLink(struct InputCommander* phead)
{
	if (phead == NULL) {
		return &socketContrl;
	}
	else {
		socketContrl.next = phead;	//	头插法
		phead = &socketContrl;
	}
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
voiceContrl.c
#include "InputCommand.h"
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int voiceInit(struct InputCommander* voicer, char* ipAddress, char* port)
{
	int fd;

	if ((fd = serialOpen(voicer->deviceName, 9600)) == -1) {	//初始化串口,波特率9600
		exit(-1);
	}
	voicer->fd = fd;
	return fd;
}

int voiceGetCommand(struct InputCommander* voicer)
{
	int nread = 0;

	memset(voicer->command, '\0',sizeof(voicer->command));
	nread = read(voicer->fd, voicer->command, sizeof(voicer->command));
	if (nread == 0) {
		printf("voice no datas\n");
	}
	else {
		return nread;
	}
	

}

struct InputCommander voiceContrl = 
{
	.commandName = "voice",
	.deviceName = "/dev/ttyAMAO",
	.command = {'\0'},
	.Init = voiceInit,
	.getCommand = voiceGetCommand,
	.log = {'\0'},
	.next = NULL
};

struct InputCommander* addVoiceContrlToCommandLink(struct InputCommander* phead)
{
	if (phead == NULL) {
		return &voiceContrl;
	}
	else {
		voiceContrl.next = phead;	//	头插法
		phead = &voiceContrl;
	}
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
mainPro.c
#include <stdio.h>
#include <string.h>
#include "contrlDevices.h"
#include "InputCommand.h"
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.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(tmp->devicesName, name) == 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(tmp->commandName, name) == 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");
		pthread_exit(NULL);
		//return NULL;
	}
	else {
		if (voiceHandler->Init(voiceHandler,NULL,NULL) < 0) {
			printf("voice init error\n");
			pthread_exit(NULL);
			//return NULL;
		}
		else {
			printf("%s init success\n", voiceHandler->commandName);
		}
		while (1) {
			nread = voiceHandler->getCommand(voiceHandler);
			if (nread == 0) {
				printf("nodata from voice\n");
			}
			else {
				printf("do divece contrl:%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");

	}

	return n_read;
}

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);

	
	//int nread;

	socketHandler = findCommandByName("socketServer", pdeviceHead);

	if (socketHandler == NULL) {
		printf("find socketHandler error");
		pthread_exit(NULL);
		//return 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()
{
	//char* name = "bathroomLight";
	char name[128];
	struct Devices* tmp = NULL;

	pthread_t* voiceThread;
	pthread_t* socketThread;

	if (wiringPiSetup() == -1) {
		return -1;
	}

	// 1.指令工厂初始化
	
	pcommandHead = addVoiceContrlToCommandLink(pcommandHead);
	pcommandHead = addSocketContrlToCommandLink(pcommandHead);

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

	//struct Devices* tmp = findDeviceByName(name, pdeviceHead);
	/*
	while (1) {
		printf("Inupt:\n");
		scanf("%s", name);
		tmp = findDeviceByName(name, pdeviceHead);

		if (tmp != NULL) {
			tmp->deviceInit(tmp->pinNum);
			tmp->open(tmp->pinNum);
		}
	}*/

	//不退出,等待线程
	pthread_join(voiceThread,NULL);
	pthread_join(socketThread, NULL);

	
	return 0;
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值