Skip to main content
Every SDK workflow begins with an ef::Device. Choose a control transport, fill InitParameters, and call open() before using a device feature.

Discover devices

USB discovery is always available:
Include a Bluetooth LE scan with:
USB results provide device_id and serial. Bluetooth LE (BLE) results provide ble_address and ble_name. From the command line:

Open over USB

USB is the default transport:
Select a specific M1 when several are attached:
USB powers the M1 and carries control and live data.

Open over Bluetooth LE

BLE provides the control plane:
Leaving udp_host empty creates a control-only session. An incorrect password does not cause open() to fail. The device continues to answer info, state and storage unauthenticated, and these are required to diagnose a device whose password has been lost, so failing here would place them behind the credential being recovered. The gated verbs report INVALID_PASSWORD individually. Check in advance with device.is_authenticated(), which is meaningful on any BLE link and on a USB link the device reports as locked. See Access Control and Encryption.

Add wireless live data

Provision the M1 on WiFi first, then set the receiving Linux host’s reachable IP address:
The M1 cannot infer the host IP over BLE. Both devices must be on a reachable network, and the host firewall must permit the selected UDP port.

Session behavior

open() claims the control transport, validates capture settings, aligns the device clock, and caches device information. It normally leaves the handle in IDLE, though pre-existing device activity may report STREAMING. The first grab() starts the USB or WiFi/UDP data plane, so control-only work does not start a live stream unnecessarily. MCAP replay is the exception: open() creates the reader and reports STREAMING.

Inspect identity and capabilities

get_device_information() returns the snapshot cached by open():
This cached accessor does not block or access the device. The snapshot is captured at open() and updated by the WiFi calls, so a handle held open across a network change continues to report the values captured earlier. Request an update explicitly when current values are required:
If the transport is unavailable at the time of the refresh, the WiFi association and the BLE link are reset to unknown rather than retaining their previous values, so a disconnected device does not continue to report itself as connected. The health status is retained, because it records a sweep that completed.

Close the session

Closing stops a host live stream and finalizes a host-file recording, then releases the transport. It does not stop a device-local recording, which is designed to continue across host disconnects. Calling open() on an already open handle returns INVALID_FUNCTION_CALL. Close it before opening a different transport or device.

Common connection errors

USB control permits one client per cable. While an SDK application or ef-cli holds the device open, a second USB open() is refused with DEVICE_BUSY. BLE remains available in parallel, so a long-running USB application does not prevent operator access to the device. INVALID_PASSWORD is deliberately absent from this table: authentication failure is not reported by open(), only by the gated verb called subsequently.