
Linuxã«Bluetoothãã¶ãªã³ã°ããŠã¿ã
ããã«ã¡ã¯Rcatã§ãã
ä»åã¯ä»¥äžã®èšäºã§è¡ã£ãUSBãã¶ãªã³ã°ãBluetoothãã¶ãªã³ã°ã«å€ããããšæããŸãã
çç±ãšããŠã¯é
ç·ãã€ãªãã£ãŠãããšäºåã®ã¹ãããšã¯ããã䜿ãããæã«äœ¿ãã¥ããããã§ãã
ãªãã¢ãã€ã«åç·ã䜿ãã®ããã©ã®ãããªæŽ»çšã®ä»æ¹ãããããã©ã®ã¢ãã€ã«åç·ããããããªã®ãã«ã€ããŠã¯ãã¡ãã®èšäºãã確èªãã ããã
ã¯ããã«
å©çšèŠçŽ
æ å ±ãäœåã®æŽ»çšæã¯äºåã«å©çšèŠçŽãã確èªãã ããã
https://note.com/rcat999/n/nb6a601a36ef5
ã³ã¡ã³ãã«ã€ããŠ
å©çšèŠçŽã®ã¬ã€ãã©ã€ã³ã確èªã®äžã³ã¡ã³ãããŠãã ãã
æŠèŠ
åºæ¬çã«ã¯åé ã§ã玹ä»ãã以äžã®èšäºã§ãã£ãŠããããšãUSBãã¶ãªã³ã°ããBluetoothãã¶ãªã³ã°ã«å€æŽããŸãã
ãã ããBluetoothãã¶ãªã³ã°ã®å Žåã¯ã¹ããããã¹ã€ããããªã³ã«ããã ãã§ãªããLinuxã®æ¹ã§ãæäœãå¿
èŠãªãããèªåã§ã§ããããã«ã¹ã¯ãªãããæ¹é ãããšããã®ãäž»ãªå
容ãšãªããŸãã
äºåæºå
ãŸãã¯Bluetoothãäœ¿ãæ¹æ³ããèŠãŠãããŸãããã
Bluetoothãæå¹ã«ãã
ãŸãã¯Bluetoothã®ãµãŒãã¹ãç«ã¡äžãã£ãŠããã確èªããŸãããã
ã¢ã¯ãã£ããªã®ã§ç«ã¡äžãã£ãŠããŸããã
$ sudo systemctl status bluetooth
â bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2024-10-24 23:21:19 JST; 17min ago
Docs: man:bluetoothd(8)
Main PID: 574 (bluetoothd)
Status: "Running"
Tasks: 1 (limit: 18830)
Memory: 2.2M
CPU: 163ms
CGroup: /system.slice/bluetooth.service
mq574 /usr/lib/bluetooth/bluetoothd次ã«å°çšã®ã³ãã³ãã䜿ã£ãŠèšå®ã«å
¥ããŸãã
ãŸãæåã«ã¹ã€ãããå
¥ããŠããã®åŸãã¹ãã£ã³ããŠãã¢ãªã³ã°ããŸãã
$bluetoothctl
Bluetoothããªã³ã«ãã
[bluetooth]# power on
Changing power on succeeded
ããã€ã¹ãã¹ãã£ã³ãããMACã¢ãã¬ã¹ãšããã€ã¹åã衚瀺ãããã¿ããã
[bluetooth]# scan on
Discovery started
[CHG] Controller XX:XX:XX:XX:XX:XX Discovering: yes
[NEW] Device XX:XX:XX:XX:XX:XX neko
ãã¢ãªã³ã°ãããã¹ãã£ã³ã§èŠã€ããããã¯ã¢ãã¬ã¹ãæå®ãã
[bluetooth]# pair XX:XX:XX:XX:XX:XX
Request confirmation
èªèšŒã³ãŒãã確èªãããã®ã§ãyesãšå
¥å(ã¹ããåŽã§ãæ¿èªãæŒã)
[agent] Confirm passkey 550095 (yes/no): yes
ã¹ãã£ã³ãæ¢ãã
[bluetooth]# scan offãã¢ãªã³ã°ãå®äºããããã¹ããåŽã§Bluetoothãã¶ãªã³ã°ãæå¹ã«ããŠãããŸãã

