文章目录

一、功能介绍
二、设计框图
三、实物展示
四、程序

一、功能介绍
基于树莓派的智能家居。智能家居用到的硬件有:树莓派4B、LD3320语音识别模块、pi 摄像头、继电器组、小灯、火焰传感器、蜂鸣器、电磁锁
采用了简单工厂模式的一个设计方式。稳定,拓展性更强,在C语言中,因为没有接口、类这一说法,所以这里采用了结构体来“等效替换”。有四个灯,所以我创建了四个灯控制.c程序。每一个程序文件中,都有一个设备结构体,每个程序文件的函数实现方法不同,当有新设备进入只需要在创建一个.c文件,改变函数实现方法即可。初始化的时候,通过链表将各个模块连接起来(头插法)。在要使用某个模块时,只需要使用链表遍历,找到所需模块去调用功能
具体功能是:
1、可通过ld3320语音模块的口令模式,口令+具体控制,通过串口把控制指令传给树莓派,来控制客厅、餐厅、二楼、浴室的灯
2、也可以通过socket客户端来发指令来控制灯的开关
3、火灾报警,当火焰传感器检测到火焰的时候,蜂鸣器会报警。
4、视频监控采用开源mjpg-Streamer来实现的,程序执行时创建一个视频监控的线程,用system函数调用启动脚本运行,监控画面可在http://172.20.10.8:8080去看到
5、人脸识别开锁,人脸识别功能是使用的翔云平台的人脸识别解决方案,需要安装libcurl 和 openSSl库来支持https协议,通过系统调用wget +http://172.20.10.8:8080/?action=snapshot -O ./huyu1.jpg 指令到树莓派的监控页面"去截取一帧保存到本地,获取图片的base64编码,工程文件夹下也有一张照片,huyu.jpg格式,相当于采集的人脸。也是获取图片的base64编码,通过sprintf函数将访问翔云需要的两张图片的base64编码与Key、secret、typeId、format拼接在一起,通过https协议去访问翔云平台, 识别成功后会将识别结果返回,通过回调函数readData将返回的字符串读到readBuff里,通过strstr去readbuff里找有没有字符’是’,如果识别成功就去控制电磁锁打开。

二、设计框图

*效果展示:*https://www.bilibili.com/video/BV1uD4y1C7PH?share_source=copy_web&vd_source=5e457ac82f63b0e36b8b9e2708807f31

三、实物展示



四、程序

1、InputCommand.h

#include <wiringPi.h>
#include <stddef.h>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 *addVoiceControlToInputCommandLink(struct InputCommander *phead);struct InputCommander *addSocketControlToInputCommandLink(struct InputCommander *phead);

2、controlDevices .h

