CLI Clients¶
The repository includes customer-facing sample clients built on the shared SDK.
Public repository root: Nexus-N3/rs-nexus-ble-tooling.
RF Survey Clients¶
RFSurvey/client.py and RFSurvey/mixed_client.py provide RF Survey workflows on top of the shared gateway SDK.
Primary behavior:
discover and select RF Survey target addresses before the survey starts
start RF Survey against the selected BLE target addresses
listen for pushed
rf_survey_statuswindow updates from the gatewayreport per-target score, quality, trend, and RSSI during the survey
stop RF Survey and print the final per-target summary returned by
rf_survey_stop()
During the survey phase, the gateway still uses duplicate advertisements internally so RF Survey can compute observations, RSSI statistics, scores, and trends. Those repeated advertisements are not forwarded to the host as normal scan_result discovery JSON; the host only receives RF Survey status and final summary messages once the survey is running.
RFSurvey/client.py is the single-target smoke-test path.
RFSurvey/mixed_client.py is the mixed-sensor path. It performs one scan, selects a combined target set across the supported sensor families, and starts RF Survey on that merged list.
Primary options for RFSurvey/mixed_client.py:
--movella-countto select how many Movella DOT sensors to include--movesense-countto select how many Movesense sensors to include--metawear-countto select how many MetaWear sensors to include--nexus-n3-dot-countto select how many Nexus N3 Dot sensors to include--scan-timeout-msto control discovery duration--window-msto control the RF Survey rolling window--duration-msto control the RF Survey duration
Example:
python -m RFSurvey.mixed_client --movella-count 2 --movesense-count 1 --window-ms 3000 --duration-ms 15000python -m RFSurvey.client --window-ms 5000 --duration-ms 20000
Capture Client¶
Capture/cli.py provides the operator-facing capture session workflow across the supported sensor families.
Primary behavior:
choose a supported sensor family
choose the sensor count
assign one location per connected sensor
optionally use guided identify for Movella DOT placement
start and stop the capture manually
type
quitat any interactive setup prompt, or pressCtrl+C, to cancel and disconnect connected sensorswrite a dedicated session directory with manifest and output files under
output-files/captures/
Primary options:
--sensor-typeto choosemovelladot,nexusn3dot,movesense, ormetawear--sensor-countto choose how many sensors to connect--tagto label the capture session--locationto predefine locations non-interactively--identifyto enable guided identify for supported sensors--sampling-rate-hzto override the family default--duration-secondsto stop automatically instead of waiting for manual stop
Movella DOT Client¶
MovellaDot/stream_client.py is the current tutorial path and the most direct example of a supported sensor workflow.
Public source links:
Primary options:
--portto select the gateway serial device--sensor-countto choose how many sensors to connect--scan-timeout-msto control discovery duration--sampling-rate-hzto select the supported Movella rate--stream-secondsto control capture duration--use-startup-gateor--no-startup-gateto control startup validation
Programmatic API:
MovellaDot.MovellaDotClient.discover()MovellaDot.MovellaDotClient.connect()MovellaDot.MovellaDotClient.configure()MovellaDot.MovellaDotClient.start_streams()MovellaDot.MovellaDotClient.stop_streams()MovellaDot.MovellaDotClient.disconnect_all()
Nexus N3 Dot Client¶
NexusN3Dot/stream_client.py follows the same overall lifecycle, with Nexus N3 Dot-specific UUIDs, output-rate settings, and device-status reads.
Public source links:
Primary options:
--portto select the gateway serial device--sensor-countto choose how many sensors to connect--scan-timeout-msto control discovery duration--sampling-rate-hzto select a supported output data rate--stream-secondsto control capture duration--use-startup-gateor--no-startup-gateto control startup validation
Programmatic API:
NexusN3Dot.NexusN3DotClient.discover()NexusN3Dot.NexusN3DotClient.connect()NexusN3Dot.NexusN3DotClient.configure()NexusN3Dot.NexusN3DotClient.start_streams()NexusN3Dot.NexusN3DotClient.stop_streams()NexusN3Dot.NexusN3DotClient.read_device_status_all()NexusN3Dot.NexusN3DotClient.disconnect_all()
Movesense Client¶
Movesense/stream_client.py provides a Movesense workflow with the shared gateway
transport and Movesense-specific command UUIDs, discovery filters, and configuration sequences.
Public source links: - Movesense/stream_client.py - Movesense/client.py
Primary options:
- --port to select the gateway serial device
- --sensor-count to choose how many sensors to connect but limited to 1 for ECG capture
- --scan-timeout-ms to control discovery duration
- --sampling-rate-hz to select a supported Movesense output data rate
- --stream-seconds to control capture duration
- --use-startup-gate or --no-startup-gate to control startup validation
Programmatic API:
- Movesense.MovesenseClient.discover()
- Movesense.MovesenseClient.connect()
- Movesense.MovesenseClient.configure()
- Movesense.MovesenseClient.start_streams()
- Movesense.MovesenseClient.stop_streams()
- Movesense.MovesenseClient.read_device_status_all()
- Movesense.MovesenseClient.disconnect_all()
MetaWear Client¶
MetaWear/stream_client.py provides the first-pass MetaWear acceleration
workflow. It uses the shared gateway transport, MetaWear-specific command UUIDs,
and gateway arrival timestamps for stream timing because live MetaWear accel
notifications do not embed a sensor-side timestamp.
Public source links:
Primary options:
--portto select the gateway serial device--sensor-countto choose how many sensors to connect--scan-timeout-msto control discovery duration--sampling-rate-hzfor the current supported MetaWear acceleration rate--stream-secondsto control capture duration--use-startup-gateor--no-startup-gateto control startup validation--dump-raw-fileto capture raw forwarded MetaWear frames for inspection
Programmatic API:
MetaWear.MetaWearClient.discover()MetaWear.MetaWearClient.connect()MetaWear.MetaWearClient.configure()MetaWear.MetaWearClient.start_streams()MetaWear.MetaWearClient.stop_streams()MetaWear.MetaWearClient.disconnect_all()