多路温度采集控制系统(7)网络采集

2024-04-18 04:18

本文主要是介绍多路温度采集控制系统(7)网络采集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

嵌入式项目实践–多路温度采集控制系统(7)网络采集

主控程序服务端

每响应一个新的客户请求,就创建一个线程。

pthread_create(&pth,NULL,client_pro,(void*)&new_fd);

通过全局变量,管理客户端连接数。

net_user++;

从客户端接收数据

    while(1){len = recv(fd,data,1,0);if(len==0 || len==-1){net_user--;close(fd);g_dev->status[index] = 0;pthread_exit("0");}else{g_dev->temp_data[index]= data[0];}          sleep(1);}

PC机客户端

定时向服务端发送模拟的温度数据。

while(1){sleep(2);data[0]=rand()%100;//模拟产生温度数据if((nread=send(sockfd,data,1,0))==-1){printf("send error\n");break;}else{//printf("%x,%x\n",data[0],data[1]);    }               }

网络采集程序代码

头文件

#ifndef __TC9000_NET_H_
#define __TC9000_NET_H_#define  DEF_PORT_8848  8848int socket_init(int port);//网络初始化
void* client_pro(void* arg);//响应网络客户线程
void* net_pro(void* arg);//服务端处理线程#endif

网络线程

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <pthread.h>   #include "config.h"
#include "net_pro.h"int net_user;//网络接入数
extern int g_net_port;//引用网络端口
extern struct st_sys g_dev[1]; //引用系统配置结构体全局变量int socket_init(int port)
{int sockfd;struct sockaddr_in server_addr;if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){fprintf(stderr,"Socket error:%s\n\a",strerror(errno));exit(1);}printf("socket...\n");bzero(&server_addr,sizeof(struct sockaddr_in));server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(g_net_port);if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1){fprintf(stderr,"Bind error:%s\n\a",strerror(errno));exit(1);}printf("bind...\n");if(listen(sockfd,10)==-1){fprintf(stderr,"Listen error:%s\n\a",strerror(errno));exit(1);}printf("listen...\n");return sockfd;
}void* client_pro(void* arg)
{float temp;int fd,*p;int index = net_user+1;int len;unsigned char data[4];        p=(void*)arg;fd = *p;g_dev->status[index] = 1;while(1){len = recv(fd,data,1,0);if(len==0 || len==-1){net_user--;close(fd);g_dev->status[index] = 0;pthread_exit("0");}else{g_dev->temp_data[index]= data[0];}           sleep(1);}
}void* net_pro(void* arg)
{pthread_t pth;int sockfd,new_fd,sin_size;struct sockaddr_in client_addr;     printf("net server pthread start...\n");        sockfd = socket_init(DEF_PORT_8848);      printf("sockfd=%d\n",sockfd);      while(1){printf("accept before...\n");   sin_size=sizeof(struct sockaddr_in);        new_fd=accept(sockfd,(struct sockaddr*)(&client_addr),&sin_size);if(new_fd==-1){fprintf(stderr,"Accpet error:%s\n\a",strerror(errno));pthread_exit("0");}               fprintf(stderr,"Sever from %s\n",inet_ntoa(client_addr.sin_addr));          if(net_user<2){     pthread_create(&pth,NULL,client_pro,(void*)&new_fd);net_user++;}}
}

网络客户端程序

功能:模拟数据采集,通过随机数产生温度数据。

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<fcntl.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>int main(int argc, char *argv[])
{int port;int sockfd,nread;struct sockaddr_in server_addr;unsigned char data[5];  if(argc < 3){printf("please input server IP,PORT.\n");   exit(0);}port = atoi(argv[2]);if(port<1024){printf("port error\n"); exit(0);}       if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));exit(1);}bzero(&server_addr,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(port);server_addr.sin_addr.s_addr=inet_addr(argv[1]);if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1){fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));exit(1);}while(1){sleep(2);data[0]=rand()%100;//模拟产生温度数据if((nread=send(sockfd,data,1,0))==-1){printf("send error\n");break;}else{//printf("%x,%x\n",data[0],data[1]);    }               }close(sockfd);exit(0);
}

这篇关于多路温度采集控制系统(7)网络采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913743

相关文章

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

WordPress网创自动采集并发布插件

网创教程:WordPress插件网创自动采集并发布 阅读更新:随机添加文章的阅读数量,购买数量,喜欢数量。 使用插件注意事项 如果遇到404错误,请先检查并调整网站的伪静态设置,这是最常见的问题。需要定制化服务,请随时联系我。 本次更新内容 我们进行了多项更新和优化,主要包括: 界面设置:用户现在可以更便捷地设置文章分类和发布金额。代码优化:改进了采集和发布代码,提高了插件的稳定

小红书商家电话采集软件使用指南

使用小红书商家电话采集软件可以提高商家电话的采集效率,以下是使用指南及附带代码。 步骤一:安装Python和相关库 首先,确保你的电脑已经安装了Python运行环境(建议安装Python3版本)。安装完成后,同样需要安装一些相关的库,如requests、beautifulsoup4等。在命令行窗口中输入以下命令进行安装: pip install requestspip install bea

温湿度采集及OLED显示

目录 软件I2C和硬件I2C每隔2秒钟采集一次温湿度数据,显示到OLED上,同时通过串口发送到上位机的“串口助手”软件 软件I2C和硬件I2C "I2C"代表Inter-Integrated Circuit,是一种用于在数字电路之间进行通信的串行通信协议。软件I2C和硬件I2C是两种实现这种协议的方式。 软件I2C是通过软件来模拟I2C通信协议的实现方式。在这种情况下,微控制

使用 GoPhish 和 DigitalOcean 进行网络钓鱼

配置环境 数字海洋VPS 我创建的丢弃物被分配了一个 IP 地址68.183.113.176 让我们登录VPS并安装邮件传递代理: ssh root@68.183.113.176apt-get install postfix 后缀配置中的点变量到我们在 DigitalOcean 中分配的 IP:mynetworks nano /etc/postfix/main.cf

Linux网络编程之循环服务器

1.介绍 Linux网络循环服务器是指逐个处理客户端的连接,处理完一个连接后再处理下一个连接,是一个串行处理的方式,比较适合时间服务器,DHCP服务器.对于TCP服务器来说,主要阻塞在accept函数,等待客户端的连接。而对于UDP服务器来说,主要阻塞在recv函数. 2.循环服务器模型 TCP循环服务器: 算法如下:          socket(...);

Linux网络编程之简单并发服务器

1.概念 与前面介绍的循环服务器不同,并发服务器对服务请求并发处理。而循环服务器只能够一个一个的处理客户端的请求,显然效率很低. 并发服务器通过建立多个子进程来实现对请求的并发处理,但是由于不清楚请求客户端的数目,因此很难确定子进程的数目。因此可以动态增加子进程与事先分配的子进程相结合的方法来实现并发服务器。 2. 算法流程 (1)TCP简单并发服务器:     服务器子进程1: