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

目录

  • 网络线程控制代码
    • inputCommand.h
    • mainPro.c
    • socketControl.c
  • 代码测试
  • 往期文章

网络线程控制代码

inputCommand.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>struct Command
{char commandName[128];						//“控制方式”名char deviceFilesName[128];					//存放初始化所需文件的路径char command[32];							//存放指令int fd;										//存放文件描述符(串口/网络)int (*Init)(struct Command *file);			//“初始化”函数指针int s_fd;									//存放服务器套接字描述符char ipAdress[32];							//存放 IP地址char port[12];								//存放端口号int (*getCommand)(struct Command *cmd);		//“获取指令”函数指针struct Command *next;
};struct Command *addSocketControlToCommandLink(struct Command *phead);		//“网络控制”加入指令链表函数声明

mainPro.c

#include <stdio.h>
#include <string.h>
#include "inputCommand.h"
#include <pthread.h>
#include <unistd.h>struct Command *findCommandByName(char *name,struct Command *phead);		//寻找链节函数声明
void *socketControlThread(void *data);			//“网络控制”线程函数声明
void *socketReadThread(void *data);				//“读取端口”线程函数声明struct Command *cmdhead = NULL;					//创建“指令”链表全局变量
struct Command *socketHandler = NULL;			//创建“链节处理”全局变量int main()
{cmdhead = addSocketControlToCommandLink(cmdhead);		//“网络控制”对象加入链表pthread_t socketControl_thread;pthread_create(&socketControl_thread,NULL,socketControlThread,NULL);	//创建“网络控制”线程pthread_join(socketControl_thread, NULL);		//主函数等待“网络控制”线程退出return 0;
}void *socketControlThread(void *data)				//“网络控制”线程
{int c_fd;											//文件描述符struct sockaddr_in c_addr;memset(&c_addr,0,sizeof(struct sockaddr_in));socklen_t clen = sizeof(struct sockaddr_in);pthread_t socketRead_thread;						//存放线程 IDsocketHandler = findCommandByName("socketControl",cmdhead);			//寻找并返回“网络控制”所处链节if(socketHandler == NULL){											//若找不到printf("find socketHandler error\n");pthread_exit(NULL);}if(socketHandler->Init(socketHandler) < 0){							//执行“网络控制”功能初始化函数printf("socketControl init error\n");pthread_exit(NULL);}while(1){//不断等待连接 只要有连接进来,就创建线程去对接c_fd = accept(socketHandler->s_fd,(struct sockaddr*)&c_addr,&clen);		//接收连接请求socketHandler->fd = c_fd;												//发送文件描述符pthread_create(&socketRead_thread,NULL,socketReadThread,NULL);			//创建“读取端口”线程 连接一个客户端就去对接 可接纳10个客户端}
}
//创建新线程:用于读取TCP端口指令
//只要有连接,就创建线程去对接。线程共用内存资源,同一时刻,所有设备只有一种状态。也可PV操作
//所有线程 只操控一个结构体 再新来一个线程(新手机客户端接入) 前一个客户端失效 因为c_fd被改了。fork()可实现多个客户端同时控制
//不过好像寄存器和内存不是完全同步的 可能缓存没改?还可以多个客户端同时控制?
//如果直接把socketReadThread()拿过来循环的话,则同时刻不能接受新的客户端接入了,因为循环卡在了socketReadThread()函数里面了//“读取端口”线程
void *socketReadThread(void *data)	//实际没传参			
{int nread;memset(socketHandler->command,'\0',sizeof(socketHandler->command));		//每次读取前,清空 “command(存放指令)”nread = read(socketHandler->fd,socketHandler->command,sizeof(socketHandler->command));		//读取客户端并存放到 “command”if(nread == 0){printf("No command received\n");}else{printf("Get command:%s\n",socketHandler->command);			//读取成功,打印数据}
}struct Command *findCommandByName(char *name,struct Command *phead)			//通过“名字”寻找链节函数
{struct Command *tmp = phead;if(phead == NULL){return NULL;}while(tmp != NULL){if(strcmp(name,tmp->commandName) == 0){return tmp;}tmp = tmp->next;}return NULL;
}

socketControl.c

#include "inputCommand.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>int socketControlInit(struct Command *file);						//“网络控制”功能初始化函数声明
struct Command *addSocketControlToLink(struct Command *phead);		//“网络控制”(对象)加入指令链表函数声明struct Command socketControl = {				//定义“网络控制”对象.commandName = "socketControl",				//名字.command = {'\0'},							//初始化储存“指令”的空间.Init = socketControlInit,					//指定“网络控制”功能初始化函数.ipAdress = "192.168.0.19",				    //树莓派 IP地址.port = "8088",								//打开的端口号
};int socketControlInit(struct Command *file)
{int s_fd;											//套接字描述符struct sockaddr_in s_addr;memset(&s_addr,0,sizeof(struct sockaddr_in));s_fd = socket(AF_INET,SOCK_STREAM,0);				//创建套接字if(s_fd == -1){										//若创建套接字失败perror("socketControl error");exit(-1);}s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(file->port));inet_aton(file->ipAdress,&s_addr.sin_addr);if(bind(s_fd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr_in)) == -1){		//套接字与端口号绑定perror("bind error");exit(-1);}if(listen(s_fd,10) == -1){							//打开监听perror("listen error");exit(-1);}file->s_fd = s_fd;									//发送套接字描述符
}struct Command *addSocketControlToCommandLink(struct Command *phead)		//“网络控制”(对象)加入指令链表函数
{if(phead == NULL){return &socketControl;}else{socketControl.next = phead;phead = &socketControl;return phead;}
}

