本项目主要采用了简单工厂模式的设计方式,通过链表将各个模块连接起来,当要使用某个模块时,只需要使用链表遍历,找到所需模块去调用,各模块功能稳定性,拓展性更强,提高了整个项目系统代码的稳定性和拓展性。项目主要分为设备工厂和指令工厂,实现网络和语音控制家电。
项目主要功能:
1、通过手机端网络调试助手,语音识别,对单独房间灯光、一、二楼灯光,全部灯光进行综合智能远程控制。
2、通过火焰报警、视频监控等功能保证家庭的安全。(可加入震动报警、烟雾报警,红外感应人体提示、原理都大同小异)
3、通过433M无线射频在无网络情况下对部分家电进行控制。(时间原因,本次只对游泳池进行控制)
4、通过翔云平台提供的人脸对比识别服务,实现人脸识别功能,可用于人脸识别开锁功能。
硬件部分:包含主控芯片树莓派3B,SU-03T离线语音模块,时光公寓模型,继电器组,继电器,433M无线射频模块,蜂鸣器,树莓派摄像头,电源,LED灯,火焰传感器,电源。
整体效果

火灾测试

无线射频控制测试

流程图:

程序构建(建议用source insight写完传输上树莓派)

主程序mainPro.c
#include
#include "contrlDevices.h"
#include "inputCommand.h"
#include
#include
#include
#include
#include
#include
#include
#include
//433M引脚定义
#define D0 4
#define D1 5int c_fd;
struct Devices *pdeviceHead = NULL;
struct InputCommander *pCommandHead = NULL;
struct Devices *deviceTmp;
struct InputCommander *commandTmp;struct InputCommander *socketHandler;
//寻找设备工厂设备
struct Devices *findDeviceByName(char *name,struct Devices *phead)
{struct Devices *tmp = phead;//定义结构体指针指向设备工厂链表头//运用指针需要多加空值判断,避免段错误if(phead == NULL){return NULL;}else{while(tmp != NULL){//遍历设备工厂if(strcmp(tmp->deviceName,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\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);printf("do divece contrl:0x%s\n",voiceHandler->command);if(nread == 0){printf("nodata from voice\n");}else if(strstr(voiceHandler->command,"P") != NULL){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开浴室灯}else if(strstr(voiceHandler->command,"Q") != NULL){deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开客厅灯}else if(strstr(voiceHandler->command,"R") != NULL){deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开卧室灯}else if(strstr(voiceHandler->command,"S") != NULL){deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开餐厅灯}else if(strstr(voiceHandler->command,"T") != NULL){deviceTmp=findDeviceByName("poolLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开泳池灯}else if(strstr(voiceHandler->command,"U") != NULL){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开全部灯deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);deviceTmp=findDeviceByName("poolLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);}else if(strstr(voiceHandler->command,"V") != NULL){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关全部灯deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);deviceTmp=findDeviceByName("poolLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);}else if(strstr(voiceHandler->command,"W") != NULL){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开二楼灯deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);}else if(strstr(voiceHandler->command,"X") != NULL){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关二楼灯deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);}else if(strstr(voiceHandler->command,"Y") != NULL){deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开一楼灯deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);}else if(strstr(voiceHandler->command,"`") != NULL){deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关一楼灯deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);}}}
}
//网络控制线程
void *read_thread(void * datas)
{int n_read;//struct InputCommander *socketHandler=NULL;//清空命令接收区,方便下次检测memset(socketHandler->command, '\0', sizeof(socketHandler->command));n_read=read(c_fd,socketHandler->command,sizeof(socketHandler->command));printf("nget: %d,%s\n",n_read,socketHandler->command); if(n_read == -1){perror("read"); }else if(strcmp(socketHandler->command,"bath") == 0){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开浴室灯}else if(strcmp(socketHandler->command,"bath1") == 0){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关浴室灯}else if(strcmp(socketHandler->command,"live") == 0){deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开客厅灯}else if(strcmp(socketHandler->command,"live1") == 0){deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关浴室灯}else if(strcmp(socketHandler->command,"upstair") == 0){deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开卧室灯}else if(strcmp(socketHandler->command,"upstair1") == 0){deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关卧室灯}else if(strcmp(socketHandler->command,"rest") == 0){deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开客厅灯}else if(strcmp(socketHandler->command,"rest1") == 0){deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关客厅灯}else if(strcmp(socketHandler->command,"pool") == 0){deviceTmp=findDeviceByName("poolLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开泳池灯}else if(strcmp(socketHandler->command,"pool1") == 0){deviceTmp=findDeviceByName("poolLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关泳池灯}else if(strcmp(socketHandler->command,"allon") == 0){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开所有灯deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);deviceTmp=findDeviceByName("poolLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);}else if(strcmp(socketHandler->command,"alloff") == 0){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关所有灯deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);deviceTmp=findDeviceByName("poolLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);}else if(strcmp(socketHandler->command,"second") == 0){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开二楼灯deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);}else if(strcmp(socketHandler->command,"second1") == 0){deviceTmp=findDeviceByName("bathroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关二楼灯deviceTmp=findDeviceByName("upstairLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);}else if(strcmp(socketHandler->command,"first") == 0){deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);//开一楼灯deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->deviceInit(deviceTmp->pinNum);deviceTmp->open(deviceTmp->pinNum);}else if(strcmp(socketHandler->command,"first1") == 0){deviceTmp=findDeviceByName("livingroomLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);//关一楼灯deviceTmp=findDeviceByName("restaurantLight",pdeviceHead);deviceTmp->close(deviceTmp->pinNum);}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);}
}
//视频监控线程
void *monitor_thread(void * datas)
{//用system函数运行监控脚本,开启监控system("/home/pi/mjpg-streamer/mjpg-streamer-experimental/start.sh");pthread_exit(NULL);
}
//火灾报警线程
void *fireAlarm_thread(void * datas)
{int firestatus;struct Devices *fireTmp = NULL;struct Devices *alarmTmp = NULL;fireTmp = findDeviceByName("fireIfOrNot",pdeviceHead);//从设备工厂找到火灾设备alarmTmp = findDeviceByName("alarm",pdeviceHead);//从设备工厂找到警报设备fireTmp->deviceInit(fireTmp->pinNum);//初始化火灾设备alarmTmp->deviceInit(alarmTmp->pinNum);//初始化警报设备while(1){firestatus = fireTmp->readStatus(fireTmp->pinNum);//读取火灾设备的引脚电平if(firestatus == 0){ alarmTmp->deviceInit(alarmTmp->pinNum);alarmTmp->open(alarmTmp->pinNum);printf("fire alarm!!!\n");delay(1000);}else if(firestatus == 1){printf("No fire!!!\n");alarmTmp->close(alarmTmp->pinNum);delay(1000);}}}
//无线射频控制线程
void *RFID_thread(void * datas)
{struct Devices *rfidTmp = NULL;int rfidStatus1;int rfidStatus2;//初始化433M射频控制wiringPiSetup();pinMode(D0,INPUT);pinMode(D1,INPUT);digitalWrite(D0, LOW);digitalWrite(D1, LOW);printf("init success!\n");while(1){delay(10);rfidStatus1 = digitalRead(D0); //读取433M的引脚电平rfidStatus2 = digitalRead(D1);if(rfidStatus1 == 1){rfidTmp=findDeviceByName("poolLight",pdeviceHead);rfidTmp->deviceInit(rfidTmp->pinNum);rfidTmp->open(rfidTmp->pinNum);}else if(rfidStatus2 == 1){rfidTmp=findDeviceByName("poolLight",pdeviceHead);rfidTmp->close(rfidTmp->pinNum); }rfidStatus1 = 10;rfidStatus2 = 10;}
}
//人脸识别功能线程
void *camera_Thread(void *data)
{struct Devices *cameraTemp = NULL;cameraTemp = findDeviceByName("camera", pdeviceHead);//从设备工程找到人脸识别if (cameraTemp == NULL){printf("find camera error\n");pthread_exit(NULL);}cameraTemp->justDoOnce();//找到人脸识别设备调用函数
}int main()
{char name[16] ={'\0'}; pthread_t voiceThread;pthread_t socketThread;pthread_t monitorThread;pthread_t fireAlarmThread;pthread_t RfidThread;pthread_t cameraThread;//wiring库初始化if(wiringPiSetup() == -1){printf("wiringPi setup error!\n");return -1;}//1.指令工厂初始化pCommandHead = addvoiceContrlLightToDeviceLink(pCommandHead);pCommandHead = addsocketContrlLightToDeviceLink(pCommandHead);//2.设备控制初始化pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);pdeviceHead = addUpstairLightToDeviceLink(pdeviceHead);pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);pdeviceHead = addFireToDeviceLink(pdeviceHead);pdeviceHead = addpoolLightToDeviceLink(pdeviceHead);pdeviceHead = addAlarmToDeviceLink(pdeviceHead);pdeviceHead = addcameraToDeviceLink(pdeviceHead);//3.线程池建立//3.1 语音线程pthread_create(&voiceThread, NULL , voice_thread ,NULL);//3.2 socket线程pthread_create(&socketThread, NULL , socket_thread ,NULL);//3.3 监控摄像头线程pthread_create(&monitorThread, NULL , monitor_thread ,NULL);//3.4 火灾线程pthread_create(&fireAlarmThread, NULL , fireAlarm_thread ,NULL);//3.5 433M线程pthread_create(&RfidThread, NULL , RFID_thread ,NULL);//3.6 人脸识别线程pthread_create(&cameraThread, NULL , camera_Thread ,NULL);//等待线程退出pthread_join(voiceThread,NULL); pthread_join(socketThread,NULL);pthread_join(monitorThread,NULL);pthread_join(fireAlarmThread,NULL); pthread_join(RfidThread,NULL); pthread_join(cameraThread,NULL); return 0;
}
设备工厂头文件controlDevice.h
#include
#include
#include
//C语言中没有布尔类型,这里需要用typedef定义布尔类型
typedef unsigned int bool;struct Devices
{char deviceName[128];int status;int pinNum;int pinNum1;int (*open)(int pinNum);//函数指针int (*close)(int pinNum);int (*deviceInit)(int pinNum);int (*readStatus)(int pinNum);int (*changeStatus)(int status);bool (*justDoOnce)();char *(*getFace)();char *(*getPicFromOCRBase64)();size_t (*readData)();struct Devices *next;
};//函数声明struct Devices* addBathroomLightToDeviceLink(struct Devices* phead);struct Devices* addUpstairLightToDeviceLink(struct Devices *phead);struct Devices* addLivingroomLightToDeviceLink(struct Devices* phead);struct Devices* addRestaurantLightToDeviceLink(struct Devices* phead);struct Devices* addFireToDeviceLink(struct Devices* phead);struct Devices *addpoolLightToDeviceLink(struct Devices *phead);struct Devices* addAlarmToDeviceLink(struct Devices* phead);struct Devices* addcameraToDeviceLink(struct Devices* phead); 命令工厂头文件inputCommand.h
#include
#include struct InputCommander
{char commandName[128];char deviceName[128];char command[32];int (*Init)(struct InputCommander *voicer, char *ipAdress, 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* addvoiceContrlLightToDeviceLink(struct InputCommander* phead);struct InputCommander* addsocketContrlLightToDeviceLink(struct InputCommander* phead);
浴室灯Bathromlight.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 = {.deviceName = "bathroomLight",.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;}}泳池灯PoolLight.c
#include "contrlDevices.h"int poolLightClose(int pinNum)
{digitalWrite(pinNum,HIGH); }
int poolLightOpen(int pinNum)
{digitalWrite(pinNum,LOW); }
int poolLightCloseInit(int pinNum)
{pinMode(pinNum ,OUTPUT);digitalWrite(pinNum,HIGH);}struct Devices poolLight = {.deviceName = "poolLight",.pinNum = 7,.open = poolLightOpen,.close = poolLightClose,.deviceInit = poolLightCloseInit,.next = NULL};struct Devices *addpoolLightToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &poolLight;}else{poolLight.next = phead;phead= &poolLight;}}火灾Fire.c
#include "contrlDevices.h"int fireIfOrNotInit(int pinNum)
{pinMode(pinNum,INPUT);digitalWrite(pinNum,HIGH);}int fireStatusRead(int pinNum)
{return digitalRead(pinNum);
}struct Devices fireIfOrNot = {.deviceName = "fireIfOrNot",.pinNum = 25,.deviceInit = fireIfOrNotInit,.readStatus = fireStatusRead
};
struct Devices* addFireToDeviceLink(struct Devices* phead)
{if(phead == NULL){return &fireIfOrNot; }else{fireIfOrNot.next = phead;phead = &fireIfOrNot;}}
警报Alarm.c
#include "contrlDevices.h"int alarmIfOrNotInit(int pinNum)
{pinMode(pinNum,OUTPUT);digitalWrite(pinNum,HIGH);}
int alarmOpen(int pinNum)
{digitalWrite(pinNum,LOW);}
int alarmClose(int pinNum)
{digitalWrite(pinNum,HIGH);}struct Devices alarm = {.deviceName = "alarm",.pinNum = 2,.deviceInit = alarmIfOrNotInit,.open = alarmOpen,.close = alarmClose
};
struct Devices* addAlarmToDeviceLink(struct Devices* phead)
{if(phead == NULL){return &alarm; }else{alarm.next = phead;phead = &alarm;}}
人脸识别camera.c
#include
#include
#include
#include
#include
#include
#include
#include
#include "contrlDevices.h"#define true 1
#define false 0typedef unsigned int bool;char buf[1024] = {'\0'};//全局变量,用来接收从OCR后台返回的数据
char *getFace1();
char* getPicBase64FromFile(char *filePath);
//回调函数,把从后台的数据拷贝给buf
size_t read_Data( void *ptr, size_t size, size_t nmemb, void *stream)
{strncpy(buf,ptr,1024);printf("==================================Get data===============================\n");printf("%s\n",buf);}
char *getFace1()
{printf("playing photo...\n");system("raspistill -q 15 -t 1 -o image.jpg");//-q 是图片质量,在0~100之间,我们调成5,压缩图片质量,生成的照片名字为imag.jpg//-t 是拍照延时,设定1s后拍照while(access("./image.jpg",F_OK) != 0);//判断是否拍照完毕printf("photo over!\n");char *base64BufFaceRec = getPicBase64FromFile("./image.jpg");return base64BufFaceRec;//返回刚才拍照的base64
}char* getPicBase64FromFile(char *filePath)
{char *bufPic;char cmd[128]={'\0'};sprintf(cmd,"base64 %s >tmpFile",filePath);system(cmd);int fd = open("./tmpFile",O_RDWR);int filelen = lseek(fd,0,SEEK_END);lseek(fd,0,SEEK_SET);char *bufpic =(char *)malloc(filelen+2);memset(bufpic,'\0',filelen+2);read(fd,bufpic,filelen);close(fd);system("rm -f tmpFile");return bufpic;
}
bool postUrl()
{CURL *curl;CURLcode res;char *postString;char img1[12];char img2[12];char *key = "***cUojMR5Lbf***";//用自己的char *secret = "***0544088f3***";//用自己的int typeId = 21;char *format = "xml";char *bufpic1 = getFace1();char *bufpic2 = getPicBase64FromFile("./zyf1.jpg");int len = strlen(key)+strlen(secret)+strlen(bufpic1)+strlen(bufpic2)+124;postString = (char*)malloc(len);//postString是一个指针,不能用sizeof来计算其指向的大小memset(postString, '\0' ,len);sprintf(postString,"&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",bufpic1,bufpic2,key,secret,21,format);curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, read_Data); res = curl_easy_perform(curl);printf("OK:%d\n",res);if(strstr(buf,"是") != NULL){printf("the same Person\n");}else{printf("diff Person\n");}curl_easy_cleanup(curl);}return true;
}struct Devices camera = {.deviceName = "camera",.justDoOnce = postUrl,.getFace = getFace1,.getPicFromOCRBase64 = getPicBase64FromFile,.readData = read_Data
};struct Devices* addcameraToDeviceLink(struct Devices* phead)
{if(phead == NULL){return &camera; }else{camera.next = phead;phead = &camera;}} 网络socket.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "inputCommand.h"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("nget: %d\n",n_read); }else{printf("client quit\n");} return n_read;
}int socketInit(struct InputCommander *socketMes, char *ipAdress, char *port)
{int s_fd; struct sockaddr_in s_addr; memset(&s_addr,0,sizeof(struct sockaddr_in));//1.sockets_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);//2.bind bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//3.listen listen(s_fd,10);printf("socket Server listening.......\n");socketMes->sfd = s_fd;return s_fd;}struct InputCommander socketContrl = {.commandName = "socketServer",.port = "8080",.ipAddress ="192.168.101.43",.command = {'\0'},.Init = socketInit,.getCommand = socketGetCommand,.log = {'\0'},.next = NULL};
struct InputCommander* addsocketContrlLightToDeviceLink(struct InputCommander* phead)
{if(phead == NULL){return &socketContrl; }else{socketContrl.next = phead;phead = &socketContrl;}} 语音控制voiceControl.c
#include
#include
#include
#include
#include
#include
#include "inputCommand.h"int voiceGetCommand(struct InputCommander *voicer)
{int nread = 0;memset(voicer->command, '\0', sizeof(voicer->command));nread = read(voicer->fd, voicer->command, sizeof(voicer->command));return nread;}int voiceInit(struct InputCommander *voicer, char *ipAdress, char *port)
{int fd;if((fd = serialOpen(voicer->deviceName,9600)) == -1){perror("./");exit(-1);}voicer->fd = fd;return fd;}struct InputCommander voiceContrl = {.commandName = "voice",.deviceName = "/dev/ttyAMA0",.command = {'\0'},.Init = voiceInit,.getCommand = voiceGetCommand,.log = {'\0'},.next = NULL};
struct InputCommander* addvoiceContrlLightToDeviceLink(struct InputCommander* phead)
{if(phead == NULL){return &voiceContrl; }else{voiceContrl.next = phead;phead = &voiceContrl;}}