1、 课程设计报告(2016/2017 学年 第一学期)题 目: 小车远程监控系统专 业 计算机科学与技术学 生 姓 名 孙烨班 级 学 号 B13040402指 导 教 师 邹志强指 导 单 位 计算机学院、软件学院日 期 2017.01.03-01.12指导教师成绩评定表学生姓名 班级学号 专业 计算机科学与技术评分内容 评分标准 优秀 良好 中等 差平时成绩 认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事设计的科学、合理性功能丰富、符合题目要求 界面友好、外观漂亮、大方程序功能执行的正确性设计成果程序算法执行的效能设计报告正确合理、反映系统设计流程文档内容详实程度设计报
2、告文档格式规范、排版美观验收答辩简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。评分等级指导教师简短评语指导教师签名 日期 2017-01-12备注 评分等级有五种:优秀、良好、中等、及格、不及格小车远程监控系统一、 课题内容和要求服务器端:1、利用 linux C 实现服务器;2、服务器端使用多进程实现多客户网络服务;3、服务器多个进程之间需要使用 IPC 通信(进程间通信);客户端:1、在 linux C 下实现网络客户端;为了实现同时读阻塞的键盘和阻塞的网络,要求使用多路 IO 实现同时阻塞的读键盘和读网络。服务器客户端的网络通信:这里要求采用 TCP 协议进行通信,实现
3、所要求的 S/C 模式,并且要求实现多客户服务。二、需求分析服务器端:1、服务器端利用随机数模拟向串口读取传感数据,需要模拟的传感数据要求有:温度、湿度、光照。2、服务器利用网络接收客户端发送过来的设备控制信号,通过写驱动,实现对底层硬件的控制,这里使用打印显示的方式模拟。3、在进程之间 IPC 通信时,要求使用文件锁或信号量实现资源保护。客户端:1、客户端能够通过网络通信实现接收服务器端传输过来的传感数据,并将传感数据打印到屏幕上显示。2、客户端能够从键盘输入控制信号,并且通信将控制信号发送给服务器。3、客户端要求实现控制信号有,开灯、关灯,开空调、关空调、开启小车、停小车等。三、概要设计服
4、务器 客户端四、详细设计 (格式:宋体,4 号,加粗,两端对齐)各个算法实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。头文件(cs.h)Times New Rxoman#include #include #include #include #include #include #include #include #include #include #include Socket socketbindlisten connectaccpetWrite,read Write,read
5、bind#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,
6、“%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 “);scanf(“%s“,data_send);flag=atoi(data_send);if(flag6|flag%sn“, data_recv);memset(data_send, 0, MAX_SIZE);memset(data_recv, 0, MAX_SIZE);sleep(1.5);return 0;服务器端:#inc
7、lude “cs.h“int 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
8、.pth_exit_flag = PTH_EIXT) pthread_mutex_unlock(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;
9、pthread_mutex_lock(/增加互斥锁sleep(3);time_t tim;float illumination=0,humid=0,temperature=0;/定义湿度,光照,温度char t16;if(atoi(data_recv)=0srand(tim);illumination=(float)(rand()%100);/随机生成humid=(float)(rand()%100);temperature=(float)(rand()%40);strcpy(data_send, “车内环境信息:光照 “);sprintf(t,“%0.1f“,illumination);/将
10、光照值加入到 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=wri
11、te(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(
12、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(if(tempfd = -1)break;printf(“停止当前连接.nn“);close(fd);count_client-;/pthread_exit(NULL);int main(void)pthread_t pthid = 0;struct
13、sockaddr_in s_addr = 0;struct pthread_arg pthargCHPTH_COUNT = 0;/* 设置互斥锁,如果第二个参数如果是 NULL,表示使用默认设置 */ret = pthread_mutex_init(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 =
14、AF_INET;s_addr.sin_port = htons(SER_PORT);s_addr.sin_addr.s_addr = inet_addr(SER_IP);ret = bind(skfd, (struct sockaddr *)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(if(ret = -1)