代码测试

手机下载网络调试助手,和树莓派连入同一个WIFI,输入树莓派IP地址以及端口号,发送消息:Today is 520,树莓派接收消息成功。

在这里插入图片描述

在这里插入图片描述

往期文章

智能家居 (1) ——智能家居整体功能框架
智能家居 (2) ——设计模式的引入
智能家居 (3) ——工厂模式继电器控制灯
智能家居 (4) ——工厂模式火焰报警
智能家居 (5) —— LD3320语音模块二次开发
智能家居 (6) ——语音识别线程控制
智能家居 (7) ——网络服务器线程控制
智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)
网络编程知识预备(1) ——了解OSI网络模型
网络编程知识预备(2) ——浅显易懂的三次握手与四次挥手
网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系
网络编程知识预备(4) ——了解HTTP协议与HTTPS协议
网络编程知识预备(5) ——libcurl库简介及其编程访问百度首页
智能家居 (9) ——人脸识别摄像头安装实现监控功能
智能家居 (10) ——人脸识别祥云平台编程使用
智能家居 (11) ——树莓派摄像头捕捉人脸并识别
智能家居 (12) ——人脸识别整合到智能家居系统
智能家居 (13) ——智能家居加入手机app端控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue插槽面试题_关于前端Vue框架的面试题,面试官可能会问到哪些。?

这年头&#xff0c;程序员面试都讲究坐姿&#xff0c;姿势不对&#xff0c;努力白费。参照下图&#xff0c;请同学们对号入座。回想一下&#xff0c;自己平时面试的坐姿&#xff0c;你在面试官眼里&#xff0c;大概是什么形象&#xff0c;可能是工程师&#xff0c;也可能是键盘…

测绘软件使用心得

作为测绘工程专业来说&#xff0c;学习使用测绘软件是每一个学生的必修课。在学校我们主要学习autoCAD和南方CASS。 对于CAD是目前使用最广泛的设计软件&#xff0c;广泛应用于建筑&#xff0c;机械&#xff0c;测绘设计等工作。我们主要学习了如何使用CAD来绘制基本图形。在画…

shell 脚本编程之for语句、if语句(2 )

一、bash条件测试&#xff1a;整数测试 [ expression ]字符测试 expression 条件测试 test expression test 根据表达式求值的结果返回 0&#xff08;真&#xff09;或 1&#xff08;假&#xff09;1、整数测试&#xff1a;数值比较-gt 大于-ge 大于或等于-eq…

龙芯3A4000 VNC配置

安装 yum install tigervnc-server -y 拷贝配置文件 cp /lib/systemd/system/vncserver\.service /lib/systemd/system/vncserver:1.service修改配置文件 vim /lib/systemd/system/vncserver:1.service替换< USER>为用户名 配置、启动vnc systemctl enable vncs…

智能家居 (6) ——语音识别线程控制

目录语音识别线程控制代码inputCommand.hmainPro.cvoiceControl.c代码测试往期文章语音识别线程控制代码 inputCommand.h #include <stdio.h> #include <stdlib.h> #include <string.h> #include <wiringPi.h> #include <wiringSerial.h>struc…

java程序设计精编教程第3版电子版课后答案_[java电子书] Java程序设计教程(第3版) PDF 电子书 百度云 网盘下载...

java自学网(www.javazx.com)-java论坛&#xff0c;java电子书推荐&#xff1a;《 Java程序设计教程(第3版)》- d5 C7 V4 o/ e/ Hjava电子书推荐理由&#xff1a;《Java程序设计教程(第3版普通高等教育十二五*规划教材)》讲解Java程序设计知识及其编程方法&#xff0c;包括Java语…

MIPS结构体传参

本文讲解了C语言运行在MIPS体系中结构体传参的情况 硬件平台&#xff1a;Loongson 3A3000 系统&#xff1a;uos 在《see MIPS run》中11.2.5中描述到&#xff0c;会将结构体成员压缩到各个arg寄存器中进行传递 “we have to pack the register with data to mimic the arran…

智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)

目录mainPro.c&#xff08;主函数&#xff09;指令工厂inputCommand.hvoiceControl.c&#xff08;语音控制&#xff09;socketControl.c&#xff08;网络线程&#xff09;控制工厂contrlEquipments.hbathroomLight.c&#xff08;浴室灯&#xff09;secondfloorLight.c&#xff…

