通过DBus配置网络管理器:如何设置ad hoc模式
我有一个难以解决的问题:给解决者一瓶漂亮的意大利基安蒂葡萄酒! 🙂
要自动配置WiFi,我首先要杀死网络管理器,然后通过命令行激活WiFi:我在我的应用程序中自动执行此操作并且运行良好。
但是,这不是正确的方法。 由于用户没有网络GUI,因此无法配置其他网络访问。 一种更好,更透明的方式是通过DBus接口通过网络管理器直接配置WiFi。 我能够配置它,但我无法将其设置为ad hoc模式。
在网上搜索一段时间:关于配置的很多内容,但与ad hoc模式无关。
我认为解决这个问题的唯一方法是查看网络管理器的源代码……也许有人已经做过了,他可以回答。
书签:
通过DBus配置网络管理器:如何设置ad hoc模式
如果使用iwconfig
“通过命令行激活wifi”,那么它可以使mode Ad-Hoc
。
引自man iwconfig
Example : iwconfig eth0 mode Managed <-- often wlan0 not the0 iwconfig eth0 mode Ad-Hoc Freudian ... eth0
通常,越低级别和越深入,工作量越多,手动劳动密集度就越大,从而破坏了自动化和计算机的整体概念和基本原理。
但是,要使用DBus,“最简单”的方式可能是D-Feet
的GUI或qdbus
如下所述并在下面使用..请注意,参数类型在命令行输入中限制为qdbus
方法,因此匹配的qdbus
命令或可能需要D-Feet
。
要获得所需方法的正确参数值,请观察iwconfig
(如上所述)或工作GUI网络管理器的影响:
dbus-monitor --system "interface='org.freedesktop.NetworkManager'"
同时更改Ad Hoc和基础设施之间的模式参数。 这将直接在DBus上提供必要的配置线索。
从而,
qdbus --system --literal org.freedesktop.NetworkManager
名单
/ /org /org/freedesktop /org/freedesktop/NetworkManager /org/freedesktop/NetworkManager/AccessPoint /org/freedesktop/NetworkManager/AccessPoint/1385 ... /org/freedesktop/NetworkManager/ActiveConnection /org/freedesktop/NetworkManager/ActiveConnection/58 /org/freedesktop/NetworkManager/AgentManager /org/freedesktop/NetworkManager/DHCP4Config /org/freedesktop/NetworkManager/DHCP4Config/45 /org/freedesktop/NetworkManager/Devices /org/freedesktop/NetworkManager/Devices/0 /org/freedesktop/NetworkManager/Devices/1 <- my wireless device /org/freedesktop/NetworkManager/IP4Config /org/freedesktop/NetworkManager/IP4Config/44 /org/freedesktop/NetworkManager/Settings /org/freedesktop/NetworkManager/Settings/0 /org/freedesktop/NetworkManager/Settings/1 ... /org/freedesktop/NetworkManager/Settings/5 /org/freedesktop/NetworkManager/Settings/6
和
qdbus --system --literal org.freedesktop.NetworkManager \ /org/freedesktop/NetworkManager/Devices/1 \ org.freedesktop.DBus.Properties.GetAll \ org.freedesktop.NetworkManager.Device.Wireless \ | sed -e 's/, "/,\n"/g'
使用粗体 模式提供无线属性:
[参数:a {sv} {“HwAddress”= [Variant(QString):“74:F0:6D:4B:8E:9B”], “PermHwAddress”= [Variant(QString):“74:F0:6D:4B:8E:9B”], “Mode”= [Variant(uint):2], “比特率”= [变体(uint):28900], “ActiveAccessPoint”= [Variant:[ObjectPath:/ org / freedesktop / NetworkManager / AccessPoint / 1395]], “WirelessCapabilities”= [Variant(uint):127]}]
粗体的相关方法
qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager
是
方法QString org.freedesktop.DBus.Introspectable.Introspect() 方法QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface) 方法QDBusVariant org.freedesktop.DBus.Properties.Get(QString接口,QString propname) 方法void org.freedesktop.DBus.Properties.Set(QString接口,QString propname,QDBusVariant值) 方法QDBusObjectPath org.freedesktop.NetworkManager.ActivateConnection(QDBusObjectPath连接,QDBusObjectPath设备,QDBusObjectPath specific_object) 方法QDBusObjectPath org.freedesktop.NetworkManager.AddAndActivateConnection(QDBusRawType :: a {sa {sv}}连接,QDBusObjectPath设备,QDBusObjectPath specific_object,QDBusObjectPath&active_connection) 方法void org.freedesktop.NetworkManager.DeactivateConnection(QDBusObjectPath active_connection) 方法void org.freedesktop.NetworkManager.Enable(bool enable) 方法QDBusObjectPath org.freedesktop.NetworkManager.GetDeviceByIpIface(QString iface) 方法QList org.freedesktop.NetworkManager.GetDevices() 方法QDBusRawType :: a {ss} org.freedesktop.NetworkManager.GetPermissions() 方法void org.freedesktop.NetworkManager.SetLogging(QString level,QString domains) 方法void org.freedesktop.NetworkManager.Sleep(bool sleep) 方法uint org.freedesktop.NetworkManager.state() 属性读取bool org.freedesktop.NetworkManager.NetworkingEnabled 属性readwrite bool org.freedesktop.NetworkManager.WimaxEnabled 属性读取bool org.freedesktop.NetworkManager.WimaxHardwareEnabled 属性readwrite bool org.freedesktop.NetworkManager.WirelessEnabled property read bool org.freedesktop.NetworkManager.WirelessHardwareEnabled 属性readwrite bool org.freedesktop.NetworkManager.WwanEnabled 属性读取bool org.freedesktop.NetworkManager.WwanHardwareEnabled 属性读取QList org.freedesktop.NetworkManager.ActiveConnections 属性读取QString org.freedesktop.NetworkManager.Version 属性读取uint org.freedesktop.NetworkManager.State signal void org.freedesktop.NetworkManager.CheckPermissions() signal void org.freedesktop.NetworkManager.DeviceAdded(QDBusObjectPath) signal void org.freedesktop.NetworkManager.DeviceRemoved(QDBusObjectPath) signal void org.freedesktop.NetworkManager.PropertiesChanged(QVariantMap) signal void org.freedesktop.NetworkManager.StateChanged(uint)
和
qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Devices/1
是
方法QString org.freedesktop.DBus.Introspectable.Introspect() 方法QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface) 方法QDBusVariant org.freedesktop.DBus.Properties.Get(QString接口,QString propname) 方法void org.freedesktop.DBus.Properties.Set(QString接口,QString propname,QDBusVariant值) 方法void org.freedesktop.NetworkManager.Device.Disconnect() 方法QListorg.freedesktop.NetworkManager.Device.Wireless.GetAccessPoints() property read bool org.freedesktop.NetworkManager.Device.FirmwareMissing 属性读取bool org.freedesktop.NetworkManager.Device.Managed 属性读取QDBusObjectPath org.freedesktop.NetworkManager.Device.ActiveConnection 属性读取QDBusObjectPath org.freedesktop.NetworkManager.Device.Dhcp4Config 属性读取QDBusObjectPath org.freedesktop.NetworkManager.Device.Dhcp6Config 属性读取QDBusObjectPath org.freedesktop.NetworkManager.Device.Ip4Config 属性读取QDBusObjectPath org.freedesktop.NetworkManager.Device.Ip6Config 属性读取QDBusRawType ::(uu)org.freedesktop.NetworkManager.Device.StateReason property read QString org.freedesktop.NetworkManager.Device.Driver property read QString org.freedesktop.NetworkManager.Device.Interface 属性读取QString org.freedesktop.NetworkManager.Device.IpInterface 属性读取QString org.freedesktop.NetworkManager.Device.Udi property read uint org.freedesktop.NetworkManager.Device.Capabilities property read uint org.freedesktop.NetworkManager.Device.DeviceType property read uint org.freedesktop.NetworkManager.Device.Ip4Address property read uint org.freedesktop.NetworkManager.Device.State 属性读取QDBusObjectPath org.freedesktop.NetworkManager.Device.Wireless.ActiveAccessPoint property read QString org.freedesktop.NetworkManager.Device.Wireless.HwAddress property read QString org.freedesktop.NetworkManager.Device.Wireless.PermHwAddress property read uint org.freedesktop.NetworkManager.Device.Wireless.Bitrate property read uint org.freedesktop.NetworkManager.Device.Wireless.Mode property read uint org.freedesktop.NetworkManager.Device.Wireless.WirelessCapabilities signal void org.freedesktop.NetworkManager.Device.StateChanged(uint,uint,uint) signal void org.freedesktop.NetworkManager.Device.Wireless.AccessPointAdded(QDBusObjectPath) signal void org.freedesktop.NetworkManager.Device.Wireless.AccessPointRemoved(QDBusObjectPath) signal void org.freedesktop.NetworkManager.Device.Wireless.PropertiesChanged(QVariantMap)
我最近不得不这样做。 以下是设置和连接ad-hoc网络的一些C代码(仅依赖于libdbus-1
):