设备监控系统

上传人:s****a 文档编号:229007502 上传时间:2023-08-22 格式:DOCX 页数:20 大小:218.80KB
收藏 版权申诉 举报 下载
设备监控系统_第1页
第1页 / 共20页
设备监控系统_第2页
第2页 / 共20页
设备监控系统_第3页
第3页 / 共20页
资源描述:

《设备监控系统》由会员分享,可在线阅读,更多相关《设备监控系统(20页珍藏版)》请在装配图网上搜索。

1、设备监控系统一、课题内容和要求1. 基本要求(1) 需求分析与概要设计。需求分析完成以后,对数据库表、界面及各功能模块做出 概要设计。(2) 设备管理。提供需监控设备的增加、修改和删除功能。同时管理人员还可以为所 管理的设备设置性能数据的告警门限值。(3) 设备监控。每隔一段时间采集保存在数据库中的性能数据,当性能数据超过告警 门限值,则生成告警;当性能数据恢复正常,则取消告警。(4) 告警显示。当告警持续一段时间(该时间可以设置)后,需要向该设备的管理人 员发送一个消息。每个设备可以有不同的管理人员。(5) 消息查看。管理人员可查看、删除发给他的消息。(6) 性能数据采集程序。该程序部署在需

2、监控的设备上,用于采集该设备的 CPU 利用 率和内存使用率,并写入到数据库中。(7) 测试。对系统中各个模块进行全面的测试,完成测试报告。2. 扩展要求。 (1)运行日志采集。监控系统可以采集各个设备上的运行日志。监控系统管理人员通 过日志查看设备的运行详情。(2)能够较完美地显示性能数据的变化规律。二、需求分析在该部分中叙述每个模块的功能要求: 首先是用户界面的编写:该部分可分为两部分,即客户端与服务端。这两个部分主 要是实现对于界面的编写以及为后续功能的注入编写好回调函数接口,由于是我们是使用 GTK/Gnome编程,没有使用glade这样的工具,所以编写图形界面的编写代码量较大,这 两

3、部分由两人分别完成。其次是数据库德操作与门限值的设置,我们使用 MySQL 数据库,门限值的设置也 是使用图形化界面。由于该功能比较单一,可以独立出来,所以由一人足以完成。这部分 的功能就是通过图形化界面使用 SQL 语句完成对数据库中对应表的对应值的修改。另外就是完成对网络传输功能的模块,该模块主要功能就是网络信息传输与接收, 也是分为客户端与用户端的,所以由两人协作完成。目的就是完成对于数据的传输,使用 的是socket套接字编程,采用的是UDP协议。最后再由一人完成对整体模块的整合。三、概要设计首先,系统整体结构:把数控机床和监控计算机通过网络设备组成一个总线式局域网,并使其运行在C S

4、模 式下。作为服务器端的数控机床安装有PC式的数控系统,负责工件的加工。作为客户端的 监控计算机设置在生产现场或监控室内,用于显示各数控机床状态及对其进行远程控制。进行监控作业时,监控计算机(客户端) ,向每个数控机床(服务器端)发出请求,数控机床 接收请求后并做出响应,返回执行结果,监控计算机接收到信息后 ,经过处理,在用户界面上 显示,完成一个监控流程。服务端的软件设计和实现:目标数控机床内安装有实时 Linux 操作系统及数控软件,数控软件负责控制加工,记录 及显示相关的加工参数。要对其实行远程监控,需要再加入一个网络通信软模块,负责数据、 指令的接收,处理和发送。该模块可以使用 L i

5、nux 下的 Socket 实现。网络模块的工作过程 为:当数控软件启动时,网络模块进行初始化,首先调用系统内的 socket ( )函数建立一个套接 字,并获得系统返回的socket描述符,再调用bind ()把套接字与网络参数(地址族,IP地址)进 行绑定,然后使用 listen ( )侦听网络。此时当客户端对其发起连接( connect ( ) )时,则调用 accep t (),建立起服务器端和客户端之间的连接。部分C语言实现代码实现如下: server_sockfd = socket (AF_ INET, SOCK_STREAM, 0) ;/ / 建立 Socket,AF_ IN I

