智能家居(3)---socket网络控制线程封装

这篇具有很好参考价值的文章主要介绍了智能家居(3)---socket网络控制线程封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

封装socket网络线程实现对智能家居中各种灯光的控制
main.Pro(主函数)

#include <stdio.h>
#include "controlDevice.h"
#include "inputCommand.h"
#include <pthread.h>


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

struct Devices* findDeviceByName(struct Devices *phead,char *name)          //在设备链表中查找设备
{
    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* read_pthread(void *data)                              //socket获取命令线程处理函数
{
    int n_read;
    while(1){
        memset(socketHander->command,0,sizeof(socketHander->command));
        n_read = read(socketHander->c_fd,socketHander->command,sizeof(socketHander->command));
        if(n_read < 0){
            perror("read");
        }else if(n_read > 0){
            printf("get %d message-->: %s",n_read,socketHander->command);
            doCommand(socketHander);                          //执行命令
        }else{
            printf("client quit\n");
            close(socketHander->c_fd);
            pthread_exit(NULL);
        }

    }
}


void* socket_pthread(void *data)                        //socket控制线程处理函数
{
    int c_fd;
    pthread_t read_pth;
    
    struct sockaddr_in c_addr;
    memset(&c_addr,0,sizeof(struct sockaddr_in));
    socklen_t c_len = sizeof(c_addr);
    
    socketHander = findCommanderByName(pcommandHead,"socketServer");
    if(socketHander == NULL){
        printf("find socketServer error\n");
        pthread_exit(NULL);
    }

    if(socketHander->Init(socketHander) < 0){
        printf("socket init error\n");
        pthread_exit(NULL);
    }else
        printf("%s init success\n",socketHander->commandName);

    while(1){
        c_fd = accept(socketHander->s_fd,(struct sockaddr *)&c_addr,&c_len);
         if(c_fd == -1){
		    perror("accept");
	    }else
            printf("get connect: %s\n",inet_ntoa(c_addr.sin_addr));
        
        socketHander->c_fd = c_fd;
        pthread_create(&read_pth,NULL,read_pthread,NULL);

    }



}


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

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


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

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

   
    //3.线程池建立
	//3.2socket线程
    ret = pthread_create(&socket_pth,NULL,socket_pthread,NULL);
    if (ret != 0) {
        printf("Failed to create socketthread.\n");
        return -1;
    }

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

    

	return 0;
}

inputCommand.h(控制类)

#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 *addSocketToCommandLink(struct InputCommander *phead);        //socket控制加入命令控制链表

socketControl.c(socket)文章来源地址https://www.toymoban.com/news/detail-648152.html

#include "inputCommand.h"

int socketInit(struct InputCommander *socketMes)
{
    int s_fd;//服务端

    struct sockaddr_in s_addr;
    memset(&s_addr,0,sizeof(struct sockaddr_in));

    //1.socket
    s_fd = socket(AF_INET,SOCK_STREAM,0);                                   //创建套接字
	if(s_fd == -1){
		perror("socket");
		exit(-1);
	}

    //2.bind
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(atoi(socketMes->port));                         //将主机字节序的端口号转换为网络字节序
    inet_aton(socketMes->ipAddress,&(s_addr.sin_addr));                     //转换ip地址为网络字节序
    bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));       //绑定相关的网络信息,如ip地址和端口号

    //3.listen
	listen(s_fd,10);//监听,可连接10个客户端 
    printf("socket Server listen success......\n");
    socketMes->s_fd = s_fd;
    
    return s_fd;


}


struct InputCommander socketControl = {
    .commandName = "socketServer",
    .command = {0},
    .port = "8090",
    .ipAddress = "192.168.31.227",
    .Init = socketInit,
    .getCommand = socketGetCommand,
    .log = {0},
    .next = NULL,

};

struct InputCommander *addSocketToCommandLink(struct InputCommander *phead)
{
    if(phead == NULL){
        return &socketControl;
    
    }else{
        socketControl.next=phead;
        phead = &socketControl;
        return phead;
    }
}

