45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
import dataclasses
|
|
from abc import ABC, abstractmethod
|
|
from typing import Callable, Awaitable, TypedDict, Dict
|
|
|
|
@dataclasses.dataclass
|
|
class Advertisement:
|
|
"""
|
|
BLE advertisement data.
|
|
"""
|
|
name: str
|
|
manufacturer_data: {int: bytes}
|
|
service_uuids: list[str]
|
|
|
|
class BLEInterface(ABC):
|
|
@abstractmethod
|
|
async def connect(self, mac: str):
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def write(self, characteristic: str, data: bytes, response: bool = False):
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def start_notify(self, characteristic: str, callback: Callable[[bytes], Awaitable[None]]):
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def disconnect(self):
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def scan_devices(self, mac: str = None) -> Dict[str, Advertisement]:
|
|
"""
|
|
Scan for compatible devices and get their BLE advertisement data. A device is considered compatible when it
|
|
advertises the service UUID specified in core.protocol.SERVICE_UUID.
|
|
This function uses BLE advertisements, which are rarely available when the device is connected!
|
|
|
|
Args:
|
|
mac: Optional MAC address to filter results
|
|
|
|
Returns:
|
|
A dictionary with MAC address as key, advertisement data as value. Only compatible devices matching the
|
|
MAC (if specified) are returned.
|
|
"""
|
|
pass
|