Schakel een usb-apparaat uit

(Filip Vervloesem) Onlangs wilde ik op mijn laptop signalen van een sensor uitlezen via Bluetooth Low Energy. De ingebouwde BLE-interface bleek echter onbetrouwbaar te zijn en na enkele uren uit te vallen. Zelfs een reset van de interface hielp niet. De oplossing was een externe BLE-dongel, die zelfs na meerdere dagen continu sensorgegevens uitlezen het niet opgaf.

Maar heel wat software veronderstelt dat je maar één Bluetooth-interface in je computer hebt of maakt het omslachtig om een andere interface in te stellen. Ik besloot daarom om de ingebouwde Bluetooth-interface uit te schakelen. Normaal doe je zoiets door de bijbehorende kernelmodule te blacklisten, maar dat blokkeert alle apparaten die dezelfde module gebruiken, wat in mijn geval ook effect had op de externe Bluetooth-interface. Gelukkig is het eenvoudig om één specifieke Bluetooth-interface uit te schakelen, omdat ze intern op de usb-bus aangesloten zijn.

Meestal kun je met lsusb wel het apparaat identificeren dat je wilt uitschakelen: in de laatste kolom staat een naam waaruit je doorgaans kunt afleiden om welk apparaat het gaat. De hexadecimale cijfers die je na ID met een dubbele punt ertussen ziet, vormen respectievelijk het vendor id en product id van het apparaat. Voor de ingebouwde Bluetooth-interface van mijn laptop was dat bijvoorbeeld 8087:0a2b.

Indien je de uitvoer van lsusb toch niet kunt ontcijferen (sommige namen zijn wel heel vaag), dan kun je met het programma udevadm alle attributen van het apparaat opvragen, bijvoorbeeld:

udevadm info -a -p /sys/class/bluetooth/hci0

Het vendor id en product id vind je dan doorgaans na ATTRS{idVendor} en ATTRS{idProduct}. Overigens geeft udevadm ook die informatie over hogerliggende apparaten in de device tree, dus bekijk goed of je het juiste apparaat hebt.

Het apparaat uitschakelen is na deze voorbereiding heel eenvoudig. Maak een udev-regelbestand /etc/udev/rules.d/81-bluetooth-hci.rules aan en plaats daarin de volgende regel:

SUBSYSTEM=="usb", ATTRS{idVendor}=="8087", ATTRS{idProduct}=="0a2b", ATTR{authorized}="0"

Het best voeg je daar ook een commentaarregel boven (beginnend met #) waarin je uitlegt waarvoor deze regel dient, zodat je dit later nog weet.

Je vult hierin dus het vendor id en product id van het uit te schakelen apparaat in. Met ATTR{authorized}=”0″ plaatst de usb-bus het apparaat in slaapmodus. Het wordt dus nooit actief, maar verbruikt nog een verwaarloosbaar klein gedeelte stroom. Als je daarna de externe BLE-dongel aansluit, wordt die als apparaat hci0 herkend en werkt alle Bluetooth-software ermee samen.