2016-05-15 8 views
1

私はエージェントを登録するとconnmanサービスに接続するために、簡単なPythonスクリプトを書いた:connman接続:DバスUnknownMethod

#!/usr/bin/python 

import gobject 
import dbus 
import dbus.service 
import dbus.mainloop.glib 

class Agent(dbus.service.Object): 
    @dbus.service.method("net.connman.Agent", in_signature='oa{sv}', out_signature='a{sv}') 
    def RequestInput(self, path, fields): 
     print(path, fields) 
     # TODO: fill the requested fields 
     response = None 
     return response 

def Scan(technology): 
    path = "/net/connman/technology/" + technology 
    technology = dbus.Interface(bus.get_object("net.connman", path), "net.connman.Technology") 
    technology.Scan() 

def FindService(ssid): 
    for path, properties in manager.GetServices(): 
     name = properties["Name"] 
     security = extract_list(properties["Security"]) 
     if (ssid == name): 
      return (path, properties) 

    return (None, None) 

def Connect(ssid, passphrase): 
    Scan("wifi") 
    path, properties = FindService(ssid) 
    if (path is None): 
     print("Service with ssid =", ssid, "not found.") 
     return 

    print("path:", path) 
    service = dbus.Interface(bus.get_object("net.connman", path), "net.connmann.Service") 
    print("Connecting..."); 

    try: 
     service.Connect(timeout=10000) 
     print("Done!") 
    except dbus.DBusException as error: 
     print("Failed: ", error._dbus_error_name, error.get_dbus_message()) 

if __name__ == '__main__': 
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 

    ssid = "mySSID" 
    passphrase = "myPassphrase" 

    bus = dbus.SystemBus() 
    manager = dbus.Interface(bus.get_object('net.connman', "/"), 'net.connman.Manager') 
    path = "/test/agent" 
    object = Agent(bus, path) 
    object.ssid = ssid 

    try: 
     manager.RegisterAgent(path) 
     print("Agent registered!") 

    except: 
     print("Cannot register connman agent.") 

    Connect(ssid, passphrase) 

    mainloop = gobject.MainLoop() 
    mainloop.run() 

これが出力されます:

Agent registered! 
path: /net/connman/service/wifi_b723ec7500fd_464153545735422d312d43217351_managed_wep 
Connecting... 
Failed: org.freedesktop.DBus.Error.UnknownMethod 
Method "Connect" with signature "" on interface "net.connmann.Service" doesn't exist 

それはそうですエージェントが登録されましたが、サービスインターフェイスは「接続」メソッドを認識しません。

http://git.kernel.org/cgit/network/connman/connman.git/tree/doc/service-api.txt

をしても、テスト-connmanスクリプトはそれを呼び出す: 文書によると、それが存在しなければならない

http://git.kernel.org/cgit/network/connman/connman.git/tree/test/test-connman

、このような問題をデバッグするための最良の方法は何ですか?

私も、そのパス上のavailables方法を参照するために数行を追加しました:

object = dbus.Interface(service, "org.freedesktop.DBus.Introspectable") 
print(object.Introspect()) 

をし、これが出力されます:

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> 
<node> 
    <interface name="org.freedesktop.DBus.Introspectable"> 
     <method name="Introspect"> 
     <arg name="xml" type="s" direction="out" /> 
     </method> 
    </interface> 
    <interface name="net.connman.Service"> 
     <method name="GetProperties"> 
     <arg name="properties" type="a{sv}" direction="out" /> 
     <annotation name="org.freedesktop.DBus.Deprecated" value="true" /> 
     </method> 
     <method name="SetProperty"> 
     <arg name="name" type="s" direction="in" /> 
     <arg name="value" type="v" direction="in" /> 
     </method> 
     <method name="ClearProperty"> 
     <arg name="name" type="s" direction="in" /> 
     </method> 
     <method name="Connect" /> 
     <method name="Disconnect" /> 
     <method name="Remove" /> 
     <method name="MoveBefore"> 
     <arg name="service" type="o" direction="in" /> 
     </method> 
     <method name="MoveAfter"> 
     <arg name="service" type="o" direction="in" /> 
     </method> 
     <method name="ResetCounters" /> 
     <signal name="PropertyChanged"> 
     <arg name="name" type="s" /> 
     <arg name="value" type="v" /> 
     </signal> 
    </interface> 
</node> 

無署名付きConnectメソッドがあります!なぜそれが言う:UnknownMethod?

答えて

0

net.connmann.Service

で二重の "n" は

net.connman.Service

にする必要がありあり
関連する問題