主程序代码初步编写,实现语音和网络线程
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是否可用
每次发送之后需要断开连接,然后重新连接再发送
上一篇:智能家居项目(九)
下一篇:智能家居项目(十一)