Use Bluetooth peripherals with Bluetooth-disabled computers.
This project creates a Bluetooth USB HID relay using a Raspberry Pi Zero (or similar OTG-enabled single-board computer). It allows you to use Bluetooth keyboards and mice with computers that have Bluetooth disabled, by presenting the board as a composite USB HID device.
This project was born out of a desire to help a friend who couldn't use his favorite Bluetooth mouse and keyboard due to Bluetooth being disabled on his work laptop. As someone who enjoys tinkering and problem-solving, I saw this as an opportunity to create something useful while learning more about Linux internals, USB gadgets, and Go programming. The Raspberry Pi Zero became the perfect bridge, connecting Bluetooth peripherals to computers that wouldn't normally allow it.
graph TD
B(Keyboard) -- Bluetooth --> A{"HID <br> (Raspberry Pi Zero)"}
C(Mouse) -- Bluetooth --> A
A -- USB--> D(Host Computer)
Before building and running the project, ensure you have the following installed:
Go (version 1.21 or later)
On most Linux distributions, including Raspberry Pi OS (formerly Raspbian), you can install Go using:
sudo apt-get update
sudo apt-get install golang
Task runner using:
sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin
or
go install github.com/go-task/task/v3/cmd/task@latest
Note: You may need to add $(go env GOPATH)/bin to your PATH environment variable with the second command.
Please read before proceeding:
This project is currently in an experimental state and has only been tested on a limited number of devices. While it works well for my use case, please be aware that:
Before running this project, you should:
I cannot guarantee this will work on all devices or configurations. Proceed at your own risk.
Log in to your Raspberry Pi Zero.
Clone this repository to your board.
Run the setup scripts in the following order:
sudo chmod +x scripts/*.sh # make sure all scripts are executable
sudo ./scripts/setup_usb_host.sh # enable the USB host and load the necessary modules
sudo reboot
sudo ./scripts/setup_bluetooth.sh # enable and start the bluetooth service
sudo ./scripts/setup_gadgets.sh # create the gadget and configure the USB strings
Pair your Bluetooth devices manually or using the script:
sudo ./scripts/pair_devices.sh
Build and install the service:
task build
sudo task service:install
Connect the board to the target computer via USB. This will turn the board on and start the service automatically (assuming it was installed and enabled using the steps above) the bluetooth peripherals should connect automatically as well and the service will retry if they are not connected momentarily. Both Windows and MacOS have been tested and should work.
This project uses Task runner for common operations:
task --list
- List all available taskstask build
- Build the projecttask clean
- Clean build artifactstask test
- Run teststask run
- Build and run the applicationtask doctor
- Run the diagnose tooltask simulate
- Run the simulate tooltask service:install
- Install and enable the servicetask service:status
- Check service statustask service:logs
- View service logstask service:restart
- Restart the servicetask service:start
- Start the servicetask service:stop
- Stop the servicetask service:uninstall
- Remove the serviceThis tool will check for connected Bluetooth devices and display all incoming events from your Bluetooth keyboard and mouse, helping you debug connection and input issues.
task doctor
To test the USB HID output without Bluetooth devices:
task simulate
This interactive tool allows you to:
To uninstall the service:
task service:uninstall
To remove the gadget and restore the USB host configuration:
./scripts/uninstall/undo_setup_gadgets.sh
./scripts/uninstall/undo_setup_usb_host.sh
This project can be used as is or as basis for other types of USB gadgets. It can also serve as a learning opportunity for:
It's been a fun journey of discovery, and I hope others find it useful or inspiring for their own projects!
Tested with DietPi 64bit as host and Windows 10 and MacOS USB clients to which the keyboard and mouse were connected. No issues with latency or input delay. My friend have been using this setup for a few days now and it works great.
Found a bug or have a suggestion? Please feel free to create an issue on GitHub! I'm actively maintaining this project and would be happy to look into any problems or improvements you identify. While this is a personal project, I'm committed to helping others get it working and making it better.
Your feedback and contributions help make this project more reliable for everyone! 💜
This project is licensed under the MIT License - see the LICENSE file for details.