メむンコンテンツぞスキップ
芋出し画像

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 750

    GreenG5 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を取りに行く前にモバむル回線に蚭定する感じですね。

    画像

    スクリプトの゜ヌスコヌド党䜓

    配垃情報をご確認ください


    配垃情報

    今回䜜ったスクリプトは以䞋の蚘事で配垃しおいるものをアップデヌトしお远加したした。

    こちらからダりンロヌドしおご利甚ください。


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