#include <wiringPi.h>
#include <stdio.h>struct Devices
{char deviceName[128];int status;int pinNum;int (*open)(int pinNum);int (*close)(int pinNum);int (*deviceInit)(int pinNum);int (*readStatus)(int pinNum);int (*changeStatus)(int status);void (*faceRecognition)(); //人脸识别char *(*takePictureInit)();//用于摄像头char *(*getPicBase64)(); //用于摄像头size_t (*readData)(); //用于摄像头struct Devices *next;};struct Devices *addBathroomLightToDeviceLink(struct Devices *phead);
struct Devices *addUpstairLightToDeviceLink(struct Devices *phead);
struct Devices *addDiningroomLightToDeviceLink(struct Devices *phead);
struct Devices *addLivingroomLightToDeviceLink(struct Devices *phead);
struct Devices *addFireAlarmToDeviceLink(struct Devices *phead);
struct Devices* addBeepToDeviceLink(struct Devices *phead);
struct Devices *addLookToDeviceLink(struct Devices *phead);struct Devices *addCameraToDeviceLink(struct Devices *phead);

3、mainPro.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#include "controlDevices.h"
#include "InputCommand.h"struct InputCommander *pCommandHead = NULL;
struct Devices        *pdeviceHead = NULL;struct InputCommander *socketHandler = NULL;int c_fd;
char *name = NULL;pthread_t cameraThread;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 *camera_thread(void *datas)  //摄像头线程
{struct Devices *cameraTemp;cameraTemp = findDeviceByName("camera", pdeviceHead); //设备都要从工厂里面取出来if (cameraTemp == NULL){   //防止段错误的必需判断,当给指针赋值是,一定要考虑NULL的情况printf("find camera error\n");pthread_exit(NULL); //在线程中不用return}cameraTemp->faceRecognition(); //调用人脸识别函数}
void * voice_thread(void *datas)    //语音线程
{int nread;struct InputCommander *voiceHandler = NULL;struct Devices *linkHandler = NULL;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){memset(voiceHandler->command,'\0',sizeof(voiceHandler->command));nread = voiceHandler->getCommand(voiceHandler);    //读取来自语音模块的消息printf(" %s\n",voiceHandler->command);if(nread > 1){if(strstr(voiceHandler->command,"KEL") != NULL){ //开二楼灯linkHandler = findDeviceByName("upstairLight",pdeviceHead);linkHandler->deviceInit(linkHandler->pinNum);linkHandler->open(linkHandler->pinNum);printf("open upstairLight\n");}else if(strstr(voiceHandler->command,"GEL") != NULL){        //关二楼灯linkHandler = findDeviceByName("upstairLight",pdeviceHead);linkHandler->close(linkHandler->pinNum);printf("close upstairLight\n");}else if(strstr(voiceHandler->command,"KYS") != NULL){ //开浴室灯linkHandler = findDeviceByName("bathroomLight",pdeviceHead);linkHandler->deviceInit(linkHandler->pinNum);linkHandler->open(linkHandler->pinNum);printf("open bathroomlight\n");}else if(strstr(voiceHandler->command,"GYS") != NULL){  //关浴室灯linkHandler = findDeviceByName("bathroomLight",pdeviceHead);linkHandler->close(linkHandler->pinNum);printf("open bathroomlight\n");}else if(strstr(voiceHandler->command,"KKT") != NULL){    //开客厅灯linkHandler = findDeviceByName("livingroomLight",pdeviceHead);linkHandler->deviceInit(linkHandler->pinNum);linkHandler->open(linkHandler->pinNum);printf("open livingroomLight\n");}else if(strstr(voiceHandler->command,"GKT") != NULL){  //关客厅灯linkHandler = findDeviceByName("livingroomLight",pdeviceHead);linkHandler->close(linkHandler->pinNum);printf("open livingroomLight\n");}else if(strstr(voiceHandler->command,"KCT") != NULL){//开餐厅灯linkHandler = findDeviceByName("diningroomLight",pdeviceHead);linkHandler->deviceInit(linkHandler->pinNum);linkHandler->open(linkHandler->pinNum);printf("open diningroomLight\n");}else if(strstr(voiceHandler->command,"GCT") != NULL){//关餐厅灯linkHandler = findDeviceByName("diningroomLight",pdeviceHead);linkHandler->close(linkHandler->pinNum);printf("open diningroomLight\n");}else if(strstr(voiceHandler->command,"KM") != NULL){//开门pthread_create(&cameraThread,NULL,camera_thread,NULL);}else if(strstr(voiceHandler->command,"DQK") != NULL){//打开全部灯linkHandler = findDeviceByName("upstairLight",pdeviceHead);linkHandler->deviceInit(linkHandler->pinNum);linkHandler->open(linkHandler->pinNum);linkHandler = findDeviceByName("bathroomLight",pdeviceHead);linkHandler->deviceInit(linkHandler->pinNum);linkHandler->open(linkHandler->pinNum);linkHandler = findDeviceByName("livingroomLight",pdeviceHead);linkHandler->deviceInit(linkHandler->pinNum);linkHandler->open(linkHandler->pinNum);linkHandler = findDeviceByName("diningroomLight",pdeviceHead);linkHandler->deviceInit(linkHandler->pinNum);linkHandler->open(linkHandler->pinNum);printf("All closed\n");}else if(strstr(voiceHandler->command,"DQG") != NULL){//关闭全部灯linkHandler = findDeviceByName("upstairLight",pdeviceHead);linkHandler->close(linkHandler->pinNum);linkHandler = findDeviceByName("bathroomLight",pdeviceHead);linkHandler->close(linkHandler->pinNum);linkHandler = findDeviceByName("livingroomLight",pdeviceHead);linkHandler->close(linkHandler->pinNum);linkHandler = findDeviceByName("diningroomLight",pdeviceHead);linkHandler->close(linkHandler->pinNum);printf("All open\n");}else if(nread == 0){printf("nodata from voice......\n");}//printf("%d\n",strlen(voiceHandler->command));}}}
}   void * read_thread(void *datas)
{int n_read;struct Devices *linkHandler1 = NULL;memset(socketHandler->command,'\0',sizeof(socketHandler->command));n_read = read(c_fd,socketHandler->command,sizeof(socketHandler->command));if(n_read>0){printf("get message:%d,%s\n",n_read,socketHandler->command);if(strstr(socketHandler->command,"KEL") != NULL){    //开二楼灯linkHandler1 = findDeviceByName("upstairLight",pdeviceHead);linkHandler1->deviceInit(linkHandler1->pinNum);linkHandler1->open(linkHandler1->pinNum);printf("open upstairLight\n");}else if(strstr(socketHandler->command,"GEL") != NULL){      //关二楼灯linkHandler1 = findDeviceByName("upstairLight",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);printf("close upstairLight\n");}else if(strstr(socketHandler->command,"KYS") != NULL){ //开浴室灯linkHandler1 = findDeviceByName("bathroomLight",pdeviceHead);linkHandler1->deviceInit(linkHandler1->pinNum);linkHandler1->open(linkHandler1->pinNum);printf("open bathroomlight\n");}else if(strstr(socketHandler->command,"GYS") != NULL){    //关浴室灯linkHandler1 = findDeviceByName("bathroomLight",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);printf("close bathroomlight\n");}else if(strstr(socketHandler->command,"KKT") != NULL){   //开客厅灯linkHandler1 = findDeviceByName("livingroomLight",pdeviceHead);linkHandler1->deviceInit(linkHandler1->pinNum);linkHandler1->open(linkHandler1->pinNum);printf("open livingroomLight\n");}else if(strstr(socketHandler->command,"GKT") != NULL){    //关客厅灯linkHandler1 = findDeviceByName("livingroomLight",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);printf("close livingroomLight\n");}else if(strstr(socketHandler->command,"KCT") != NULL){//开餐厅灯linkHandler1 = findDeviceByName("diningroomLight",pdeviceHead);linkHandler1->deviceInit(linkHandler1->pinNum);linkHandler1->open(linkHandler1->pinNum);printf("open diningroomLight\n");}else if(strstr(socketHandler->command,"GCT") != NULL){//关餐厅灯linkHandler1 = findDeviceByName("diningroomLight",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);printf("close diningroomLight\n");}else if(strstr(socketHandler->command,"KM") != NULL){//开门//linkHandler1 = findDeviceByName("camera",pdeviceHead);//linkHandler1->takePictureInit();//linkHandler1->faceRecognition();pthread_create(&cameraThread,NULL,camera_thread,NULL);}else if(strstr(socketHandler->command,"GM") != NULL){//关门linkHandler1 = findDeviceByName("lock",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);}else if(strstr(socketHandler->command,"DQK") != NULL){//打开全部灯linkHandler1 = findDeviceByName("upstairLight",pdeviceHead);linkHandler1->deviceInit(linkHandler1->pinNum);linkHandler1->open(linkHandler1->pinNum);linkHandler1 = findDeviceByName("bathroomLight",pdeviceHead);linkHandler1->deviceInit(linkHandler1->pinNum);linkHandler1->open(linkHandler1->pinNum);linkHandler1 = findDeviceByName("livingroomLight",pdeviceHead);linkHandler1->deviceInit(linkHandler1->pinNum);linkHandler1->open(linkHandler1->pinNum);linkHandler1 = findDeviceByName("diningroomLight",pdeviceHead);linkHandler1->deviceInit(linkHandler1->pinNum);linkHandler1->open(linkHandler1->pinNum);printf("All open\n");}else if(strstr(socketHandler->command,"DQG") != NULL){      //关闭全部灯linkHandler1 = findDeviceByName("upstairLight",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);linkHandler1 = findDeviceByName("bathroomLight",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);linkHandler1 = findDeviceByName("livingroomLight",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);linkHandler1 = findDeviceByName("diningroomLight",pdeviceHead);linkHandler1->close(linkHandler1->pinNum);printf("All closed\n");}else if(n_read == -1){perror("read");}  }}void * socket_thread(void *datas) //socket线程
{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 * video_thread(void *datas)   //视频监控线程
{system("/home/pi/mjpg-streamer/mjpg-streamer-experimental/start.sh");pthread_exit(NULL);
}void * fireAlarm_thread(void *datas)   //火灾报警线程
{int status;struct Devices *firetmp = NULL;struct Devices *beeptmp = NULL;firetmp = findDeviceByName("fireAlarm",pdeviceHead);     //寻找“火焰传感器”链表节点,返回给firetmpbeeptmp = findDeviceByName("beep",pdeviceHead);             //寻找“蜂鸣器”链表节点,返回给buztmpwhile(1){status = firetmp->readStatus(firetmp->pinNum);            //读取“火焰传感器”状态if(status == 0){ beeptmp->deviceInit(beeptmp->pinNum);                             //检测到火焰或强光源beeptmp->open(beeptmp->pinNum);        //打开蜂鸣器printf("Warning of fire!!!\n");delay(1000);    //延时1000毫秒=1秒}if(status == 1){                       //未检测到火焰、强光源或解除警报beeptmp->close(beeptmp->pinNum);     //关闭蜂鸣器}}}int main(){//char name[128] = {'\0'};pthread_t voiceThread;pthread_t socketThread;pthread_t fireAlarmThread;pthread_t videoThread;pthread_t cameraThread;struct Devices *tmp = NULL;if(wiringPiSetup() == -1){return -1;}//1. 指令工厂初始化pCommandHead = addVoiceControlToInputCommandLink(pCommandHead);pCommandHead = addSocketControlToInputCommandLink(pCommandHead);//2. 设备控制工厂初始化pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);pdeviceHead = addUpstairLightToDeviceLink(pdeviceHead);pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);pdeviceHead = addDiningroomLightToDeviceLink(pdeviceHead);pdeviceHead = addFireAlarmToDeviceLink(pdeviceHead);pdeviceHead = addBeepToDeviceLink(pdeviceHead);pdeviceHead = addLookToDeviceLink(pdeviceHead);pdeviceHead = addCameraToDeviceLink(pdeviceHead);struct Devices *tmpequiphead = pdeviceHead;if(tmpequiphead != NULL){                        //设备工厂所有设备初始化tmpequiphead->deviceInit(tmpequiphead->pinNum);tmpequiphead = tmpequiphead->next;}//3.池建立//3.1 语音线程//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);pthread_create(&voiceThread,NULL,voice_thread,NULL);//3.2 socket线程pthread_create(&socketThread,NULL,socket_thread,NULL);//3.3 摄像头线程//printf("camera_thread1===============\n");pthread_create(&cameraThread,NULL,camera_thread,NULL);//3.4 火灾线程pthread_create(&fireAlarmThread,NULL,fireAlarm_thread,NULL);//3.视频监控 pthread_create(&videoThread, NULL, video_thread, NULL);pthread_join(voiceThread,NULL);pthread_join(socketThread,NULL);pthread_join(cameraThread,NULL);pthread_join(fireAlarmThread,NULL);pthread_join(videoThread,NULL);return 0;
}

4、upstairLight.c

#include "controlDevices.h"
#include <stddef.h>/*struct Devices
{char deviceName[128];int status;int (*open)();int (*close)();int (*deviceInit)();int (*readStatus)()int (*changeStatus)(int status);struct Devices *next;};
*/int upstairLightOpen(int pinNum)
{digitalWrite(pinNum,HIGH);}int upstairLightClose(int pinNum)
{digitalWrite(pinNum,LOW);}int upstairLightInit(int pinNum)
{pinMode(pinNum,OUTPUT);digitalWrite(pinNum,LOW);}int  upstairLightStatus(int status)
{}struct Devices upstairLight = {.deviceName = "upstairLight",.pinNum = 21,.open = upstairLightOpen,.close = upstairLightClose,.deviceInit = upstairLightInit,.changeStatus = upstairLightStatus,.next = NULL
};struct Devices *addUpstairLightToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &upstairLight;  }   else{upstairLight.next = phead;phead = &upstairLight;return phead;}
}

5、bathroomLight.c

#include "controlDevices.h"
#include <stddef.h>/*struct Devices
{char deviceName[128];int status;int (*open)();int (*close)();int (*deviceInit)();int (*readStatus)()int (*changeStatus)(int status);struct Devices *next;};
*/int bathroomLightOpen(int pinNum)
{digitalWrite(pinNum,HIGH);}
int bathroomLightClose(int pinNum)
{digitalWrite(pinNum,LOW);}
int bathroomLightInit(int pinNum)
{pinMode(pinNum,OUTPUT);digitalWrite(pinNum,LOW);}int  bathroomLightStatus(int status)
{}struct Devices bathroomLight = {.deviceName = "bathroomLight",.pinNum = 22,.open = bathroomLightOpen,.close = bathroomLightClose,.deviceInit = bathroomLightInit,.changeStatus = bathroomLightStatus,.next = NULL
};struct Devices *addBathroomLightToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &bathroomLight; }   else{bathroomLight.next = phead;phead = &bathroomLight;return phead;}
}

6、livingroomLight.c

#include "controlDevices.h"
#include <stddef.h>/*struct Devices
{char deviceName[128];int status;int (*open)();int (*close)();int (*deviceInit)();int (*readStatus)()int (*changeStatus)(int status);struct Devices *next;};
*/int livingroomLightOpen(int pinNum)
{digitalWrite(pinNum,HIGH);}int livingroomLightClose(int pinNum)
{digitalWrite(pinNum,LOW);}
int livingroomLightInit(int pinNum)
{pinMode(pinNum,OUTPUT);digitalWrite(pinNum,LOW);}int  livingroomLightStatus(int status)
{}struct Devices livingroomLight = {.deviceName = "livingroomLight",.pinNum = 23,.open = livingroomLightOpen,.close = livingroomLightClose,.deviceInit = livingroomLightInit,.changeStatus = livingroomLightStatus,.next = NULL
};struct Devices *addLivingroomLightToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &livingroomLight;   }   else{livingroomLight.next = phead;phead = &livingroomLight;return phead;}
}

