首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python访问iwd dbus接口

从python访问iwd dbus接口
EN

Stack Overflow用户
提问于 2020-02-23 07:59:32
回答 1查看 682关注 0票数 3

我正在尝试使用mips dbus包在嵌入式python3目标(mips MT7628,如果重要的话)上控制无线。

系统很可能设置正确,因为我在这个嵌入式目标上启动并运行了iwd + dhclient。

我可以通过eth0和wlan0连接。

我也可以通过iwctl控制iwd。到目前一切尚好。

我现在需要从python3控制iwd;具体地说,我需要能够通过串行线发送扫描结果(与我的开发板相反,真正的目标将是无头的)。

我对dbus接口一无所知。我需要一些例子来开始。

我尝试了一些类似的方法:

代码语言:javascript
复制
# python
Python 3.8.1 (default, Feb 21 2020, 11:13:38) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dbus
>>> bus = dbus.SystemBus()
>>> wlan0 = bus.get_object('net.connman.iwd', '/net/connman/iwd/phy1/1')
>>> p = wlan0.Properties(dbus_interface='net.connman.iwd.Station')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/site-packages/dbus/proxies.py", line 72, in __call__
  File "/usr/lib/python3.8/site-packages/dbus/proxies.py", line 141, in __call__
  File "/usr/lib/python3.8/site-packages/dbus/connection.py", line 652, in call_blocking
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotFound: No matching method found
>>> p = wlan0.Scan(dbus_interface='net.connman.iwd.Station')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/site-packages/dbus/proxies.py", line 141, in __call__
  File "/usr/lib/python3.8/site-packages/dbus/connection.py", line 652, in call_blocking
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotFound: No matching method found
>>> 

此时WiFi正在工作:

代码语言:javascript
复制
# iwctl 
[iwd]# adapter list
                                    Adapters                                  *
--------------------------------------------------------------------------------
  Name               Powered   Vendor              Model               
--------------------------------------------------------------------------------
  phy1               on        --

[iwd]# device list
                                    Devices                                   *
--------------------------------------------------------------------------------
  Name                Address             Powered   Adapter   Mode      
--------------------------------------------------------------------------------
  wlan1               42:c1:f8:85:67:ba   on        phy1      station   

[iwd]# station list
                            Devices in Station Mode                           *
--------------------------------------------------------------------------------
  Name                State          Scanning
--------------------------------------------------------------------------------
  wlan1               connected              

[iwd]# 

..。但我显然遗漏了一些非常基本的东西。

请谁给我指个方向好吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-23 18:33:43

回答我自己的问题,以帮助任何在这里跌倒的人:

事实证明,iwd和connman存储库都在“python3”子目录中提供了完整的测试示例。

让它们适应我的特定需求被证明是微不足道的。

相关目录可以在here (iwd)here (connman)中找到。

我的特定问题的解决方案在以下脚本中:scan-for-networkslist-known-networks

扫描网络:

代码语言:javascript
复制
#!/usr/bin/python3

import sys
import dbus


if (len(sys.argv) != 2):
    print("Usage: %s <device>" % (sys.argv[0]))
    sys.exit(1)

bus = dbus.SystemBus()
device = dbus.Interface(bus.get_object("net.connman.iwd", sys.argv[1]),
                                    "net.connman.iwd.Station")
device.Scan()

list_known_networks:

代码语言:javascript
复制
#!/usr/bin/python3

import sys
import dbus

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object('net.connman.iwd', '/'),
                         'org.freedesktop.DBus.ObjectManager')

forget = None
if len(sys.argv) >= 4 and sys.argv[1] == 'forget':
    forget = (sys.argv[2], sys.argv[3])

print('Known Networks:')

for path, interfaces in manager.GetManagedObjects().items():
    if 'net.connman.iwd.KnownNetwork' not in interfaces:
        continue

    network = interfaces['net.connman.iwd.KnownNetwork']

    if (network['Name'], network['Type']) == forget:
        obj = dbus.Interface(bus.get_object('net.connman.iwd', path),
                             'net.connman.iwd.KnownNetwork')
        obj.Forget()
        continue

    print("[ %s ]" % network['Name'])

    for key in network:
        val = network[key]
        if type(val) == dbus.Boolean:
            val = 'True' if val else 'False'
        print("    %s = %s" % (key, val))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60358001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档