[network] Add configuration parameter for using iOS wake-up (#16259)

Fixes #9575

Signed-off-by: Leo Siepel <leosiepel@gmail.com>
Signed-off-by: Ciprian Pascu <contact@ciprianpascu.ro>
This commit is contained in:
lsiepel 2024-01-15 22:37:38 +01:00 committed by Ciprian Pascu
parent b701dd0cc6
commit 2ee995afed
6 changed files with 16 additions and 12 deletions

View File

@ -53,6 +53,7 @@ Use the following options for a **network:pingdevice**:
- **retry:** After how many refresh interval cycles the device will be assumed to be offline. Default: `1`.
- **timeout:** How long the ping will wait for an answer, in milliseconds. Default: `5000` (5 seconds).
- **refreshInterval:** How often the device will be checked, in milliseconds. Default: `60000` (one minute).
- **useIOSWakeUp:** When set to true, an additional port knock is performed before a ping. Default: `true`.
- **networkInterfaceNames:** The network interface names used for communicating with the device.
Limiting the network interfaces reduces the load when arping and Wake-on-LAN are used.
Use comma separated values when using textual config. Default: empty (all network interfaces).
@ -91,8 +92,7 @@ Use DHCP listen for an almost immediate presence detection for phones and tablet
Apple iOS devices are usually in a deep sleep mode and do not respond to ARP pings under all conditions, but to Bonjour service discovery messages (UDP port 5353).
Therefore, first a Bonjour message is sent, before the ARP presence detection is performed.
The binding automatically figures out if the target device is an iOS device.
To check if the binding has correctly recognised a device, have a look at the _uses_ios_wakeup_ property of the Thing.
This is default behaviour of the binding, when needed this can be changed with the config parameter `useIOSWakeUp`.
### Use open TCP ports
@ -189,7 +189,7 @@ Things support the following channels:
demo.things:
```java
Thing network:pingdevice:devicename [ hostname="192.168.0.42", macAddress="6f:70:65:6e:48:41" ]
Thing network:pingdevice:devicename [ hostname="192.168.0.42", macAddress="6f:70:65:6e:48:41", useIOSWakeUp="false" ]
Thing network:speedtest:local "SpeedTest 50Mo" @ "Internet" [url="https://bouygues.testdebit.info/", fileName="50M.iso"]
```

View File

@ -60,5 +60,4 @@ public class NetworkBindingConstants {
public static final String PROPERTY_ARP_STATE = "arp_state";
public static final String PROPERTY_ICMP_STATE = "icmp_state";
public static final String PROPERTY_PRESENCE_DETECTION_TYPE = "presence_detection_type";
public static final String PROPERTY_IOS_WAKEUP = "uses_ios_wakeup";
}

View File

@ -31,5 +31,6 @@ public class NetworkHandlerConfiguration {
public Integer retry = 1;
public Integer refreshInterval = 60000;
public Integer timeout = 5000;
public boolean useIOSWakeUp = true;
public Set<String> networkInterfaceNames = Set.of();
}

View File

@ -184,11 +184,7 @@ public class NetworkHandler extends BaseThingHandler
}
presenceDetection.setServicePorts(Set.of(port));
} else {
// It does not harm to send an additional UDP packet to a device,
// therefore we assume all ping devices are iOS devices. If this
// does not work for all users for some obscure reason, we can make
// this a thing configuration variable.
presenceDetection.setIOSDevice(true);
presenceDetection.setIOSDevice(handlerConfiguration.useIOSWakeUp);
// Hand over binding configurations to the network service
presenceDetection.setUseDhcpSniffing(configuration.allowDHCPlisten);
presenceDetection.setUseIcmpPing(configuration.allowSystemPings);
@ -214,7 +210,6 @@ public class NetworkHandler extends BaseThingHandler
properties.put(NetworkBindingConstants.PROPERTY_ARP_STATE, presenceDetection.getArpPingState());
properties.put(NetworkBindingConstants.PROPERTY_ICMP_STATE, presenceDetection.getIPPingState());
properties.put(NetworkBindingConstants.PROPERTY_PRESENCE_DETECTION_TYPE, "");
properties.put(NetworkBindingConstants.PROPERTY_IOS_WAKEUP, presenceDetection.isIOSdevice() ? "Yes" : "No");
properties.put(NetworkBindingConstants.PROPERTY_DHCP_STATE, presenceDetection.getDhcpState());
updateProperties(properties);
}

View File

@ -41,6 +41,8 @@ thing-type.config.network.pingdevice.retry.label = Retry
thing-type.config.network.pingdevice.retry.description = How many refresh interval cycles should a presence detection should take place, before the device is stated as offline
thing-type.config.network.pingdevice.timeout.label = Timeout
thing-type.config.network.pingdevice.timeout.description = States how long to wait for a response (in ms), before if a device is stated as offline
thing-type.config.network.pingdevice.useIOSWakeUp.label = Use iOS Wake Up
thing-type.config.network.pingdevice.useIOSWakeUp.description = Set to true if the device presence detection should be performed for an iOS device like iPhone or iPads. An additional port knock is performed before a ping.
thing-type.config.network.servicedevice.hostname.label = Hostname or IP
thing-type.config.network.servicedevice.hostname.description = Hostname or IP of the device
thing-type.config.network.servicedevice.macAddress.label = MAC Address

View File

@ -21,7 +21,6 @@
<property name="dhcp_state">-</property>
<property name="icmp_state">-</property>
<property name="presence_detection_type">-</property>
<property name="uses_ios_wakeup">-</property>
</properties>
<config-description>
@ -62,6 +61,15 @@
reduces the load when arping and Wake-on-LAN are used. All interfaces are used when left empty.</description>
<advanced>true</advanced>
</parameter>
<parameter name="useIOSWakeUp" type="boolean" required="true">
<label>Use iOS Wake Up</label>
<default>true</default>
<description>Set to true if the device presence detection should be performed for an iOS device like iPhone or
iPads. An additional port knock is performed before a ping.</description>
<advanced>true</advanced>
</parameter>
</config-description>
</thing-type>
@ -82,7 +90,6 @@
<property name="dhcp_state">-</property>
<property name="icmp_state">-</property>
<property name="presence_detection_type">-</property>
<property name="uses_ios_wakeup">-</property>
</properties>
<config-description>