Provide raw exchange of data at L2, using WifiAware, P2P/WifiDirect, BLE, Lora(using an adapter). To communicate securely across 'mesh' devices - including low-end IoT, Android, servers - it is useful to support multiple protocols that don't require the device to be given full Internet access or added to the Wifi access point.
This uses the same idea as Istio and other mesh protocols based on 'zero trust'. A device connected to the mesh is not trusted - will not be allowed direct access to the Wifi network nor full internet access. The link security is also not trusted - Wifi and BLE provide some encryption, but it is local, not end-to-end. Security is implemented at L6, using end-to-end encryption - mTLS for streams and WebPush for single messages. Neither are part of this package.
Wifi and BLE requires root or NET_ADMIN capabilities - only minimal code required to achieve low-level packet exchange included, to further minimize security risks and keep things simple.
The app will open a 'dmesh' UDS socket. A non-root app is expected to connect. UID of the peer will be checked and use to authorize the connection.
This implements a message-based communication - commands and raw packets are exchange over the socket, similar with Netlink.
This is the recommended and most interesting protocol, supported in Android Pixel2+. It operates on Channel 6, as a peer-to-peer protocol, with a rotating 'master' sending beacons every 1/2 second. Devices advertise the time they are awake and receiving, and on which frequencies.
An Android device can be connected to an AP, but still communicate via NAN with other devices on a different frequncy.
It is better optimized for low-power and disconnected operation, allowing devices to exchange messages without having a connection, and to create direct connections while both devices can still sleep. With P2P one of the device (the group owner) is typically active all the time, in particular if 'legacy' API is used to connect (the only way to create connections without user interaction on most android versions).
The package implements a minimal subset of the protocol, enough to communicate with Android and ESP32, by using NetLink SEND_FRAME interface and creating a monitor interface.
A future extension of this will be to allow each device to select a different receive channel, to maximize the use of the spectrum. Channel 6 will be used according to the standard, to exchange information about the time schedule and channel of each device. A control plane will attempt to optimize the allocation (in an even more distant future).
Operation will be similar with LoRA - a device will know the channel and time when each peer is available and use that to send frames.
A device may have multiple drivers - it could also listen on a BLE or LoRA channel, the goal is to use the most battery efficient mechanism for transmission of low-speed control data, as well as activate high-speed interface on the best channel when needed.
A connection to wpa_supplicant is used to control P2P discovery, starting an AP and connecting to other P2P devices.
The app will also start a dhcp server, using the defined port - non-root applications can't do this. This is needed since most versions of Android expect a DHCP response.
Communication with non-rooted Android uses normal UDP, using IPv6 link-local address.
Uses an 'extended' version of Eddystone to advertise a UUID. The extension consists of using 'connectable', with a Proxy characteristic used to send and receive frames.
Testing with Android and ESP32.
TODO: L2 communication is more efficient, supported in recent Android.
WIP - similar with Istio, to allow capturing local traffic and redirecting to the high-level proxy.