7、diningroomLight.c

#include "controlDevices.h"
#include <stddef.h>/*struct Devices
{char deviceName[128];int status;int (*open)();int (*close)();int (*deviceInit)();int (*readStatus)()int (*changeStatus)(int status);struct Devices *next;};
*/int diningroomLightOpen(int pinNum)
{digitalWrite(pinNum,HIGH);}int diningroomLightClose(int pinNum)
{digitalWrite(pinNum,LOW);
}int diningroomLightInit(int pinNum)
{pinMode(pinNum,OUTPUT);digitalWrite(pinNum,LOW);}int  diningroomLightStatus(int status)
{}struct Devices diningroomLight = {.deviceName = "diningroomLight",.pinNum = 24,.open = diningroomLightOpen,.close = diningroomLightClose,.deviceInit = diningroomLightInit,.changeStatus = diningroomLightStatus,.next = NULL
};struct Devices *addDiningroomLightToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &diningroomLight;   }   else{diningroomLight.next = phead;phead = &diningroomLight;return phead;}
}

8、fire.c

#include "controlDevices.h"
#include <stddef.h>int fireAlarmInit(int pinNum)
{pinMode(pinNum,INPUT);digitalWrite(pinNum,HIGH);}int  fireStatusRead(int pinNum)
{return digitalRead(pinNum);
}struct Devices fireAlarm = {.deviceName = "fireAlarm",.pinNum = 25,.deviceInit = fireAlarmInit,.readStatus = fireStatusRead,.next = NULL
};struct Devices *addFireAlarmToDeviceLink(struct Devices *phead)
{if(phead == NULL){return & fireAlarm;    }   else{fireAlarm.next = phead;phead = & fireAlarm;}
}

