diff --git a/DeviceWireless.go b/DeviceWireless.go index 530ec74..fc424f6 100644 --- a/DeviceWireless.go +++ b/DeviceWireless.go @@ -10,8 +10,19 @@ const ( DeviceWirelessInterface = DeviceInterface + ".Wireless" // Methods - DeviceWirelessGetAccessPoints = DeviceWirelessInterface + ".GetAccessPoints" - DeviceWirelessRequestScan = DeviceWirelessInterface + ".RequestScan" + DeviceWirelessGetAccessPoints = DeviceWirelessInterface + ".GetAccessPoints" + DeviceWirelessGetAllAccessPoints = DeviceWirelessInterface + ".GetAllAccessPoints" + DeviceWirelessRequestScan = DeviceWirelessInterface + ".RequestScan" + + // Properties + DeviceWirelessPropertyHwAddress = DeviceWirelessInterface + ".HwAddress" // readable s + DeviceWirelessPropertyPermHwAddress = DeviceWirelessInterface + ".PermHwAddress" // readable s + DeviceWirelessPropertyMode = DeviceWirelessInterface + ".Mode" // readable u + DeviceWirelessPropertyBitrate = DeviceWirelessInterface + ".Bitrate" // readable u + DeviceWirelessPropertyAccessPoints = DeviceWirelessInterface + ".AccessPoints" // readable ao + DeviceWirelessPropertyActiveAccessPoint = DeviceWirelessInterface + ".ActiveAccessPoint" // readable o + DeviceWirelessPropertyWirelessCapabilities = DeviceWirelessInterface + ".WirelessCapabilities" // readable u + DeviceWirelessPropertyLastScan = DeviceWirelessInterface + ".LastScan" // readable x ) type DeviceWireless interface { @@ -23,7 +34,40 @@ type DeviceWireless interface { // GetAllAccessPoints() method. GetAccessPoints() ([]AccessPoint, error) - RequestScan() + // GetAllAccessPoints gets the list of all access points visible to this + // device, including hidden ones for which the SSID is not yet known. + GetAllAccessPoints() ([]AccessPoint, error) + + // Request the device to scan. To know when the scan is finished, use the + // "PropertiesChanged" signal from "org.freedesktop.DBus.Properties" to listen + // to changes to the "LastScan" property. + RequestScan() error + + // The active hardware address of the device. + GetPropertyHwAddress() (string, error) + + // The permanent hardware address of the device. + GetPropertyPermHwAddress() (string, error) + + // The operating mode of the wireless device. + GetPropertyMode() (Nm80211Mode, error) + + // The bit rate currently used by the wireless device, in kilobits/second (Kb/s). + GetPropertyBitrate() (uint32, error) + + // List of object paths of access point visible to this wireless device. + GetPropertyAccessPoints() ([]AccessPoint, error) + + // Object path of the access point currently used by the wireless device. + GetPropertyActiveAccessPoint() (AccessPoint, error) + + // The capabilities of the wireless device. + GetPropertyWirelessCapabilities() (uint32, error) + + // The timestamp (in CLOCK_BOOTTIME milliseconds) for the last finished + // network scan. A value of -1 means the device never scanned for access + // points. + GetPropertyLastScan() (int64, error) } func NewDeviceWireless(objectPath dbus.ObjectPath) (DeviceWireless, error) { @@ -55,13 +99,92 @@ func (d *deviceWireless) GetAccessPoints() ([]AccessPoint, error) { return aps, nil } -func (d *deviceWireless) RequestScan() { +func (d *deviceWireless) GetAllAccessPoints() ([]AccessPoint, error) { + var apPaths []dbus.ObjectPath + err := d.callWithReturn(&apPaths, DeviceWirelessGetAllAccessPoints) + + if err != nil { + return nil, err + } + + aps := make([]AccessPoint, len(apPaths)) + + for i, path := range apPaths { + aps[i], err = NewAccessPoint(path) + if err != nil { + return aps, err + } + } + + return aps, nil +} + +func (d *deviceWireless) RequestScan() error { var options map[string]interface{} - d.obj.Call(DeviceWirelessRequestScan, 0, options).Store() + return d.obj.Call(DeviceWirelessRequestScan, 0, options).Store() +} + +func (d *deviceWireless) GetPropertyHwAddress() (string, error) { + return d.getStringProperty(DeviceWirelessPropertyHwAddress) +} + +func (d *deviceWireless) GetPropertyPermHwAddress() (string, error) { + return d.getStringProperty(DeviceWirelessPropertyPermHwAddress) +} + +func (d *deviceWireless) GetPropertyMode() (Nm80211Mode, error) { + v, err := d.getUint32Property(DeviceWirelessPropertyMode) + return Nm80211Mode(v), err +} + +func (d *deviceWireless) GetPropertyBitrate() (uint32, error) { + return d.getUint32Property(DeviceWirelessPropertyBitrate) +} + +func (d *deviceWireless) GetPropertyAccessPoints() ([]AccessPoint, error) { + apPaths, err := d.getSliceObjectProperty(DeviceWirelessPropertyAccessPoints) + if err != nil { + return nil, err + } + + ap := make([]AccessPoint, len(apPaths)) + for i, path := range apPaths { + ap[i], err = NewAccessPoint(path) + if err != nil { + return ap, err + } + } + + return ap, nil +} + +func (d *deviceWireless) GetPropertyActiveAccessPoint() (AccessPoint, error) { + path, err := d.getObjectProperty(DeviceWirelessPropertyActiveAccessPoint) + if err != nil || path == "/" { + return nil, err + } + + return NewAccessPoint(path) +} + +func (d *deviceWireless) GetPropertyWirelessCapabilities() (uint32, error) { + return d.getUint32Property(DeviceWirelessPropertyWirelessCapabilities) +} + +func (d *deviceWireless) GetPropertyLastScan() (int64, error) { + return d.getInt64Property(DeviceWirelessPropertyLastScan) } func (d *deviceWireless) MarshalJSON() ([]byte, error) { m := d.device.marshalMap() - m["AccessPoints"], _ = d.GetAccessPoints() + m["AccessPoints"], _ = d.GetPropertyAccessPoints() + m["HwAddress"], _ = d.GetPropertyHwAddress() + m["PermHwAddress"], _ = d.GetPropertyPermHwAddress() + m["Mode"], _ = d.GetPropertyMode() + m["Bitrate"], _ = d.GetPropertyBitrate() + m["AccessPoints"], _ = d.GetPropertyAccessPoints() + m["ActiveAccessPoint"], _ = d.GetPropertyActiveAccessPoint() + m["WirelessCapabilities"], _ = d.GetPropertyWirelessCapabilities() + m["LastScan"], _ = d.GetPropertyLastScan() return json.Marshal(m) }