6、ET 表示 IP 地址族,SOCK_STREAM, 表示使用TCP协议bind ( server_ sockfd, ( struct sockaddr 3 ) &server_ address, server_len) ;/ /绑定Socket和IP地址listen ( server_sockfd, 5) ;/ /监听网络在监控过程中,网络通信模块通过receive ()接收客户端发送的指令,经处理和判断后,读 取或修改数控软件内的相关内容和参数,并把执行结果通过send ()发送回客户端。客户端的软件设计和实现: 客户端软件用于向生产管理人员显示各数控机床的信息及对其进行控制, 运行在安装

7、有W indows或Linux操作系统上。该软件将分为3相对独立的部分进行设计:网络通信,中间 层,用户界面。网络通信通过Socket实现,完成发起关闭网络连接,数据发送和接收的功能。 当用户需要连接数控机床(服务器端)时,软件调用socket ()建立一个套接字,并获得一个 socket描述符,然后调用connect ()和远端监听中的服务器进行连接,连接一旦建立,就可以通 过send ()及receive ()进行数据的发送和接收。需要关闭监控时,可以调用close ()关闭连接。 L inux和W indows系统都提供有Socket的相关函数,可以直接调用,在L inux下包含在sys

8、/ socket. h,在Windows下包含在winsock2. h中,在不同系统下编译时可以通过Makefile和程序 中的宏定义选择不同的头文件,部分实现代码为:#ifndef _W IN32_#include #else#include #endif/ / 头文件的选择客户端进行网络连接时,可以通过connect ()函数实现:err = connect ( sock, ( struct sockaddr 3 ) &servername, sizeof( servername) ) ;当需要同时监控多台数控机床时,可按以上过程建立若干个连接,每新建一个socket,系 统返回的sock

9、et描述符(程序中的sock变量)都是不同的,根据该描述符即可区分各个连接,区 分每一台被监控的数控机床,使数据的收发不会发生混淆。为保证数据发送和接收的可靠性 和连续性,网络通信部分将以独立线程方式运行。整个网络通信过程如图所示:中间层处于网络通信和用户界面之间 ,包括几个功能:数据格式转换,提供功能回调函 数和数据暂存。由于用户界面是根据用户的需求而订制的 ,具有很大的可变性,为了保证界 面的强可塑性和灵活性,软件接收到得数据不会直接被界面接收和显示,而是先把接 收的数据进行转换后存储在一个数据结构中 ,再由界面读取显示。功能回调函数为软件提 供各种控制功能,供上层界面调用。程序中定义一个

10、结构体(struct )来描述数控机床的各种状态:typedef struct StrMachineState char ProgramName 400 ;int FeedOverride;StrMachineState;而对各个数控机床的状态进行存储,则使用结构数组实现:StrMachineStateMachineStateNUM_OF_MACH INES结构数组内的每组变量存储一个数控机床的状态数据,NUM_OF_MACH INES为可存 储数控数据的最大值,可以自行定义。用户界面是监控软件的最外层,直接与用户进行交互,使用GTK +进行编写。界面分为3 部分: 主窗口,用于显示各个数控机

11、床的概要信息,包括程序状态和数控机床参数等,主窗口 划分为若干区域,用于同时显示不同机床的信息。监控软件 3 层关系结构如图所示:四、源程序代码 头文件,主要包括一些结构的定义。#ifndef _GLOBALAPI_H#define _GLOBALAPI_H#include /*基本的系统数据类型*/#include /*基本的套接字的定义*/#include #include #include #include #include #include #include #include #include #include #include /*服务器端使用的端口*/#define SERVER_

12、PORT_NO 8889/*客户端与服务器端使用的消息类型定义*/#define INITIAL_VALUE 65535/*客户端使用的消息代码含义*/#define DISCONNECT 0#define REPORT 1#define LOG 2/*服务器端使用的消息代码含义*/#define REPORT_SUCCEED 255#define REPORT_FAILED 256#define ARM 257#define UNKNOWN_CODE 258/*服务器与客户端使用的消息结构定义*/ struct mystatchar cpu4;int cpu_value;char cpu05

13、;int cpu0_value;char cpu15;int cpu1_value;char intr5;int intr_value;char ctxt5;int ctxt_value;char btime6;int btime_value;char processes10;int processes_value;char procs_running14;int procs_running_value;char procs_blocked14;int procs_blocked_value; pthread_mutex_t ticket_mutex;struct stMessage unsi

