小车远程监控系统-课程设计.doc_第1页
小车远程监控系统-课程设计.doc_第2页
小车远程监控系统-课程设计.doc_第3页
小车远程监控系统-课程设计.doc_第4页
小车远程监控系统-课程设计.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告(2016/2017学年 第一学期)题 目:小车远程监控系统 专 业计算机科学与技术学 生 姓 名孙烨班 级 学 号B13040402指 导 教 师邹志强指 导 单 位计算机学院、软件学院日 期2017.01.03-01.12指导教师成绩评定表学生姓名班级学号专业计算机科学与技术评分内容评分标准优秀良好中等差平时成绩认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事设计成果设计的科学、合理性功能丰富、符合题目要求 界面友好、外观漂亮、大方程序功能执行的正确性程序算法执行的效能设计报告设计报告正确合理、反映系统设计流程文档内容详实程度文档格式规范、排版美观验收答辩简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。评分等级指导教师简短评语指导教师签名日期2017-01-12备注评分等级有五种:优秀、良好、中等、及格、不及格小车远程监控系统一、 课题内容和要求服务器端: 1、利用linux C实现服务器; 2、服务器端使用多进程实现多客户网络服务; 3、服务器多个进程之间需要使用IPC通信(进程间通信);客户端: 1、在linux C下实现网络客户端;为了实现同时读阻塞的键盘和阻塞的网络,要求使用多路IO实现同时阻塞的读键盘和读网络。服务器客户端的网络通信:这里要求采用TCP协议进行通信,实现所要求的S/C模式,并且要求实现多客户服务。二、需求分析服务器端:1、服务器端利用随机数模拟向串口读取传感数据,需要模拟的传感数据要求有:温度、湿度、光照。2、服务器利用网络接收客户端发送过来的设备控制信号,通过写驱动,实现对底层硬件的控制,这里使用打印显示的方式模拟。3、在进程之间IPC通信时,要求使用文件锁或信号量实现资源保护。客户端:1、客户端能够通过网络通信实现接收服务器端传输过来的传感数据,并将传感数据打印到屏幕上显示。2、客户端能够从键盘输入控制信号,并且通信将控制信号发送给服务器。3、客户端要求实现控制信号有,开灯、关灯,开空调、关空调、开启小车、停小车等。 三、概要设计SocketsocketbindlistenconnectaccpetWrite,readWrite,readbind 服务器客户端四、详细设计 (格式:宋体,4号,加粗,两端对齐)各个算法实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。头文件(cs.h)Times New Rxoman#include #include #include #include #include #include #include #include #include #include #include #include #define SER_PORT 5010#define SER_IP 127.0.0.1#define MAX_SIZE 2048#define MAX_CONNECT 20 /最大可连接的客户端数量#define CHPTH_COUNT 3#define PTH_EIXT 1int skfd = 0;int cfd = 0;int ret = 0;void err_fun(const char *const file_name, int line, const char *const fun_name, int err_no) fprintf(stderr, %s %d %s: %sn, file_name, line, fun_name, strerror(err_no); exit(-1);void signal_fun(int a)int ret = shutdown(skfd, SHUT_WR);if(ret 0) err_fun(_FILE_, _LINE_, shutdown, errno);printf(nShuts Down!n);exit(0);struct global_vachar pth_exit_flag;pthread_mutex_t mutex;glb_va = 0, PTHREAD_MUTEX_INITIALIZER;struct pthread_argint fd;pthread_t pthid;int pthnum;客户端代码:#include cs.hint main(void)char data_sendMAX_SIZE=0;char data_recvMAX_SIZE=0;struct sockaddr_in s_addr = 0;int flag=0;skfd = socket(PF_INET, SOCK_STREAM, 0);/* 创建一个套接字文件,返回一个用于监听用客户上线用的文件描述符 * 参数1:域(协议族) */if(skfd 0) err_fun(_FILE_, _LINE_, socket, errno); s_addr.sin_family = AF_INET;s_addr.sin_port = htons(SER_PORT);s_addr.sin_addr.s_addr = inet_addr(SER_IP);ret = connect(skfd, (struct sockaddr *)&s_addr, sizeof(s_addr);if(ret );scanf(%s,data_send);flag=atoi(data_send);if(flag6|flag0)/*值域判断*/printf(输入错误,请重新输入。n);else ret = write(skfd, data_send, MAX_SIZE);if(ret 0) err_fun(_FILE_, _LINE_, write error, errno);ret = read(skfd,data_recv,MAX_SIZE);if(ret %sn, data_recv);memset(data_send, 0, MAX_SIZE);memset(data_recv, 0, MAX_SIZE);sleep(1.5);return 0;服务器端:#include cs.hint count_client= 0; /存储当前的客户端数量static void pthread_fun(void * cfd)count_client+;int tempfd= 0;int i_recvBytes;char data_recvMAX_SIZE=0;char data_send MAX_SIZE=0;strcpy(data_send, 已执行操作);struct pthread_arg *p = (struct pthread_arg *)cfd;int fd = p-fd;while(1)printf(n等待请求.n);if(glb_va.pth_exit_flag = PTH_EIXT) pthread_mutex_unlock(&glb_va.mutex);break;i_recvBytes = read(fd,data_recv,MAX_SIZE);if(i_recvBytes = 0) printf( 客户 %d 下线n,fd-3);break;if(i_recvBytes = -1)fprintf(stderr,读错误!n);break;printf(从客户 :%d t收到控制序号 %sn,fd-3,data_recv);if(strcmp(data_send,quit) = 0) printf(拒绝请求!n);break;pthread_mutex_lock(&glb_va.mutex);/增加互斥锁sleep(3);time_t tim;float illumination=0,humid=0,temperature=0;/定义湿度,光照,温度char t16;if(atoi(data_recv)=0&atoi(data_recv)7)switch(atoi(data_recv)case 0:tim=time(NULL);srand(tim);illumination=(float)(rand()%100);/随机生成humid=(float)(rand()%100);temperature=(float)(rand()%40);strcpy(data_send, 车内环境信息:光照 );sprintf(t,%0.1f,illumination);/将光照值加入到t字符串中strcat(data_send,t);strcat(data_send, 湿度 );sprintf(t,%0.1f,humid);/将湿度值加入到t字符串中strcat(data_send,t);strcat(data_send, 温度 );sprintf(t,%0.1f,temperature);/将温度值加入到t字符串中strcat(data_send,t);tempfd=write(fd,data_send,strlen(data_send);break;case1:strcpy(data_send, 调已关闭);tempfd=write(fd,data_send,strlen(data_send);break;case2:strcpy(data_send, 空调已开启);tempfd=write(fd,data_send,strlen(data_send);break;case3:strcpy(data_send, 灯已关闭);tempfd=write(fd,data_send,strlen(data_send);break;case4:strcpy(data_send, 灯已打开);tempfd=write(fd,data_send,strlen(data_send);break;case5:strcpy(data_send, 小车已启动);tempfd=write(fd,data_send,strlen(data_send);break;case6:strcpy(data_send, 小车已停止);tempfd=write(fd,data_send,strlen(data_send);break;pthread_mutex_unlock(&glb_va.mutex);if(tempfd = -1)break;printf(停止当前连接.nn);close(fd);count_client-;/pthread_exit(NULL);int main(void)pthread_t pthid = 0;struct sockaddr_in s_addr = 0;struct pthread_arg pthargCHPTH_COUNT = 0;/* 设置互斥锁,如果第二个参数如果是NULL,表示使用默认设置 */ret = pthread_mutex_init(&glb_va.mutex, NULL);if(skfd 0) err_fun(_FILE_, _LINE_, pthread_mutex_init, ret); skfd = socket(PF_INET, SOCK_STREAM, 0);if(skfd 0) err_fun(_FILE_, _LINE_, socket, errno); s_addr.sin_family = AF_INET;s_addr.sin_port = htons(SER_PORT);s_addr.sin_addr.s_addr = inet_addr(SER_IP);ret = bind(skfd, (struct sockaddr *)&s_addr, sizeof(s_addr);if(ret 0) err_fun(_FILE_, _LINE_, bind, ret);ret = listen(skfd, MAX_CONNECT);if(ret 0) err_fun(_FILE_, _LINE_, listen, errno);printf(监听客户地址%s 端口号%d.n,SER_IP,SER_PORT);signal(SIGINT, signal_fun);while(1)printf(n等待新的连接.n);cfd = accept(skfd,NULL,NULL); if(cfd = -1)fprintf(stderr,监听出错!n);continue; if(count_client MAX_CONNECT)printf(现在已经开始连接客户 %d .,count_client+1);ret = pthread_create(&pthid, NULL, (void *)(&pthread_fun), (void *)(&cfd);if(ret = -1) fprintf(stderr,线程创建错误!n);break;return 0;五、测试数据及其结果分析开启服务器:连接一个客户

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论