connman简介

来源:互联网 发布:第三次经济普查数据库 编辑:程序博客网 时间:2024/05/18 12:28

Service basics


         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,WIMAX,或者是远程蓝牙设备(比如手机)。

        这个列表的分类和排序是由connman内部实现,没必要由使用它的用户来决定怎么去将网络排序之类的。用户的决定(比如链接WIFI、关闭以太网等等)会通过connman实现,与此同时connman会重新对列表中的网络服务进行排序。


+---------------------------------------+
| Ethernet                              |
+---------------------------------------+
| Bluetooth phone                       |
+---------------------------------------+
| Guest            (strength 90, none)  |
+---------------------------------------+
| My WiFi AP       (strength 80, rsn)   |
+---------------------------------------+
| Clear WiMAX      (strength 70)        |
+---------------------------------------+
| Other AP         (strength 70, rsn)   |
+---------------------------------------+
| Friends AP       (strength 70, wep)   |
+---------------------------------------+
| Other WiMAX      (strength 50)        |

+---------------------------------------+


        如果以前从来没有上过网的话,列表的初始化排列大致如上:以太网、蓝牙、3G、WIFI,(并且这些内部都有自己的排序,如果某个网络设备有多个网络服务的话)。假设SIM卡存在,可用,非漫游的话,3G才会存在于列表之中。
        × 以太网,总是第一位的,如果它被关闭了,就不会在列表中显示。
        × 蓝牙,首先需要配对,并且用户的选择是最重要的参考参数。所以,connman只显示设备具有PAN或者DUN的设备。蓝牙的扫描特别耗费资源,所以列表中按使用的先后次序排列。
        × WIFI,WIMAX。按信号强度(距离)、加密级别以及SSID排列。
        × WIMAX在同样信号下,首先链接,已链接的WIFI排在最前面。

Service order

        在connman中有一个叫做internal order number的标记,所有没有使用的服务会将它自己的internal order number设置为0,并且按照上述规则排序。蓝牙的规则有点不同,用户选择链接蓝牙设备后,可能在第一次网络链接的时候做为它用(比如:播放音乐),这样在此时蓝牙已经配置好了,但是做为网络链接来说,它并不是一个网络链接。

        WIFI链接上以后,它会成为一个“favorite device”,internal order number设置成大于0的有序的值。所有的值都是内部的。它们仅仅标记到favorite的网络服务上(这里,在meego中可以有两种网络同时产生链接)。比如,当WIFI,WIMAX,BLUETOOTH链接上以后,它们自动成为一个favorite。以太网的话,插入的网线就会把它变成favorite。断网不能移除favorite,只能用户点击某个按钮来进行移除。


    +---------------------------------------+
    | My WiFi AP       (strength 80, rsn)   |  order=1 - favorite=yes
    +---------------------------------------+
    | Ethernet                              |  order=0
    +---------------------------------------+
    | Guest            (strength 90, none)  |  order=0
    +---------------------------------------+
    |                                       |

        以太网是特列,拔掉网线就不是facorite了。

    +---------------------------------------+
    | My WiFi AP       (strength 80, rsn)   |  order=1 - favorite=yes
    +---------------------------------------+
    | Ethernet                              |  order=0
    +---------------------------------------+
    | Guest            (strength 90, none)  |  order=0
    +---------------------------------------+
    |                                       |


        一般的说,order大于0,就有favorite=yes的属性。而其它的属性为favorite=no。favorite可以通过service的d-bus接口来设置,它属于一个property

        connman可以有几个服务同时链接,并且有IP分配。但只有一个为当前路由那就是列表中最上面的那个网络服务,order最大的那个。


    +---------------------------------------+
    | Ethernet                              |  order=2 - connected=yes
    +---------------------------------------+
    | My WiFi AP       (strength 80, rsn)   |  order=1 - connected=yes
    +---------------------------------------+
    | Guest            (strength 90, none)  |  order=0
    +---------------------------------------+
    |                                       |

        假设要改变默认的链接,用户需要受手动把节点拖到列表的顶部。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
    +---------------------------------------+
    |                                       |

Service tweaks


        connman的Interface会暴落出所有的网络服务,没有网线的以太网是不在显示范围之内的,只有有运营商之后的才显示。

        service接口并不做基础的设备配置的任务。所以切换网络开关是通过device接口实现。

        小屏幕与大量的WIFI设备,决定了在用户接口上不显示某些WIFI是合理的。(以信号强度决定)

      

Serivce naming


        每个服务都有一个名称属性,允许用户接口直接将其显示。所有的名字都使用UTF-8。它与网络细节有关。

        WIFI会把名称属性设置成SSID,SSID是二进制数组,可以转换成可显示的格式,不能显示的以空格表示。

        WIMAX是运营商的名字。

        bluetooth是设备的名字。

        以太网没有名字。


Service states

        每一个服务都有许多状态来表示当前的网络事件包括idle、association、configuration、ready、disconnect、failure。


应用基础Application basics


        所有的应用程序需要使用connman的d-bus接口。
        主要的接口是net.connman.manager挂在对象"/"上,简单的应用如下(python):
        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"]