到了这里,关于智能家居(3)---socket网络控制线程封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 智能家居---工厂模式实现灯光控制(继电器组)以及火灾报警模组的封装

    采用工厂模式以面向对象的方式来封装各种设备模块,方便整合项目以及后期的维护和扩展 mainPro.c(主函数) controlDevice.h( 设备类) bathroomLight.c(浴室灯) livingroomLight.c(客厅灯) restaurantLight.c(餐厅灯) beedroomLight(卧室灯) fire.c(火灾检测) beep.c(和火灾检测配合实现火灾报警的蜂鸣

    2024年02月13日
    浏览(30)
  • 智能家居(1)---工厂模式实现灯光控制(继电器组)以及火灾报警模组的封装

    采用工厂模式以面向对象的方式来封装各种设备模块,方便整合项目以及后期的维护和扩展 mainPro.c(主函数) controlDevice.h( 设备类) bathroomLight.c(浴室灯) livingroomLight.c(客厅灯) restaurantLight.c(餐厅灯) beedroomLight(卧室灯) fire.c(火灾检测) beep.c(和火灾检测配合实现火灾报警的蜂鸣

    2024年02月13日
    浏览(30)
  • 【智能家居】6、语音控制及网络控制代码实现

    这个结构体定义了一个命令输入的模型。在这个模型中,包含以下几个部分: cmdName: 一个长度为128的字符串,用于存储命令名称。 dvicesName: 一个长度为128的字符串,用于存储设备名称。 cmd: 一个长度为32的字符串,用于存储具体的命令。 Init: 一个函数指针,该函数接受

    2024年02月19日
    浏览(34)
  • 智能家居(13)——智能家居控制系统

    灯光的控制:模拟客厅灯、餐厅灯、二楼灯、卫生间灯。灯光可以通过手机App、语音、控制开关。 家内发生火灾后报警功能。 温湿度检测通过服务器上传到手机App。 摄像头安全监控,将视频上传到手机App,并通过摄像头实现人脸识别智能开锁。 灯光通过普通IO口控制,自己

    2024年02月11日
    浏览(39)
  • 基于智能家居控制器的智能家居智能化控制:基于强化学习技术

    引言 1.1. 背景介绍 随着科技的发展,智能家居逐渐成为人们生活中不可或缺的一部分。智能家居通过引入各种智能化设备,如智能门锁、智能照明、智能空调等,使人们的生活更加便捷、舒适。然而,智能家居的复杂性导致用户在控制过程中面临诸多困难,如操作复杂、界面

    2024年02月11日
    浏览(36)
  • 语音识别智能家居控制设计

    目录 一、方案流程及技术规格书设计 二、系统硬件电路设计 三、软件编写及调试 四、系统调试测试与分析 前言       随着科学技术的快速发展,人们对生活品质的要求也不断提高,开始追求更好更方便的生活方式。因此,智能家居系统应运而生。智能家居控制系统(sma

    2024年02月03日
    浏览(39)
  • LabVIEW智能家居控制系统

    LabVIEW智能家居控制系统 介绍了一个基于LabVIEW的智能家居控制系统的开发过程。该系统利用LabVIEW软件与硬件设备相结合,通过无线网络技术实现家居环境的实时监控与控制,提升居住舒适度和能源使用效率。 项目背景:随着科技的发展和生活水平的提高,智能家居系统越来

    2024年02月21日
    浏览(36)
  • 智能家居控制系统:让生活更智能、更便捷

    智能家居控制系统是一种集成了智能化技术的家居系统,通过连接各种智能设备和传感器,实现远程控制、自动化管理和智能化服务,让生活更智能、更便捷。以下是关于智能家居控制系统的几个方面的分点论述: 智能家居控制系统可以通过手机App或者互联网实现远程控制家

    2024年02月20日
    浏览(31)
  • 别墅智能家居控制系统解决方案

    别墅智能家居控制系统解决方案 如果说建筑是凝固的音乐,那么完美的智能家居控制系统则是这首乐曲上绝妙的音符。在科技发达、物质富庶的今天,自控系统已不单纯是实现室内基本安防、照明、采暖的工具,而且是建筑装饰的一种实用艺术品,是自动化技术与建筑艺术的

    2024年02月15日
    浏览(35)
  • 基于物联网的智能家居控制系统设计

    智能家居,一种以住宅为平台,利用综合布线技术,网络通讯技术,安防技术,自动化控制技术,以及语音控制技术,具有很高的学习价值,同时作文毕业设计也是不错的选择。 对于家庭智能家居系统,通信范围较短,因此蓝牙或 WIFI 等较短距离通信方式可能更合适。在带宽

    2024年03月24日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包