智能家居(2)---串口通信(语音识别)控制线程封装

封装语音线程(语音通过串口和主控设备进行交流)实现对智能家居中各种灯光的控制

mainPro.c(主函数)

c 复制代码
#include <stdio.h>
#include "controlDevice.h"
#include "inputCommand.h"
#include <pthread.h>


struct Devices        *pdeviceHead  = NULL;         //设备工厂链表头
struct InputCommander *pcommandHead = NULL;         //指令工厂链表头

struct Devices* findDeviceByName(struct Devices *phead,char *name)          //在设备链表中查找设备(语音和socket均可使用)
{
    struct Devices *tmp = phead;
    if(tmp == NULL){
        printf("The devicesLink is NULL");
        return NULL;
    
    }else{
        while(tmp != NULL){
            if(strcmp(tmp->deviceName,name) == 0){
                return tmp;
            }
            tmp = tmp->next;
        }
   
     return NULL;   

    }

}

struct InputCommander* findCommanderByName(struct InputCommander *phead,char *name)     //在控制链表中查找相关控制
{
    struct InputCommander *tmp = phead;
    if(tmp == NULL){
        printf("The commanderLink is NULL");
        return NULL;
    
    }else{
        while(tmp != NULL){
            if(strcmp(tmp->commandName,name) == 0){
                return tmp;
            }
            tmp = tmp->next;
        }
   
     return NULL;   

    }

}

void doCommand(struct InputCommander *cmd)                              //根据传入的命令控制相关设备
{
    struct Devices *tmp = NULL;

    if(strstr(cmd->command,"START")){                                   //初始化所有设备
        tmp = findDeviceByName(pdeviceHead,"bathroomLight");
        if(tmp != NULL) tmp->deviceInit(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"bedroomLight");
        if(tmp != NULL) tmp->deviceInit(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"livingroomLight");
        if(tmp != NULL) tmp->deviceInit(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"restaurantLight");
        if(tmp != NULL) tmp->deviceInit(tmp->pinNum);
        printf("The devices all init success\n");
        
    }else if(strstr(cmd->command,"OL1")){                               //打开卫生间灯
        tmp = findDeviceByName(pdeviceHead,"bathroomLight");
        if(tmp != NULL) tmp->open(tmp->pinNum);
        printf("The bathroomLight already open\n");

    }else if(strstr(cmd->command,"CL1")){                               //关闭卫生间灯
        tmp = findDeviceByName(pdeviceHead,"bathroomLight");
        if(tmp != NULL) tmp->close(tmp->pinNum);
        printf("The bathroomLight already close\n");
    
    }else if(strstr(cmd->command,"OL2")){                               //打开卧室灯
        tmp = findDeviceByName(pdeviceHead,"bedroomLight");
        if(tmp != NULL) tmp->open(tmp->pinNum);
        printf("The bedroomLight already open\n");
    
    }else if(strstr(cmd->command,"CL2")){                               //关闭卧室灯
        tmp = findDeviceByName(pdeviceHead,"bedroomLight");
        if(tmp != NULL) tmp->close(tmp->pinNum);
        printf("The bedroomLight already close\n");
    
    }else if(strstr(cmd->command,"OL3")){                               //打开客厅灯
        tmp = findDeviceByName(pdeviceHead,"livingroomLight");
        if(tmp != NULL) tmp->open(tmp->pinNum);
        printf("The livingroomLight already open\n");
    
    }else if(strstr(cmd->command,"CL3")){                               //关闭客厅灯
        tmp = findDeviceByName(pdeviceHead,"livingroomLight");
        if(tmp != NULL) tmp->close(tmp->pinNum);
        printf("The livingroomLight already close\n");
    
    }else if(strstr(cmd->command,"OL4")){                               //打开餐厅灯
        tmp = findDeviceByName(pdeviceHead,"restaurantLight");
        if(tmp != NULL) tmp->open(tmp->pinNum);
        printf("The restaurantLight already open\n");
    
    }else if(strstr(cmd->command,"CL4")){                               //关闭餐厅灯
        tmp = findDeviceByName(pdeviceHead,"restaurantLight");
        if(tmp != NULL) tmp->close(tmp->pinNum);
        printf("The restaurantLight already close\n");
    
    }else if(strstr(cmd->command,"ALL1")){                              //打开所有的灯
        tmp = findDeviceByName(pdeviceHead,"bathroomLight");
        if(tmp != NULL) tmp->open(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"bedroomLight");
        if(tmp != NULL) tmp->open(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"livingroomLight");
        if(tmp != NULL) tmp->open(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"restaurantLight");
        if(tmp != NULL) tmp->open(tmp->pinNum);
        printf("The Light all open success\n");
    
    }else if(strstr(cmd->command,"ALL0")){                              //关闭所有的灯
        tmp = findDeviceByName(pdeviceHead,"bathroomLight");
        if(tmp != NULL) tmp->close(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"bedroomLight");
        if(tmp != NULL) tmp->close(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"livingroomLight");
        if(tmp != NULL) tmp->close(tmp->pinNum);
        tmp = findDeviceByName(pdeviceHead,"restaurantLight");
        if(tmp != NULL) tmp->close(tmp->pinNum);
        printf("The Light all close success\n");

    }

}