Bluetoothãã¶ãªã³ã°ã«æ¥ç¶ãã
次ã«nmcliã³ãã³ãã§ããã€ã¹ã®ç¶æ
ã確èªããŸãã
TYPEãBTã«ãªã£ãŠããã®ãBluetoothãã¶ãªã³ã°ã§ãããŸã ã€ãªãã§ããªãã®ã§åæã«ãªã£ãŠããŸããã
connectãªãã·ã§ã³ã§æ¥ç¶ããŸãã
$ nmcli dev status
DEVICE TYPE STATE CONNECTION
enp1s0 ethernet æ¥ç¶æžã¿ æç·æ¥ç¶ 1
XX:XX:XX:XX:XX:XX bt åææžã¿ --
æ¥ç¶ãã
$ sudo nmcli dev connect XX:XX:XX:XX:XX:XX
ããäžåºŠç¢ºèªãã
$ nmcli dev status
DEVICE TYPE STATE CONNECTION
enp1s0 ethernet æ¥ç¶æžã¿ æç·æ¥ç¶ 1
XX:XX:XX:XX:XX:XX bt æ¥ç¶æžã¿ neko ãããã¯ãŒã¯æ¥ç¶ãå®äºããããã«ãŒãã®ã³ãã³ãã§ã確èªããŠã¿ãŸãããã
ã¡ããªãã¯ã750ãšã ãã¶åªå
é äœãäœãã§ããã远å ãããŠããããšã確èªã§ããŸããã
ããã§äºåæºåã¯å®äºã§ãã
$ ip route
default via 192.168.0.1 dev enp1s0 proto dhcp metric 100
default via 192.168.44.1 dev XXXXXXXXXXXX proto dhcp metric 750GreenG5 x Ubuntu 22.04.5 LTSã§ãBluetoothããªã³ã«ããæ¹æ³
â»bluetoothctlã³ãã³ããæ£åžžã«åãã人ã¯ã¹ãããããŠãã ãã
ããŠãç§ã¯ãããªãbluetoothctlã³ãã³ãã䜿ããªãã£ãã§ãâŠã
ä»åãã¶ãªã³ã°ããŠããã®ã¯ä»¥äžã§ç޹ä»ããŠããããPCã§ãOSãUbuntu 22.04.5 LTSã§ãã
å®ã¯wi-fi䜿ã£ãŠãªãã£ãã®ã§ã©ãã§ãè¯ãã£ããã§ãããç¡ç·ãå
šã䜿ããŸããã§ãããã©ããwi-fiãšBluetoothãã»ããã®ããã§ãã©ã£ã¡ã䜿ããªããšããç¶æ
ã§ããã
æç·ã ãããããšæã£ãŠæŸçœ®ããŠãããã§ãããä»ååé¡ã«ãªããŸããã
åå
ãã®ããœã³ã³ã«æèŒãããŠãããããã¯ãŒã¯ã¢ããã¿ãŒã®ãã©ã€ãããªãã
調ã¹ãŠã¿ããšããã®ããŒãžã§ã³ã®Ubuntuã§ã¯å¯Ÿå¿ããŠããªããšããããšãããã£ããã€ãŸããæ£èŠã®æ¹æ³ã§ã¯å©çšã§ããªããšããããšã
ã ããå®ã¯ä»ã®ãã©ã€ããåœãŠãã ãã§äœ¿ãããããã®ã§ããã®æ¹æ³ã§ãã£ãŠã¿ãŸããã
â»æè¿ã¯æ°ããUbuntuã®ããŒãžã§ã³ãåºãã¿ãããªã®ã§ãããªã察å¿ããŠãã®ãããããŸãããBluetoothã®ããã ãã«ãªã¹ã¯ã䌎ã£ãŠã¢ããããŒãã¯ããªãã§ããâŠã
以äžããã°ã§ãã
ãã¡ãŒã ãŠã§ã¢ãã¡ã€ã«ããããŸãããšãããšã©ãŒãåºãŠããŸããã
$ sudo dmesg | grep -i bluetooth
[269198.297536] Bluetooth: hci0: Device revision is 2
[269198.297544] Bluetooth: hci0: Secure boot is enabled
[269198.297545] Bluetooth: hci0: OTP lock is enabled
[269198.297546] Bluetooth: hci0: API lock is enabled
[269198.297547] Bluetooth: hci0: Debug lock is disabled
[269198.297548] Bluetooth: hci0: Minimum firmware build 1 week 10 2014
[269198.297551] Bluetooth: hci0: Bootloader timestamp 2019.40 buildtype 1 build 38
[269198.297558] Bluetooth: hci0: No support for _PRR ACPI method
[269198.299074] Bluetooth: hci0: Failed to load Intel firmware file intel/ibt-0040-1050.sfi (-2)
[269198.299509] Bluetooth: hci0: Reading supported features failed (-56)
[269198.299513] Bluetooth: hci0: Error reading debug featuresè¶³ããªãã®ã¯"0040-1050"ã®ãã©ã€ããŒãã¡ã€ã«ã§ã調ã¹ããšãã代ããã«"1040-4150"ã®ãã©ã€ããŒãã¡ã€ã«ãåœãŠãããšã§ã¢ã¯ãã£ãã«ããããšãã§ãããããã§ãã
以äžã®ããã«ã·ã³ããªãã¯ãªã³ã¯ã貌ããŸããã
sudo ln -s /usr/lib/firmware/intel/ibt-{1040-4150,0040-1050}.sfi
sudo ln -s /usr/lib/firmware/intel/ibt-{1040-4150,0040-1050}.ddcãããŠäžåºŠã·ã£ããããŠã³ããŠé»æºãå
¥ãçŽããŸããã
ãããšä»ãŸã§ãããšããããšãèšããªãã£ãbluetoothctlã³ãã³ãã䜿ããããã«ãªããŸãã
ãªããèªå·±è²¬ä»»ã§ãé¡ãããŸãã
èªå忀èš
ããŠãBluetoothãåæããå Žåã©ããªãã®ã?
å床ãªã³ã«ããŠãèªåçã«ãã¶ãªã³ã°ãããããã§ã¯ãããŸããã
ã€ãŸããããœã³ã³ãåèµ·åããŠåæããããšãã¹ããã§ã¯ãã¶ãªã³ã°ãæå¹ãªã®ã«æ¥ç¶ãããªããšããããšã
å°ããŸãããããŸãã³ãã³ããã·ã§ã«ããæããªããšãããªãã®ã§ããããïŒ
ããããã©ãããããã®ã§èªååããŸãããã
èªååã¹ã¯ãªãããäœæ
ããŠãååã®USBãã¶ãªã³ã°ã®èšäºã§é
åžããŠãããéä¿¡ã«ãŒãèšå®èªååã¹ã¯ãªããã«ä»åã®Bluetoothã®ãã¶ãªã³ã°èªååã远å ããŸããã
ããããããšã§èªåçã«Bluetoothãã¶ãªã³ã°ã«æ¥ç¶åŸããã®ãããã¯ãŒã¯ã«ã«ãŒãèšå®ãŸã§ãèªååã§ããŸãã
USBãã¶ãªã³ã°ã¯PCåèµ·åãããšå床ã¹ãããæäœããªããšãããªãã®ã§ãããBluetoothãªãæå¹ã®ãŸãŸãªã®ã§ãã£ã¡ã®æ¹ã䟿å©ãããããªãã§ããã
é
åžã¯æäžéšããæ¡å
ããŠããŸã
æ¬äœã¯Pythonã§äœæããŠãããŸããå°å ¥æ¹æ³ã«ã€ããŠã¯ä»¥äžãã確èªãã ããã
ã€ã³ã¹ã¿ã³ã¹ãšBluetoothã®ç®¡ç
ãŸãã¯ã¯ã©ã¹ãã€ã³ããŒãããŠã€ã³ã¹ã¿ã³ã¹ããŸãããã
ä»åäœæããã¯ã©ã¹ã¯BluetoothNetworkManagerã§ãã
ãã®äžã®CheckBluetoothPower颿°ãå©ããšBluetoothãæå¹ãã©ããã確èªãã黿ºãå
¥ã£ãŠããªãå Žåã¯é»æºãå
¥ããŸãã(åŒæ°ã«Falseãæž¡ãããšã§ãèªåçã«é»æºãå
¥ããªãããã«ããããšãã§ããŸãã)
å
·äœçã«ã¯"bluetoothctl power on"ã³ãã³ãã代ããã«å©ããŸãã
ãŸãããããŸã§ã®äœæ¥ãããŠããæç¹ã§é»æºã¯å
¥ã£ãŠãããšæããŸããã
$sudo python3 #äžéšã®ã³ãã³ãã«ç®¡çè
æš©éãå¿
èŠ
>>>import iproute
>>>b = iproute.BluetoothNetworkManager()
>>> b.CheckBluetoothPower()
Trueã¡ãªã¿ã«ãªãã«ããå Žåã¯BluetoothPowerControlã«å¯ŸããŠããŒã«åã§ã¹ããŒã¿ã¹ãæž¡ããŸãããã¡ãã®é¢æ°ã䜿ã£ãŠãªã³ã«ããããšãã§ããŸãã
>>> b.BluetoothPowerControl(False)æ¥ç¶
ãã¢ãªã³ã°ã¯æ¢ã«ããã§ããåæã§ãConnectã¡ãœãããå©ãã ãã§æ¥ç¶ã§ããŸãã
ã¡ãªã¿ã«ãã®é¢æ°ã®äžã§äžã®CheckBluetoothPowerãåŒã³åºãã®ã§æå¹ã«ãªã£ãŠããªããã°èªåçã«æå¹ã«ããŠãããŸãã
ã³ãã¯ãããæã¯MACã¢ãã¬ã¹ãæå®ããå¿
èŠããããŸããããã¢ãªã³ã°ããŠããããããã®ããã€ã¹ã«æ¥ç¶ã§ããã°ããå Žåã¯çç¥å¯èœã§ãã
>>>b.Connect()
INFO ããã€ã¹ã®æå®ãç¡ãã®ã§XX:XX:XX:XX:XX:XXãèªåéžæããŸã
INFO ããã€ã¹ã®æå®ãç¡ãã®ã§XX:XX:XX:XX:XX:XCãèªåéžæããŸã
INFO XX:XX:XX:XX:XX:XCã«æ¥ç¶ããŸãã
DEBUG {'mac': 'XX:XX:XX:XX:XX:XC', 'status': True, 'name': 'neko ãããã¯ãŒã¯'}
DEBUG {'mac': 'XX:XX:XX:XX:XX:XX', 'status': False, 'name': '--'}
Trueç§ã®å Žåã¯2å°ã®ã¹ããããã¢ãªã³ã°ããŠããã®ã§ã確èªã³ãã³ãã䜿ããš2å°æ€åºãããŸãã
äžã®äŸã§ã¯æåã®ããã€ã¹ãç¡å¹ã«ãªã£ãŠããã®ã§å€±æãããã®å Žåã¯æ®ãã®ããã€ã¹ãæåãããŸã§åŠçãç¶ããŸããããæåã®ããã€ã¹ã§æ¥ç¶ãå®äºããã°2ã€ç®ã®ããã€ã¹ã§ã¯æ¥ç¶ãããŸããã
$ nmcli dev status
DEVICE TYPE STATE CONNECTION
enp1s0 ethernet æ¥ç¶æžã¿ æç·æ¥ç¶ 1
XX:XX:XX:XX:XX:XX bt æ¥ç¶æžã¿ neko ãããã¯ãŒã¯
XX:XX:XX:XX:XX:XX bt åææžã¿ --ã¡ãªã¿ã«ãã§ã«æ¥ç¶ãããŠããå Žåã¯äœãããŸããã
äºéæ¥ç¶ãããå Žåã¯ãçŽæ¥MACã¢ãã¬ã¹ãæå®ããŠãã ããã
>>>b.Connect()
INFO æ¢ã«æ¥ç¶ãããŠããããã€ã¹ãããããèªåæ¥ç¶ã¯è¡ããŸãã
False
#MACã¢ãã¬ã¹ãæå®ããŠæç€ºçã«æ¥ç¶ããå Žåã¯ãæ¢åã®æ¥ç¶ããã£ãŠãæ¥ç¶å¯èœ
>>>b.Connect("XX:XX:XX:XX:XX:XX")
True$ nmcli dev status
DEVICE TYPE STATE CONNECTION
enp1s0 ethernet æ¥ç¶æžã¿ æç·æ¥ç¶ 1
XX:XX:XX:XX:XX:XX bt æ¥ç¶æžã¿ neko ãããã¯ãŒã¯
XX:XX:XX:XX:XX:XX bt æ¥ç¶æžã¿ Rcat ãããã¯ãŒã¯åæ
åæããæã¯DisConnectããããã ãã§ãã
2ã€ä»¥äžæ¥ç¶ããŠããå Žåã¯ãåŒæ°ãçç¥ãããšã³ãã³ãã§è¡šç€ºããæã«äžã«è¡šç€ºãããããã€ã¹ãå
ã«åæãããŸãããªããé£ç¶ã§åæãè¡ããŸããã®ã§ã1åã®å®è¡ã«ã€ã1ããã€ã¹ãåæã§ãã
>>>b.DisConnect()
True
#æç€ºçã«MACã¢ãã¬ã¹ãæå®ããå Žå
>>>b.DisConnect("XX:XX:XX:XX:XX:XX")
Trueã¡ãªã¿ã«æ¥ç¶ãããšããã€ã¹ã®ååããããããã«ãªãã®ã§ãåææã¯ååã®äžéšãå ¥åããããšã§ãåæããããšãã§ããŸãã
>>> b.DisConnect(Name="Rcat")
Trueå šèªåå
ã§ã¯ãBluetoothãæ¥ç¶ããéä¿¡çµè·¯ãèšå®ãŸã§ãäžé£ã®æµããèªååããŠã¿ãŸãããã
ãšã¯ãããååãã«ãŒãèšå®ã«å°ã远å ããã ãã§ãã
å°ããšèšãã2è¡ã ãã§ããã
äžçªæåã«Bluetooth管çã®ã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹ããã³ãã¯ã颿°ã䜿ã£ãŠãã¢ãªã³ã°ããŠããã¹ããŒããã©ã³ã«ã©ãã§ãããã®ã§æ¥ç¶ãè¡ããŸãã
ãã®åŸãçµè·¯èšå®ãè¡ãããšã§ç¹å®ã®ãµã€ãã ãBluetoothãã¶ãªã³ã°çµç±ã§æ¥ç¶ã§ããããã«ãªããŸãã

