具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
本技术领域技术人员可以理解,这里所使用的“终端”、“终端设备”既包括无线信号接收器的设备,其仅具备无发射能力的无线信号接收器的设备,又包括接收和发射硬件的设备,其具有能够在双向通信链路上,进行双向通信的接收和发射硬件的设备。这种设备可以包括:蜂窝或其他通信设备,其具有单线路显示器或多线路显示器或没有多线路显示器的蜂窝或其他通信设备;PCS(Personal Communications Service,个人通信系统),其可以组合语音、数据处理、传真和/或数据通信能力;PDA(Personal DigitalAssistant,个人数字助理),其可以包括射频接收器、寻呼机、互联网/内联网访问、网络浏览器、记事本、日历和/或GPS(GlobalPositioning System,全球定位系统)接收器;常规膝上型和/或掌上型计算机或其他设备,其具有和/或包括射频接收器的常规膝上型和/或掌上型计算机或其他设备。这里所使用的“终端”、“终端设备”可以是便携式、可运输、安装在交通工具(航空、海运和/或陆地)中的,或者适合于和/或配置为在本地运行,和/或以分布形式,运行在地球和/或空间的任何其他位置运行。这里所使用的“终端”、“终端设备”还可以是通信终端、上网终端、音乐/视频播放终端,例如可以是PDA、MID(Mobile Internet Device,移动互联网设备)和/或具有音乐/视频播放功能的移动电话,也可以是智能电视、机顶盒等设备。
本发明的实现,适于为Android提供并安装一个应用程序,由其启动,在获取系统最高权限或者系统开放最高权限的情况下,而向系统提供交互功能,实现本方法所需的控制。
如图1所示,本发明的一种智能终端免系统权限网络配置方法,包括如下步骤S11-S13:
步骤S11、建立符合WiFi P2P规范的网络群组以完成本智能终端的热点模式的启动,使其与本智能终端的站点模式并存工作。
理论上可以通过Android系统的热点进程Hostapd来建立所述的热点模式,但是,实测中,hostapd进程启动时,会自动关闭站点进程,导致智能终端无法同时工作于热点模式和站点模式之下,因而,转而采用自行建立网络群组的方式,可以有效避免这一故障的发生。
根据WiFi P2P协议的规范,可以使多个智能终端组在一个网络群组,在该网络群组中,有且只有一个服务端角色,余者为客户端角色。所述的服务端与客户端两种角色,在本发明中,主要相对于以WiFi P2P协议所规范的两部智能终端而言,其中,作为客户端的智能终端的芯片模组工作于该协议所规范的P2P-Client模式下,即表现为客户端角色;而与之相对的本发明的智能终端则工作于该协议所规范的P2P-Group Owner(P2P GO)模式下,即表现为服务端角色。
Android系统中,封装了一个点对点连接管理类,即WiFiP2pManager,顾名思义,该类即用于依照WiFi P2P协议的规范来管理Android终端之间的点对点连接。该类构造了一个用于建立所述的网络群组的方法函数,具体引用形式为WiFiP2pManager.createGroup(wifip2pmanger.chanenl,wifip2pmanager.ActionListener),调用该方法,可以创建一个热点,使智能终端启动热点模式,并且将自身设置为服务端,由此创建的热点还可以供不支持WiFi P2P协议的传统WiFi设备与之连接。由此形成的网络群组,可以使用该类的另一方法函数:requestConnectionInfo(wifip2pmanger.chanenl,wifip2pmanager.ActionListener)去得到详细的连接信息。这个wifip2pInfo连接信息包含了拥有组者也即服务端的地址groupOwnerAddress和一个去说明当前设备是否是这个p2p组的拥有者的标志isGroupOwer,一个p2p的客户端因此可以和p2p组拥有者通过一个socket连接进行通信。
Android操作系统默认情况下,并不允许同一智能终端的WiFi芯片模组同时工作于客户端和服务端两种模式下,但是,通过自行创建所述的网络群组却可解决这一问题,其中createGroup()函数的调用起到关键的作用,其完成了本智能终端的热点模式的启动。
由于本发明重点是解决让客户端通过服务端所在的智能设备的WiFi功能访问外网的网络配置问题。在不考虑客户端自行连接外网的前提下,本智能终端能够访问外网,是接入本网络群组的客户端访问外网的前提。因此,较佳的方式中,是使本智能终端在完成上述热点模式的启动之前,便已启动了站点模式。
欲启动Android系统的站点模式,可以通过用户在系统设置页上手动开启或通过系统的站点进程来建立。所述站点进程,特指Android系统自身提供的wpa_supplicant进程,wpa_supplicant本是开源项目源码,被谷歌修改后加入android移动平台,主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。
以下提供一个利用wpa_cli来完成网络连接的示例供本领域技术人员参照理解本发明,但不应理解为对本发明的实现的限制。
要实现网络连接功能,首先需要运行wpa_supplicant程序以加载基本功能;
执行:/system/bin/wpa_supplicant-d-Dwext-iwlan0-c/data/misc/wifi/wpa_supplicant.conf
其中:
-d:增加调试信息
-Dwext:wext,驱动名称
-iwlan0:wlan0,网络接口名称
/system/bin/wpa_supplicant:wpa_supplicant,可执行程序路径
/data/misc/wifi/wpa_supplicant.conf:wpa_supplicant的配置文件路径
然后,运行命令行工具wpa_cli;
执行:wpa_cli-iwlan0-p/data/system/wpa_supplicant
注意,-p/data/system/wpa_supplicant中的wpa_supplicant并不是可执行程序,而是个控制套接字。
此时会进入交互模式。其中交互模式的命令如下表:
Full command
Short command
Description
status
stat
displays the current connection status
disconnect
disc
prevents wpa_supplicant from connecting to any access point
quit
q
exits wpa_cli
terminate
term
kills wpa_supplicant
reconfigure
recon
reloads wpa_supplicant with the configuration file supplied(-cparameter)
scan
scan
scans for available access points(only scans it,doesn't displayanything)
scan_result
scan_r
displays the results of the last scan
list_networks
list_n
displays a list of configured networks and their status(active ornot,enabled or disabled)
select_network
select_n
select a network among those defined to initiate a connection(ie select_network 0)
enable_network
enable_n
makes a configured network available for selection(ieenable_network 0)
disable_network
disable_n
makes a configured network unavailable for selection(iedisable_network 0)
remove_network
remove_n
removes a network and its configuration from the list(ieremove_network 0)
add_network
add_n
adds a new network to the list.Its id will be createdautomatically
set_network
set_n
shows a very short list of available options to configure anetwork when supplied with no parameters.
See next section for a list of extremely useful parameters to beused with set_network and get_network.
get_network
get_n
displays the required parameter for the specified network.Seenext section for a list of parameters
save_config
save_c
saves the configuration
以上命令项可以从Android的公开技术文档中查看,此处仅供参考。
设置网络的基本格式的指令为:set_network<network id><key><parameter>[<parameter>]
显示网络信息的基本格式的指令为:get_network<network id><key>
相应的参数如下表:
Key
Description
Parameters
ssid
Access point name
string
id_str
String identifying the network
string
priority
Connection priority over other APs
number(0being the default low priority)
bssid
Mac address of the access point
mac address
scan_ssid
Enable/disbale ssid scan
0,1,2
key_mgmt
Type of key management
WPA-PSK,WPA_EAP,None
pairwise
Pairwise ciphers for WPA
CCMP,TKIP
group=TKIP
Group ciphers for WPA
CCMP,TKIP,WEP104,WEP40
psk
Pre-Shared Key(clear or encrypted)
string
wep_key0
WEP key(up to 4:wep_key[0123])
string
eap
Extensible Authentication Protocol
MD5,MSCHAPV2,OTP,GTC,TLS,PEAP,TTLS
identity
EAP identity string
string
password
EAP password
string
ca_cert
Pathname to CA certificate file
/full/path/to/certificate
client_cert
Pathname to client certificate
/full/path/to/certificate(PEM/DER)
private_key
Pathname to a client private key file
/full/path/to/private_key(PEM/DER/PFX)
同理,以上参数表也可通过公共途径从Android官方得到,仅供参考,恕不赘述。以下利用一用于连接无加密的AP的具体实例说明如何实现网络连接:
>add_network(将显示一网络ID,假定返回值为0)
>set_network 0ssid"666"
>set_network 0key_mgmt NONE
>enable_network 0
>quit
再利用一用于连接WEP加密的AP的具体实例加以说明:
>add_network(假定网络ID返回1)
>set_network 1ssid"666"
>set_network 1key_mgmt NONE
>set_network 1wep_key0"your ap password"
>enable_network 1
至于连接WPA-PSK/WPA2-PSK加密的AP的示例如下:
>add_network(假定网络ID返回2)
>set_network 2ssid"666"
>set_network 2psk"your pre-shared key"
>enable_network 2
到此,wifi模块就能连接上AP了。
以上是通过命令行工具wpa_cli来实现wifi网络的连接。当然,也可以通过wpa_supplicant的配置文件来实现连接。
不妨再回顾前面运行wpa_supplicant时执行的命令:
/system/bin/wpa_supplicant-d-Dwext-iwlan0-c/data/misc/wifi/wpa_supplicant.conf
我们在执行时加上了-c/data/misc/wifi/wpa_supplicant.conf,故而可以将要连接的AP的设置以一定的格式写入wpa_supplicant.conf配置文件中即可。例如:
ctrl_interface=DIR=/data/system/wpa_supplicantGROUP=system update_config=1
network={
ssid="my access point"
proto=WPA
key_mgmt=WPA-PSK
psk="you pass words"
}
可见,即使是调用站点进程启动智能终端WiFi芯片模组的站点模式,也可通过以上运用指令、运用配置文件两种不同方式,来实现由应用程序进程自行控制所述的站点进程的开启,从而使智能终端工作于站点模式之下。
由以上的分析可知,本发明可以借助多种方式激活智能终端的站点模式,并通过调用点对点连接管理类的createGroup方法来激活智能终端的热点模式,这两种模式可以并存于Android智能终端中。从而使得智能终端能够利用其站点模式接入外网,同时利用热点模式建构一个小型网络。
为使上述的双模状态更易于操作,体现更佳的用户体验,本发明的应用程序进程可以通过对用户界面进行设计来对此加以完善。
用户界面泛指能够用于实现人机交互并且能够接收用户控制指令的显示界面,例如,可以是Android系统的设置页面中的一个选项(或按键,由所述应用程序添加其中,下同),也可以是从桌面呼出的通知栏或者交互页面中的一个选项,还可以是所述应用程序的一个活动组件所构造的页面中的一个选项。
本发明优选如下两种方式,用于接收所述的控制指令:
其一,通过在用户界面提供单个控制按键,以用于一键式地接收所述的控制指令,这种方式便于用户实现一键式操作。
其二,通过在用户界面对应热点模式和站点模式而分别提供控制按键,以分别对应不同按键而产生对应启动相应的模式的控制指令。
根据以上的方式提供的控制按键,通常这些按键可以优选设置在系统桌面通知栏列表处,或者以桌面悬浮窗的方式提供,既便于用户触控控制,又不影响用户视觉效果,当然也可作为系统的默认功能而随用户开启WiFi按键时激活。较佳的,所述应用程序可以将自身设为自启动项,使得系统启动时,可以自行加载所述的按键,从而便于用户操作。
当用户通过所述的用户界面,触控所述的控制按键之后,便产生相应的控制指令,该控制指令将被所述应用程序的进程接收,从而对应控制热点模式和/或站点模式开户。
具体而言,用户既可以通过单个控制按键来同时开启热点模式和站点模式,也可以通过两个与两种模式相对应的按键来开启,实质上提供了多种操作变化例。对应这些变化,以下进一步示例说明。
设用户界面提供单个控制按键,用户通过该单个控制按键而触发其用户指令,此处便可以先调用createGroup()创建热点。继而,本发明的应用程序进程再自行启动该站点进程,由此便可实现两种模式的并存。反之,也可以先行启动站点进程,在其完成开启之后,再行参照上述示例开启热点模式。也就是说,对应于单个控制按键引起的控制指令,可以以不同的实施方式灵活安排所述热点模式和站点模式的启动顺序。
而对应用户界面提供不同的控制按键,分别表征开启不同的模式的实例而言,则可按用户点击不同控制按键的顺序而按序开启相应的模式,此举并不影响本发明的实施。
在优选的方案中,推荐优先让站点模式先于热点模式开启,在确保本智能终端可以连接外网的情况下,向其他智能终端提供接入功能,可以免除一些无用功,更为节能。
由此可见,将站点模式与热点模式相继启动后,便可以实现两种模式的共存。在此基础上,本发明的应用程序进程可以向用户界面输出一些结果信息,以告知用户该智能终端当前已经处于热点模式和站点模式共存的双模状态。至于所述的结果信息的表达形式,既可以是通过系统消息显示到通知栏中,也可以在桌面上弹窗显示,更优的方式可以是调用一个预设的第三方图标,用于表征该智能终端处于热点模式和站点模式共存的双模状态,将该第三方图标显示到用户界面的系统状态栏中,使得用户更易于获知相应的结果信息。
步骤S12、通过调用预置于系统提供的点对点连接管理类的配置接口,驱动网络守护进程修改网络共享配置信息使连通热点模式与站点模式之间的网络连接。
涉及到对网络守护进程直接调用的操作,依照Android的规范,需要获取系统的最高权限,因而,在获取Android系统最高权限或者Android系统已经开放最高权限的前提下,可以通过对所述网络守护进程进行调用,借此修改涉及到网络共享的配置信息,即网络共享配置信息,以便连通热点模式与站点模式之间的网络连接,让客户端可以通过服务端来访问外网。
所述的网络守护进程,即Netd,Network Daemon的缩写。Netd负责跟一些涉及物理端口的网络操作相关的功能实现,例如带宽控制(Bandwidth),网络地址转换(NAT),个人局域网(pan),PPP链接,soft-ap,本智能终端的热点模式所涉及的共享上网(Tether)等等……都是按照模块(.cpp+.h)组织在netd文件目录下的。
Android Netd相关的基本框架的四大部分:
(1)Linux Kernel用于检测网络相关的所有事件。
(2)Netd作为Kernel(内核层)与Framework(框架层)之间通信的桥梁。
(3)框架层操作Netd,向Netd发送操作命令。
(4)应用层与框架层交互,用于用户进行网络的操控。
Android为Netd提供了一个测试工具,即ndc,其主要功能有:
监视Netd中发生的事件。
支持通过命令行发送命令给Netd去执行。ndc的实现原理,便是连接上位于netd进程中的“netd”监听socket,然后从Netd接收信息或发送命令给Netd。
由此可见,可以通过ndc来驱动网络守护进程执行相关指令,本发明中,实现对网络共享配置信息的修改的功能,便可利用ndc命令来实施。
请先参照如下对Android系统实施的观测过程:
首先,通过分析,发现createGroup()创建热点之后,虽然产生可以被客户端连接,但其用于向用户反馈DHCP配置信息的配置进程DNSmasq的参数如下:
/system/bin/dnsmasq--keep-in-foreground--no-resolv--no-poll--dhcp-authoritative--dhcp-option-force=43,ANDROID_METERED--pid-file--dhcp-range=192.168.42.2,192.168.42.254,1h--dhcp-range=192.168.43.2,192.168.43.254,1h--dhcp-range=192.168.44.2,192.168.44.254,1h--dhcp-range=192.168.45.2,192.168.45.254,1h--dhcp-range=192.168.46.2,192.168.46.254,1h--dhcp-range=192.168.47.2,192.168.47.254,1h--dhcp-range=192.168.48.2,192.168.48.254,1h--dhcp-range=192.168.49.2,192.168.49.254,1h
从中可以看出,其中增加了强制配置序列为43的控制选项即dhcp-option-force=43,ANDROID_METERED,序号43的官方释义是厂商指定选项,用于表示当前连接为计费连接,在这种情况下,客户端将不能利用服务端的外网连接,以免产生巨额费用。然而,这种设计逻辑是以服务端将通过运营商的计费连接而提供访问外网服务的,但服务端存在以WiFi站点模式建立的免费外网连接的情况,并未被Android所兼容。
继而,通过分析Android官方文档中对于TetherController(共享控制器)的源代码可知,在这种情况下,该处对ANDROID_METERED进行了规范,然而,却未见默认网关的设置。
而对客户端中进行分析,从core.java.android.net.DhcpInfoInternal也就是dhcp客户端那边,利用下述的代码实施检测:
以上的分析表明,如要令客户端通过服务端来连接外网,需要避开上述的控制选项的影响。
进而,通过分析本智能终端的热点模式开启前和开启后的数
据包转发开关和数据包过滤表即iptables,也发现影响客户端上网
的因子。
具体而言,对于数据包转发开关,可以发现,cat
/proc/sys/net/ipv4/ip_forward的结果是1而不是0,因而理论上可
以通过echo"1">/proc/sys/net/ipv4/ip_forward enable来改变此一
开关设置,使其打开数据包转发功能。然而,这种情况下,由于
受iptables的影响,即使做出上述的改变,客户端进行外网访问仍
然未能畅通。当智能终端的热点模式下的p2p0标识所对应的接口
收到数据包,虽会查找路由,并且发到其站点模式下wlan0标识
所对应的接口,但是会被iptables的过滤规则所丢弃。
对于iptables,发现其存在两方面的影响,其一是其中包含有
将接口p2p0的数据包丢弃的规则,其二是欠缺将智能终端映射到
公网的NAT规则。对于前者,可以通过以下指令处理:iptables-D
FORWARD 4,即删除forward里的第4条规则,也即
natctrl_FORWARD规则。这时候当p2p0收到包,会从wlan0发出。
但是这个包的源ip是一个内网ip。因此,需要对后者做处理如下:
iptables-t nat-A POSTROUTING-o wlan0-j MASQUERADE,即向
iptables过滤表增加一条nat规则,添加之后,在另一个手机上,
便可以ping通外网ip了。由客户端到外网的连接,由此便畅通了。
结合实践分析,网关也已经得到正确配置。
通过上述的处理,仅仅解决了IP层的问题,对于DNS解析的功能,则仍未实现。进一步通过分析DNSmasq的配置参数,发现其携带了--no-resolv选项,该选项正是导致影响客户端获取正确的DNS解析的原因。由此,可以通过修改startTethering方法或者增加一个startTetheringWithDns()方法,去掉--no-resolv参数。完成这些操作,客户端经服务端到外网,具体到基于域名的万维网的访问,便畅通无阻了。
以上,概括而言,本发明为实现客户端通过服务端访问外网而借助ndc工具驱动网络守护进程所做出的涉及到网络共享配置信息的修改,主要涉及到以下方面:
其一、开通连通热点模式与站点模式之间的网络连接的数据包转发功能:具体表现为可通过echo指令设置其参数为1来打开。
其二、修正用于畅通热点模式与站点模式之间的网络连接的
数据包过滤表的设置内容:具体表现为对iptables表格去除相应的
过滤条目以及添加NAT映射记录。
其三、去除客户端共享上网限制解析DNS的选项:具体表现为可通过共享控制器(TetherController)的有关方法来去除--no-resolv选项。
由此可见,通过上述的方法,便可使本发明的智能终端实现连通其热点模式与其站点模式下之间的网络连接,为客户端提供接入外网的服务。
以上通过揭示对Android的系统原理的分析过程,揭示了本发明的实现原理,并提供了如何修改网络共享配置信息的一种实施例,除此之外,还可通过以下的方式来修改网络共享配置信息:
这种方式具体而言,即以系统最高权限调用ndc工具通过网络守护进程来实现修改的方式,请参阅如下代码及其说明:
ndc ipfwd enable
ndc tether dns set 0 114.114.114.114
//如果失败,通常意味着前面有手工操作没有完全撤销。执行ps|grep dnsmasq先强制关闭配置进程。如果还有残留进程,例如:
shell@CP8681_A01:/#ps|grep dnsmasq
dhcp 3557 325 10272 740 001a0338b66f61acS/system/bin/dnsmasq
//执行kill 3557杀掉,然后
ndc tether stop,//停止共享
ndc tether start 192.168.49.2192.168.49.254//启动共享,配置网段
ndc tether dns set 0 114.114.114.114//设置DNS
ndc nat enable p2p0wlan0 0//添加NAT规则
经测试,以上代码所起的效果与上方揭示的手动修改过程一
致,经由此段代码作用,数据包转发功能被打开,iptables过滤表
得到正确的配置,DNS解析功能也得到正确的维护。因此,本发
明的应用程序可以在系统最高权限状态下,在启动热点模式之后,
执行这段代码,便实现了对网络共享配置信息的正确修改,客户
端便可通过服务端来上网。
多数的Android系统智能终端,由于厂商的限制,并未开放其系统最高权限,或者未成功被ROOT,对于这种情况,以上以NDC指令直接驱动网络守护进行实施网络共享配置信息的修改的操作将不能成功。因此,需要另辟蹊径。
一种改进的方式是将以上以NDC表达的代码封装成一个方法函数(配置接口),对WiFiP2pManager类的开源代码文件即WifiP2pServiceImpl.java进行修改,由于WifiP2pServiceImpl.java可以直接通过mNwService导出的函数实现那些ndc命令,因在,可在里面增加该方法函数,并且导出给WiFiP2pManager类使用,这样,本发明的应用程序只需直接通过WiFiP2pManager类调用该配置接口,即可实施对网络共享配置信息的修改,而无需借助系统最高权限的获取。
由此可见,借助ndc命令控制所述网络守护进程以修改网络共享配置参数的方式也是多样化的。
通过实施上述的多种控制方式,均可使服务端的热点模式和站点模式之间的网络连接互相连通,路由的问题随之有解。
步骤S13、在客户端接入所述网络群组后,建立该客户端与由所述站点模式所维持的外网的连接。
客户端接入服务端提供的网络群组之后,将向服务端发送DHCP请求,服务端的配置进程读取经上述修改之后的正确的网络共享配置信息,反馈给客户端。客户端据此完成自身的网络设置后,便可经作为服务端本发明智能终端的热点接口、站点接口而访问外网。对于本智能终端而言,当其接收客户端访问外网的数据包时,将该数据包转发经所述站点模式的路径传输给所述的外网;当其接收外网访问客户端的数据包时,将其转发经所述热点模式的路径传输给该客户端。
进一步的,为完善本发明的应用程序进程的功能,可以增加后续步骤:该步骤响应于退出共享上网的用户指令,调用点对点连接管理类中预设的清退接口,恢复所述的网络共享配置信息。
具体而言,本发明的应用程序可以参照前述的方式,向用户界面提供一个共享上网的控制按键,如沿用上述已经提供到用户界面的控制按键的一个复选控制操作也可。当该控制按键被触发时,便产生所述的用户指令,受该用户指令的作用,本发明便可实施断开所述的热点模式,由此便自动断开外部连接。
进一步,可以采用更为彻底的方式,先行对前述处理过程产生的网络共享配置信息进行清理,例如,参阅以下的ndc指令:
ndc ipfwd disable//关闭数据包转发功能
ndc tether stop//停止上网共享功能
ndc nat disable p2p0wlan0 0//关闭NAT映射功能
通过本发明的应用程序进程执行上述的命令,便可通过SOCKET端口控制网络守护进程执行相应的功能,从而避免前述的对网络共享配置信息对本机使用所带来的潜在的影响。可以知晓,在本发明的应用程序进程中直接调用上述的命令控制所述的网络守护进程的前提是已经获取系统的最高权限。
同理,根据上述构造方法函数并将其植入到WiFiP2pManager中的示例可知,此处的清理代码完全可以同样的方法被构造为方法函数(清退接口),添加到WiFiP2pManager类的代码文件中,导出为该类的相应的成员函数,后续直接由本发明的应用程序进程调用该清退接口即可执行,而不必考虑当前是否已经获得系统ROOT权限。
综上所述,本发明的方法解决了Android智能终端同时开启热点模式和站点模式的技术难题,并且允许接入其热点模式下的网络群组的客户端经由其站点模式相对应的外网接口访问外网。
根据计算机软件的模块化思维,本发明还提供一种智能终端,该智能终端包括建立单元11、配置单元12以及通信单元13,以下介绍各个单元所实现的具体功能:
所述的建立单元11,用于建立符合WiFi P2P规范的网络群组以完成本智能终端的热点模式的启动,使其与本智能终端的站点模式并存工作。
理论上可以通过Android系统的热点进程Hostapd来建立所述的热点模式,但是,实测中,hostapd进程启动时,会自动关闭站点进程,导致智能终端无法同时工作于热点模式和站点模式之下,因而,转而采用自行建立网络群组的方式,可以有效避免这一故障的发生。
根据WiFi P2P协议的规范,可以使多个智能终端组在一个网络群组,在该网络群组中,有且只有一个服务端角色,余者为客户端角色。所述的服务端与客户端两种角色,在本发明中,主要相对于以WiFi P2P协议所规范的两部智能终端而言,其中,作为客户端的智能终端的芯片模组工作于该协议所规范的P2P-Client模式下,即表现为客户端角色;而与之相对的本发明的智能终端则工作于该协议所规范的P2P-Group Owner(P2P GO)模式下,即表现为服务端角色。
Android系统中,封装了一个点对点连接管理类,即WiFiP2pManager,顾名思义,该类即用于依照WiFi P2P协议的规范来管理Android终端之间的点对点连接。该类构造了一个用于建立所述的网络群组的方法函数,具体引用形式为WiFiP2pManager.createGroup(wifip2pmanger.chanenl,wifip2pmanager.ActionListener),调用该方法,可以创建一个热点,使智能终端启动热点模式,并且将自身设置为服务端,由此创建的热点还可以供不支持WiFi P2P协议的传统WiFi设备与之连接。由此形成的网络群组,可以使用该类的另一方法函数:requestConnectionInfo(wifip2pmanger.chanenl,wifip2pmanager.ActionListener)去得到详细的连接信息。这个wifip2pInfo连接信息包含了拥有组者也即服务端的地址groupOwnerAddress和一个去说明当前设备是否是这个p2p组的拥有者的标志isGroupOwer,一个p2p的客户端因此可以和p2p组拥有者通过一个socket连接进行通信。
Android操作系统默认情况下,并不允许同一智能终端的WiFi芯片模组同时工作于客户端和服务端两种模式下,但是,通过自行创建所述的网络群组却可解决这一问题,其中createGroup()函数的调用起到关键的作用,其完成了本智能终端的热点模式的启动。
由于本发明重点是解决让客户端通过服务端所在的智能设备的WiFi功能访问外网的网络配置问题。在不考虑客户端自行连接外网的前提下,本智能终端能够访问外网,是接入本网络群组的客户端访问外网的前提。因此,较佳的方式中,是使本智能终端在完成上述热点模式的启动之前,便已启动了站点模式。
欲启动Android系统的站点模式,可以通过用户在系统设置页上手动开启或通过系统的站点进程来建立。所述站点进程,特指Android系统自身提供的wpa_supplicant进程,wpa_supplicant本是开源项目源码,被谷歌修改后加入android移动平台,主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。
以下提供一个利用wpa_cli来完成网络连接的示例供本领域技术人员参照理解本发明,但不应理解为对本发明的实现的限制。
要实现网络连接功能,首先需要运行wpa_supplicant程序以加载基本功能;
执行:/system/bin/wpa_supplicant-d-Dwext-iwlan0-c/data/misc/wifi/wpa_supplicant.conf
其中:
-d:增加调试信息
-Dwext:wext,驱动名称
-iwlan0:wlan0,网络接口名称
/system/bin/wpa_supplicant:wpa_supplicant,可执行程序路径
/data/misc/wifi/wpa_supplicant.conf:wpa_supplicant的配置文件路径
然后,运行命令行工具wpa_cli;
执行:wpa_cli-iwlan0-p/data/system/wpa_supplicant
注意,-p/data/system/wpa_supplicant中的wpa_supplicant并不是可执行程序,而是个控制套接字。
此时会进入交互模式。其中交互模式的命令如下表:
Full command
Short command
Description
status
stat
displays the current connection status
disconnect
disc
prevents wpa_supplicant from connecting to any access point
quit
q
exits wpa_cli
terminate
term
kills wpa_supplicant
reconfigure
recon
reloads wpa_supplicant with the configuration file supplied(-cparameter)
scan
scan
scans for available access points(only scans it,doesn't displayanything)
scan_result
scan_r
displays the results of the last scan
list_networks
list_n
displays a list of configured networks and their status(active ornot,enabled or disabled)
select_network
select_n
select a network among those defined to initiate a connection(ie select_network 0)
enable_network
enable_n
makes a configured network available for selection(ieenable_network 0)
disable_network
disable_n
makes a configured network unavailable for selection(iedisable_network 0)
remove_network
remove_n
removes a network and its configuration from the list(ieremove_network 0)
add_network
add_n
adds a new network to the list.Its id will be createdautomatically
set_network
set_n
shows a very short list of available options to configure anetwork when supplied with no parameters.
See next section for a list of extremely useful parameters to beused with set_network and get_network.
get_network
get_n
displays the required parameter for the specified network.Seenext section for a list of parameters
save_config
save_c
saves the configuration
以上命令项可以从Android的公开技术文档中查看,此处仅供参考。
设置网络的基本格式的指令为:set_network<network id><key><parameter>[<parameter>]
显示网络信息的基本格式的指令为:get_network<network id><key>
相应的参数如下表:
Key
Description
Parameters
ssid
Access point name
string
id_str
String identifying the network
string
priority
Connection priority over other APs
number(0being the default low priority)
bssid
Mac address of the access point
mac address
scan_ssid
Enable/disbale ssid scan
0,1,2
key_mgmt
Type of key management
WPA-PSK,WPA_EAP,None
pairwise
Pairwise ciphers for WPA
CCMP,TKIP
group=TKIP
Group ciphers for WPA
CCMP,TKIP,WEP104,WEP40
psk
Pre-Shared Key(clear or encrypted)
string
wep_key0
WEP key(up to 4:wep_key[0123])
string
eap
Extensible Authentication Protocol
MD5,MSCHAPV2,OTP,GTC,TLS,PEAP,TTLS
identity
EAP identity string
string
password
EAP password
string
ca_cert
Pathname to CA certificate file
/full/path/to/certificate
client_cert
Pathname to client certificate
/full/path/to/certificate(PEM/DER)
private_key
Pathname to a client private key file
/full/path/to/private_key(PEM/DER/PFX)
同理,以上参数表也可通过公共途径从Android官方得到,仅供参考同,恕不赘述。以下利用一用于连接无加密的AP的具体实例说明如何实现网络连接:
>add_network(将显示一网络ID,假定返回值为0)
>set_network 0ssid"666"
>set_network 0key_mgmt NONE
>enable_network 0
>quit
再利用一用于连接WEP加密的AP的具体实例加以说明:
>add_network(假定网络ID返回1)
>set_network 1ssid"666"
>set_network 1key_mgmt NONE
>set_network 1wep_key0"your ap password"
>enable_network 1
至于连接WPA-PSK/WPA2-PSK加密的AP的示例如下:
>add_network(假定网络ID返回2)
>set_network 2ssid"666"
>set_network 2psk"your pre-shared key"
>enable_network 2
到此,wifi模块就能连接上AP了。
以上是通过命令行工具wpa_cli来实现wifi网络的连接。当然,也可以通过wpa_supplicant的配置文件来实现连接。
不妨再回顾前面运行wpa_supplicant时执行的命令:
/system/bin/wpa_supplicant-d-Dwext-iwlan0-c/data/misc/wifi/wpa_supplicant.conf
我们在执行时加上了-c/data/misc/wifi/wpa_supplicant.conf,故而可以将要连接的AP的设置以一定的格式写入wpa_supplicant.conf配置文件中即可。例如:
ctrl_interface=DIR=/data/system/wpa_supplicant
GROUP=system update_config=1
network={
ssid="my access point"
proto=WPA
key_mgmt=WPA-PSK
psk="you pass words"
}
可见,即使是调用站点进程启动智能终端WiFi芯片模组的站点模式,也可通过以上运用指令、运用配置文件两种不同方式,来实现由应用程序进程自行控制所述的站点进程的开启,从而使智能终端工作于站点模式之下。
由以上的分析可知,本发明可以借助多种方式激活智能终端的站点模式,并通过调用点对点连接管理类的createGroup方法来激活智能终端的热点模式,这两种模式可以并存于Android智能终端中。从而使得智能终端能够利用其站点模式接入外网,同时利用热点模式建构一个小型网络。
为使上述的双模状态更易于操作,体现更佳的用户体验,本发明的应用程序进程可以通过对用户界面进行设计来对此加以完善。
用户界面泛指能够用于实现人机交互并且能够接收用户控制指令的显示界面,例如,可以是Android系统的设置页面中的一个选项(或按键,由所述应用程序添加其中,下同),也可以是从桌面呼出的通知栏或者交互页面中的一个选项,还可以是所述应用程序的一个活动组件所构造的页面中的一个选项。
本发明优选如下两种方式,用于接收所述的控制指令:
其一,通过在用户界面提供单个控制按键,以用于一键式地接收所述的控制指令,这种方式便于用户实现一键式操作。
其二,通过在用户界面对应热点模式和站点模式而分别提供控制按键,以分别对应不同按键而产生对应启动相应的模式的控制指令。
根据以上的方式提供的控制按键,通常这些按键可以优选设置在系统桌面通知栏列表处,或者以桌面悬浮窗的方式提供,既便于用户触控控制,又不影响用户视觉效果,当然也可作为系统的默认功能而随用户开启WiFi按键时激活。较佳的,所述应用程序可以将自身设为自启动项,使得系统启动时,可以自行加载所述的按键,从而便于用户操作。
当用户通过所述的用户界面,触控所述的控制按键之后,便产生相应的控制指令,该控制指令将被所述应用程序的进程接收,从而对应控制热点模式和/或站点模式开户。
具体而言,用户既可以通过单个控制按键来同时开启热点模式和站点模式,也可以通过两个与两种模式相对应的按键来开启,实质上提供了多种操作变化例。对应这些变化,以下进一步示例说明。
设用户界面提供单个控制按键,用户通过该单个控制按键而触发其用户指令,此处便可以先调用createGroup()创建热点。继而,本发明的应用程序进程再自行启动该站点进程,由此便可实现两种模式的并存。反之,也可以先行启动站点进程,在其完成开启之后,再行参照上述示例开启热点模式。也就是说,对应于单个控制按键引起的控制指令,可以以不同的实施方式灵活安排所述热点模式和站点模式的启动顺序。
而对应用户界面提供不同的控制按键,分别表征开启不同的模式的实例而言,则可按用户点击不同控制按键的顺序而按序开启相应的模式,此举并不影响本发明的实施。
在优选的方案中,推荐优先让站点模式先于热点模式开启,在确保本智能终端可以连接外网的情况下,向其他智能终端提供接入功能,可以免除一些无用功,更为节能。
由此可见,将站点模式与热点模式相继启动后,便可以实现两种模式的共存。在此基础上,本发明的应用程序进程可以向用户界面输出一些结果信息,以告知用户该智能终端当前已经处于热点模式和站点模式共存的双模状态。至于所述的结果信息的表达形式,既可以是通过系统消息显示到通知栏中,也可以在桌面上弹窗显示,更优的方式可以是调用一个预设的第三方图标,用于表征该智能终端处于热点模式和站点模式共存的双模状态,将该第三方图标显示到用户界面的系统状态栏中,使得用户更易于获知相应的结果信息。
所述的配置单元12,被配置为通过调用预置于系统提供的点对点连接管理类的配置接口,驱动网络守护进程修改网络共享配置信息使连通热点模式与站点模式之间的网络连接。
涉及到对网络守护进程直接调用的操作,依照Android的规范,需要获取系统的最高权限,因而,在获取Android系统最高权限或者Android系统已经开放最高权限的前提下,可以通过对所述网络守护进程进行调用,借此修改涉及到网络共享的配置信息,即网络共享配置信息,以便连通热点模式与站点模式之间的网络连接,让客户端可以通过服务端来访问外网。
所述的网络守护进程,即Netd,Network Daemon的缩写。Netd负责跟一些涉及物理端口的网络操作相关的功能实现,例如带宽控制(Bandwidth),网络地址转换(NAT),个人局域网(pan),PPP链接,soft-ap,本智能终端的热点模式所涉及的共享上网(Tether)等等……都是按照模块(.cpp+.h)组织在netd文件目录下的。
Android Netd相关的基本框架的四大部分:
(1)Linux Kernel用于检测网络相关的所有事件。
(2)Netd作为Kernel(内核层)与Framework(框架层)之间通信的桥梁。
(3)框架层操作Netd,向Netd发送操作命令。
(4)应用层与框架层交互,用于用户进行网络的操控。
Android为Netd提供了一个测试工具,即ndc,其主要功能有:
监视Netd中发生的事件。
支持通过命令行发送命令给Netd去执行。ndc的实现原理,便是连接上位于netd进程中的“netd”监听socket,然后从Netd接收信息或发送命令给Netd。
由此可见,可以通过ndc来驱动网络守护进程执行相关指令,本发明中,实现对网络共享配置信息的修改的功能,便可利用ndc命令来实施。
请先参照如下对Android系统实施的观测过程:
首先,通过分析,发现createGroup()创建热点之后,虽然产生可以被客户端连接,但其用于向用户反馈DHCP配置信息的配置进程DNSmasq的参数如下:
/system/bin/dnsmasq--keep-in-foreground--no-resolv--no-poll--dhcp-authoritative--dhcp-option-force=43,ANDROID_METERED--pid-file--dhcp-range=192.168.42.2,192.168.42.254,1h--dhcp-range=192.168.43.2,192.168.43.254,1h--dhcp-range=192.168.44.2,192.168.44.254,1h--dhcp-range=192.168.45.2,192.168.45.254,1h--dhcp-range=192.168.46.2,192.168.46.254,1h--dhcp-range=192.168.47.2,192.168.47.254,1h--dhcp-range=192.168.48.2,192.168.48.254,1h--dhcp-range=192.168.49.2,192.168.49.254,1h
从中可以看出,其中增加了强制配置序列为43的控制选项即dhcp-option-force=43,ANDROID_METERED,序号43的官方释义是厂商指定选项,用于表示当前连接为计费连接,在这种情况下,客户端将不能利用服务端的外网连接,以免产生巨额费用。然而,这种设计逻辑是以服务端将通过运营商的计费连接而提供访问外网服务的,但服务端存在以WiFi站点模式建立的免费外网连接的情况,并未被Android所兼容。
继而,通过分析Android官方文档中对于TetherController(共享控制器)的源代码可知,在这种情况下,该处对ANDROID_METERED进行了规范,然而,却未见默认网关的设置。
而对客户端中进行分析,从core.java.android.net.DhcpInfoInternal也就是dhcp客户端那边,利用下述的代码实施检测:
以上的分析表明,如要令客户端通过服务端来连接外网,需要避开上述的控制选项的影响。
进而,通过分析本智能终端的热点模式开启前和开启后的数
据包转发开关和数据包过滤表即iptables,也发现影响客户端上网
的因子。
具体而言,对于数据包转发开关,可以发现,cat
/proc/sys/net/ipv4/ip_forward的结果是1而不是0,因而理论上可
以通过echo"1">/proc/sys/net/ipv4/ip_forward enable来改变此一
开关设置,使其打开数据包转发功能。然而,这种情况下,由于
受iptables的影响,即使做出上述的改变,客户端进行外网访问仍
然未能畅通。当智能终端的热点模式下的p2p0标识所对应的接口
收到数据包,虽会查找路由,并且发到其站点模式下wlan0标识
所对应的接口,但是会被iptables的过滤规则所丢弃。
对于iptables,发现其存在两方面的影响,其一是其中包含有
将接口p2p0的数据包丢弃的规则,其二是欠缺将智能终端映射到
公网的NAT规则。对于前者,可以通过以下指令处理:iptables-D
FORWARD 4,即删除forward里的第4条规则,也即
natctrl_FORWARD规则。这时候当p2p0收到包,会从wlan0发出。
但是这个包的源ip是一个内网ip。因此,需要对后者做处理如下:
iptables-t nat-A POSTROUTING-o wlan0-j MASQUERADE,即向
iptables过滤表增加一条nat规则,添加之后,在另一个手机上,
便可以ping通外网ip了。由客户端到外网的连接,由此便畅通了。
自然的,以及结合实践分析,网关也已经得到正确配置。
通过上述的处理,仅仅解决了IP层的问题,对于DNS解析的功能,则仍未实现。进一步通过分析DNSmasq的配置参数,发现其携带了--no-resolv选项,该选项正是导致影响客户端获取正确的DNS解析的原因。由此,可以通过修改startTethering方法或者增加一个startTetheringWithDns()方法,去掉--no-resolv参数。完成这些操作,客户端经服务端到外网,具体到基于域名的万维网的访问,便畅通无阻了。
以上,概括而言,本发明为实现客户端通过服务端访问外网而借助ndc工具驱动网络守护进程所做出的涉及到网络共享配置信息的修改,主要涉及到以下方面:
其一、开通连通热点模式与站点模式之间的网络连接的数据包转发功能:具体表现为可通过echo指令设置其参数为1来打开。
其二、修正用于畅通热点模式与站点模式之间的网络连接的
数据包过滤表的设置内容:具体表现为对iptables表格去除相应的
过滤条目以及添加NAT映射记录。
其三、去除客户端共享上网限制解析DNS的选项:具体表现为可通过共享控制器(TetherController)的有关方法来去除--no-resolv选项。
由此可见,通过上述的方法,便可使本发明的智能终端实现连通其热点模式与其站点模式下之间的网络连接,为客户端提供接入外网的服务。
以上通过揭示对Android的系统原理的分析过程,揭示了本发明的实现原理,并提供了如何修改网络共享配置信息的一种实施例,除此之外,还可通过以下的方式来修改网络共享配置信息:
这种方式具体而言,即以系统最高权限调用ndc工具通过网络守护进程来实现修改的方式,请参阅如下代码及其说明:
ndc ipfwd enable
ndc tether dns set 0 114.114.114.114
//如果失败,通常意味着前面有手工操作没有完全撤销。执行ps|grep dnsmasq先强制关闭配置进程。如果还有残留进程,例如:
shell@CP8681_A01:/#ps|grep dnsmasq
dhcp 3557 325 10272 740 001a0338b66f61acS/system/bin/dnsmasq
//执行kill 3557杀掉,然后
ndc tether stop,//停止共享
ndc tether start 192.168.49.2192.168.49.254//启动共享,配置网段
ndc tether dns set 0 114.114.114.114//设置DNS
ndc nat enable p2p0wlan0 0//添加NAT规则
经测试,以上代码所起的效果与上方揭示的手动修改过程一
致,经由此段代码作用,数据包转发功能被打开,iptables过滤表
得到正确的配置,DNS解析功能也得到正确的维护。因此,本发
明的应用程序可以在系统最高权限状态下,在启动热点模式之后,
执行这段代码,便实现了对网络共享配置信息的正确修改,客户
端便可通过服务端来上网。
多数的Android系统智能终端,由于厂商的限制,并未开放其系统最高权限,或者未成功被ROOT,对于这种情况,以上以NDC指令直接驱动网络守护进行实施网络共享配置信息的修改的操作将不能成功。因此,需要另辟蹊径。
一种改进的方式是将以上以NDC表达的代码封装成一个方法函数(配置接口),对WiFiP2pManager类的开源代码文件即WifiP2pServiceImpl.java进行修改,由于WifiP2pServiceImpl.java可以直接通过mNwService导出的函数实现那些ndc命令,因在,可在里面增加该方法函数,并且导出给WiFiP2pManager类使用,这样,本发明的应用程序只需直接通过WiFiP2pManager类调用该配置接口,即可实施对网络共享配置信息的修改,而无需借助系统最高权限的获取。
由此可见,借助ndc命令控制所述网络守护进程以修改网络共享配置参数的方式也是多样化的。
通过实施上述的多种控制方式,均可使服务端的热点模式和站点模式之间的网络连接互相连通,路由的问题随之有解。
所述的通信单元13,用于在客户端接入所述网络群组后,建立该客户端与由所述站点模式所维持的外网的连接。
客户端接入服务端提供的网络群组之后,将向服务端发送DHCP请求,服务端的配置进程读取经上述修改之后的正确的网络共享配置信息,反馈给客户端。客户端据此完成自身的网络设置后,便可经作为服务端本发明智能终端的热点接口、站点接口而访问外网。对于本智能终端而言,当其接收客户端访问外网的数据包时,将该数据包转发经所述站点模式的路径传输给所述的外网;当其接收外网访问客户端的数据包时,将其转发经所述热点模式的路径传输给该客户端。
进一步的,为完善本发明的应用程序进程的功能,可以增加恢复单元,该恢复单元被配置为响应于退出共享上网的用户指令,调用点对点连接管理类中预设的清退接口,恢复所述的网络共享配置信息。
具体而言,本发明的应用程序可以参照前述的方式,向用户界面提供一个共享上网的控制按键,如沿用上述已经提供到用户界面的控制按键的一个复选控制操作也可。当该控制按键被触发时,便产生所述的用户指令,受该用户指令的作用,本发明便可实施断开所述的热点模式,由此便自动断开外部连接。
进一步,可以采用更为彻底的方式,先行对前述处理过程产生的网络共享配置信息进行清理,例如,参阅以下的ndc指令:
ndc ipfwd disable//关闭数据包转发功能
ndc tether stop//停止上网共享功能
ndc nat disable p2p0wlan0 0//关闭NAT映射功能
通过本发明的应用程序进程执行上述的命令,便可通过SOCKET端口控制网络守护进程执行相应的功能,从而避免前述的对网络共享配置信息对本机使用所带来的潜在的影响。可以知晓,在本发明的应用程序进程中直接调用上述的命令控制所述的网络守护进程的前提是已经获取系统的最高权限。
同理,根据上述构造方法函数并将其植入到WiFiP2pManager中的示例可知,此处的清理代码完全可以同样的方法被构造为方法函数(清退接口),添加到WiFiP2pManager类的代码文件中,导出为该类的相应的成员函数,后续直接由本发明的应用程序进程调用该清退接口即可执行,而不必考虑当前是否已经获得系统ROOT权限。
综上所述,本发明的方法解决了Android智能终端同时开启热点模式和站点模式的技术难题,并且允许接入其热点模式下的网络群组的客户端经由其站点模式相对应的外网接口访问外网。
概而言之,通过本发明的处理,Android系统的智能终端便具备了双模功能,也即同时既可充当热点供其他设备接入,也可充当站点接入外部网络接入点,并且可以起到路由器的作用,允许接入该智能终端的客户端设备通过该智能终端访问外网。
本技术领域技术人员可以理解,本发明包括涉及用于执行本申请中所述操作中的一项或多项的设备。这些设备可以为所需的目的而专门设计和制造,或者也可以包括通用计算机中的已知设备。这些设备具有存储在其内的计算机程序,这些计算机程序选择性地激活或重构。这样的计算机程序可以被存储在设备(例如,计算机)可读介质中或者存储在适于存储电子指令并分别耦联到总线的任何类型的介质中,所述计算机可读介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(Random Access Memory,随即存储器)、EPROM(Erasable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically ErasableProgrammable Read-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,可读介质包括由设备(例如,计算机)以能够读的形式存储或传输信息的任何介质。
本技术领域技术人员可以理解,可以用计算机程序指令来实现这些结构图和/或框图和/或流图中的每个框以及这些结构图和/或框图和/或流图中的框的组合。本技术领域技术人员可以理解,可以将这些计算机程序指令提供给通用计算机、专业计算机或其他可编程数据处理方法的处理器来实现,从而通过计算机或其他可编程数据处理方法的处理器来执行本发明公开的结构图和/或框图和/或流图的框或多个框中指定的方案。
本技术领域技术人员可以理解,本发明中已经讨论过的各种操作、方法、流程中的步骤、措施、方案可以被交替、更改、组合或删除。进一步地,具有本发明中已经讨论过的各种操作、方法、流程中的其他步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。进一步地,现有技术中的具有与本发明中公开的各种操作、方法、流程中的步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。