mpu 配置内存空间_ARM存储器之:存储保护单元MPU

本文引用地址&#xff1a;http://www.eepw.com.cn/article/257010.htm15.4.2内存访问顺序当ARM处理器产生一个内存访问信号时&#xff0c;内存保护单位MPU将负责检查要访问的地址是否在被定义的域中。①如果地址不在任何域中&#xff0c;存储器产生异常。如果内核预取指令则MPU…

对象创建过程之二(类加载器)

2019独角兽企业重金招聘Python工程师标准>>> JAVA为我们提供了两种动态加载机制。 第一种是隐式机制。其实new一个对象和调用类的静态方法时&#xff0c;就是隐式机制在工作。 第二种是显示机制。显示的机制又有两种策略 第一种是用public static Class<?> …

Python_堆栈和队列

堆栈和队列 (1)堆栈&#xff0c;新放进去的先取出 #encodingutf-8 >>> stack [3, 4, 5] >>> stack.append(6) >>> stack.append(7) >>> print (stack) [3, 4, 5, 6, 7] >>> print (stack.pop()) 7 >>> print (stack) […

智能家居 (10) ——人脸识别祥云平台编程使用(编译libcurl库支持SSL,安装SSL依赖库libssl、libcrypto)

目录说明人工智能OCR识别平台介绍人脸识别接口购买编程打通OCR后台实现人脸识别&#xff08;ubuntu上实现&#xff09;问题发现编译libcurl库支持SSL安装SSL依赖库openSSL(使用工具wget)curl库重新配置&#xff0c;编译&#xff0c;安装开启SSL后重新编译人脸识别.C文件传入图片…

解决Centos 7 VNC黑屏

在配置Centos 7下VNC时发现root用户可以正常登陆VNC桌面&#xff0c;而普通用户VNC桌面黑屏&#xff0c;分析~/.vnc/xstarup 后发现是普通用户没有执行/etc/X11/xinit/xinitrc的权限 #!/bin/shunset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS /etc/X11/xinit/xinitrc #…

MFC控件(7):Split Button

VS2008中可以看到MFC有一个叫Split Button的控件,要想看它的效果,瞧下QQ那聊天窗口的"发送", "消息记录"这两个按钮就知道了.实际上就是还有点像Combo Box了.不过它的实现应该是button加menu.所以它的消息处理可以分开成button的处理和menu的处理 往dialog…

srs 服务关闭命令_【经验总结】如何做到网络版工作站与服务器时间同步?

随着行业发展&#xff0c;越来越多的实验室色谱数据工作站由原来的单机版&#xff0c;升级为网络版。升级后带来的益不必多说&#xff0c;那么升级带来的困难你遇到过吗&#xff1f;快来跟小析姐一起看看牛人是如何解决问题的吧。最近公司将色谱工作站进行了升级&#xff0c;采…

oss图片尺寸调用方式_是时候来一场轰轰烈烈的OSS升级了

【摘要】伴随5G和云网部署的持续推进&#xff0c;运营商OSS升级建设都已经在不断加速。| 科 | 技 | 杂 | 谈 |中国通信行业第一自媒体【1】运营商的IT支撑系统&#xff0c;正迫切需要新一轮的调整转型。今天&#xff0c;中国移动在2020全球合作伙伴大会上宣布&#xff0c;全球最…

由C过渡到C++-入门知识点

从C语言过渡到C&#xff0c;这些知识点应该是比较重要的。 目录 第一个C程序名称空间特性coutcin 缺省参数重载提问&#xff1a;为什么C语言不支持重载而C支持 引用常引用 引用与函数返回值对于指针和引用的区别引用的底层实现两者在语法上两者在物理上两者的不同之处 内联函数…

gdb pwndbg插件安装

环境&#xff1a; gdb 9.2ubuntu 20(x64) 连接 pwndbggdb9.2gdb9.2网盘连接 密码: kaq4GDB中文教程 编译gdb 由于发行的gdb比较老&#xff0c;pwndbg建议使用高版本GDB&#xff0c;因此我们下载最新的GDB9.2 安装依赖 #apt install texinfo解压GDB,卸载自带GDB #tar -vxf…

Android--UI之DatePicker、TimePicker...

前言 这一篇博客分别讲解Android平台下&#xff0c;关于日期和时间的几个相关控件。包括DatePicker&#xff08;日期选择控件&#xff09;、TimePicker&#xff08;时间选择控件&#xff09;、DatePickerDialog&#xff08;日期选择对话框&#xff09;、TimePickerDialog&#…

DPDK 18 log日志系统使用

概述&#xff1a; DPDK 日志系统分为1-8个等级&#xff0c;在lib/librte_eal/common/include/rte_log.h文件中定义&#xff0c;每个DPDK模块都可以定义一个预设日志输出等级&#xff0c;只有日志输出语句的等级小于等于预设输出等级才能被输出。 以下为dpdk对日志的分级&…