7

I have an hard nut to crack: a nice bottle of italian Chianti wine to the solver! :)

To automatically configure WiFi, I first have to kill the Network Manager and than activate the WiFi via the command-line: I do this all automatically in my application and works great.

However, it is not the right way to do this. As the user has no network GUI anymore to configure some other network access. A much better and transparent way would be to configure WiFi directly via Network Manager over the DBus interface. I was able to configure it, but I wasn't able to set it to ad hoc mode.

Searching the web for a while: a lot about configuration in general but nothing related to ad hoc mode.

I think the only way to do figure that out is to look into the source code of the Network Manager...maybe someone already did it and he can answer.

2 Answers 2

7

Bookmark:
Configuration of the Network Manager via DBus: how to set the ad hoc mode

If using iwconfig to "activate the wifi via the command line" then it can make the mode Ad-Hoc.

Quoting from man iwconfig

Example :  
                   iwconfig eth0 mode Managed        <-- often wlan0 not the0
                   iwconfig eth0 mode Ad-Hoc                  Freudian ... eth0

Generally the more low level and deeper one goes, the more manually labour intensive the effort becomes, defeating the whole concept and rationale of automation and computers.

However, to use DBus the "easiest" way might be with D-Feet's GUI or qdbus as described here and used below.. Note that argument types are limited in command line input to methods of qdbus and so the matching gdbus command or D-Feet maybe needed.

To get the correct argument values for the required methods, observe the influence of iwconfig, as above, or a working GUI Network Manager with:

dbus-monitor --system "interface='org.freedesktop.NetworkManager'"

while changing the mode paramemter between Ad Hoc and Infrastructure. This will provide the necessary clues for configuration directly on the DBus.
Thus,

qdbus --system --literal  org.freedesktop.NetworkManager

lists

/
/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

and

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'

gives the wireless properties with mode in bold:

[Argument: a{sv} {"HwAddress" = [Variant(QString): "74:F0:6D:4B:8E:9B"],
"PermHwAddress" = [Variant(QString): "74:F0:6D:4B:8E:9B"],
"Mode" = [Variant(uint): 2],
"Bitrate" = [Variant(uint): 28900],
"ActiveAccessPoint" = [Variant: [ObjectPath: /org/freedesktop/NetworkManager/AccessPoint/1395]],
"WirelessCapabilities" = [Variant(uint): 127]}]

The pertinent methods in bold of

qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager

are

method QString         org.freedesktop.DBus.Introspectable.Introspect()
method QVariantMap     org.freedesktop.DBus.Properties.GetAll(QString interface)
method QDBusVariant    org.freedesktop.DBus.Properties.Get(QString interface, QString propname)
method void            org.freedesktop.DBus.Properties.Set(QString interface, QString propname, QDBusVariant value)
method QDBusObjectPath org.freedesktop.NetworkManager.ActivateConnection(QDBusObjectPath connection, QDBusObjectPath device, QDBusObjectPath specific_object)
method QDBusObjectPath org.freedesktop.NetworkManager.AddAndActivateConnection(QDBusRawType::a{sa{sv}} connection, QDBusObjectPath device, QDBusObjectPath specific_object, QDBusObjectPath& active_connection)
method void            org.freedesktop.NetworkManager.DeactivateConnection(QDBusObjectPath active_connection)
method void            org.freedesktop.NetworkManager.Enable(bool enable)
method QDBusObjectPath org.freedesktop.NetworkManager.GetDeviceByIpIface(QString iface)
method QList org.freedesktop.NetworkManager.GetDevices()
method QDBusRawType::a{ss} org.freedesktop.NetworkManager.GetPermissions()
method void            org.freedesktop.NetworkManager.SetLogging(QString level, QString domains)
method void            org.freedesktop.NetworkManager.Sleep(bool sleep)
method uint            org.freedesktop.NetworkManager.state()
property read bool org.freedesktop.NetworkManager.NetworkingEnabled
property readwrite bool org.freedesktop.NetworkManager.WimaxEnabled
property read bool org.freedesktop.NetworkManager.WimaxHardwareEnabled
property readwrite bool org.freedesktop.NetworkManager.WirelessEnabled
property read bool org.freedesktop.NetworkManager.WirelessHardwareEnabled
property readwrite bool org.freedesktop.NetworkManager.WwanEnabled
property read bool org.freedesktop.NetworkManager.WwanHardwareEnabled
property read QList org.freedesktop.NetworkManager.ActiveConnections
property read QString org.freedesktop.NetworkManager.Version
property read 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)

and of

qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Devices/1

are

method QString           org.freedesktop.DBus.Introspectable.Introspect()
method QVariantMap       org.freedesktop.DBus.Properties.GetAll(QString interface)
method QDBusVariant      org.freedesktop.DBus.Properties.Get(QString interface, QString propname)
method void              org.freedesktop.DBus.Properties.Set(QString interface, QString propname, QDBusVariant value)
method void              org.freedesktop.NetworkManager.Device.Disconnect()
method QList<QDBusObjectPath> org.freedesktop.NetworkManager.Device.Wireless.GetAccessPoints()
property read bool            org.freedesktop.NetworkManager.Device.FirmwareMissing
property read bool            org.freedesktop.NetworkManager.Device.Managed
property read QDBusObjectPath org.freedesktop.NetworkManager.Device.ActiveConnection
property read QDBusObjectPath org.freedesktop.NetworkManager.Device.Dhcp4Config
property read QDBusObjectPath org.freedesktop.NetworkManager.Device.Dhcp6Config
property read QDBusObjectPath org.freedesktop.NetworkManager.Device.Ip4Config
property read QDBusObjectPath org.freedesktop.NetworkManager.Device.Ip6Config
property read QDBusRawType::(uu) org.freedesktop.NetworkManager.Device.StateReason
property read QString         org.freedesktop.NetworkManager.Device.Driver
property read QString         org.freedesktop.NetworkManager.Device.Interface
property read QString         org.freedesktop.NetworkManager.Device.IpInterface
property read 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
property read 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)
1
  • Beautiful answer!!!!
    – slm
    Feb 8, 2013 at 15:51
2

I just recently had to do that. Here's some C code (depending only on libdbus-1) to set up and connect an ad-hoc network:

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.