9、beep.c

#include "controlDevices.h"struct Devices *addBeepToDeviceLink(struct Devices *phead);int beepInit(int pinNum)                 //初始化函数
{pinMode(pinNum,OUTPUT);                    //配置引脚为输出引脚digitalWrite(pinNum,LOW);                //引脚输出低电平,即默认为关闭状态
}int beepOpen(int pinNum)                   //打开蜂鸣器函数
{digitalWrite(pinNum,HIGH);
}int beepClose(int pinNum)                  //关闭蜂鸣器函数
{digitalWrite(pinNum,LOW);
}struct Devices beep = {           //蜂鸣器设备链表节点.deviceName = "beep",.pinNum = 27,                   //树莓派gpio引脚27.deviceInit = beepInit,.open = beepOpen,.close = beepClose,.next = NULL
};struct Devices* addBeepToDeviceLink(struct Devices *phead)            //头插法将设备节点加入设备工厂链表函数
{if(phead == NULL){return &beep;}else{beep.next = phead;phead = &beep;return phead;}
}

10、voiceControl.c

#include "InputCommand.h"
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.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));if(nread == 0){printf("usart for voice read over time!\n");}else{return nread;    //读取到的指令是存放到voicer.command的}
}int voiceInit(struct InputCommander *voicer,char *ipAdress,char *port)
{int fd;//printf("test init1\n");if((fd = serialOpen(voicer->deviceName,9600))== -1)    //初始化串口,波特率9600{printf("open serial error\n");exit(-1);}voicer->fd = fd;return fd;}
struct InputCommander voiceControl = {.commandName = "voice",.deviceName = "/dev/ttyAMA0",.command = {'\0'},.Init = voiceInit,.getCommand = voiceGetCommand,.log = {'\0'},.next = NULL
};struct InputCommander *addVoiceControlToInputCommandLink(struct InputCommander *phead)
{if(phead == NULL){return &voiceControl;  }   else{voiceControl.next = phead;phead = &voiceControl;}
}

11、socketControl.c

基于树莓派的智能家居项目整理相关推荐

  1. 基于树莓派的智能家居控制系统设计论文参考

    完整论文咨询可WX联系:gyf1842965496 智能家居控制系统功能实现详细介绍:基于树莓派的智能家居控制系统设计https://blog.csdn.net/G1842965496/article ...

  2. python语音控制智能家电_基于树莓派的智能家居语音控制系统

    2018-10 基于树莓派的智能家居语音控制系统 Intelligent home voice control system based on raspberry Pi 刘 华 , 田占生 , 冯宇飞 ...

  3. 基于树莓派的智能家居控制系统设计

    基于树莓派的智能家居控制系统设计 完整文件下载 基于树莓派的智能家居控制系统设计 https://download.csdn.net/download/G1842965496/85802405 一.功 ...

  4. python智能家居论文_毕业设计(论文)-基于树莓派的智能家居精选.docx

    毕业设计(论文)-基于树莓派的智能家居精选 摘要随着物联网技术的发展,智能家居产业迅速崛起.在此背景下,我们研究了智能家居管理系统的设计与实现.本文所设计的智能家居管理系统采用分层架构设计,分别为感知 ...

  5. 基于stm32的智能家居项目

    基于stm32的智能家居 具体教程可以看文中的B站链接,上面有手把手教程 本人其他项目链接基于linux的智能仓储项目 基于Qt的人脸识别 移植人脸识别到Linux开发板上 基于正点原子的IMX6UL ...

  6. linux项目—基于树莓派的智能家居系统

    1.项目简介 项目采用工厂设计模式.所有控制以及外设的设备都做成一个个对象(java思想),分别将命令控制的连成一个控制链表,外设设备做成一个外设设备的链表,这样做是为了方便以后功能模块的添加.其中为 ...

  7. 【基于stm32f103C8T6-小程序智能家居项目实战-自绘PCB到实现功能一条龙+30分钟解决-各种bug已修复】

    项目演示: 阿熊智能家居演示 文章目录 项目演示: 整体结构 硬件清单 核心板 STM32F103C8T6 WIFI模块 ESP8266-01s 传感器 DHT11温湿度传感器 BH1750光照传感器 ...

  8. 基于树莓派的智能家居

    一点点摸索总结资料出来,所以希望记录下来,也能给其他的小伙伴有一点点参考.由于是自己摸索,所以可能说的不是很清楚或者显得很业余.后来还把小车和智能家居联合起来了,小车可以控制智能家居,智能家居也可以控 ...

  9. 基于树莓派的智能家居设计

    文章目录 前言 一.整体系统框图 二.代码部分 二.APP客户端 1.MainActivity.java 2.NetUtils.java 三.实物展示 前言 一个简易的小项目,以下是代码部分和实物效果 ...

最新文章

  1. android获取指针空间大小_腾讯笔试题:浅谈计算机中cpu位数和指针
  2. 薪资被「倒挂」,别慌,咱们用实力说话
  3. 《Spring Cloud微服务实战》100本赠书获得名单
  4. 谷歌吃苹果:新系统让Macbook秒变Chromebook
  5. [翻译]VC++中创建并使用自定义控件
  6. java servlet 调试日志 logger sae_java servlet 调试日志 lo
  7. 升级ipython_Linux服务器python升级
  8. 计算机硬件系统的安全,维护硬件系统的计算机安全论文
  9. FPGA 串口中断_一个严谨的STM32串口DMA发送amp;接收(1.5Mbps波特率)机制
  10. linux查看某个时间段的日志
  11. Python debug——TypeError: unhashable type(list/set/dict)
  12. 移动开发 Jetpack Compose 组件布局
  13. python程序结构有哪几种_Python程序3种控制结构的由来
  14. 打开.class文件
  15. 卤煮花生米的制作过程(高压锅版)
  16. 纯净版英雄联盟LOL如何开启 2022年8月8日方法
  17. 突然发现自己的虚拟VMNET8 没有了,不要慌
  18. manjaro linux无线网卡,为 Manjaro 18.1.4 配置无线网卡
  19. JVM探秘:垃圾收集器
  20. 2020年总结 - 不纠结当下,不忧虑未来

热门文章

  1. Java项目校园兼职平台(三层架构+设计模式重构版)(含代码)
  2. 融云IM整理 01--- (API)
  3. Linux系统清除缓存【整理】
  4. 总账会计、明细账会计和出纳是分工和协作的关系(转)
  5. 设计路上的重点原型设计
  6. python中文文本分析_Python有趣|中文文本情感分析
  7. 2021-05-04
  8. org.apache.tomcat.util.http.parser.Cookie.logInvalidHeader 收到包含无效cookie的cookie头(含图文)
  9. R语言数据可视化——图形色彩设计(调色盘)
  10. 展厅智能中央控制服务器,四川中控展厅分布式智能控系统