14、gned int msg_type; unsigned int msg_id; struct mystat info; message;/*服务器开启状况*/int ser_id_stat8=0,0,0,0,0,0,0,0;void init_message()message.msg_type=INITIAL_VALUE;/*服务器端的线程缓冲区的最大数量*/#define THREAD_BUFF_NUM 128/*提示信息输出*/#define INFO_NUM 10#define INFO_OCCUPIED 1struct info_t int status; char msg512; i

15、nfoINFO_NUM;#define INFO_FREED 0/*INFO_OCCUPIED or INFO_FREED*/*contents of message*/pthread_mutex_t info_mutex;/*初始化界面输出信息缓冲区*/void init_info()int i;for (i=INFO_NUM;i0;i-) infoi-1.status=INFO_FREED; sprintf(infoi-1.msg, );/*分配一个空闲的界面输出信息缓冲区,如果没有空闲的缓冲区则返回1*/int get_free_info()int i,ret;/*注意对互斥锁的操作,这

16、些操作必须是成对的(加锁和解锁),否则会发生死锁的情况*/ pthread_mutex_lock(&info_mutex);for(i=0;iINFO_NUM; i+) if(infoi.status=INFO_FREED) ret=i;pthread_mutex_unlock(&info_mutex);break;if(i=INFO_NUM) ret=-1; pthread_mutex_unlock(&info_mutex);return ret;/*释放界面输出信息缓冲区,对 info_status 的访问同样需要使用互斥保护*/ void free_info(int index)int

17、i; pthread_mutex_lock(&info_mutex);if(infoindex.status=INFO_OCCUPIED)infoindex.status=INFO_FREED; pthread_mutex_unlock(&info_mutex);void add_info(char *src) int i;while(i=get_free_info()=-1)sleep(1);/*添加消息*/ pthread_mutex_lock(&info_mutex); infoi.status=INFO_OCCUPIED; strcpy(infoi.msg, src);pthread_

18、mutex_unlock(&info_mutex);#endif 经删减后的客户端程序:#include#include globalapi.hstatic GtkWidget *app;/*程序主窗口*/static GtkWidget *frame, *vbox, *box2 ,*table;/*box2 用来封装文本构件与垂直滚动条*/static GtkWidget *clientwindow,*serverwindow,*vscrollbar; /服务器窗口,用来输出相关提示 。struct mystat test;int socket_fd; /连接 socketstruct so

19、ckaddr_in server;/服务器地址信息,客户端地址信息int ret,i;void connectserver(GtkWidget *widget, gpointer data); void disconnect(GtkWidget *widget, gpointer data);void clean_server_info(GtkWidget *widget, gpointer data);void display_info(char *msg);void display_server_info(char *msg);void dialog_ok(GnomeDialog *dia

20、log, gint id,gpointer data);void displaycontents(GtkWidget *widget, gpointer data);void about(GtkWidget *widget, gpointer data);void send_client_info();gint timeout_callback(gpointer data);gint remove_id=0;int myread(char *path);GnomeUIInfo client_operation_menu=GNOMEUIINFO_ITEM_NONE(”连接服务器,与远程服务器建立

21、连接,connectserver),GNOMEUIINFO_ITEM_NONE(”断开连接,断开与远程服务器的连接”,disconnect), GNOMEUIINFO_ITEM_NONE(退出,退出程序,gtk_main_quit),GNOMEUIINFO_END;/*生成帮助菜单项*/GnomeUIInfo help_menu=GNOMEUIINFO_ITEM_NONE(显示内容,显示帮助内容 ”,displaycontents),GNOMEUIINFO_ITEM_NONE(关于,关于此程序说明 ”,about), GNOMEUIINFO_END;/*生成顶层菜单项*/GnomeUIInfo

22、 menubar= GNOMEUIINFO_SUBTREE(” 客户端操作(_S), client_operation_menu),GNOMEUIINFO_SUBTREE(” 帮助(H),help_menu),GNOMEUIINFO_END;/*生成工具栏*/GnomeUIInfo toolbar= GNOMEUIINFO_ITEM_STOCK( 连 接 服 务 器 , 与 远 程 服 务 器 建 立 连 接 ,connectserver,GNOME_STOCK_PIXMAP_PRINT),GNOMEUIINFO_ITEM_STOCK( 断 开 连 接 , 断 开 与 远 程 服 务 器 的

23、连 接 ,disconnect, GNOME_STOCK_PIXMAP_CUT),GNOMEUIINFO_ITEM_STOCK( 清 空 信 息 , 清 空 服 务 器 发 来 的 信 息 ,clean_server_info,GNOME_STOCK_PIXMAP_OPEN),GNOMEUIINFO_ITEM_STOCK( 退 出 , 退 出 程 序 , gtk_main_quit,GNOME_STOCK_PIXMAP_EXIT),GNOMEUIINFO_END;int main(int argc, char *argv)GtkWidget *isenable;/界面初始化部分gtk_set_

