我有一件难事要解决:给解答者一瓶上好的意大利基安蒂葡萄酒!:)
要自动配置 WiFi,我首先必须关闭网络管理器,然后通过命令行激活 WiFi:我在我的应用程序中自动完成所有操作,并且效果很好。
但是,这不是正确的做法。因为用户不再有网络 GUI 来配置其他网络访问。一种更好、更透明的方法是直接通过 DBus 接口上的网络管理器配置 WiFi。我可以配置它,但无法将其设置为 ad hoc 模式。
在网上搜索了一段时间:有很多关于一般配置的信息,但没有与临时模式相关的信息。
我认为解决这个问题的唯一方法是查看网络管理器的源代码......也许有人已经这样做了,他可以回答。
答案1
书签:
通过 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
,因此匹配的gdbus
命令或D-Feet
可能需要。
iwconfig
要获取所需方法的正确参数值,请观察上述内容的影响,或使用以下方法观察正在运行的 GUI 网络管理器:
dbus-monitor --system "interface='org.freedesktop.NetworkManager'"
同时在 Ad Hoc 和 Infrastructure 之间更改模式参数。这将为直接在 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”], “模式” = [变量(uint):2], “比特率” = [变量(uint):28900], "ActiveAccessPoint" = [变量:[ObjectPath:/org/freedesktop/NetworkManager/AccessPoint/1395]], "WirelessCapabilities" = [变量 (uint): 127]}]
相关方法在大胆的的
qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager
是
方法 QString org.freedesktop.DBus.Introspectable.Introspect() 方法 QVariantMap org.freedesktop.DBus.Properties.GetAll(QString 接口) 方法 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 属性读写 bool org.freedesktop.NetworkManager.WimaxEnabled 属性读取 bool org.freedesktop.NetworkManager.WimaxHardwareEnabled 属性读写 bool org.freedesktop.NetworkManager.WirelessEnabled 属性读取 bool org.freedesktop.NetworkManager.WirelessHardwareEnabled 属性读写 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 信号void org.freedesktop.NetworkManager.CheckPermissions() 信号void org.freedesktop.NetworkManager.DeviceAdded(QDBusObjectPath) 信号void org.freedesktop.NetworkManager.DeviceRemoved(QDBusObjectPath) 信号void org.freedesktop.NetworkManager.PropertiesChanged(QVariantMap) 信号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 接口) 方法 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<QDBusObjectPath> org.freedesktop.NetworkManager.Device.Wireless.GetAccessPoints() 属性读取 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 属性读取 QString org.freedesktop.NetworkManager.Device.Driver 属性读取 QString org.freedesktop.NetworkManager.Device.Interface 属性读取 QString org.freedesktop.NetworkManager.Device.IpInterface 属性读取 QString org.freedesktop.NetworkManager.Device.Udi 属性读取 uint org.freedesktop.NetworkManager.Device.Capabilities 属性读取 uint org.freedesktop.NetworkManager.Device.DeviceType 属性读取 uint org.freedesktop.NetworkManager.Device.Ip4Address 属性读取 uint org.freedesktop.NetworkManager.Device.State 属性读取 QDBusObjectPath org.freedesktop.NetworkManager.Device.Wireless.ActiveAccessPoint 属性读取 QString org.freedesktop.NetworkManager.Device.Wireless.HwAddress 属性读取 QString org.freedesktop.NetworkManager.Device.Wireless.PermHwAddress 属性读取 uint org.freedesktop.NetworkManager.Device.Wireless.Bitrate 属性读取 uint org.freedesktop.NetworkManager.Device.Wireless.Mode 属性读取 uint org.freedesktop.NetworkManager.Device.Wireless.WirelessCapabilities 信号void org.freedesktop.NetworkManager.Device.StateChanged(uint, uint, uint) 信号void org.freedesktop.NetworkManager.Device.Wireless.AccessPointAdded(QDBusObjectPath) 信号void org.freedesktop.NetworkManager.Device.Wireless.AccessPointRemoved(QDBusObjectPath) 信号void org.freedesktop.NetworkManager.Device.Wireless.PropertiesChanged(QVariantMap)
答案2
我最近才刚刚开始做这件事。以下是一些 C 代码(仅依赖于libdbus-1
)用于设置和连接临时网络: