Python(Bluetooth通信02-Bleak_データ送受信)
■Write, Read, Notifyまで。
前回に続きBluetooth Low Energyの試し。今回はPC-スマホ間でのデータ送受信まで。PCで、Python(Bleakライブラリ)を使用して、スマホではBluetoothの既存アプリ(GATTサーバーとして使用)を使用している。
Write (PC→スマホ)、Read(スマホ→PC)、Notify(スマホで設定値を変更してPCへ通知)を実施。
- Writeの結果。
コード内に記載した文字列がスマホに送信されている。データを受信したスマホのキャプチャが次。

- Readの結果。
スマホのアプリで設定した値(ここでは"11あかさ")がPCのコンソールに表示されることを確認した。PCのコンソールのキャプチャが次。バイナリデータで受信して、UTF-8で解読。

- Notifyの結果。
Pythonでコードを実行すると、start_notifyでリスニング状態になる。その間にスマホで値を変更する。Python側ではその操作時間を確保するため、60秒待機させている。
値を変更した直後に、PCのコンソールに結果が表示される。

コードは下。Write, Read, Notifyをまとめているけど、実行時には適宜コメントアウトとかしている。それぞれAIで生成。
# スマホのBLEアドレス
ADDRESS = "XX:XX:XX:XX:XX:XX"
# Characteristic UUID(スマホのアプリで任意に設定)
CHAR_UUID = "12345678-1234-5678-1234-56789abcdef0"
def callback(sender, data):
print("--------------------")
print("Notify受信")
print("UUID :", sender)
print("Raw :", data)
try:
print("Text :", data.decode("utf-8"))
except UnicodeDecodeError:
print("UTF-8ではありません")
async def main():
print("接続中...")
async with BleakClient(ADDRESS) as client:
print("接続成功")
print("Connected :", client.is_connected)
text = "Hello BLE!hhhhhhhggggggggggg"
await client.write_gatt_char(
CHAR_UUID,
text.encode("utf-8")
)
print("送信した文字列 :", text)
#===================================================================
data = await client.read_gatt_char(CHAR_UUID)
print("受信データ :", data)
print("文字列 :", data.decode("utf-8"))
#===================================================================
print("接続成功")
await client.start_notify(
CHAR_UUID,
callback
)
print("60秒待機中")
await asyncio.sleep(60)
await client.stop_notify(CHAR_UUID)
print("終了")
if __name__ == "__main__":
asyncio.run(main())

