Ubuntuブルートゥース識別及びPyBluezブルートゥースシリアルポートテストを実現
10624 ワード
システム:Ubuntu 14.04
Bluetooth:緑聯USB 2.0 Bluetoothアダプタ(モデル:CM 109、チップ:CSR 8510)
一、ブルートゥース識別:
1、ハードウェアを挿入し、端末を開き、デバイスが検出されたかどうかを確認する.
2、Bluetoothモジュールと認識されているかどうかを確認する.
3、ブルートゥースモジュールのアドレスを確認する;Bluetoothモジュールとそのアドレスが表示されない場合は、rfkill listコマンドでhci 0がblockedであるかどうかを確認し、rfkill unblock 0(rfkill listに表示されるhci 0のシーケンス番号)を使用してBluetoothモジュール(hci 0)を有効にする必要があります.
4、ブルートゥースモジュールをアクティブにする:
Bluetoothモジュールをアクティブにすると、携帯電話のBluetoothで正常に接続できます.携帯電話でこのBluetoothモジュールが検索できない場合、UbuntuのBluetoothモジュールはデフォルトで非表示のため、Ubuntuの上のツールバーでBluetoothアイコンをクリックし、Visible ONを設定する必要があります(Ubuntuの下でBluetoothの可視性を設定する端末コマンドはしばらく見つかりません).
5、今回のテストはブルートゥースモジュールをサービス側に設定し、ペアリングコードを必要としない:
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を取り付ける:
問題が発生:
問題解決:libbluetooth-devをインストールする
三、PyBluezテスト(PyBluezのexample実装を参照):
1、設備リストを問い合わせる:
2、問い合わせ設備サービス:
3、RFCOMM:
Bluetoothシリアルポートサービス:
問題が発生しました: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
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