通过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()
 方法QList  org.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 ):