· 

AndroidでGATT Server

スマホと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が動作し追加した処理が実行されます。