-
Notifications
You must be signed in to change notification settings - Fork 304
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #911 from hbldh/release/v0.15.0
Release/v0.15.0
- Loading branch information
Showing
39 changed files
with
2,252 additions
and
1,004 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
__version__ = "0.14.3" | ||
__version__ = "0.15.0" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
""" | ||
Bluetooth Assigned Numbers | ||
-------------------------- | ||
This module contains useful assigned numbers from the Bluetooth spec. | ||
See <https://www.bluetooth.com/specifications/assigned-numbers/>. | ||
""" | ||
|
||
|
||
from enum import IntEnum | ||
|
||
|
||
class AdvertisementDataType(IntEnum): | ||
""" | ||
Generic Access Profile advertisement data types. | ||
`Source <https://btprodspecificationrefs.blob.core.windows.net/assigned-numbers/Assigned%20Number%20Types/Generic%20Access%20Profile.pdf>`. | ||
""" | ||
|
||
FLAGS = 0x01 | ||
INCOMPLETE_LIST_SERVICE_UUID16 = 0x02 | ||
COMPLETE_LIST_SERVICE_UUID16 = 0x03 | ||
INCOMPLETE_LIST_SERVICE_UUID32 = 0x04 | ||
COMPLETE_LIST_SERVICE_UUID32 = 0x05 | ||
INCOMPLETE_LIST_SERVICE_UUID128 = 0x06 | ||
COMPLETE_LIST_SERVICE_UUID128 = 0x07 | ||
SHORTENED_LOCAL_NAME = 0x08 | ||
COMPLETE_LOCAL_NAME = 0x09 | ||
TX_POWER_LEVEL = 0x0A | ||
CLASS_OF_DEVICE = 0x0D | ||
|
||
SERVICE_DATA_UUID16 = 0x16 | ||
SERVICE_DATA_UUID32 = 0x20 | ||
SERVICE_DATA_UUID128 = 0x21 | ||
|
||
MANUFACTURER_SPECIFIC_DATA = 0xFF |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1 @@ | ||
import re | ||
import subprocess | ||
|
||
from ...exc import BleakError | ||
|
||
|
||
def check_bluez_version(major: int, minor: int) -> bool: | ||
""" | ||
Checks the BlueZ version. | ||
Returns: | ||
``True`` if the BlueZ major version is equal to *major* and the minor | ||
version is greater than or equal to *minor*, otherwise ``False``. | ||
""" | ||
# lazy-get the version and store it so we only have to run subprocess once | ||
if not hasattr(check_bluez_version, "version"): | ||
p = subprocess.Popen(["bluetoothctl", "--version"], stdout=subprocess.PIPE) | ||
out, _ = p.communicate() | ||
s = re.search(b"(\\d+).(\\d+)", out.strip(b"'")) | ||
|
||
if not s: | ||
raise BleakError(f"Could not determine BlueZ version: {out.decode()}") | ||
|
||
setattr(check_bluez_version, "version", tuple(map(int, s.groups()))) | ||
|
||
bluez_major, bluez_minor = getattr(check_bluez_version, "version") | ||
|
||
return bluez_major == major and bluez_minor >= minor | ||
"""BlueZ backend.""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
""" | ||
Advertisement Monitor | ||
--------------------- | ||
This module contains types associated with the BlueZ D-Bus `advertisement | ||
monitor api <https://github.com/bluez/bluez/blob/master/doc/advertisement-monitor-api.txt>`. | ||
""" | ||
|
||
import logging | ||
from typing import Iterable, NamedTuple, Tuple, Union, no_type_check | ||
|
||
from dbus_next.service import ServiceInterface, dbus_property, method, PropertyAccess | ||
|
||
from . import defs | ||
from ...assigned_numbers import AdvertisementDataType | ||
|
||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class OrPattern(NamedTuple): | ||
""" | ||
BlueZ advertisement monitor or-pattern. | ||
https://github.com/bluez/bluez/blob/master/doc/advertisement-monitor-api.txt | ||
""" | ||
|
||
start_position: int | ||
ad_data_type: AdvertisementDataType | ||
content_of_pattern: bytes | ||
|
||
|
||
# Windows has a similar structure, so we allow generic tuple for cross-platform compatibility | ||
OrPatternLike = Union[OrPattern, Tuple[int, AdvertisementDataType, bytes]] | ||
|
||
|
||
class AdvertisementMonitor(ServiceInterface): | ||
""" | ||
Implementation of the org.bluez.AdvertisementMonitor1 D-Bus interface. | ||
The BlueZ advertisement monitor API design seems to be just for device | ||
presence (is it in range or out of range), but this isn't really what | ||
we want in Bleak, we want to monitor changes in advertisement data, just | ||
like in active scanning. | ||
So the only thing we are using here is the "or_patterns" since it is | ||
currently required, but really we don't need that either. Hopefully an | ||
"all" "Type" could be added to BlueZ in the future. | ||
""" | ||
|
||
def __init__( | ||
self, | ||
or_patterns: Iterable[OrPatternLike], | ||
): | ||
""" | ||
Args: | ||
or_patterns: | ||
List of or patterns that will be returned by the ``Patterns`` property. | ||
""" | ||
super().__init__(defs.ADVERTISEMENT_MONITOR_INTERFACE) | ||
# dbus_next marshaling requires list instead of tuple | ||
self._or_patterns = [list(p) for p in or_patterns] | ||
|
||
@method() | ||
def Release(self): | ||
logger.debug("Release") | ||
|
||
@method() | ||
def Activate(self): | ||
logger.debug("Activate") | ||
|
||
# REVISIT: mypy is broke, so we have to add redundant @no_type_check | ||
# https://github.com/python/mypy/issues/6583 | ||
|
||
@method() | ||
@no_type_check | ||
def DeviceFound(self, device: "o"): # noqa: F821 | ||
logger.debug("DeviceFound %s", device) | ||
|
||
@method() | ||
@no_type_check | ||
def DeviceLost(self, device: "o"): # noqa: F821 | ||
logger.debug("DeviceLost %s", device) | ||
|
||
@dbus_property(PropertyAccess.READ) | ||
@no_type_check | ||
def Type(self) -> "s": # noqa: F821 | ||
# this is currently the only type supported in BlueZ | ||
return "or_patterns" | ||
|
||
@dbus_property(PropertyAccess.READ, disabled=True) | ||
@no_type_check | ||
def RSSILowThreshold(self) -> "n": # noqa: F821 | ||
... | ||
|
||
@dbus_property(PropertyAccess.READ, disabled=True) | ||
@no_type_check | ||
def RSSIHighThreshold(self) -> "n": # noqa: F821 | ||
... | ||
|
||
@dbus_property(PropertyAccess.READ, disabled=True) | ||
@no_type_check | ||
def RSSILowTimeout(self) -> "q": # noqa: F821 | ||
... | ||
|
||
@dbus_property(PropertyAccess.READ, disabled=True) | ||
@no_type_check | ||
def RSSIHighTimeout(self) -> "q": # noqa: F821 | ||
... | ||
|
||
@dbus_property(PropertyAccess.READ, disabled=True) | ||
@no_type_check | ||
def RSSISamplingPeriod(self) -> "q": # noqa: F821 | ||
... | ||
|
||
@dbus_property(PropertyAccess.READ) | ||
@no_type_check | ||
def Patterns(self) -> "a(yyay)": # noqa: F821 | ||
return self._or_patterns |
Oops, something went wrong.