智能家居(4) —— 网络服务器线程控制

目录

网络线程控制代码

mainPro.c

inputCommand.h

socketControl.c

测试结果


网络线程控制代码

mainPro.c

#include 
#include "controlDevice.h"
#include "inputCommand.h"

struct InputCommand *pcommandHead = NULL;				              //定义指令工厂初始链表头
struct InputCommand *socketHandler = NULL;

void *socketReadThread(void *data)				//“读取tcp端口指令线程”执行的函数
{
    int n_read;
    printf("Connect success\n");
    while(1){
        memset(socketHandler->command,'\0',sizeof(socketHandler->command));
        n_read=read(socketHandler->fd,socketHandler->command,sizeof(socketHandler->command));
        if(n_read == -1){
            perror("read:");
        }else{
            printf("Get SocketCommand-->%s\n",socketHandler->command);
        }
    }
}


void *socketControlThread(void *data)           //“网络控制线程”执行的函数
{   
    int c_fd;                           //文件描述符
    struct sockaddr_in c_addr;
    memset(&c_addr,0,sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);

    pthread_t socketRead_thread; //线程里面套线程,网络连接后信息通信

    socketHandler =  findCommandByName("socket", pcommandHead);

    if(socketHandler == NULL){
        printf("find socketHandler error\n");
        pthread_exit(NULL);
    }
    if(socketHandler->Init(socketHandler) < 0){   //“网络控制”功能初始化
        printf("socketControl init error\n");
        pthread_exit(NULL);
    }else{
        printf("socketControl init success\n");
    }
    while(1){
        //4.accept
		c_fd = accept(socketHandler->s_fd,(struct sockaddr *)&c_addr,&clen);	//接收连接请求,阻塞至有客户端完成三次握手
		socketHandler->fd = c_fd;					                            //将套接字描述符返回给“网络控制”链表节点
		pthread_create(&socketRead_thread,NULL,socketReadThread,NULL);			//创建新线程:用于读取TCP端口指令
    }
}


int main()
{
  
    if (wiringPiSetup () == -1) { 
        fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; 
        return 1 ; 
    }

	pthread_t socketControl_thread;

    //指令工厂初始化
    pcommandHead = addSocketControlToInputCommandLink(pcommandHead);
     
    pthread_create(&socketControl_thread,NULL,socketControlThread,NULL);

	pthread_join(socketControl_thread, NULL);		//主函数等待线程退出

    return 0;
}

inputCommand.h

#include 
#include 
#include 
#include 
#include 
#include       
#include 
#include 
#include 
#include 
#include 

struct InputCommand
{
    char commandName[128];                              //“控制方式”名
    char deviceName[128];               
    char command[32];                                   //存放指令
    int fd;                                             //存放文件描述符(串口/网络)
    int s_fd;									        //存放服务器套接字描述符
    char port[12];								        //存放端口号
    char ipAdress[32];							        //存放 IP地址
    char log[1024];                                     //日志
    int (*Init)(struct InputCommand *voice);            //“初始化”函数指针
    int (*getCommand)(struct InputCommand *voice);      //“获取指令”函数指针


    struct InputCommand *next;
};

struct InputCommand* addSocketControlToInputCommandLink(struct InputCommand *phead);

socketControl.c

#include "inputCommand.h"

int socketInit(struct InputCommand *socketMsg)
{
    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);             //创建套接字,ipv4 tcp协议
	if(s_fd == -1){                                 //若创建套接字失败
		perror("socket:");
		exit(-1);
	}

    s_addr.sin_family = AF_INET;                        //ipv4
	s_addr.sin_port = htons(atoi(socketMsg->port));     //端口号,选择5000以上。honts返回网络字节序,atoi(argv[2])防止端口被占用
	inet_aton(socketMsg->ipAdress,&s_addr.sin_addr);    //转换为网络能识别的格式

    //2.bind
	bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

    //3.listen
	listen(s_fd,10);//监听10个连接
    printf("socket Server listening ...\n");

    socketMsg->s_fd = s_fd;						    //发送套接字描述符
    return s_fd;
}


struct InputCommand socketControl = {
    .commandName = "socket",
    .command = '\0',
    .port = "8080",
    .ipAdress = "192.168.3.77",
    .Init = socketInit,
    .log = {'\0'},
    .next = NULL
};

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

测试结果

智能家居(4) —— 网络服务器线程控制_第1张图片

 智能家居(4) —— 网络服务器线程控制_第2张图片

智能家居项目目录

智能家居(1) —— 工厂模式引入&工厂模式实现继电器控制

智能家居(2) —— 工厂模式实现烟雾报警

智能家居(3) —— 串口通信(语音识别)线程控制

智能家居(4) —— 网络服务器线程控制

智能家居(5) —— 智能家居项目整合(语音控制线程,网络控制线程、烟雾报警线程)

网络编程知识预备(1) —— 7层OSI网络模型

网络编程知识预备(2) —— 三次握手与四次挥手、半连接状态、2MSL

网络编程知识预备(3) —— TCP流量控制(滑动窗口)、拥塞控制

网络编程知识预备(4) —— SOCKET、TCP、HTTP之间的区别与联系

网络编程知识预备(5) —— 了解应用层的HTTP协议与HTTPS协议

网络编程知识预备(6) —— libcurl库简介及其编程访问百度首页

智能家居(6) —— 香橙派摄像头安装实现监控功能

智能家居(7) —— 人脸识别 & 翔云平台编程使用(编译openSSL支持libcurl的https访问、安装SSL依赖库openSSL)

智能家居(8) —— 香橙派摄像头加入设备工厂

你可能感兴趣的:(【Linux智能家居】,智能家居,linux,网络)