スマホとWindowsやLinuxを通信させたいときに便利です。
通常スマホはClientで動作させることが多いのですが
あえてスマホをGATT Serverとします。そしてWindowsやLinuxをClientとし通信をさせます。
これは、
Linuxは、周辺デバイス(BLEデバイス)を制御したりネットワーク接続したりなどサービスの中心で
スマホは、UIとして使うような場合に最適です。
参照ソースコード
Android側のソースコードはこちらを参照しました。
今回はJAVAを使います。
https://github.com/androidthings/sample-bluetooth-le-gattserver/tree/master
TimeProfile.javaの修正
TimeProfile.javaをします。
まずはUUIDの追加をします。
public class TimeProfile の宣言を追加します。
今回は以下のUUIDを追加しました。
public static UUID UUID_CHAR_WRITE = UUID.fromString("52dc2801-7e98-4fc2-908a-66161b5959b0");
続いてpublic static BluetoothGattService createTimeService()に以下のコードを追加します。
これで追加したBluetoothサービスへの登録を行います。
BluetoothGattCharacteristic wrire_char = new BluetoothGattCharacteristic(UUID_CHAR_WRITE,
//Read/write characteristic
BluetoothGattCharacteristic.PROPERTY_WRITE,
BluetoothGattCharacteristic.PERMISSION_WRITE);
service.addCharacteristic(wrire_char);
なお、今回はwrireなのですがreadも同じように登録が行えます。
GattServerActivity.javaの修正
GattServerActivity.javaの修正を修正します。
private BluetoothGattServerCallback mGattServerCallback = new BluetoothGattServerCallback() に
以下の関数を追加します。
public void onCharacteristicWriteRequest(android.bluetooth.BluetoothDevice device, int requestId,
BluetoothGattCharacteristic characteristic, boolean preparedWrite,
boolean responseNeeded, int offset, byte[] value) {
if( characteristic.getUuid().compareTo(UUID_CHAR_WRITE) == 0 ){
ここに処理を追加
}
}else{
mBluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_FAILURE, offset, null);
}
}
Linux側のコード
Pythonを使用します。
以下のコードのファイルを作成します。
import asyncio
from distutils import text_file
from http import client
from bleak import BleakClient
import binascii
import os
import time
from bleak import discover
MOTIFY_CHARACTERISTIC_UUID = "00002a2b-0000-1000-8000-00805f9b34fb"
READ_CHARACTERISTIC_UUID = "00002a0f-0000-1000-8000-00805F9B34FB"
WRITE_CHARACTERISTIC_UUID = "52dc2801-7e98-4fc2-908a-66161b5959b0"
PATH_ROOT = ""
CONTROL_FILE_NEME = "Text_file.txt"
devices = []
text_data = ""
pcontrol_file_buff = os.path.getmtime(PATH_ROOT + CONTROL_FILE_NEME)
async def scan():
dev = await discover()
for i in range(0,len(dev)):
print("["+str(i)+"]"+str(dev[i]))
devices.append(dev[i])
async def connect(address):
global text_data
async with BleakClient(address) as client:
print("Service Starting...")
while(True):
write_value = "aaaaa"
write_value_byte = write_value.encode()
await client.write_gatt_char(WRITE_CHARACTERISTIC_UUID, write_value_byte)
print("Send data...")
time.sleep(5)
asyncio.run(scan())
index = input('please select device from 0 to '+str(len(devices))+":")
index = int(index)
asyncio.run(connect(devices[index].address))
動作確認
以下の手順で動作させます。
PCとAndroid
ペアリングさせます。
Linux
Pythonを動作させます。
以下のようなログがでるのでペアリングしたAndroidoの番号を入力
[0]55:D5:D5:B8:57:C2: Google (b'\x00\x04\xcaa\x82\xaa')
[1]5A:08:59:47:55:E5: Apple, Inc. (b'\x10\x06\x03\x19\xbe\xcc2(')
・・・・
please select device from 0 to 8
Android
5秒間隔でBluetoothGattServerCallback mGattServerCallbackが動作し追加した処理が実行されます。
コメントをお書きください