• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Znikający hci0

Object Storage Arubacloud
0 głosów
194 wizyt
pytanie zadane 10 stycznia 2021 w Systemy operacyjne, programy przez Anedroid Obywatel (1,530 p.)
edycja 12 stycznia 2021 przez Anedroid

Problem jest następujący: gdy wymuszę wylogowanie się z systemu przez pkill -u user, sysrq-k/e/i, lub graficznie przejdę w stan uśpienia, przestaje mi działać Bluetooth, przez co nie mogę połączyć głośników Bluetooth. Oczywiście reboot zawsze pomaga, jednak wolałbym wiedzieć co jest przyczyną problemu. Sprawdziłem parę rzeczy i zauważyłem, że Linux nie widzi adaptera hci0.

user@host:~$ systemctl status bluetooth
● bluetooth.service - Bluetooth service
     Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-01-10 01:14:04 CET; 12h ago
       Docs: man:bluetoothd(8)
   Main PID: 642 (bluetoothd)
     Status: "Running"
      Tasks: 1 (limit: 3325)
     Memory: 1.5M
     CGroup: /system.slice/bluetooth.service
             └─642 /usr/lib/bluetooth/bluetoothd

Warning: some journal files were not opened due to insufficient permissions.
user@host:~$ rfkill
ID TYPE DEVICE        SOFT      HARD
 0 wlan phy0     unblocked unblocked
 1 wlan brcmwl-0 unblocked unblocked

Wiem że tu powinno być hci0, ponieważ w normalnych warunkach (tzw. kiedy Bluetooth działa), wyświetla się tam jeszcze urządzenie hci0. Używam tej komendy po raz pierwszy i nie mam pojęcie do czego ona służy. Żadnego z tych urządzeń nie znalazłem w /dev ani podkatalogach.

Spróbowałem jeszcze jednego polecenia z tej strony, niestety wciąż z marnym skutkiem:

user@host:~$ rfkill unblock bluetooth
user@host:~$ rfkill
ID TYPE DEVICE        SOFT      HARD
 0 wlan phy0     unblocked unblocked
 1 wlan brcmwl-0 unblocked unblocked

Edit: Zauważyłem, że kiedy komputer wraca z uśpienia, dostaje w powiadomieniach komunikat, że usługa kded5 scrashowała.

komentarz 16 stycznia 2021 przez j23 Mędrzec (194,920 p.)

Spróbuj jeszcze jedną rzecz. Tutaj masz kod w Pythonie (stąd) do resetowania urządzenia:

#!/usr/bin/python
"""
USB Reset

Call as "usbreset.py <device_file_path>"

With device_file_path like "/dev/bus/usb/bus_number/device_number"
"""
import fcntl, sys, os

USBDEVFS_RESET = ord('U') << (4*2) | 20

def main():
    fd = os.open(sys.argv[1], os.O_WRONLY)
    if fd < 0: sys.exit(1)
    fcntl.ioctl(fd, USBDEVFS_RESET, 0)
    os.close(fd)
    sys.exit(0)
# end main

if __name__ == '__main__':
    main()

Spróbuj go użyć u siebie do wybudzenia bluetootha.

Numer szyny i urządzenia wyciągniesz poleceniem lsusb.

komentarz 16 stycznia 2021 przez Anedroid Obywatel (1,530 p.)
Dzięki, to pomogło. Teraz tylko muszę ustawić tak, żeby ten skrypt odpalało mi automatycznie po wybudzeniu z sudo, ale myślę, że to już sam dam radę znaleźć w internecie.

Dziękuję za pomoc i poświęcony czas.
komentarz 17 stycznia 2021 przez j23 Mędrzec (194,920 p.)
Jeśli mnie pamięć nie myli, można do tego zaangażować systemd pisząc odpowiedni plik .service.
komentarz 17 stycznia 2021 przez Anedroid Obywatel (1,530 p.)

@j23,
Trochę ulepszyłem ten skrypt, ponieważ zauważyłem, że czasami ścieżka do urządzenia się zmienia (przy okazji trochę poznałem składnię Pythona):

#!/usr/bin/python
import fcntl, sys, os, re
 
USBDEVFS_RESET = ord('U') << (4*2) | 20
 
def main():
    bus = re.compile("Bus (\d\d\d)").findall(sys.argv[1])[0]
    device = re.compile("Device (\d\d\d)").findall(sys.argv[1])[0]
    path = "/dev/bus/usb/"+bus+"/"+device
    fd = os.open(path, os.O_WRONLY)
    if fd < 0: sys.exit(1)
    fcntl.ioctl(fd, USBDEVFS_RESET, 0)
    os.close(fd)
    sys.exit(0)
# end main
 
if __name__ == '__main__':
    main()
#!/bin/sh
info=$(lsusb | grep Broadcom)
echo $info
pkexec /home/$USER/usb\ reset.py "$info"

Może kod nie wygląda zbyt dobrze, ale działa.

komentarz 17 stycznia 2021 przez j23 Mędrzec (194,920 p.)

W sumie możesz nieco uprościć:

res = re.findall("Bus +(\d\d\d) +Device +(\d\d\d)", sys.argv[1])
fd = os.open("/dev/bus/usb/{}/{}".format(res[0][0], res[0][1]), os.O_WRONLY)

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 557 wizyt
0 głosów
0 odpowiedzi 635 wizyt
0 głosów
1 odpowiedź 391 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...