CN103823674B - 云计算系统及其终端的实现方法 - Google Patents
云计算系统及其终端的实现方法 Download PDFInfo
- Publication number
- CN103823674B CN103823674B CN201410049269.9A CN201410049269A CN103823674B CN 103823674 B CN103823674 B CN 103823674B CN 201410049269 A CN201410049269 A CN 201410049269A CN 103823674 B CN103823674 B CN 103823674B
- Authority
- CN
- China
- Prior art keywords
- list
- application
- interface
- web
- computing system
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- User Interface Of Digital Computer (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明公开了一种云计算系统及其终端的实现方法,该方法首先利用Citrix XenApp搭建虚拟服务器,并在虚拟服务器中安装web interface角色,接着终端通过HDMI接口连接到显示设备上,并在显示设备的屏幕上创建主窗体,然后利用web interface连接到云计算系统,并从云计算系统上拉取相应的应用到本地终端,最终初始化前台界面,获取应用列表及相应的图标,通过GTK图形界面在主窗体内将相应的图标与设置在云计算系统上的应用对接,实现云端应用的本地图形化操作。本发明,云计算系统终端省略了机箱及显示部分,仅内置操作系统,通过HDMI接口连接在任一台显示设备上,通过无线网络连接到云端,调用云计算机上的应用实现相应的功能,具有体积小巧、便于携带、操作方便等显著的优点。
Description
技术领域
本发明涉及MC嵌入式开发系统领域,具体涉及云计算系统及其终端的实现方法。
背景技术
虚拟服务器是把一台服务器变成很多个独立的虚拟服务器,在一台服务器运行不同的操作系统和应用程序;另一种则是把若干个分散的服务器整合为一个大的虚拟服务器,同时支配多台服务器的资源。虚拟化也因此更多地被用来实现让一台计算机做多台计算机的工作,这相当于让一台计算机长出“三头六臂”。虚拟的服务器和虚拟的桌面可以让你在本地和远程拥有多个操作系统和应用程序,从而打破物理和地理的限制,因此有效提升了硬件的利用率和灵活性。传统方式的虚拟服务器终端依赖台式机、笔记本或其他终端设备,这类的终端设备由于体积大,携带不方便,同时其应用列表是以文字的形式显示,操作起来不够直观。
发明内容
本发明所要解决的是传统方式的虚拟化服务器在调用云端服务时依靠外界的电脑等服务器设备,携带不够方便,同时传统虚拟服务器的列表是以文字的形式存在,操作不方便的技术问题。
为了解决上述技术问题,本发明所采用的技术方案是提供一种云计算系统终端的实现方法,该方法的实现包括以下步骤:
步骤A10、利用Citrix XenApp在云计算系统的云端搭建虚拟服务器,并在虚拟服务器中安装web interface角色;
步骤A20、通过HDMI接口将云计算系统终端连接到显示设备上,并在显示设备的屏幕上创建主窗体,然后利用web interface连接到云计算系统,并从云计算系统上拉取相应的应用到本地终端;
步骤A30、初始化所述显示设备的前台界面,之后获取云计算系统上的云端的相应应用列表及其图标,并通过GTK图形工具包在主窗体内显示相应应用的图标并与云端对应的应用对接,实现云端应用在所述显示设备上的本地图形化操作。
在上述技术方案中,步骤A20包括以下步骤:
步骤A201、通过HDMI接口将云计算系统终端连接到显示设备上,在显示设备的屏幕上创建主窗体并初始化,设定窗体大小与所述显示设备的屏幕大小相同;
步骤A202、初始化应用表头app_list_head和应用列表表头table_list_head,进行内存分配,并对内部的成员变量进行赋值;
步骤A203、初始化后台webkit内核中的webview控件,并创建一个WebkitWebView控件,通过web interface读取保存的服务器地址,使服务器的web interface网页与该控件重新连接;
步骤A204、初始化登陆界面及应用列表界面;
步骤A205、调用登录页面,在用户验证登陆后,构造应用列表界面中的所有控件,并将登陆界面隐藏,显示空白的应用列表界面。
在上述技术方案中,步骤A30包括以下步骤:
步骤A301、利用dom树获取应用列表,并下载对应的应用图标,建立app_list_node并添加到app_list_head链表中;
步骤A302、构建GtkTable控件和应用图标,并计算出各应用图标的存放位置,然后将app_list_node中的GtkButton添加到GtkTable控件中;
步骤A303、将应用图标添加到GtkImage控件中,并使用g_signal_connect将应用图标与对应的应用进行关联;
步骤A304、通过show_login_screen()调用函数gtk_widget_show()显示GtkTable控件,显示出应用列表界面。
在上述技术方案中,在步骤A30中,前台界面分为左右两部分,左部分用于显示功能性按钮,右半部分用于显示帮助文档界面,并添加有翻页按钮。
本发明还提供了一种云计算系统,包括云端和终端,所述云端上设有利用CitrixXenApp搭建的虚拟服务器,且所述虚拟服务器中安装有web interface角色;
所述终端上设有HDMI接口、主窗体创建模块、初始化模块、应用拉取模块、应用图标与云端应用的对接模块;
所述终端通过HDMI与外接显示设备连接并从外接显示设备取电;
所述主窗体创建模块在显示设备的屏幕上创建主窗体,完成登陆界面和应用列表界面的初始化,然后利用web interface角色连接到云计算系统,完成应用列表界面的构造并显示;
所述初始化模块初始化显示设备的前台界面;
所述应用拉取模块获取应用列表,并拉取云端上的相应应用到终端;
所述应用图标与云端应用的对接模块,利用GTK图形工具包在主窗体内显示相应应用的图标并与云端对应的应用对接,实现云端应用在所述显示设备上的本地图形化操作。
本发明,云计算系统终端省略了机箱及显示部分,仅内置操作系统,通过HDMI接口连接在任一台显示设备上,通过无线网络连接到云端,调用云计算机上的应用实现相应的功能,具有体积小巧、便于携带、操作方便等显著的优点。
附图说明
图1为现有技术的登陆界面数据流图;
图2为现有技术的应用列表界面数据流图;
图3为本发明提供的云计算系统终端的实现方法的app_list链表结构;
图4为本发明提供的云计算系统终端的实现方法的table_list链表结构;
图5为本发明提供的云计算系统终端的实现方法的程序流程图;
图6为本发明提供的云计算系统终端的实现方法的初始化窗体程序流程图;
图7为本发明提供的云计算系统终端的实现方法的初始化webkit流程图;
图8为本发明提供的云计算系统终端的实现方法的load-finished事件流程图;
图9为本发明提供的云计算系统终端的实现方法中的get_application_list流程图;
图10为本发明提供的云计算系统终端的实现方法中的add_app_in_table函数流程图;
图11为本发明提供的云计算系统终端的实现方法的登录函数流程图。
具体实施方式
下面结合附图对本发明做出详细的说明。
参照图1至图11,其中图1和图2为传统方式的虚拟化服务器的实现方法,传统方式的虚拟化服务器依赖外界的台式机、笔记本或其他终端设备,在本地安装虚拟化服务器,实现最终的虚拟化服务。
如图3至图11所示,本发明提供了一种云计算系统终端及其实现方法,该云计算系统终端省略了显示屏部分,仅内置操作系统,可通过HDMI接口连接在任何一台显示设备上,并通过无线网络连接到云计算系统,通过调用云计算系统中云端上的相应应用实现相应的功能,具有体积小巧(类似一个U盘大小)、便于携带等显著的优点。
其中,云计算系统,包括云端和终端,云端上设有利用Citrix XenApp搭建的虚拟服务器,并且在虚拟服务器中安装有web interface角色。
终端上设有HDMI接口、主窗体创建模块、初始化模块、应用拉取模块、应用图标与云端应用的对接模块,终端通过HDMI与外接显示设备连接并从外接显示设备取电,主窗体创建模块在显示设备的屏幕上创建主窗体,完成登陆界面和应用列表界面的初始化,然后利用web interface角色连接到云计算系统,完成应用列表界面的构造并显示,初始化模块初始化显示设备的前台界面,应用拉取模块获取应用列表,并拉取云端上的相应应用到终端,应用图标与云端应用的对接模块,利用GTK图形工具包在主窗体内显示相应应用的图标并与云端对应的应用对接,实现云端应用在显示设备上的本地图形化操作。
如图5所示,本发明提供的云计算系统终端的实现方法包括以下步骤:
步骤A10、利用Citrix XenApp在云计算系统的云端搭建虚拟服务器,并在虚拟服务器中安装web interface角色;
步骤A20、通过HDMI接口将云计算系统终端连接到显示设备上,并在显示设备的屏幕上创建主窗体,完成登陆界面和应用列表界面的初始化,然后利用web interface角色连接到云计算系统,完成应用列表界面的构造并显示;
步骤A30、初始化显示设备的前台界面,获取应用列表并实现云端应用的本地拉取,之后通过GTK图形工具包在主窗体内显示相应应用的图标并与云端对应的应用对接,实现云端应用在所述显示设备上的本地图形化操作。
本发明,在显示设备的显示界面上完全隔离了网页页面显示,呈现的是完完全全的本地化的应用。
本发明所使用的gtk+3.0和webkitgtk+3.0库,一些关键数据结构为gtk+3.0库与webkitgtk+3.0库中所有,同时定制了相应的专用数据结构,主要包括以下结构体:web_element,fixed_element,app_list_head,app_list_node,table_list_head和table_list_node。
(1)web_element结构体:
web_element结构体主要用于后端,包括web页面的访问控制,web页面的元素获取。
web_view:使用webkitgtk+3.0库中的webkit_web_view_new()构建,主要用于读取url地址web页面并显示。
web_set:其为WebKitWebSettings*结构体,主要包括webkit的一些设置,达到自定义的效果。
message_type:主要用于存放读取后的web网页一些特定的返回信息。
message_key:主要用于存放读取后的web页面一些特定的返回信息。
Dom:用于指向web页面的dom文档。
user_dom:用于指向dom文档中的用户名输入栏元素。
passwd_dom:用于指向dom文档中的密码输入栏元素。
frame:指向web页面的框架。
js:指向web页面全局javascript上下文。
globalObject:保存web页面全局javascript对象。
myfunctionname:用于保存javascript的功能名。
functionObject:指向javascript功能对象。
程序中只会生成一个web_element结构体。
(2)fixed_element结构体:
fixed_element结构体用于控制登陆界面的排版及相应功能的实现,其核心控件包括GtkFixed、GtkImage、GtkButton、GtkEntry。
GtkFixed控件用于将控件固定于GtkWindow上某个准确位置。
GtkImage控件用于将外部图片读取进入本程序。
GtkButton控件用于实现按键效果。
GtkEntry控件用于实现输入框效果。
整个完整的fixed_element结构体如下:
几个重要结构体成员介绍:
help_image:用于存放帮助文档,帮助文档为一张张图片组合而成,通过翻页按键实现帮助文档的查阅。而帮助文档的页数更具HELP_IMAGE_NUM宏决定。
user:为gtkEntry控件,用于向用户提供用户名输入栏;
passwd:为gtkEntry控件,用于向用户提供密码输入栏;
user_data:用于存放用户名;
passwd_data:用于存放密码;
network_button:用于提供一个网络设置按键;
login_button:用于提供一个登陆按键;
prev_page:用于提供一个上一页按键;
next_page:用于提供一个下一页按键;
server_button:用于提供一个服务器设置按键;
shutdown_button:用于提供一个关机按键。
(3)app_fixed_element结构体:
app_fixed_element结构体用于向用户提供一个应用列表界面,其主要包括工具栏以及页面按钮和应用列表。而工具栏上包括显示登陆的用户,刷新应用按键、注销按键以及返回上级目录按键。
完整的app_fixed_element为:
几个重要结构体成员解释:
logoff:用于指向web页面的dom文档中的注销节点元素;
refresh:用于指向web页面的dom文档中的刷新应用节点元素;
return_0:用于指向web页面的dom文档中的“主要”节点元素;
toolbox:用于指向工具栏;
logoff_button:用于指向注销按键;
refresh_button:用于指向刷新应用按键;
return_button:用于指向返回上级目录按键;
radio_list:用于提供一个选择按钮的链表;
radio_box:用于指向选择按钮盒子;
table_head:用于指向应用列表界面中的应用列表链表表头。
(4)app_list_head结构体:
本程序进入应用列表界面后,维系一个包含所有应用节点的链表,会根据每一个应用创建一个节点,而app_list_head结构体为这个链表的表头,指向链表的第一个节点。
(5)app_list_node结构体:
app_list_node结构体用于保存一个应用的节点,应用列表中有多少个应用就会建立多少个app_list_node结构体(如果应用列表中包含文件夹目录,则文件夹目录也会建立起一个app_list_node节点),其结构如下:
name:用于保存应用名;
type:用于保存应用类型(应用程序或者目录);
download:用于指向dom文档中的应用图标元素节点以用于将web页面上的应用图标下载与本地;
click_node:指向dom文档中的应用节点;
in_table:指向其所处表控件;
button:用于指向应用的button控件;
next:指向链表中的下一个节点。
(6)table_list_head结构体:
table_list_head结构体用于维系一个table_list_node链表,table_list_node链表用于表示应用列表页数,因为一种情况为应用数过多以及排版问题导致应用无法全部显示于同一页上,所以使用了这个链表,每一页都会有一个table_list_node结构体用于管理此页。而table_list_head作为此链表的头,它的first成员变量指向第一页,也就是第一页的table_list_node结构体。
(7)table_list_node结构体:
table_list_node结构体用于表示一页的应用链表,其主要包含一个gtkradiobutton控件和gtktable控件,而其中也包含一个链表用于指向本页的应用程序的app_list_node。其结构如下:
其主要成员解释如下:
app_count:保存应用表单中现有应用个数;
max_app:应用表单中最大应用个数;
rows:应用表单一行应用个数;
columns:应用表单一列应用个数;
table_num:应用表单号;
this_radio_button:指向应用表单的选择按钮;
table_widget:应用表单的gtktable控件,用于显示表单;
first_app:指向应用表单中第一个app_list_node;
prev_app:指向应用表单中最后一个app_list_node;
next:指向下一个应用表单。
上述实现方法中,步骤A20中,包括以下步骤:
步骤A201、云计算系统终端通过HDMI接口连接到显示设备上之后,显示设备通过HDMI接口给云计算系统终端供电从而启动云计算系统终端,云计算系统终端启动后,首先初始化主窗体。其流程图如图6所示,初始化app_fixed_element和fixed_element结构体,使用gtk_fixed_new()初始化app_fixed_element中的fixed,将app_fixed_element中的fixed包含于window_vbox中。
之后,调用gtk3.0函数库中的GtkWidget*gtk window new(GtkWindowType type)函数,创建一个GtkWindowType类型的窗体,并返回一个GtkWidget指针。调用该函数的GtkWindowType的参数为GTK_WINDOW_TOPLEVEL。通过gtk下层的gdk库函数
GdkScreen*gdk screen get default(woid);
Gint gdk screen get width(GdkScreen*screen);
Gint gdk screen get height(GdkScreen*screen);获取屏幕的大小。
并通过gtk函数
Void gtk window set default size(GtkWindow*window gint width,gintheight);
设置主窗体的大小,将主窗体的控件以及获取到的窗口的高度及长度放入此函数,将主窗体的大小调整为显示设备屏幕的大小。
再通过函数
Void gtk window set type hint(GtkWindow*window,GdkWindowTypeHinthint);
将窗体设置为桌面类型的窗体。
为实现此功能,需要将此函数的主窗体控件作为第一参数,其中的GdkWindowTypeHint设置为GDK_WINDOW_TYPE_HINT_DESKTOP。
在以上过程都实现后,最后将一个vbox控件装载入主窗体完成主窗体的初始化,用于加速界面的转换。并将登陆界面和应用列表界面都装入vbox中,实现了不同操作对两种界面进行不同的显示和隐藏,提高了用户的体验。
在程序关闭时,gtk库将destroy信号广播到各个控件,并将程序调用到窗口的销毁事件。通过函数Gulong g_signal_connect(gpointer*object,const gchar*name,GCallback func,gpointer data)为主窗口创建销毁事件。
其中的object参数用于传入主窗体控件,而name用于表明“destroy”事件,func是一个函数指针,传入需要调用的函数,使用gtk自带的销毁函数,只需要把gtk_main_quit传入func即可,最后data为调用到的函数所需要的参数,这里使用NULL。
步骤A202、如图3和图4所示,初始化应用表头app_list_head和应用列表表头table_list_head,其目的是进行内存分配并将其内部的成员变量进行赋值。具体方法如下:
调用函数Void*malloc(size t size)对表头以及app_list_node和table_list_node进行内存分配。
调用函数Void free(void*ptr)销毁及删除链表中的node,进行内存的释放。
步骤A203、初始化后台webkit内核中的webview控件,并创建一个WebkitWebView控件,通过web interface读取保存的服务器地址,使服务器的web interface网页与该控件重新连接;
如图7所示,首先,初始化webkit中的webview控件及web_element结构体,通过web_element结构体实现web页面的访问控制以及web页面的元素获取。使用函数GtkWidget*webkit web view new(void)创建一个WebkitWebView控件,函数的返回值指向新建的控件。为了防止页面出错,重启系统再次在网页上连接该控件;之后通过函数Gpointer g_object_ref(gpointer object)增加WebkitWebView的引用计数。通过函数Void gtk_container_remove(GtkContainer*container,GtkWidget*widgit)避免其被使用将其移除容器,并由系统将其数据删除。最后,通过webkit库函数中的函数
WebKitWebSetting*webkit_web_settings_new(void);
Void webkit_web_view_set_settings(WebkitWebView*web_view,WebKitWebSettings*settings);
定义WebkitWebView的“load-finished”及“destroy”时间。
其中load-finished事件的流程图如图8所示,load-finished事件主要是用于根据url判断显示的界面,然后根据程序中自身设定的状态位对程序的一些路径进行选择,在应用列表中根据不同的状态对界面及后台进行不同的操作。获取WebkitWebView结构中提取出WebkitWebFrame结构,并从WebkitWebFrame结构中通过函数
WebkitWebFrame*webkit_web_view_get_main_frame(WebKitWebView*webview);
Const gchar*webkit_web_frame_get_uri(WebKitWebFrame*frame);
获取当前网页的URL。
通过将后台的web_view控件传入webkit_web_view_get_main_frame函数获取WebKitWebFrame,然后通过webkit_web_frame_get_uri获取当前页面URL。根据判断URL中特定的字符串获取当前URL是处于何种状态,其主要状态有:登陆页面(包括密码错误),应用列表页面(包括刷新),注销页面等。
在该步骤中,还需要对
步骤A204、初始化登陆界面及应用列表界面,将app_fixed_element中的fixed装入主窗体中,并将应用列表界面设置为隐藏属性。
整个登录界面包括几个功能:用户名密码输入框,登录按钮,网络设置按钮,服务器设置按钮,关机,帮助文档。而整个界面格局为帮助文档占屏幕的右半边,其他功能集中于屏幕左侧。帮助文档以图片的形式进行显示,并且包含有上一页下一页图标。
登陆界面初始化主要使用GTK库函数中的以下函数:
GtkWidget*gtk_fixed_new(void);用于创建一个固定容器GtkFixed,将其子空间固定于其父控件的相应位置,本发明中利用此函数新建GtkFixed控件,并对登录界面进行布局。
GdkPixbuf*gdk_pixbuf_new_from_file(const char*filename,GError**error);从filename指定文件中获取图片,所有的应用图标图片,帮助文档图片,背景图片都是使用此函数读取图片文件,程序中error都使用NULL。
GdkPixbuf*gdk_pixbuf_scale_simple(const GdkPixbuf*src,int dest_width,int dest_heigh GdkInterpType interp_type);在程序中使用此函数调整图片大小,而图片大小与屏幕大小相关。根据屏幕大小计算出相应比例的图片大小,并将长宽分别传入dest_width与dest_height,而interp_type设置为GDK_INTERP_BILINEAR。
GtkWidget*gtk_image_new(void);新建一个图片控件,用于显示图片。
void gtk_image_set_from_pixbuf(GtkImage*image,GdkPixbuf*pixbuf);将GdkPixbuf中的图片信息传入GtkImage,GdkPixbuf只保留着图片信息,无法使用GdkPixbuf直接显示图片,而显示图片需要使用GtkImage控件。
GtkWidget*gtk_button_new(void);用于新建图标。
void gtk_container_add(GtkContainer*container,GtkWidget*widget);在容器中添加控件,容器也可以是控件,程序中一般在GtkButton控件中添加GtkImage控件,使图标显示更美观。
Void gtk_container_set_border_width(GtkContainer*container,guintborder_width);设置容器边框与子控件的间距,程序中用于将GtkButton控件与其内部GtkImage控件间距设置为0。
void gtk_button_set_relief(GtkButton*button,GtkReliefStyle newstyle);用于设置GtkButton控件显示效果,因程序界面设计需要GtkButton控件为透明效果,所以使用此函数设置GtkButton控件的relief属性为GTK_RELIEF_NONE。
void gtk_fixed_put(GtkFixed*fixed,GtkWidget*widget,gint x,gint y);用于将控件固定于其父控件的固定位置,程序中用于将GtkButton,GtkImage,GtkEntry,GtkBox固定于主窗体中。
GtkWidget*gtk_entry_new(void);用于新建一个GtkEntry控件,此控件用于实现单行用户输入框。
void gtk_entry_set_max_length(GtkEntry*entry,gint max);设置GtkEntry控件最大长度。
void gtk_entry_set_text(GtkEntry*entry,const gchar*text);设置GtkEntry控件内容。初始化时在用户名的GtkEntry中调用其显示“@用户名”,密码的GtkEntry中调用其显示“密码”。
void gtk_box_pack_start(GtkBox*box,GtkWidget*child,gboolean expand,gboolean fill,guint padding);用于在盒子容器中加入子控件,由于在初始化登录界面中盒子容器用于保存登录界面和应用列表界面,而初始化时应用列表界面为隐藏,所以调用此函数是expand为TRUE,fill为TRUE,pading为0。
初始化应用列表界面:应用列表界面主要包括两个方面,一个是工具栏,一个为应用列表,工具栏使用GtkBox建立,其中包括一个GtkLabel控件用于显示登陆用户,GtkButton注销图标,GtkButton刷新应用图标,如果用户进入应用列表中的文件夹,工具栏还会显示GtkButton返回上一级图标。其主要使用的gtk函数包括:
GtkWidget*gtk_alignment_new(gfloat xalign,gfloat yalign,gfloatxscale,gfloat yscale),用于建立一个对齐控件,一般只使用第一个参数xalign,中间对齐为0.5,左对齐为0,右对齐为1。
GtkWidget*gtk_frame_new(const gchar*label),用于建立一个包含应用列表的GtkTable的frame框控件。
void gtk_frame_set_shadow_type(GtkFrame*frame,GtkShadowType type),用于设置frame框风格,其中type为GTK_SHADOW_NONE,即不将frame框显示。
GtkWidget*gtk_hbox_new(gboolean homogeneous,gint spacing),用于建立一个横向组装盒,工具栏与radio_button控件使用的就是横向组装盒,在其中再添加Gtkalignment达到对齐效果。将有所radio_button控件包含于横向组装盒让其能够相互对齐。
GtkWidget*gtk_vbox_new(gboolean homogeneous,gint spacing),用于建立纵向组装盒,将radio_button使用的横向组装盒及frame框加入,将radio_button使用的横向组装盒放于frame框之上。
void gtk_widget_modify_fg(GtkWidget*widget,GtkStateType state,constGdkColor*color),用于设置控件颜色,设置GtkLabel,GtkButton中的字体颜色。
步骤A205、调用登陆界面,在用户验证登陆后,构造应用列表界面中的所有控件,并将登陆界面隐藏。
首先调用登陆界面,其登陆流程如图11所示。对web interface的用户名进行验证,在用户名及密码通过验证后,会连接到云端的虚拟服务器。在登陆后会完成整个应用列表界面的构造,该步将应用列表界面的所有构件构造出来,包括整个框架。但此时并不包括GtkTable控件,整个应用列表界面没有应用的存在。
登陆时获取本地地址主要通过以下系统调用实现:
int socket(int domain,int type,int protocol);
int ioctl(int handle,int cmd,[int*argdx,int argcx]);
首先使用socket,并将domain设置为AF_INET,type设置为SOCK_DGRAM,protocol设置为0,然后使用ioctl将cmd设置为SIOCGIFCONF获得所有接口的清单,同时再使用ioctl获取所有接口的IP地址,如若所有返回地址只有回环地址则表明系统没有接入网络。当接入网络后通过const gchar*gtk_entry_get_text(GtkEntry*entry)获取用户名及密码的GtkEntry控件值,并判断其值是否为空,如若为空将显示提示窗口,此后获取本地保存的服务器地址,最后通过调用void webkit_web_view_load_uri(WebKitWebView*web_view,const gchar*uri)将本地保存的服务器地址传入uri,后台web_view控件将读取其web页面。执行完此步之后程序将使用g_timeout_add添加一个定时器用于防止登陆超时,定时器超时时间设定为20秒,并将主窗体设置为不可访问的,而当定时器到时时,将会显示提示窗口提示登录超时,并将主窗体设置为可访问。
当密码错误时,使用GTK自带的message_dialog调用函数GtkWidget*get_message_dialog_new(GtkWindow*parent,GtkDialogFlags flags,GtkMessageType type,GtkButtonsType button,const gchar*message format,...)。其中,parent指定为主窗体,flags使用GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,type使用GTK_MESSAGE_ERROR,buttons使用GTK_BUTTONS_OK。Message_format使用“用户名或密码错误。”
最后将新的message_dialog传入函数
Gint gtk_dialog_run(GtkDialog*dialog);
Void gtk_widget_destroy(GtkWidget*widget);
用于显示与销毁。
当LOGIN状态不处于密码错误状态时,表明后台web_view处于登陆页面,通过使用webkit函数
WebKitDocument*webkit_web_view_get_dom_document(WebKitWebView*web_view);
获取页面相应的DOM文档。
然后使用webkit_dom_document_get_element_by_id函数,根据element ID获取元素,需要使用的element ID为“user”,“password”。获取到“user”与“password”后,程序将用户名的GtkEntry内容写入“user”元素,密码的GtkEntry写入“password”元素,可使用void webkit_dom_html_input_element_set_value_for_user(WebKitDOMHTMLInputElement*input,const gchar*data)进行写入。
之后程序需要调用网页的登陆按钮,调用前需定位此按钮,通过
JSGlobalContextRef
webkit_web_frame_get_global_context(WebKitWebFrame*frame);
从当前页面的WebKitWebFrame中获取全局的javascript上下文,然后通过JSobjectRef JSContextGetGlobalOBject(JSContextRef ctx);获取全局的javascriptobject,之后将之前获取到的JSGlobalContextRef与JSobjectRef和登陆按钮的JSString格式名出入
JSValueRef JSObjectGetProperty(JSContextRef ctx,JSObjectRef object,
JSStringRef propertyName,JSValueRef*exception);
获取相应的功能object,最后通过调用
JSValueRef JSObjectCallAsFunction(JSContextRef ctx,
JSObjectRef object,JSObjectRef thisObject,size_t argumentCount,constJSValueRef arguments[],JSValueRef*exception);
实现调用页面的登陆按钮。
当登陆成功后进入应用列表网页,首先通过webkit_web_view_get_dom_document获取页面的dom树,并通过webkit_dom_document_get_element_by_id分别获取页面的“注销”、“刷新应用”、“主要”这些元素。
当为登录状态时,程序通过函数
Void gtk_widget_hide(GtkWidget*widget);将登陆界面隐藏,并通过函数
Void gtk_widget_show(GtkWidget*widget);显示应用列表界面。此时显示出的应用列表界面并无应用,显示的是一个空的应用列表界面。
步骤A30包括以下步骤:
步骤A301、利用dom树获取应用列表,并下载对应的应用图标,建立app_list_node并添加到app_list_head链表中。
首先使用get_application_list()获取整个应用列表,其流程图如图9所示,在该过程中主要调用到了以下函数:
webkit_web_view_get_dom_document获取页面DOM文档
webkit_dom_node_list_get_length获取节点列表长度
webkit_dom_node_list_item获取父节点指定子节点
webkit_dom_node_get_child_nodes获取父节点的子节点链表
webkit_dom_html_image_element_get_src获取图像元素的原始地址
webkit_dom_html_element_get_class_name用于判断获取元素的class_name,从而判断是否为文件夹。
webkit_dom_html_element_get_title获取元素的title
通过函数WebKitNetworkRequest*webkit_network_request_new(const gchar*uri)使用图像元素的原地址创建一个网络请求,用于建立图标下载;
通过函数WebKitDownload*webkit_download_new(WebKitNetworkRequest*request)使用建立的网络请求一个新的下载。
通过函数Void webkit_download_set_destination_uri(WebKitDownload*download,const gchar*destination_uri)设置下载的位置,通过函数Void webkit_download_start(WebKitDown*download)开始下载,再通过函数WebKitDownloadStatuswebkit_download_get_status(WebKitDownload*download)获取下载状态。
接着会根据下载的应用图标建立app_list_node,并将app_list_node添加到app_list_head的链表中。
本发明,同时还设计了下载检测定时器用于检测下载的状态,给予定时器不同的时间,使定时器经过相应的时候后遍历app_list,并使用webkit_download_get_status检测所有app_list_node中的download状态,当所有download状态都为WEBKIT_DOWNLOAD_STATUS_FINISHED时,显示应用列表界面中的应用列表。当调用webkit_download_start后,会调用add_app_list_node添加一个app_list_node节点,并将app_list_node节点中的download指向当前的WebKitDownload用于定时器判断下载状态。定时器会定时遍历所有app_list_node,判断所有的下载状态,如若下载未完成则跳出等待下次定时器执行,当所有下载完毕后,定时器会将运行add_app_in_table函数,其流程图如图10所示。
步骤A302、构建GtkTable控件和应用图标,并计算出各应用图标的存放位置,然后将app_list_node中的GtkButton添加到GtkTable控件中。
首先判断table_list_head是否初始化,若table_list_head中的first指向空,则建立一个table_list_node,并新建一个GtkTable,使table_list_node中的table_widget指向新的GtkTable。每一个GtkTable都会有一个table_list_node,GtkTable的每一行和每一列与屏幕大小有关,具体计算公式如下:
rows=(frame_x+BUTTON_SPACE)/(BUTTON_WIDTH+BUTTON_SPACE);
columns=(frame_y+COLUMNS_SPACE)/(BUTTON_HEIGHT+COLUMNS_SPACE);
frame_x为屏幕长度的3/4,frame_y为屏幕长度的1/2,BUTTON_SPACE为应用行间间隔,BUTTON_WIDTH为应用图标宽度,COLUMNS_SPACE为每一行之间的间隔,BUTTON_HEIGHT为图标高度。Rows为一行应用数,columns为一列应用数。
然后根据计算出的结果,使用函数GtkWidget*gtk_table_new(guint rows,guintcolumns,gboolean homogeneous)新建一个GtkTable,其中的homogeneous设置为FALSE。
接着使用函数GtkWidget*gtk_radio_button_new(GSList*group)建立相应的应用图标。
最后根据函数
void gtk_table_attach(GtkTable*table,GtkWidget*child,guint left_attach,guint right_attach,
guint top_attach,guint bottom_attach,
GtkAttachOptions xoptions,GtkAttachOptions yoptions,
guint xpadding,guint ypadding);
计算出该按钮放置的位置,并将app_list_node中的GtkButton添加到GtkTable控件中。
在该步骤中还需要对服务器进行设置,其主要为:
绑定与服务器设置的GtkButton控件,当用户使用鼠标或者回车键点击GtkButton控件时会调用到此函数,而此函数主要设计思路为使用gtk_window_new创建一个窗体,使用gtk_window_set_default_size设置窗体大小,使用gtk_window_set_position将其位置设置为GTK_WIN_POS_CENTER,也就是居中,并使用void gtk_widget_set_sensitive(GtkWidget*widget,gboolean sensitive)通过将sensitive设置为FALSE将主窗体设置为不可访问的,在服务器设置子窗体关闭时再通过将sensitive设置为TRUE将主窗体设置为可访问。当建立完子窗体后再其上新建确定及取消按键,以及GtkEntry输入框用于输入密码,使用GtkWidget*gtk_label_new(const gchar*str)新建一个GtkLabel用于显示“管理员密码:”,这些控件全部使用一个GtkFixed固定于新建的小窗口上,而当确定后,小窗体保持不变,调用gtk_label_set_text将“管理员密码:”更改为“服务器地址:”,程序会读取本地保存的一个存储服务器URL地址的文件,并将其内容显示于GtkEntry输入框。最后用户输入服务器URL后确定时,程序会将新的服务器URL写入本地存储服务器URL地址的文件中并替换旧的服务器URL。
网络设置函数:网络设置主要调用外部wicd程序进行网络的设置,并将主窗体使用gtk_widget_set_sensitive设置为不可访问的,主要使用pid_t fork(void)新建立一个子进程,在子进程中使用int execlp(const char*file,const char*arg,...,(char*)0)运行wicd-client客户端。并且使用g_timeout_add添加一个定时器用于检测wicd是否关闭,定时器中使用pid_t waitpid(pid_t pid,int*status,intoptions)将options设置为WNOHANG使此函数不予等待及时返回,并将使用fork新建立的子进程pid传入pid中。通过判断返回值获取wicd是否正在运行,如若运行则等待指定时间后继续执行定时器函数,否则将窗体设置为可访问的。
步骤A303、将应用图标添加到GtkImage控件中,并使用g_signal_connect将应用图标与对应的应用进行关联,实现GTK图形界面与云端应用的对接。
在该过程中主要用到的GTK库函数为:
通过调用函数GdkPixbuf*gdk_pixbuf_new_from_file(const char*filename,GError**error)从filename指定文件中获取图片文件,其中帮助文档图片,背景图片也都是使用此函数读取图片文件,程序中在出现error时都使用NULL。
接着,在程序中通过使用函数GdkPixbuf*gdk_pixbuf_scale_simple(constGdkPixbuf*src,int dest_width,int dest_heigh GdkInterpType interp_type)来调整图片显示的大小,而图片大小与屏幕大小相关,同时也要与应用按钮的大小相匹配。根据屏幕大小计算出相应比例的图片大小,并将长宽分别传入dest_width与dest_height,而其中的interp_type设置为GDK_INTERP_BILINEAR。
再通过函数GtkWidget*gtk_image_new(void)新建一个图片控件显示图片。
由函数void gtk_image_set_from_pixbuf(GtkImage*image,GdkPixbuf*pixbuf);将GdkPixbuf中的图片信息传入GtkImage,GdkPixbuf只保留着图片信息,无法使用GdkPixbuf直接显示图片,而显示图片需要使用GtkImage控件。
GtkWidget*gtk_button_new(void);用于新建图标。
void gtk_container_add(GtkContainer*container,GtkWidget*widget);在容器中添加控件,容器也可以是控件,程序中一般在GtkButton控件中添加GtkImage控件,使图标显示更美观。
最后通过g_signal_connect将应用图标与对应的应用按钮及相关的设计函数相关联,最终实现GTK的图形界面操作。
步骤A304、通过show_login_screen()调用函数gtk_widget_show()显示GtkTable控件,显示应用列表界面。
应用列表界面主要包括一个工具栏和一个为应用列表,其中的工具栏使用GtkBox建立,包括一个用于显示登陆用户信息的GtkLabel控件,一个注销图标GtkButton和一个刷新应用图标的GtkButton。在用户进入应用列表中的文件夹,工具栏中还会显示返回上一级图标的GtkButton。
还包括关机和翻页等,关机图标主要通过绑定shutdown_func函数,而此函数通过调用system(″shutdown-h now″)达到关机效果;翻页包括上一页与下一页功能,主要用于帮助文档的翻页,帮助文档由一张张图片构成,而使用上一页及下一页图标就是调用到gtk_widget_hide()函数隐藏此页的图片,并调用gtk_widget_show()函数显示相应的页面图像。
本发明,云计算系统终端省略了机箱及显示部分,仅内置操作系统,通过HDMI接口连接在任一台显示设备上,通过无线网络连接到云端,调用云计算机上的应用实现相应的功能,具有体积小巧、便于携带、操作方便等显著的优点。
本发明不局限于上述最佳实施方式,任何人应该得知在本发明的启示下作出的结构变化,凡是与本发明具有相同或相近的技术方案,均落入本发明的保护范围之内。
Claims (5)
1.云计算系统终端的实现方法,其特征在于,该方法的实现包括以下步骤:
步骤A10、利用Citrix XenApp在云计算系统的云端搭建虚拟服务器,并在虚拟服务器中安装web interface角色;
步骤A20、通过HDMI接口将云计算系统终端连接到显示设备上,并在显示设备的屏幕上创建主窗体,完成登陆界面和应用列表界面的初始化,然后利用web interface角色连接到云计算系统,完成应用列表界面的构造并显示;
步骤A30、初始化所述显示设备的前台界面,获取应用列表并实现云端应用的本地拉取,之后通过GTK图形工具包在主窗体内显示相应应用的图标并与云端对应的应用对接,实现云端应用在所述显示设备上的本地图形化操作;
步骤A20包括以下步骤:
步骤A201、通过HDMI接口将云计算系统终端连接到显示设备上,在显示设备的屏幕上创建主窗体并初始化,设定窗体大小与所述显示设备的屏幕大小相同;
步骤A202、初始化应用表头app_list_head和应用列表表头table_list_head,分配内存,并对内部的成员变量进行赋值,具体方法如下:
调用函数Void*malloc(size t size)对表头以及app_list_node和table_list_node进行内存分配;
步骤A203、初始化后台webkit内核中的webview控件,创建一个WebkitWebView控件,通过web interface读取保存的服务器地址,使服务器的web interface网页与该控件重新连接;
步骤A204、初始化登陆界面及应用列表界面;
步骤A205、调用登录页面,在用户验证登陆后,构造应用列表界面中的所有控件,并将登陆界面隐藏。
2.如权利要求1所述的云计算系统终端的实现方法,其特征在于,步骤A30包括以下步骤:
步骤A301、利用dom树获取应用列表,并下载对应的应用图标,建立app_list_node并添加到app_list_head链表中;
步骤A302、构建GtkTable控件和应用图标,并计算出各应用图标的存放位置,然后将app_list_node中的GtkButton添加到GtkTable控件中;
步骤A303、将应用图标添加到GtkImage控件中,并使用g_signal_connect将应用图标与对应的应用进行关联;
步骤A304、通过show_login_screen()调用函数gtk_widget_show()显示GtkTable控件,显示出应用列表界面。
3.如权利要求1所述的云计算系统终端的实现方法,其特征在于,在步骤A30中,前台界面分为左右两部分,左部分用于显示功能性按钮,右半部分用于显示帮助文档界面,并设有翻页按钮。
4.如权利要求1所述的云计算系统终端的实现方法,其特征在于,在步骤A20中,通过对web_element结构体的操作实现web页面的访问控制以及web页面的元素获取,web_element结构体定义如下:
web_view:使用webkitgtk+3.0库中的webkit_web_view_new()构建,用于读取url地址web页面并显示;
web_set:其为WebKitWebSettings*结构体,用于设置自定义参数;
message_type:用于存放读取后的web网页一些特定的返回信息;
message_key:用于存放读取后的web页面一些特定的返回信息;
Dom:用于指向web页面的dom文档;
user_dom:用于指向dom文档中的用户名输入栏元素;
passwd_dom:用于指向dom文档中的密码输入栏元素;
frame:指向web页面的框架;
js:指向web页面全局javascript上下文;
globalObject:保存web页面全局javascript对象;
myfunctionname:用于保存javascript的功能名;
functionObject:指向javascript功能对象。
5.云计算系统,包括云端和终端,其特征在于,
所述云端上设有利用Citrix XenApp搭建的虚拟服务器,且所述虚拟服务器中安装有web interface角色;
所述终端上设有HDMI接口、主窗体创建模块、初始化模块、应用拉取模块、应用图标与云端应用的对接模块;
所述终端通过HDMI与外接显示设备连接并从外接显示设备取电;
所述主窗体创建模块在显示设备的屏幕上创建主窗体,完成登陆界面和应用列表界面的初始化,然后利用web interface角色连接到云计算系统,完成应用列表界面的构造并显示;
所述初始化模块初始化显示设备的前台界面,初始化应用表头app_list_head和应用列表表头table_list_head,分配内存,并对内部的成员变量进行赋值;初始化后台webkit内核中的webview控件,创建一个WebkitWebView控件,通过web interface读取保存的服务器地址,使服务器的web interface网页与该控件重新连接;
所述应用拉取模块获取应用列表,并拉取云端上的相应应用到终端;
所述应用图标与云端应用的对接模块,利用GTK图形工具包在主窗体内显示相应应用的图标并与云端对应的应用对接,实现云端应用在所述显示设备上的本地图形化操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410049269.9A CN103823674B (zh) | 2014-02-12 | 2014-02-12 | 云计算系统及其终端的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410049269.9A CN103823674B (zh) | 2014-02-12 | 2014-02-12 | 云计算系统及其终端的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103823674A CN103823674A (zh) | 2014-05-28 |
CN103823674B true CN103823674B (zh) | 2017-04-05 |
Family
ID=50758760
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410049269.9A Active CN103823674B (zh) | 2014-02-12 | 2014-02-12 | 云计算系统及其终端的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103823674B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105763645A (zh) * | 2016-04-22 | 2016-07-13 | 努比亚技术有限公司 | 移动终端应用虚拟化方法及装置 |
CN107320123A (zh) * | 2017-06-28 | 2017-11-07 | 东北大学 | 基于扫描前端与成像后端分离的ct影像链重组方法 |
CN111475236A (zh) * | 2020-02-20 | 2020-07-31 | 唐朝 | 云端操作的交互系统及云端操作系统的主机 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102970380A (zh) * | 2012-12-20 | 2013-03-13 | 青岛海信传媒网络技术有限公司 | 获取云存储文件的媒体数据的方法以及云存储服务器 |
CN103176770A (zh) * | 2011-12-21 | 2013-06-26 | 上海三一精机有限公司 | 一种数控系统中界面系统的创建方法 |
CN103377053A (zh) * | 2012-04-16 | 2013-10-30 | 腾讯科技(深圳)有限公司 | 一种控制应用的方法、装置及系统 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101253560B1 (ko) * | 2009-11-05 | 2013-04-11 | 한국전자통신연구원 | 가상화 솔루션의 관리 시스템, 관리 서버, 및 그 방법 |
US9769085B2 (en) * | 2012-05-04 | 2017-09-19 | Citrix Systems, Inc. | Systems and methods for adaptive application provisioning |
-
2014
- 2014-02-12 CN CN201410049269.9A patent/CN103823674B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103176770A (zh) * | 2011-12-21 | 2013-06-26 | 上海三一精机有限公司 | 一种数控系统中界面系统的创建方法 |
CN103377053A (zh) * | 2012-04-16 | 2013-10-30 | 腾讯科技(深圳)有限公司 | 一种控制应用的方法、装置及系统 |
CN102970380A (zh) * | 2012-12-20 | 2013-03-13 | 青岛海信传媒网络技术有限公司 | 获取云存储文件的媒体数据的方法以及云存储服务器 |
Non-Patent Citations (2)
Title |
---|
Xenapp之web界面中文化及发布应用;ccfxny;《http://www.cnblogs.com/ccfxny/archive/2010/03/12/1683941.html》;20100513;正文第1-16页 * |
面向云{ 端融合的移动互联网应用运行平台;黄罡 等;《中国科学》;20130131;第43卷(第1期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN103823674A (zh) | 2014-05-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104823163B (zh) | 基于元数据的虚拟机配置 | |
US9491061B1 (en) | Isolation of objects representng server resources in browser using iframes | |
CN105122233B (zh) | 云对象 | |
CN103415834B (zh) | 动态跨环境应用配置 | |
KR101782302B1 (ko) | 네트워크에서의 검색가능 데이터에 대한 인덱스 구성 | |
CN106575243A (zh) | 管理程序托管的虚拟机取证 | |
CN105378661B (zh) | 资源包索引 | |
Bhowmik | Cloud computing | |
CN103608799A (zh) | 自动用户界面对象变换和代码生成 | |
Badam et al. | Munin: A peer-to-peer middleware for ubiquitous analytics and visualization spaces | |
Rindos et al. | The virtual computing lab (vcl): an open source cloud computing solution designed specifically for education and research | |
CN107402766B (zh) | 页面布局管理方法及装置 | |
DE202014010943U1 (de) | Wechseln zu und aus nativen Webanwendungen | |
CN109086020A (zh) | 分屏显示方法及装置 | |
CN103823674B (zh) | 云计算系统及其终端的实现方法 | |
CN106462329A (zh) | 轻解除管理器 | |
CN106233243A (zh) | 多架构管理器 | |
US10540215B2 (en) | Interoperability between a host application and an embedded target application | |
CN103823675B (zh) | 云计算系统终端从云端拉取应用到本地的方法 | |
US8949930B1 (en) | Template representation of security resources | |
Seda et al. | Efficient architecture design for software as a service in cloud environments | |
KR102184162B1 (ko) | 반응형 웹툰 제작 시스템 및 방법 | |
CN108292193A (zh) | 动画数字墨水 | |
Roche et al. | Beginning Java Google App Engine | |
Rosenbaum | Serverless computing in Azure with. NET |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |