getNetworkInterfaces method

Future<List<OnvifNetworkInterface>> getNetworkInterfaces()

Returns the list of network interfaces on the device.

Implementation

Future<List<OnvifNetworkInterface>> getNetworkInterfaces() async {
  const String body = '<tds:GetNetworkInterfaces/>';
  final response = await client.soapRequest(
    body,
    action: 'http://www.onvif.org/ver10/device/wsdl/GetNetworkInterfaces',
  );

  final document = XmlDocument.parse(response);
  const tdsNs = 'http://www.onvif.org/ver10/device/wsdl';
  const ttNs = 'http://www.onvif.org/ver10/schema';
  final result = <OnvifNetworkInterface>[];

  for (final iface in document.findAllElements('NetworkInterfaces', namespace: tdsNs)) {
    final token = iface.getAttribute('token') ?? '';
    final enabled = iface.findElements('Enabled', namespace: ttNs).firstOrNull?.innerText.trim().toLowerCase() == 'true';
    final hwAddress = iface.findElements('HwAddress', namespace: ttNs).firstOrNull?.innerText.trim();

    final ipv4Config = iface.findAllElements('Config', namespace: ttNs).firstOrNull;
    final dhcp = ipv4Config?.findElements('DHCP', namespace: ttNs).firstOrNull?.innerText.trim().toLowerCase() == 'true';

    final manualIp = ipv4Config?.findAllElements('Manual', namespace: ttNs).firstOrNull;
    final dhcpIp = ipv4Config?.findAllElements('FromDHCP', namespace: ttNs).firstOrNull;
    final ipNode = manualIp ?? dhcpIp;
    final ipv4Address = ipNode?.findElements('Address', namespace: ttNs).firstOrNull?.innerText.trim();
    final prefixStr = ipNode?.findElements('PrefixLength', namespace: ttNs).firstOrNull?.innerText.trim();

    result.add(OnvifNetworkInterface(
      token: token,
      enabled: enabled,
      dhcp: dhcp,
      ipv4Address: (ipv4Address == null || ipv4Address.isEmpty) ? null : ipv4Address,
      prefixLength: prefixStr != null ? int.tryParse(prefixStr) : null,
      hwAddress: (hwAddress == null || hwAddress.isEmpty) ? null : hwAddress,
    ));
  }

  OnvifLogger.instance.log(
    'GetNetworkInterfaces count=${result.length} ${result.map((i) => '${i.token}:${i.ipv4Address}/${i.prefixLength} dhcp=${i.dhcp}').join(' ')}',
    name: _tag,
  );
  return result;
}