24、locale();gnome_init(example, 0.1, argc, argv); app=gnome_app_new(example, 框架); gtk_signal_connect(GTK_OBJECT(app),delete_event,GTK_SIGNAL_FUNC(gtk_main_quit),NU LL);/添加菜单和工具栏 gnome_app_create_menus(GNOME_APP(app),menubar); gnome_app_create_toolbar(GNOME_APP(app),toolbar);gtk_window_set_default_size(

25、GtkWindow *)app, 800, 600); vbox=gtk_vbox_new(FALSE,0);gnome_app_set_contents(GNOME_APP(app),vbox);/*启动程序时使工具条上断开连接以及相应的菜单项灰化*/ isenable=toolbar1.widget;gtk_widget_set_sensitive(isenable,FALSE); isenable=client_operation_menu1.widget; gtk_widget_set_sensitive(isenable,FALSE);/*创建客户端输出信息*/ frame=gtk_

26、frame_new(NULL);gtk_frame_set_label(GTK_FRAME(frame),客户端信息”); gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start(GTK_BOX(vbox),frame,TRUE,TRUE,10);/*最后一个参数控制间隔 */ gtk_widget_show(vbox);box2 = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER (b

27、ox2),10); gtk_container_add(GTK_CONTAINER(frame),box2);gtk_widget_show (box2);table = gtk_table_new (2,2,FALSE); gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2); gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2); gtk_box_pack_start (GTK_BOX(box2),table,TRUE,TRUE,0); gtk_widget_show (table);cli

28、entwindow=gtk_text_new (NULL, NULL); gtk_text_set_editable(GTK_TEXT(clientwindow),FALSE) /文本信息不可编辑 gtk_text_set_word_wrap(GTK_TEXT(clientwindow),TRUE);/自动换行gtk_table_attach(GTK_TABLE(table),clientwindow,0,1,0,1,GTK_EXPAND|GTK_SHRINK|GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);gtk_widget_show (clien

29、twindow);vscrollbar = gtk_vscrollbar_new (GTK_TEXT(clientwindow)-vadj);gtk_table_attach(GTK_TABLE(table),vscrollbar,1,2,0,1,GTK_FILL,GTK_EXPAND|GTK_SHRIN K|GTK_FILL,0,0);gtk_widget_show (vscrollbar);gtk_widget_realize (clientwindow);/*服务端信息显示区创建*/frame=gtk_frame_new(NULL);gtk_frame_set_label(GTK_FRA

30、ME(frame),服务端信息”); gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);gtk_box_pack_start(GTK_BOX(vbox),frame,TRUE,TRUE,10);/*最后一个参数控制间隔 */ gtk_widget_show(vbox);box2 = gtk_vbox_new (FALSE,10);gtk_container_set_border_width (GTK_CONTAINER (box2), 10);gtk_container_add(GTK_CONTAINER(fra

31、me),box2);gtk_widget_show (box2);table = gtk_table_new (2,2,FALSE);gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2);gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2);gtk_box_pack_start (GTK_BOX (box2), table, TRUE, TRUE, 0);gtk_widget_show (table);/*创建服务端传送的信息*/serverwindow=gtk_text_new (NULL,

32、NULL);gtk_text_set_editable(GTK_TEXT(serverwindow),FALSE);/文本信息不可编辑gtk_text_set_word_wrap(GTK_TEXT(serverwindow),TRUE);/自动换行gtk_table_attach(GTK_TABLE(table),serverwindow,0,1,0,1,GTK_EXPAND| GTK_SHRINK|GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);gtk_widget_show (serverwindow);vscrollbar = gtk_vscro

