Ubuntuブルートゥース識別及びPyBluezブルートゥースシリアルポートテストを実現

10624 ワード

システム:Ubuntu 14.04
Bluetooth:緑聯USB 2.0 Bluetoothアダプタ(モデル:CM 109、チップ:CSR 8510)
一、ブルートゥース識別:
1、ハードウェアを挿入し、端末を開き、デバイスが検出されたかどうかを確認する.
$ lsusb
Bus 001 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

2、Bluetoothモジュールと認識されているかどうかを確認する.
$ hciconfig -a
hci0:    Type: BR/EDR    Bus: USB
            ...

3、ブルートゥースモジュールのアドレスを確認する;Bluetoothモジュールとそのアドレスが表示されない場合は、rfkill listコマンドでhci 0がblockedであるかどうかを確認し、rfkill unblock 0(rfkill listに表示されるhci 0のシーケンス番号)を使用してBluetoothモジュール(hci 0)を有効にする必要があります.
$ hcitool dev
Devices:
    hci0    00:1A:7D:DA:71:11

4、ブルートゥースモジュールをアクティブにする:
$ sudo hciconfig hci0 up

Bluetoothモジュールをアクティブにすると、携帯電話のBluetoothで正常に接続できます.携帯電話でこのBluetoothモジュールが検索できない場合、UbuntuのBluetoothモジュールはデフォルトで非表示のため、Ubuntuの上のツールバーでBluetoothアイコンをクリックし、Visible ONを設定する必要があります(Ubuntuの下でBluetoothの可視性を設定する端末コマンドはしばらく見つかりません).
5、今回のテストはブルートゥースモジュールをサービス側に設定し、ペアリングコードを必要としない:
$ hciconfig hci0 noauth

6、hciconfigとhcitool(BlueZが提供するツールで、BlueZは多くのLinuxリリース版のデフォルトBluetoothプロトコルスタック)が検索、接続などの機能を実現することができ、ここでは主にプログラミングによってBluetoothモジュールを制御することを望んでいるので、これについてはしばらく深く考えない.
二、PyBluez取付:
1、PyBluez-0.22をダウンロードして解凍し、PyBluez-0.22ディレクトリに入る.(https://github.com/karulis/pybluez)
2、PyBluez-0.22を取り付ける:
$ sudo python setup.py install

問題が発生:
In file included from bluez/btmodule.c:20:0:
    bluez/btmode.h:5:33: fatal error: bluetooth/bluetooth.h: No such file or directory
    #include 

問題解決:libbluetooth-devをインストールする
$ sudo apt-get install libbluetooth-dev

三、PyBluezテスト(PyBluezのexample実装を参照):
1、設備リストを問い合わせる:
import bluetooth

nearby_devices = bluetooth.discover_devices(lookup_names=True)for addr, name in nearby_devices:
    print("  %s - %s" % (addr, name))

2、問い合わせ設備サービス:
import bluetooth

nearby_devices = bluetooth.discover_devices(lookup_names=True)for addr, name in nearby_devices:
    print("  %s - %s" % (addr, name))

    services = bluetooth.find_service(address=addr)
    for svc in services:
        print("Service Name: %s"    % svc["name"])
        print("    Host:        %s" % svc["host"])
        print("    Description: %s" % svc["description"])
        print("    Provided By: %s" % svc["provider"])
        print("    Protocol:    %s" % svc["protocol"])
        print("    channel/PSM: %s" % svc["port"])
        print("    svc classes: %s "% svc["service-classes"])
        print("    profiles:    %s "% svc["profiles"])
        print("    service id:  %s "% svc["service-id"])
        print("")

  3、RFCOMM:
Bluetoothシリアルポートサービス:
import bluetooth

if __name__ == "__main__":
    print("looking for nearby devices...")
    nearby_devices = bluetooth.discover_devices(lookup_names=True)
    for addr, name in nearby_devices:
        print("%s %s" % (addr, name))

    server_sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
    server_sock.bind(("", bluetooth.PORT_ANY))
    server_sock.listen(1)
    
    port = server_sock.getsockname()[1]
    
    uuid = "00001101-0000-1000-8000-00805f9b34fb"
    bluetooth.advertise_service(server_sock, "SampleServer", service_id=uuid)
    
    print("Waiting for connection on RFCOMM channel %d" % port)
    client_sock, client_info = server_sock.accept()
    print(client_info)
    
    try:
        while True:
            data = client_sock.recv(1024)
            if len(data) == 0:
                break
            print("received [%s]" % data)
    except IOError:
        pass
    
    client_sock.close()
    server_sock.close()
    print("this test is done!")
    

問題が発生しました:Segmentation Fault(rfcomm-server.pyを参照してadvertise_serviceメソッドの6つのパラメータを指定した場合)
問題を解決する:まずエラーの原因を理解する--メモリアクセスの境界を越えて、PyBluezパッケージBlueZにいくつかのバグがあることを説明します;次に、位置決めエラーが発生した場所:advertise_service;その後、PyBluezのソースであるbluetoothフォルダの下にあるbluezを表示します.pyファイルのadvertise_サービスの実装では,この方法は少なくとも最初の3つのパラメータだけでよいことが分かったが,余分なパラメータを除去した後,実行に成功した.
総括問題:このような余分なパラメータにバグが発生する場合は非常に典型的であり、プログラム実現の初期には、通常、必要なパラメータを処理するために余分な/拡張的/補助的なパラメータを無視しているが、一般的なテストの過程でもこのようなパラメータの問題を検出することは少ないため、実際に応用する際に、余分なパラメータを減らすことはバグを迂回する実用的な方法である.
 
最後に、携帯電話のBluetoothシリアルアプリケーションを通じてBluetoothシリアルサービス側に接続し、情報伝達に成功した.(^_^)
転載先:https://www.cnblogs.com/Ezekiel/p/8547817.html