智能家居(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;
    }
}
相关推荐
技术支持者python,php10 天前
MQTT通讯:物联网
物联网·智能家居
深圳市尚想信息技术有限公司11 天前
UL/CE双认证!光宝MOC3052-A双向可控硅输出光耦 智能家居/工业控制必备!
智能家居·工业控制·光宝·驱动光耦·输出光耦
根号三加载成功12 天前
物联网控制器:一台顶N台!路由器、PLC控制器、网关、工控机……
物联网·云计算·智能家居·工业自动化
Smartlabs13 天前
Matter协议开发者指南:使用Matter SDK构建智能家居应用
智能家居·matter·matter方案·matter协议
华普微HOPERF14 天前
让温度“说话”,数字温度传感器如何智能感知温度?
科技·单片机·嵌入式硬件·物联网·智能家居
花开月满西楼16 天前
Android实例项目【智能家居系统】实现数据库登录注册+动画效果+网页跳转+短信发送!!!
android·数据库·智能家居
华一精品Adreamer16 天前
定制平板在智能家居中能做些什么?全面解析其核心功能
智能家居·平板
13631676419侯21 天前
ESP32-C3FH4X—低功耗、高集成度的 MCU 系统级芯片 (SoC)
嵌入式硬件·智能家居·芯片
riveting21 天前
明远智睿SD2351核心板:边缘计算时代的工业级核心引擎深度解析
人工智能·功能测试·音频·智能家居·边缘计算·智能硬件
深圳市青牛科技实业有限公司 小芋圆24 天前
GC1809:高性能音频接收与转换芯片
科技·单片机·嵌入式硬件·音视频·智能家居·新能源