Authorize your computer's ADB public key and enable wireless ADB access on the scooter.
To protect against unauthorized wireless connections, the Android operating system requires incoming ADB clients to authenticate using an RSA public/private keypair. On the scooter’s head unit, authorized public keys are loaded from /adb_keys.
Because the scooter’s root filesystem is mounted read-only (ro), you cannot directly edit /adb_keys. Instead, we push our public key (adbkey.pub) to a temporary writable directory, mount-bind it over /adb_keys, and switch the scooter to manufacturing mode (mfg). While adbd always listens on port 5555, switching to mfg mode unblocks the port in the firewall and triggers the daemon to reload the keys from /adb_keys.
You can perform this setup automatically with s1util.py or execute the commands manually.
Option A: Automatic Pairing (Recommended)
Section titled “Option A: Automatic Pairing (Recommended)”The s1util.py utility includes a setup-adb command that fully automates the key generation, file transfer, mount binding, and mode-switching sequence:
python s1util.py setup-adb --host "<scooter-ip>"What Happens Automatically
Section titled “What Happens Automatically”- Key Detection & Generation: Checks your computer for an existing ADB keypair (
adbkey/adbkey.pub). If none exists, it automatically generates one usingadb keygen. - Default Path Resolution: Loads your public key directly from the standard OS location (e.g.,
~/.android/adbkey.pubor%USERPROFILE%\.android\adbkey.pub). - Pushes & Configures Key: Uploads your public key to the scooter and applies proper permissions (
666). On Gen 3 scooters, it stages the key and mount-binds it over/adb_keys. If it detects a Gen 1 / Gen 2 MoveOS device (by checking for/data/misc/adb/adbkeymoveos3_pub_prod), it pushes directly to/data/misc/adb/adb_keysand/data/misc/adb/adbkeymoveos3_pub_prodinstead, skipping the bind-mount. - Unblocks Port & Reloads Keys: Switches
persist.ola.security.scootermodetomfg, unblocking port5555in the firewall and restartingadbdso it loads your key from/adb_keys.
This provides a single-command, frictionless pairing experience without needing manual file transfers or shell commands.
Option B: Manual Pairing
Section titled “Option B: Manual Pairing”If you prefer full control over each step, follow the manual workflow below.
1. Generate an ADB Key (If Not Already Present)
Section titled “1. Generate an ADB Key (If Not Already Present)”If you have already used the Android SDK platform tools on your computer, your keypair is likely already generated. If not, generate one by running:
adb keygen ~/.android/adbkeyYour public key (adbkey.pub) is stored at the following default location depending on your operating system:
%USERPROFILE%\.android\adbkey.pub(Typically C:\Users\<YourUsername>\.android\adbkey.pub)
~/.android/adbkey.pub2. Push the Public Key to the Scooter
Section titled “2. Push the Public Key to the Scooter”Push your local adbkey.pub to the scooter using s1util.py push:
On Gen 3, push the key to a temporary location (/data/local/tmp/adb_keys_temp):
Windows (PowerShell):
python s1util.py push --host "<scooter-ip>" "$env:USERPROFILE\.android\adbkey.pub" /data/local/tmp/adb_keys_tempLinux / macOS:
python s1util.py push --host "<scooter-ip>" ~/.android/adbkey.pub /data/local/tmp/adb_keys_tempOn Gen 1 and Gen 2, push the key directly to /data/misc/adb/adb_keys:
Windows (PowerShell):
python s1util.py push --host "<scooter-ip>" "$env:USERPROFILE\.android\adbkey.pub" /data/misc/adb/adb_keysLinux / macOS:
python s1util.py push --host "<scooter-ip>" ~/.android/adbkey.pub /data/misc/adb/adb_keys3. Set File Permissions
Section titled “3. Set File Permissions”Android expects authorized key files to be readable by system processes. Set the permissions of the pushed key file to 666:
python s1util.py exec --host "<scooter-ip>" "chmod 666 /data/local/tmp/adb_keys_temp"python s1util.py exec --host "<scooter-ip>" "chmod 666 /data/misc/adb/adb_keys"4. Mount-Bind the Key File (Gen 3 Only)
Section titled “4. Mount-Bind the Key File (Gen 3 Only)”Because / (root) is read-only on Gen 3, /adb_keys cannot be written to directly. Bind-mount the temporary file over /adb_keys:
python s1util.py exec --host "<scooter-ip>" "mount --bind /data/local/tmp/adb_keys_temp /adb_keys"5. Switch Scooter Mode to Unblock Firewall & Reload Keys
Section titled “5. Switch Scooter Mode to Unblock Firewall & Reload Keys”With the new key file mounted, switch the scooter’s security property to manufacturing (mfg) mode:
python s1util.py exec --host "<scooter-ip>" "setprop persist.ola.security.scootermode mfg"Reverting ADB Setup
Section titled “Reverting ADB Setup”If you want to revert your scooter to its original factory state and undo the ADB pairing changes, run the revert-adb command with s1util.py:
python s1util.py revert-adb --host <scooter-ip>This removes the authorized keys, unmounts any temporary bindings, and resets the security mode back to standard customer mode (cust), re-enabling the firewall on port 5555.
Next Steps
Section titled “Next Steps”Now that ADB is paired successfully and port 5555 is unblocked in the firewall, proceed to establish an interactive root shell and mirror your scooter’s display.