33、llbar_new(GTK_TEXT(serverwindow)-vadj);gtk_table_attach(GTK_TABLE(table),vscrollbar,1,2,0,1,GTK_FILL, GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);gtk_widget_show(vscrollbar);gtk_widget_realize(serverwindow);gtk_widget_show_all(app);gtk_main();return 0;/*状态内容输出函数*/void display_info(char *msg)gtk_text_freeze(

34、GTK_TEXT(clientwindow); gtk_text_insert(GTK_TEXT(clientwindow),NULL,&clientwindow-style-black,NULL,msg,-1); gtk_text_thaw(GTK_TEXT(clientwindow);/*服务断内容输出函数*/void display_server_info(char *msg)gtk_text_freeze(GTK_TEXT(serverwindow); gtk_text_insert(GTK_TEXT(serverwindow),NULL,&serverwindow-style-bla

35、ck,NULL,msg,-1); gtk_text_thaw(GTK_TEXT(serverwindow);/*清空服务端的消息*/void clean_server_info(GtkWidget *widget, gpointer data)guint length; gtk_text_freeze(GTK_TEXT(serverwindow); length=gtk_text_get_length(GTK_TEXT(serverwindow); gtk_text_backward_delete(GTK_TEXT (serverwindow),length); gtk_text_thaw(G

36、TK_TEXT(serverwindow);/*帮助对话框和关于对话框的确定按钮处理函数*/void dialog_ok(GnomeDialog *dialog, gint id,gpointer data) gnome_dialog_close(dialog);/*帮助显示内容*/void displaycontents(GtkWidget *widget, gpointer data)int i;GtkWidget *dialog;GtkWidget *label;char msg2256=连接服务器:与远程服务器建立连接,断开连接:断开与远程服务器的连 接;dialog = gnome_

37、dialog_new(_(帮助”),GNOME_STOCK_BUTTON_OK ,NULL ,NULL); for(i=0;ivbox),label,TRUE,TRUE ,0 ) ; gtk_widget_show (label);gtk_signal_connect(GTK_OBJECT(dialog),clicked ,GTK_SIGNAL_FUNC(dialog_ok) ,&dialog) gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog);gnome_dialog_set_parent(G

38、NOME_DIALOG( dialog),GTK_WINDOW(app);/*帮助关于*/void about(GtkWidget *widget, gpointer data)GtkWidget *dialog;GtkWidget *contentlabel,*versionlabel,*authorlabel,*copyrightlabel;dialog = gnome_dialog_new(_(关于本程序 ”),GNOME_STOCK_BUTTON_OK,NULL,NULL); contentlabel=gtk_label_new(_(设备监控系统客户端); versionlabel=g

39、tk_label_new(_(版本:0.1);copyrightlabel=gtk_label_new(_(Copyright 2010); authorlabel=gtk_label_new(_(mayue);gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)-vbox),contentlabel,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)-vbox),versionlabel,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(GNOME

40、_DIALOG(dialog)-vbox),copyrightlabel,TRUE,TRUE,0)gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)-vbox),authorlabel,TRUE,TRUE,0);gtk_widget_show (contentlabel); gtk_widget_show (versionlabel);gtk_widget_show (copyrightlabel); gtk_widget_show (authorlabel);gtk_signal_connect(GTK_OBJECT(dialog),clicked

41、 ,GTK_SIGNAL_FUNC(dialog_ok) ,&dialog)gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog);gnome_dialog_set_parent(GNOME_DIALOG( dialog),GTK_WINDOW(app);/*连接服务器操作*/void connectserver(GtkWidget *widget, gpointer data)char msg512;/提示信息GtkWidget *isenable;FILE *fp;time_t timep; ti

42、me(&timep);/*创建套接字*/ socket_fd=socket(AF_INET,SOCK_STREAM,0);if(socket_fd0) sprintf(msg,创建套接字出错! n);display_info(msg);return;/*设置接收、发送超时值*/ struct timeval time_out;time_out.tv_sec=5;time_out.tv_usec=0;setsockopt(socket_fd,SOL_SOCKET,SO_RCVTIMEO,&time_out,sizeof(time_out); /*填写服务器的地址信息*/server.sin_fa

43、mily=AF_INET;server.sin_addr.s_addr=inet_addr(127.0.0.1);/htonl(INADDR_ANY);server.sin_port=htons(SERVER_PORT_NO);/*连接服务器*/ ret=connect(socket_fd,(struct sockaddr*)&server, sizeof(server); if(ret0) sprintf(msg,连接服务器出错! n,SERVER_PORT_NO); display_info(msg);close(socket_fd);return;/成功后输出提示信息sprintf(ms

44、g,连接服务器成功! n); display_info(msg);fp=fopen(log,a);fprintf(fp,%s连接服务器5卫$血皿6皿何皿6(&timep); fclose(fp);/*连接服务器菜单项和工具条灰化*/ isenable=toolbar0.widget;gtk_widget_set_sensitive(isenable,FALSE); isenable=client_operation_menu0.widget; gtk_widget_set_sensitive(isenable,FALSE); isenable=toolbar1.widget; gtk_widg

45、et_set_sensitive(isenable,TRUE); isenable=client_operation_menu1.widget; gtk_widget_set_sensitive(isenable,TRUE); myread(/proc/stat);send_client_info();remove_id=gtk_timeout_add(30000,timeout_callback,NULL);/*断开连接操作*/void disconnect(GtkWidget *widget, gpointer data)char msg512;/提示信息GtkWidget *isenab

46、le;FILE *fp; time_t timep;time(&timep); close(socket_fd);sprintf(msg,断开连接成功! n);display_info(msg); fp=fopen(log,a); fprintf(fp,%s 断开连接服务器n,asctime(gmtime(&timep); fclose(fp);gtk_timeout_remove(remove_id); isenable=toolbar1.widget; gtk_widget_set_sensitive(isenable,FALSE); isenable=client_operation_m

47、enu1.widget; gtk_widget_set_sensitive(isenable,FALSE); isenable=toolbar0.widget; gtk_widget_set_sensitive(isenable,TRUE); isenable=client_operation_menu0.widget; gtk_widget_set_sensitive(isenable,TRUE);gint timeout_callback(gpointer data)guint length; gtk_text_freeze(GTK_TEXT(clientwindow); length=g

48、tk_text_get_length(GTK_TEXT(clientwindow); gtk_text_backward_delete(GTK_TEXT(clientwindow),length); gtk_text_thaw(GTK_TEXT(clientwindow); myread(/proc/stat);send_client_info();return TRUE;int myread(char *path)FILE *fp;int i;char msg256;if(fp=fopen(path,r)=NULL)display_info(Source file open error!n)

49、;return 1;fscanf(fp,%s,test.cpu);for(i=0;i9;i+)fscanf(fp,%d,&test.cpu_value);fscanf(fp,%s,test.cpu0);for(i=0;i9;i+) fscanf(fp,%d,&test.cpu0_value);fscanf(fp,%s,test.cpu1);for(i=0;i9;i+) fscanf(fp,%d,&test.cpu1_value);fscanf(fp,%s,test.intr);for(i=0;i225;i+)fscanf(fp,%d,&test.intr_value);fscanf(fp,%s

50、 %d,test.ctxt,&test.ctxt_value);fscanf(fp,%s %d,test.btime,&test.btime_value);fscanf(fp,%s %d,test.processes,&test.processes_value);fscanf(fp,%s %d,test.procs_running,&test.procs_running_value);fscanf(fp,%s %d,test.procs_blocked,&test.procs_blocked_value); sprintf(msg,%st,test.cpu);display_info(msg)

51、;sprintf(msg,%d,test.cpu_value);display_info(msg);sprintf(msg,n%st,test.cpu0);display_info(msg);sprintf(msg,%d,test.cpu0_value);display_info(msg);sprintf(msg,n%st,test.cpu1);display_info(msg);sprintf(msg,%d,test.cpu1_value);display_info(msg);sprintf(msg,n%st,test.intr);display_info(msg);sprintf(msg,

52、%dt,test.intr_value);display_info(msg);sprintf(msg,n%s %dn,test.ctxt,test.ctxt_value);display_info(msg);sprintf(msg,%s %dn,test.btime,test.btime_value);display_info(msg);sprintf(msg,%s %dn,test.processes,test.processes_value); display_info(msg);sprintf(msg,%s %dn,test.procs_running,test.procs_runnin

53、g_value); display_info(msg);sprintf(msg,%s %dn,test.procs_blocked,test.procs_blocked_value); display_info(msg);fclose(fp);return 0;void send_client_info()char msg512;char send_buf1024,recv_buf512;GtkWidget *mbox;init_message();message.msg_type=REPORT;message.msg_id=0; /设置客户端序号 message.info.cpu_value

54、=test.cpu_value; message.info.cpu0_value=test.cpu0_value; message.info.cpu1_value=test.cpu1_value; message.info.intr_value=test.intr_value; message.info.ctxt_value=test.ctxt_value; message.info.btime_value=test.btime_value; message.info.processes_value=test.processes_value; message.info.procs_runnin

55、g_value=test.procs_running_value; message.info.procs_blocked_value=test.procs_blocked_value; memcpy(send_buf,&message,sizeof(message);int ret=send(socket_fd, send_buf,sizeof(message),0);/*发送出错*/if(ret=-1) mbox = gnome_message_box_new ( 发 送 失 败 ! 请 重 新 发 送 ! ,GNOME_MESSAGE_BOX_INFO,GNOME_STOCK_BUTTON

56、_OK,NULL);gtk_widget_show (mbox); gtk_window_set_modal (GTK_WINDOW (mbox),TRUE); gnome_dialog_set_parent(GNOME_DIALOG(mbox),GTK_WINDOW(app); return ; ret=recv(socket_fd,recv_buf,sizeof(message),0);if(ret=-1) mbox = gnome_message_box_new ( 接 收 失 败 ! 请 重 新 发 送 ! ,GNOME_MESSAGE_BOX_INFO,GNOME_STOCK_BUT

57、TON_OK,NULL);gtk_widget_show (mbox); gtk_window_set_modal (GTK_WINDOW (mbox), TRUE); gnome_dialog_set_parent(GNOME_DIALOG(mbox),GTK_WINDOW(app); return ; memcpy(&message,recv_buf,sizeof(message);if(message.msg_type=REPORT_SUCCEED)sprintf(msg,报告成功! n);else if(message.msg_type=REPORT_FAILED)sprintf(ms

58、g,报告失败! n); display_server_info(msg);else if(message.msg_type=ARM)sprintf(msg,警报:超过门限值! n); display_server_info(msg);由于篇幅有限,故不在此一一列举了。五、软件运行环境配置和安装说明操作系统是 Ubuntu 8.10,gnome 界面即需要 gnome 库,编译环境是 gcc 4.3.2,工程环境 make 3.81,数据库使用的是MySQL。如果使用其它版本的话,需要重新编译,那就需要安 装一些开发库,Ubuntu下可使用新力得软件包管理器下载。而且由于程序中使用了中文, 所以

59、操作系统需要安装好中文语言包,否则会显示出乱码。详细内容可参考手册。自己针对本程序中的修改门限值的程序写的Makefile如下: target:fram.cgcc fram.c -o target gnome-config -cflags -libs gnomeui -lmysqlclient clean:rm -f target由上可以看出,我对于源程序保存名为 fram.c 生成目标文件为 target。建议使用本人的开发环境,以免出现兼容性问题。例如若使用更高版本的Ubuntu,贝U很有 可能没有gnome-config脚本,则就不能使用例如上面的Makefile 了。说明:本程序是在u

60、buntu8.10下进行的开发与测试,不是在虚拟机上,若使用本程序在虚 拟机上安装,贝会导致出错,原因是由于本程序是读取系统数据,在虚拟机上的数据和实 体机上的数据不同,会导致读取的值不正确,从而导致数据程序出错。另外,如需运行在 其它ubuntu版本上时,需要对系统进行中文配置,否则会导致无法正常显示的问题。六、测试数据及其结果分析本程序可以监控8个客户端,在测试过程中只是使用一个监控端,以下是程序测试过程中的截图:七 、调试过程中的问题程序的编写过程中,出现过很多问题,大多是通过调试解决的(除了编码的问题),由 于使用的是图形界面编程,所以调试过程中有许多问题还是由于对 gtk/gnome

61、 库德不了解 以及不熟悉造成的。我主要遇到的问题是在 gtktext 的显示上,一开始我通过使用在文本界 面下的文件读取方式来写入数据,结果会出现显示不完全的问题。通过调试后发现这是由 于 gtktext 有缓冲的功能,所以使用动态数组后就可改变这一现象。 八、课程设计总结收获:此次程序设计所做的程序,虽然不是我的第一个Linux程序,确是我的第一个 使用 gtk/gnome 库开发的程序,以前大多用文本界面形式编程,虽然也用过飞漫公司的 miniGUI 编写过图形界面,但这次是完全自己手写的,成就感较大。同样,在编写过程中 也遇到了许多问题,首先是编码,当然,这个至今还是个问题,其次是控件的选取与运用。 还有最麻烦的就是编写图形界面没有很好的IDE,不但编

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!