忥ç¶ãèæ ®ããå Žå
é·æéå®è¡ãç¶ããã¹ã¯ãªããã®äžã§ãæåã ãããã€ã¹ãã§ãã¯ãã«ãŒãèšå®ãè¡ããšéäžã§åæãããå Žåã«å
ã«æ»ãããšãã§ããŸããã
ãšããããã§ãç§ã®å Žåã¯ä»¥äžã®é¢æ°ãã¢ãã€ã«åç·ã䜿ã£ãŠæ¥ç¶ããçŽåã«åŒã³åºããŠããŸãã
äœãããŠããããšãããšãæåã«Bluetoothã®æ¥ç¶ã確èªããæ¥ç¶ãããŠããªãå Žåã¯æ¥ç¶ããªããã
次ã«ãã¹ãåããIPã¢ãã¬ã¹ã«å€æãéä¿¡ã«ãŒãã远å ãããAddRouteForHost颿°ã¯æ°ããIPã¢ãã¬ã¹ãèŠã€ãããã«ãŒãã远å ãããå Žåã®ã¿IPã¢ãã¬ã¹ãè¿ããŸãããã§ã«ç»é²ãããŠããå Žåã¯äœãããŸããã

æåŸã«ä¿åã§ãã
ã¡ãªã¿ã«åæãããçŽåŸã«ä¿åã ããã£ãŠããŸããšãä»ãŸã§èšå®ããŠãããã®ãå
šãŠæ¶ããŠããŸããããå
ã«èªã¿èŸŒã¿ãè¡ã£ãŠããŸãããã®åŸã«ä¿åããããšã§ãä»ãŸã§ã®èšå®ãä¿æãããããªå·¥å€«ããªãããŠããŸãããã®èªã¿èŸŒã¿ãæ¢åã®ã«ãŒãã¯ç¡èŠããã®ã§ãäœèšãªäœæ¥ãçºçããããšã¯ãããŸããã
ããããããšã§ãã»ãŒç¢ºå®ã«ã¢ãã€ã«åç·ã䜿çšããããšãã§ããããã«ãªããŸãã
ã¡ãªã¿ã«ãã®é¢æ°ã¯ä»¥äžã®ãããªåŒã³åºãæ¹ãããŠããŸããåèã«ããŠãã ãããRSSãåãã«è¡ãåã«ã¢ãã€ã«åç·ã«èšå®ããæãã§ããã

ã¹ã¯ãªããã®ãœãŒã¹ã³ãŒãå šäœ
é åžæ å ±ãã確èªãã ãã
é åžæ å ±
ä»åäœã£ãã¹ã¯ãªããã¯ä»¥äžã®èšäºã§é åžããŠãããã®ãã¢ããããŒãããŠè¿œå ããŸããã
ãã¡ãããããŠã³ããŒãããŠãå©çšãã ããã