目录
主流程设计框架及某一功能框架编写
头文件: 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
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;};
contrlDevices.h框架
struct Devices{ char devicesName[128]; int status; //状态 int (*open)(); //打开 int (*close)(); //关闭 int (*devicesInit)(); //初始化 int (*readStatus)(); //读状态 int(*changeStatus)(int status); //改变状态 struct Devices* next;};
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 }};
四盏灯、火焰传感器及主程序代码(继电器输入控制)
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; }};
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; }};
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; }};
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; }};
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; }};
mainPro.c
#include #include #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;}
contrlDevices.h
#include #include 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)
添加声音识别模块的串口读取功能
voiceContrl.c
#include "InputCommand.h"#include #include #include #include #include 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; }}
InputCommand.h
#include "InputCommand.h"#include #include #include #include #include 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; }}
mainPro.c
#include #include #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;}
添加socket服务器功能
socketContrl.c
#include "InputCommand.h"#include #include #include #include #include #include #include #include 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; }}
InputCommand.h
#include #include 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);
mainPro.c
#include #include #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;}
主程序代码编写,实现语音和网络线程
socketContrl.c
#include "InputCommand.h"#include #include #include #include #include #include #include #include #include #include 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; }}
voiceContrl.c
#include "InputCommand.h"#include #include #include #include #include #include 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; }}
mainPro.c
#include #include #include "contrlDevices.h"#include "InputCommand.h"#include #include #include #include #include #include //全局变量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;}