日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

智能家居(工厂模式)

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 智能家居(工厂模式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘自:智能家居
作者:LEO-max
發布時間: 2021-03-05 00:38:07
網址:https://blog.csdn.net/zouchengzhi1021/article/details/114375529?spm=1001.2014.3001.5502

目錄

    • 主流程設計框架及某一功能框架編寫
        • InputCommand.h框架
        • contrlDevices.h框架
        • bathroomLight.c框架
    • 四盞燈、火焰傳感器及主程序代碼(繼電器輸入控制)
        • bathroomLight.c
        • upstairLight.c
        • livingroomLight.c
        • restaurantLight.c
        • fire.c
        • mainPro.c
        • contrlDevices.h
    • 添加聲音識別模塊的串口讀取功能
        • voiceContrl.c
        • InputCommand.h
        • mainPro.c
    • 添加socket服務器功能
        • socketContrl.c
        • InputCommand.h
        • mainPro.c
    • 主程序代碼編寫,實現語音和網絡線程
        • socketContrl.c
        • voiceContrl.c
        • mainPro.c

主流程設計框架及某一功能框架編寫

頭文件:contrlDevices.hInputCommand.h 源文件:mainPro.cbathroomLight.cCamera.cfire.clivingroomLight.clock.crestaurantLight.csocketContrl.cupstairLight.cusartContrl.cvoiceContrl.c
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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; };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

contrlDevices.h框架

struct Devices {char devicesName[128];int status; //狀態int (*open)(); //打開int (*close)(); //關閉int (*devicesInit)(); //初始化int (*readStatus)(); //讀狀態int(*changeStatus)(int status); //改變狀態struct Devices* next; };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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} };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

四盞燈、火焰傳感器及主程序代碼(繼電器輸入控制)

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;} };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

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;} };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

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;} };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

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;} };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

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;} };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

mainPro.c

#include <stdio.h> #include <string.h> #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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

contrlDevices.h

#include <wiringPi.h> #include <stdlib.h>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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

添加聲音識別模塊的串口讀取功能

voiceContrl.c

#include "InputCommand.h" #include <wiringPi.h> #include <wiringSerial.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h>int voiceInit(struct InputCommander *voicer, char* ipAddress, char* port) {int fd;if ((fd = serialOpen(voicer->deviceName, 9600)) == -1) { //初始化串口,波特率9600exit(-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;} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

InputCommand.h

#include "InputCommand.h" #include <wiringPi.h> #include <wiringSerial.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h>int voiceInit(struct InputCommander *voicer, char* ipAddress, char* port) {int fd;if ((fd = serialOpen(voicer->deviceName, 9600)) == -1) { //初始化串口,波特率9600exit(-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;} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

mainPro.c

#include <stdio.h> #include <string.h> #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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

添加socket服務器功能

socketContrl.c

#include "InputCommand.h" #include <wiringPi.h> #include <wiringSerial.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h>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));*/// 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);// bindbind(s_fd, (struct sockaddr*) & s_addr, sizeof(struct sockaddr_in));//listenlisten(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;} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

InputCommand.h

#include <wiringPi.h> #include <stdlib.h>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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

mainPro.c

#include <stdio.h> #include <string.h> #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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

主程序代碼編寫,實現語音和網絡線程

socketContrl.c

#include "InputCommand.h" #include <wiringPi.h> #include <wiringSerial.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h>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));*/// 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);// bindbind(s_fd, (struct sockaddr*) & s_addr, sizeof(struct sockaddr_in));//listenlisten(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;} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91

voiceContrl.c

#include "InputCommand.h" #include <wiringPi.h> #include <wiringSerial.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h>int voiceInit(struct InputCommander* voicer, char* ipAddress, char* port) {int fd;if ((fd = serialOpen(voicer->deviceName, 9600)) == -1) { //初始化串口,波特率9600exit(-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;} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

mainPro.c

#include <stdio.h> #include <string.h> #include "contrlDevices.h" #include "InputCommand.h" #include <unistd.h> #include <pthread.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>//全局變量 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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191

總結

以上是生活随笔為你收集整理的智能家居(工厂模式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。