#plc #communication #discover #sockets #homeplug #ethertype

powerline

Work-in-progress: Power-line communication library

1 unstable release

0.1.0 Feb 20, 2021

#13 in #discover

BSD-2-Clause

61KB
1.5K SLoC

Rust Power-Line Communication Management Library

This is an experimental Rust Library to discover PLC devices and manage them, along with a command line tool that uses the library.

Currently supported protocols:

  • HomePlug AV 1.1/2.0 (Ethertype 0x88e1)
  • Broadcom/Gigle Protocol (Ethertype 0x8912, "Mediaxtream"?)

These protocols are Layer 2 (Data link) and thus require the ability to send and receive raw ethernet frames. This library has a cross-platform layer to facilitate this in an efficient manner.

Currently supported OS':

  • Linux (using AF_PACKET sockets)
  • macOS (using /dev/bpf devices)

The core of the library is no_std to allow for use in low-resource devices (such as routers).

Qualcomm/Atheros Based Devices

These devices seem to implement all HomePlug AV H1 management frames documented in the HomePlug AV specifications. They also have a number of vendor extensions which are implemented in Qualcomm's open-plc-utils.

Tested with:

  • QCA7420 - Netcomm NP505F (500Mbps HomePlug AV 1.1)

Broadcom/Gigle Devices

While these devices seem to inter-operate at the power-line level with other HomePlug AV devices, their support of H1 management frames is limited. They appear to have most functionality exposed on ethertype 0x8912, which seems to be Gigle/Mediaxtream legacy.

Tested with:

  • BCM60355 - D-Link DHP-601AV (1000Mbps HomePlug AV 2.0)

Resources

HomePlug Specifications Qualcomm open-plc-utils

Command-line tool

You may need to be root to use this tool!

Usage:

    powerline [FLAGS] [OPTIONS] [SUBCOMMAND]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information
    -v               Increase verbosity

OPTIONS:
        --interface <interfaces>...    Select the interface(s) to discover with

SUBCOMMANDS:
    find        Find which interface a specific device is reachable
    help        Prints this message or the help of the given subcommand(s)
    scan        Discover and list devices
    set-name    Set the name of a device

To build and install to ~/.cargo/bin:

cargo install --example powerline --path .

Example output:

$ powerline 
eth0: [60:63:4c:11:22:33] HPAV2.0 Broadcom 3Ethers 'Lounge'
eth0: [60:63:4c:44:55:66] HPAV2.0 Broadcom 5Ethers 'Gateway'
eth0: [00:60:64:77:88:99] HPAV1.1 Qualcomm 8Ethers 'Upstairs'

The output shows that three HomePlug AV devices were found on the eth0 network interface.
Two are HPAV2.0 devices from Broadcom. one is a HPAV1.1 device from Qualcomm.
The XEthers field shows how many ethernet devices are bridge by the HPAV device.
And the final text in quote marks is the device's friendly name.

Dependencies

~130KB