Connection Manager简称connman,connman是使用d-bus做为进程间通信机制来管理linux网络链接的一种软件。在connman的d-bus接口中,有一个接口叫做service。该接口的全称为:net.connman.Service,自然是挂在net.connman上面的。做为net.connman.Service接口,它可以访问到network的细节以及用户偏好使用什么类型的网络(比如3g、wifi、wimax等等)。外部的程序就通过net.connman.Service的一堆Properties和Methods来实现它基本的功能。(可能诠释的不对,可能是整体的connman的功能)
这个列表的分类和排序是由connman内部实现,没必要由使用它的用户来决定怎么去将网络排序之类的。用户的决定(比如链接WIFI、关闭以太网等等)会通过connman实现,与此同时connman会重新对列表中的网络服务进行排序。
+---------------------------------------+
WIFI链接上以后,它会成为一个“favorite device”,internal order number设置成大于0的有序的值。所有的值都是内部的。它们仅仅标记到favorite的网络服务上(这里,在meego中可以有两种网络同时产生链接)。比如,当WIFI,WIMAX,BLUETOOTH链接上以后,它们自动成为一个favorite。以太网的话,插入的网线就会把它变成favorite。断网不能移除favorite,只能用户点击某个按钮来进行移除。
以太网是特列,拔掉网线就不是facorite了。
+---------------------------------------+
| My WiFi AP (strength 80, rsn) | order=1 - favorite=yes
+---------------------------------------+
| Ethernet | order=0
+---------------------------------------+
| Guest (strength 90, none) | order=0
+---------------------------------------+
| |
connman可以有几个服务同时链接,并且有IP分配。但只有一个为当前路由。那就是列表中最上面的那个网络服务,order最大的那个。
假设要改变默认的链接,用户需要受手动把节点拖到列表的顶部。connman在没有什么理由的时候不会卸下默认路由。保证能上网是connman的第一要素。
+---------------------------------------+
| Ethernet | order=2 - connected=yes
+---------------------------------------+
| My WiFi AP (strength 80, rsn) | order=1 - connected=yes
+---------------------------------------+
| Guest (strength 90, none) | order=0
+---------------------------------------+
| |
另外一种人机交互则是以太网网线被拔掉了,这种情况下favorite属性被取消,并且该网络服务不能呆在列表的顶端了。
+---------------------------------------+
| My WiFi AP (strength 80, rsn) | order=1 - connected=yes
+---------------------------------------+
| Ethernet | order=0
+---------------------------------------+
| Guest (strength 90, none) | order=0
+---------------------------------------+
| |
如果服务链表顶端的服务(网络)被改变,则链接路由自动随之进行调整。用户如果拔掉网线、取消网络连接、或者网络不可用都会触发这个情况。
如上述所述,仅仅将网络disconnect是不会改变favorite的设置的,所以先前选择的网络服务仍然是当前路由,并且在列表最前面。
+---------------------------------------+
| Ethernet | order=2 - connected=yes
+---------------------------------------+
| My WiFi AP (strength 80, rsn) | order=1 - connected=no
+---------------------------------------+
| Guest (strength 90, none) | order=0
+---------------------------------------+
| |
拔掉网线以后,Ethernet网络服务会排在order=0的最上面
+---------------------------------------+
| My WiFi AP (strength 80, rsn) | order=1 - connected=no
+---------------------------------------+
| Ethernet | order=0 - connected=no
+---------------------------------------+
| Guest (strength 90, none) | order=0
+---------------------------------------+
| |
connman的Interface会暴落出所有的网络服务,没有网线的以太网是不在显示范围之内的,只有有运营商之后的才显示。
service接口并不做基础的设备配置的任务。所以切换网络开关是通过device接口实现。
小屏幕与大量的WIFI设备,决定了在用户接口上不显示某些WIFI是合理的。(以信号强度决定)
每个服务都有一个名称属性,允许用户接口直接将其显示。所有的名字都使用UTF-8。它与网络细节有关。
WIFI会把名称属性设置成SSID,SSID是二进制数组,可以转换成可显示的格式,不能显示的以空格表示。
WIMAX是运营商的名字。
bluetooth是设备的名字。
以太网没有名字。
bus = dbus.SystemBus() manager = dbus.Interface(bus.get_object("net.connman", "/"), "net.connman.Manager") properties = manager.GetProperties() manager.SetProperty("OfflineMode", dbus.Boolean(1))
manager对象包含了profiles、 devices、 services 和connections。这些都是可以用于控制connman细节的接口。一般profiles和devices用不到。
网络服务表现为一个object path列表。每个object path包含了一个网络服务接口,所有服务被对等对待。
如上所述,以太网,WIFI,3G,蓝牙,WIMAX等等按照一定的规则,列成列表显示给用户。
Service接口的详细说明请见API,它包含了所有网络的通用属性。包括一个connect和disconnect方法。这允许用户选择指定的网络服务,或者外部触发connman进行自动链接。
链接一个服务和断开一个服务都很简单:
service.Connect() or service.Disconnect()同时可以链接很多个网络服务,使用同一个WIFI设备进行网络切换,会导致当前网络断开。connman在后台处理这些事情,链接一个没有网线的以太网服务会得到一个ERROR。
properties = service.GetProperties() print properties["State"]