void* voice_pthread(void *data)				//语音识别(串口通信)处理线程函数
{
    struct InputCommander *voiceHandler;
    int n_read;

    voiceHandler = findCommanderByName(pcommandHead,"voice");
    if(voiceHandler == NULL){
        printf("find voice error\n");
        pthread_exit(NULL);
    }else{
        if(voiceHandler->Init(voiceHandler) < 0 ){
            printf("%s init error\n",voiceHandler->commandName);
            pthread_exit(NULL);
        }else
            printf("%s init success\n",voiceHandler->commandName);

        while(1){
            n_read = voiceHandler->getCommand(voiceHandler);
            if(n_read == 0){
                printf("no command from voice\n");
            }else{//根据指令进行控制
                printf("read %d message-->:%s",n_read,voiceHandler->command);
                doCommand(voiceHandler);                //执行命令
                
            }
            
        }
    }


}


int main()
{
    pthread_t voice_pth;
    
    if(wiringPiSetup()<0){//初始化wiringPi外设库

            printf("wiringPi Init failed\n");
            return -1;
        }


    //1.指令工厂初始化
    pcommandHead = addVoiceToCommandLink(pcommandHead);             //将语音控制加入命令控制链表
   

    //2.设备控制工厂初始化
    pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);        //将卫生灯加入设备链表
    pdeviceHead = addbedroomLightToDeviceLink(pdeviceHead);         //将卧室灯加入设备链表
    pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);      //将餐厅灯加入设备链表
    pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);      //将客厅灯加入设备链表
    pdeviceHead = addFireToDeviceLink(pdeviceHead);                 //将火灾检测加入设备链表
    pdeviceHead = addBeepToDeviceLink(pdeviceHead);                 //将蜂鸣器加入设备链表

   
    //3.线程池建立
    //3.1语音线程
    int ret = pthread_create(&voice_pth,NULL,voice_pthread,NULL);
    if (ret != 0) {
        printf("Failed to create voicethread.\n");
        return -1;
    }

	//等待线程退出
    pthread_join(voice_pth,NULL);

	return 0;
}

inputCommand.h(控制类)

c 复制代码
#include <wiringPi.h>
#include <stddef.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>


struct InputCommander
{
    char commandName[128];      //命令名字
    char command[32];           //具体命令
    char deviceName[128];       //打开的设备名,比如串口
    char port[12];              //端口号
    char ipAddress[32];         //ip地址

    int (*Init)(struct InputCommander *commder);
    int (*getCommand)(struct InputCommander *commder);
    int fd;     //文件描述符
    int baud;   //波特率
    int s_fd;   //socket服务端文件描述符
    int c_fd;   //客户端文件描述符
    
    char log[1024]; //日志
    struct InputCommander *next;
};

struct InputCommander *addVoiceToCommandLink(struct InputCommander *phead);				//语音控制加入命令控制链表

voiceControl.c(语音)

c 复制代码
#include "inputCommand.h"


int voiceInit(struct InputCommander *voiceMes)
{
    int fd;
    fd =serialOpen(voiceMes->deviceName,voiceMes->baud);//打开串口
    if(fd<0){
        printf("open serial fail!\r\n");//判断串口打开是否成功
        return -1;
    }else
        voiceMes->fd = fd;//传回串口文件描述符

    return fd;

}

 int voiceGetCommand(struct InputCommander *voiceMes)
 {
    int nread = 0;
    memset(voiceMes->command,0,sizeof(voiceMes->command));
    nread = read(voiceMes->fd,voiceMes->command,sizeof(voiceMes->command));
    return nread;
 }




struct InputCommander voiceControl = {
    .commandName = "voice",
    .command = {'\0'},
    .deviceName = "/dev/ttyAMA0",
    .baud = 9600,
    .Init = voiceInit,
    .getCommand = voiceGetCommand,
    .log = {'\0'},
    .next = NULL,

};

struct InputCommander *addVoiceToCommandLink(struct InputCommander *phead)
{
    if(phead == NULL){
        return &voiceControl;
    
    }else{
        voiceControl.next=phead;
        phead = &voiceControl;
        return phead;
    }
}
相关推荐
唯创知音1 天前
人体红外感应模块推荐:智能家居、电子门锁、洗浴设备方案
智能家居
三佛科技-134163842122 天前
FT32F103系列与APM32F103,STM32F103之间的对比,能否替换?
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
深念Y2 天前
状态缓存与TTL:给每个设备状态贴一张“保质期”
数据库·缓存·智能家居·时间·时间戳·智能电视·ttl
电子科技圈2 天前
SmartDV展示完整的边缘与连接IP解决方案,以高速和低功耗特性赋能移动、物联网和媒体处理设备创新
人工智能·嵌入式硬件·mcu·物联网·智能家居·智能硬件·iot
唯创知音4 天前
主动红外和被动红外在智能家居中如何选择?
人工智能·智能家居
电子科技圈4 天前
芯科科技2026 Tech Talks技术讲座启航聚焦无线与边缘 AI,共绘智能物联新蓝图
人工智能·嵌入式硬件·mcu·物联网·智能家居·智能硬件·iot
cici158746 天前
智能家居室内WIFI报警系统设计
智能家居
hoiii1876 天前
智能家居继电器控制与蓝牙4.0开发
智能家居
点灯小铭6 天前
基于单片机的智能家居门铃系统设计
单片机·嵌入式硬件·毕业设计·智能家居·课程设计·期末大作业
天泽恒晟8 天前
适老化到适我化—摄像头的选择
科技·信息可视化·生活·智能家居·交互