MultiSignal-Collector is a slim raw data collection toolkit extracted from the MultiSignal Android research workspace. It keeps only the Android collection app, PC-side WiFi/ADB control, live raw receiver, raw session backfill, and build/install helpers.
This repository does not include acoustic, fingerprint, indoor positioning, PDR, model training, inference, report generation, historical experiment scripts, or generated datasets.
- Android IMU event streams
- WiFi scan and RTT records when available
- BLE scan records
- GNSS raw measurements and clock records when available
- Raw float PCM audio saved as WAV
- Session metadata, transport batch continuity, and task preset metadata
The default live upload port is 8888. The default raw session backfill port
is 8890.
Raw sessions can contain sensitive environment and personal data, including audio, WiFi SSID/BSSID values, BLE MAC addresses and device names, GNSS location/time records, phone source IPs, and Android device model metadata. Do not publish collected session folders without review and redaction.
The public collector code does not include generated datasets, analysis outputs, model checkpoints, private path configs, build fingerprints, ADB serials, tokens, or keys.
app/: Android collection appscripts/receiver.py: one-shot PC receiverscripts/receiver_watch.py: long-running phone-manual WiFi upload receiverscripts/harvest_control.py: PC-controlled ADB/WiFi collection entryscripts/watch_wifi_upload.sh: phone-manual WiFi upload launcherscripts/watch_wifi_upload_fresh.sh: launcher that clears stale listenersscripts/install_debug_apk.sh: installs the debug APK with adbpython/collect/collect_session.py: compact collection facadepython/core/raw_backfill.py: raw session backfill serverdocs/data_format.md: raw output format notes
- Android Studio or Android Gradle Plugin compatible SDK installation
- JDK suitable for the Android Gradle Plugin version in this project
- Python 3.10+
- Python package
protobuf - adb on
PATH, orULTRAHARVESTER_ADBpointing to adb
Set the Android SDK in one of these ways:
export ANDROID_SDK_ROOT=/path/to/android/sdk
export ANDROID_HOME="$ANDROID_SDK_ROOT"
export JAVA_HOME=/path/to/jdkYou can also create an untracked local.properties:
sdk.dir=/path/to/android/sdk./gradlew :app:assembleDebug
bash scripts/install_debug_apk.shTo install a specific APK:
bash scripts/install_debug_apk.sh app/build/outputs/apk/debug/app-debug.apkStart a fresh PC listener:
bash scripts/watch_wifi_upload_fresh.sh \
-o ./MultiSignal_Experiments \
--host <PC_LAN_IPV4> \
--max-sessions 1On the Android app, use:
- transport mode:
wifi - WiFi link mode:
upload - PC host: the same
<PC_LAN_IPV4> - live port:
8888 - raw backfill port:
8890
Start collection from the phone UI. The PC should create a session directory
named like <prefix>_session_YYYYMMDD_HHMMSS when a prefix is available.
ADB-controlled USB or WiFi collection:
python3 python/collect/collect_session.py \
--transport wifi \
--control-via wifi \
--phone-ip <PHONE_LAN_IPV4> \
--pc-host <PC_LAN_IPV4> \
-d 3 \
-o ./MultiSignal_Experiments \
--label pointAcollect_session.py passes unknown options through to
scripts/harvest_control.py, so sensor toggles such as --no-ble,
--no-gnss, or --no-audio-play can be used there as well.
The Android app and PC scripts keep these collection presets as raw collection configuration and storage folders only:
acoustic_sensingindoor_MultisignalAcoustic_IMU_landmark
No post-processing is run automatically for any preset.
If live WiFi upload drops batches, keep the PC listener running. The phone can
send the complete local raw session to the PC backfill listener on port 8890.
The backfill server replaces the session raw_data/ tree atomically after the
full manifest has arrived.
MIT. See LICENSE.