bumble 0.0.211__tar.gz → 0.0.212__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bumble-0.0.212/.github/ci-gradle.properties +26 -0
- bumble-0.0.212/.github/workflows/gradle-btbench.yml +33 -0
- {bumble-0.0.211 → bumble-0.0.212}/PKG-INFO +4 -4
- {bumble-0.0.211 → bumble-0.0.212}/apps/bench.py +4 -2
- {bumble-0.0.211 → bumble-0.0.212}/apps/console.py +2 -2
- {bumble-0.0.211 → bumble-0.0.212}/apps/pair.py +185 -32
- {bumble-0.0.211 → bumble-0.0.212}/bumble/_version.py +2 -2
- {bumble-0.0.211 → bumble-0.0.212}/bumble/att.py +13 -12
- {bumble-0.0.211 → bumble-0.0.212}/bumble/avctp.py +2 -2
- {bumble-0.0.211 → bumble-0.0.212}/bumble/avdtp.py +122 -68
- {bumble-0.0.211 → bumble-0.0.212}/bumble/avrcp.py +11 -5
- {bumble-0.0.211 → bumble-0.0.212}/bumble/core.py +13 -7
- bumble-0.0.211/bumble/crypto.py → bumble-0.0.212/bumble/crypto/__init__.py +11 -95
- bumble-0.0.212/bumble/crypto/builtin.py +652 -0
- bumble-0.0.212/bumble/crypto/cryptography.py +84 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/device.py +362 -185
- {bumble-0.0.211 → bumble-0.0.212}/bumble/drivers/intel.py +3 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/gatt.py +3 -5
- {bumble-0.0.211 → bumble-0.0.212}/bumble/gatt_client.py +5 -3
- {bumble-0.0.211 → bumble-0.0.212}/bumble/gatt_server.py +8 -6
- {bumble-0.0.211 → bumble-0.0.212}/bumble/hci.py +67 -2
- {bumble-0.0.211 → bumble-0.0.212}/bumble/hfp.py +44 -20
- {bumble-0.0.211 → bumble-0.0.212}/bumble/hid.py +24 -12
- {bumble-0.0.211 → bumble-0.0.212}/bumble/host.py +24 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/keys.py +64 -48
- {bumble-0.0.211 → bumble-0.0.212}/bumble/l2cap.py +19 -9
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pandora/host.py +11 -11
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pandora/l2cap.py +2 -2
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pandora/security.py +72 -56
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/aics.py +3 -5
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/ancs.py +3 -1
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/ascs.py +11 -5
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/asha.py +11 -6
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/csip.py +1 -3
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/gatt_service.py +1 -3
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/hap.py +16 -33
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/mcp.py +12 -9
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/vcs.py +5 -5
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/vocs.py +6 -9
- {bumble-0.0.211 → bumble-0.0.212}/bumble/rfcomm.py +17 -8
- {bumble-0.0.211 → bumble-0.0.212}/bumble/smp.py +14 -8
- {bumble-0.0.211 → bumble-0.0.212}/bumble.egg-info/PKG-INFO +4 -4
- {bumble-0.0.211 → bumble-0.0.212}/bumble.egg-info/SOURCES.txt +5 -1
- {bumble-0.0.211 → bumble-0.0.212}/bumble.egg-info/requires.txt +3 -3
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_a2dp_sink.py +0 -6
- bumble-0.0.212/extras/android/BtBench/.gitignore +10 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/AndroidManifest.xml +1 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Advertiser.kt +2 -1
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/GattServer.kt +3 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/L2capServer.kt +2 -6
- {bumble-0.0.211 → bumble-0.0.212}/pyproject.toml +3 -3
- {bumble-0.0.211 → bumble-0.0.212}/tests/gatt_test.py +19 -19
- {bumble-0.0.211 → bumble-0.0.212}/tests/smp_test.py +31 -37
- bumble-0.0.211/extras/android/BtBench/.gitignore +0 -15
- {bumble-0.0.211 → bumble-0.0.212}/.devcontainer/devcontainer.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/.git-blame-ignore-revs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/.github/workflows/code-check.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/.github/workflows/codeql-analysis.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/.github/workflows/python-avatar.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/.github/workflows/python-build-test.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/.github/workflows/python-publish.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/.gitignore +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/.vscode/settings.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/CONTRIBUTING.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/LICENSE +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/README.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/README.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/auracast.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/ble_rpa_tool.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/controller_info.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/controller_loopback.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/controllers.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/device_info.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/gatt_dump.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/gg_bridge.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/hci_bridge.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/l2cap_bridge.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/lea_unicast/app.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/lea_unicast/index.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/link_relay/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/link_relay/link_relay.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/link_relay/logging.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/pandora_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/player/player.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/rfcomm_bridge.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/scan.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/show.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/speaker/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/speaker/logo.svg +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/speaker/speaker.css +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/speaker/speaker.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/speaker/speaker.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/speaker/speaker.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/unbond.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/apps/usb_probe.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/a2dp.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/at.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/audio/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/audio/io.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/avc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/bridge.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/codecs.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/colors.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/company_ids.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/controller.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/decoder.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/drivers/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/drivers/common.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/drivers/rtk.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/gap.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/gatt_adapters.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/helpers.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/link.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pairing.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pandora/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pandora/config.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pandora/device.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pandora/py.typed +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/pandora/utils.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/bap.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/bass.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/battery_service.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/cap.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/device_information_service.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/gap.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/gmap.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/heart_rate_service.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/le_audio.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/pacs.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/pbp.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/py.typed +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/profiles/tmap.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/py.typed +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/rtp.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/sdp.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/snoop.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/android_emulator.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/android_netsim.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/common.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/file.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/common_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/common_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/common_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/hci_packet_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/hci_packet_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/hci_packet_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/model_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/model_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/model_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/packet_streamer_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/packet_streamer_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/packet_streamer_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/startup_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/startup_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/netsim/startup_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/rootcanal/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/rootcanal/configuration_pb2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/rootcanal/configuration_pb2.pyi +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/grpc_protobuf/rootcanal/configuration_pb2_grpc.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/hci_socket.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/pty.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/py.typed +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/pyusb.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/serial.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/tcp_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/tcp_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/udp.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/unix.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/usb.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/vhci.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/ws_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/transport/ws_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/utils.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/vendor/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/vendor/android/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/vendor/android/hci.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/vendor/zephyr/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble/vendor/zephyr/hci.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble.egg-info/dependency_links.txt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble.egg-info/entry_points.txt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/bumble.egg-info/top_level.txt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/README.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/favicon.ico +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo.svg +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo.vectornator/Artboard0.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo.vectornator/Document.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo.vectornator/Manifest.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo.vectornator/Thumbnail.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo.vectornator/UndoHistory.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo_framed.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo_framed.svg +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo_framed.vectornator/Artboard0.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo_framed.vectornator/Document.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo_framed.vectornator/Manifest.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo_framed.vectornator/Thumbnail.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/images/logo_framed.vectornator/UndoHistory.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/mkdocs.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/requirements.txt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/api/examples.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/api/guide.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/api/reference.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/auracast.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/bench.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/console.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/gatt_dump.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/gg_bridge.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/hci_bridge.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/link_relay.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/pair.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/show.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/speaker.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/unbond.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/apps_and_tools/usb_probe.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/components/controller.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/components/gatt.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/components/host.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/components/security_manager.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/development/code_style.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/development/contributing.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/development/python_environments.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/downloads/zephyr/hci_usb.zip +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/drivers/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/drivers/intel.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/drivers/realtek.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/examples/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/extras/android_bt_bench.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/extras/android_remote_hci.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/extras/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/getting_started.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hardware/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/index.toml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/bumble.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/scanner/scanner.css +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/scanner/scanner.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/scanner/scanner.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/scanner/scanner.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/speaker/logo.svg +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/speaker/speaker.css +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/speaker/speaker.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/speaker/speaker.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/speaker/speaker.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/hive/web/ui.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/images/bumble_layers.svg +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/images/console_screenshot.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/images/favicon.ico +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/images/logo.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/images/logo_framed.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/images/speaker_screenshot.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/platforms/android.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/platforms/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/platforms/linux.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/platforms/macos.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/platforms/windows.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/platforms/winusb_driver.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/platforms/zephyr.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/android_emulator.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/file.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/hci_socket.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/pty.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/serial.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/tcp_client.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/tcp_server.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/udp.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/usb.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/vhci.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/ws_client.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/transports/ws_server.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/use_cases/index.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/use_cases/use_case_1.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/use_cases/use_case_2.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/use_cases/use_case_3.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/use_cases/use_case_4.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/use_cases/use_case_5.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/src/use_cases/use_case_6.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/docs/mkdocs/theme/partials/footer.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/environment.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/README.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/a2dp_sink1.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/asha_sink.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/asha_sink1.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/asha_sink2.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/async_runner.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/avrcp_as_sink.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/battery_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/battery_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/classic1.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/classic2.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/cs_initiator.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/cs_reflector.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/device1.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/device2.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/device3.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/device_information_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/device_information_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/device_with_rpa.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/heart_rate_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/heart_rate_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/hfp_gateway.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/hfp_gateway.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/hfp_handsfree.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/hfp_handsfree.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/hid_key_map.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/hid_keyboard.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/hid_report_parser.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/keyboard.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/keyboard.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/keyboard.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/leaudio.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/leaudio_with_classic.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/mcp_server.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/mobly/bench/one_device_bench_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/mobly/bench/sample_config.yml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/mobly/bench/two_devices_bench_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_a2dp_info.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_a2dp_source.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_advertiser.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_ancs_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_asha_sink.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_avrcp.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_channel_sounding.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_cig_setup.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_classic_connect.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_classic_discoverable.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_classic_discovery.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_connect_and_encrypt.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_controller.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_controller_with_scanner.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_csis_servers.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_device_with_snooper.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_esco_connection.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_extended_advertiser.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_extended_advertiser_2.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_gatt_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_gatt_client_and_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_gatt_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_gatt_with_adapters.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_hap_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_hfp_gateway.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_hfp_handsfree.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_hid_device.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_hid_host.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_mcp_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_notifier.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_rfcomm_client.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_rfcomm_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_scanner.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_unicast_server.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/run_vcp_renderer.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/speaker.json +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/examples/vcp_renderer.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/.gitignore +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/build.gradle.kts +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/proguard-rules.pro +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/ic_launcher-playstore.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/AutomationSnippet.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Connection.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Gatt.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/GattClient.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/IoClient.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/L2capClient.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/MainActivity.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Mode.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Model.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Packet.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Pinger.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Ponger.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Receiver.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/RfcommClient.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/RfcommServer.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Scan.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Sender.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/SocketClient.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/SocketServer.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Color.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Theme.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Type.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/drawable/ic_launcher_foreground.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/values/colors.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/values/ic_launcher_background.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/values/strings.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/values/themes.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/xml/backup_rules.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/app/src/main/res/xml/data_extraction_rules.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/build.gradle.kts +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/gradle/libs.versions.toml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/gradle/wrapper/gradle-wrapper.jar +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/gradle/wrapper/gradle-wrapper.properties +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/gradle.properties +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/gradlew +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/gradlew.bat +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/BtBench/settings.gradle.kts +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/.gitignore +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/.gitignore +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/build.gradle.kts +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/proguard-rules.pro +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/AndroidManifest.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/IBluetoothHci.aidl +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/IBluetoothHciCallbacks.aidl +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/Status.aidl +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/hidl/bluetooth/1.1/IBluetoothHci.hal +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/hidl/bluetooth/1.1/IBluetoothHciCallbacks.hal +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/ic_launcher-playstore.png +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/IBluetoothHci.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/IBluetoothHciCallbacks.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/Status.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/IBluetoothHci.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/IBluetoothHciCallbacks.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/Status.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_1/IBluetoothHci.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_1/IBluetoothHciCallbacks.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/CommandLineInterface.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciHal.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciHalCallback.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciPacket.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciParser.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciProxy.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciServer.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/MainActivity.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Color.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Theme.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Type.kt +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/values/colors.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/values/ic_launcher_background.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/values/strings.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/values/themes.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/xml/backup_rules.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/app/src/main/res/xml/data_extraction_rules.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/build.gradle.kts +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/gradle/libs.versions.toml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/gradle/wrapper/gradle-wrapper.jar +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/gradle/wrapper/gradle-wrapper.properties +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/gradle.properties +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/gradlew +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/gradlew.bat +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/.gitignore +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/build.gradle.kts +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/consumer-rules.pro +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/proguard-rules.pro +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/AndroidManifest.xml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/internal/hidl/base/V1_0/DebugInfo.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/internal/hidl/base/V1_0/IBase.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/os/HidlSupport.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwBinder.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwBlob.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwParcel.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/os/IHwBinder.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/os/IHwInterface.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/os/NativeHandle.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/lib/src/main/java/android/os/ServiceManager.java +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/scripts/generate_java_from_aidl.sh +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/extras/android/RemoteHCI/settings.gradle.kts +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/noxfile.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/.gitignore +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/CHANGELOG.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/Cargo.lock +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/Cargo.toml +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/README.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/examples/battery_client.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/examples/broadcast.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/examples/scanner.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/pytests/assigned_numbers.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/pytests/pytests.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/pytests/wrapper/drivers.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/pytests/wrapper/hci.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/pytests/wrapper/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/pytests/wrapper/transport.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/resources/test/firmware/realtek/README.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/resources/test/firmware/realtek/rtl8723b_fw_structure.bin +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/resources/test/firmware/realtek/rtl8761bu_fw_structure.bin +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/adv.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/cli/firmware/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/cli/firmware/rtk.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/cli/l2cap/client_bridge.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/cli/l2cap/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/cli/l2cap/server_bridge.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/cli/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/cli/usb/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/internal/drivers/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/internal/drivers/rtk.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/internal/hci/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/internal/hci/packets.pdl +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/internal/hci/tests.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/internal/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/lib.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/main.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/assigned_numbers/company_ids.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/assigned_numbers/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/assigned_numbers/services.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/common.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/controller.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/core.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/device/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/device/tests.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/drivers/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/drivers/rtk.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/gatt_client.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/hci.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/host.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/l2cap.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/link.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/logging.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/mod.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/profile.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/src/wrapper/transport.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/tools/file_header.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/rust/tools/gen_assigned_numbers.rs +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/scripts/process_android_emulator_protos.sh +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/scripts/process_android_netsim_protos.sh +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/setup.cfg +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tasks.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/a2dp_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/aics_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/asha_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/at_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/avdtp_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/avrcp_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/bap_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/bass_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/cap_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/codecs_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/core_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/csip_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/decoder_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/device_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/g722_sample.g722 +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/gatt_service_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/gmap_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/hap_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/hci_data_001.bin +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/hci_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/hfp_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/host_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/import_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/keystore_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/l2cap_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/le_audio_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/mcp_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/pytest.ini +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/rfcomm_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/sdp_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/self_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/test_utils.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/transport_tcp_server_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/transport_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/utils_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/vcp_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tests/vocs_test.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tools/__init__.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tools/generate_company_id_list.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tools/intel_fw_download.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tools/intel_util.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tools/rtk_fw_download.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/tools/rtk_util.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/.gitignore +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/README.md +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/bumble.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/favicon.ico +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/heart_rate_monitor/heart_rate_monitor.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/heart_rate_monitor/heart_rate_monitor.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/heart_rate_monitor/heart_rate_monitor.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/scanner/scanner.css +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/scanner/scanner.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/scanner/scanner.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/scanner/scanner.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/speaker/logo.svg +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/speaker/speaker.css +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/speaker/speaker.html +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/speaker/speaker.js +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/speaker/speaker.py +0 -0
- {bumble-0.0.211 → bumble-0.0.212}/web/ui.js +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright 2025 Google LLC
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
org.gradle.configureondemand=true
|
|
18
|
+
org.gradle.caching=true
|
|
19
|
+
org.gradle.parallel=true
|
|
20
|
+
|
|
21
|
+
# Declare we support AndroidX
|
|
22
|
+
android.useAndroidX=true
|
|
23
|
+
|
|
24
|
+
org.gradle.jvmargs=-Xmx4608m -XX:MaxMetaspaceSize=1536m -XX:+HeapDumpOnOutOfMemoryError
|
|
25
|
+
|
|
26
|
+
kotlin.compiler.execution.strategy=in-process
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Gradle Android Build & test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main ]
|
|
8
|
+
paths:
|
|
9
|
+
- 'extras/android/BtBench/**'
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
timeout-minutes: 40
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- name: Check out from Git
|
|
21
|
+
uses: actions/checkout@v3
|
|
22
|
+
|
|
23
|
+
- name: Set up JDK
|
|
24
|
+
uses: actions/setup-java@v4
|
|
25
|
+
with:
|
|
26
|
+
distribution: 'zulu'
|
|
27
|
+
java-version: 17
|
|
28
|
+
|
|
29
|
+
- name: Setup Gradle
|
|
30
|
+
uses: gradle/actions/setup-gradle@v3
|
|
31
|
+
|
|
32
|
+
- name: Build with Gradle
|
|
33
|
+
run: cd extras/android/BtBench && ./gradlew build
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bumble
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.212
|
|
4
4
|
Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
|
|
5
5
|
Author-email: Google <bumble-dev@google.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/google/bumble
|
|
@@ -10,8 +10,8 @@ License-File: LICENSE
|
|
|
10
10
|
Requires-Dist: aiohttp~=3.8; platform_system != "Emscripten"
|
|
11
11
|
Requires-Dist: appdirs>=1.4; platform_system != "Emscripten"
|
|
12
12
|
Requires-Dist: click>=8.1.3; platform_system != "Emscripten"
|
|
13
|
-
Requires-Dist: cryptography>=
|
|
14
|
-
Requires-Dist: cryptography>=
|
|
13
|
+
Requires-Dist: cryptography>=44.0.3; platform_system != "Emscripten"
|
|
14
|
+
Requires-Dist: cryptography>=44.0.3; platform_system == "Emscripten"
|
|
15
15
|
Requires-Dist: grpcio>=1.62.1; platform_system != "Emscripten"
|
|
16
16
|
Requires-Dist: humanize>=4.6.0; platform_system != "Emscripten"
|
|
17
17
|
Requires-Dist: libusb1>=2.0.1; platform_system != "Emscripten"
|
|
@@ -20,7 +20,7 @@ Requires-Dist: platformdirs>=3.10.0; platform_system != "Emscripten"
|
|
|
20
20
|
Requires-Dist: prompt_toolkit>=3.0.16; platform_system != "Emscripten"
|
|
21
21
|
Requires-Dist: prettytable>=3.6.0; platform_system != "Emscripten"
|
|
22
22
|
Requires-Dist: protobuf>=3.12.4; platform_system != "Emscripten"
|
|
23
|
-
Requires-Dist: pyee>=
|
|
23
|
+
Requires-Dist: pyee>=13.0.0
|
|
24
24
|
Requires-Dist: pyserial-asyncio>=0.5; platform_system != "Emscripten"
|
|
25
25
|
Requires-Dist: pyserial>=3.5; platform_system != "Emscripten"
|
|
26
26
|
Requires-Dist: pyusb>=1.2; platform_system != "Emscripten"
|
|
@@ -121,9 +121,9 @@ def print_connection(connection):
|
|
|
121
121
|
|
|
122
122
|
params.append(
|
|
123
123
|
'Parameters='
|
|
124
|
-
f'{connection.parameters.connection_interval
|
|
124
|
+
f'{connection.parameters.connection_interval:.2f}/'
|
|
125
125
|
f'{connection.parameters.peripheral_latency}/'
|
|
126
|
-
f'{connection.parameters.supervision_timeout
|
|
126
|
+
f'{connection.parameters.supervision_timeout:.2f} '
|
|
127
127
|
)
|
|
128
128
|
|
|
129
129
|
params.append(f'MTU={connection.att_mtu}')
|
|
@@ -1256,6 +1256,7 @@ class Central(Connection.Listener):
|
|
|
1256
1256
|
self.device.classic_enabled = self.classic
|
|
1257
1257
|
|
|
1258
1258
|
# Set up a pairing config factory with minimal requirements.
|
|
1259
|
+
self.device.config.keystore = "JsonKeyStore"
|
|
1259
1260
|
self.device.pairing_config_factory = lambda _: PairingConfig(
|
|
1260
1261
|
sc=False, mitm=False, bonding=False
|
|
1261
1262
|
)
|
|
@@ -1408,6 +1409,7 @@ class Peripheral(Device.Listener, Connection.Listener):
|
|
|
1408
1409
|
self.device.classic_enabled = self.classic
|
|
1409
1410
|
|
|
1410
1411
|
# Set up a pairing config factory with minimal requirements.
|
|
1412
|
+
self.device.config.keystore = "JsonKeyStore"
|
|
1411
1413
|
self.device.pairing_config_factory = lambda _: PairingConfig(
|
|
1412
1414
|
sc=False, mitm=False, bonding=False
|
|
1413
1415
|
)
|
|
@@ -335,9 +335,9 @@ class ConsoleApp:
|
|
|
335
335
|
elif self.connected_peer:
|
|
336
336
|
connection = self.connected_peer.connection
|
|
337
337
|
connection_parameters = (
|
|
338
|
-
f'{connection.parameters.connection_interval}/'
|
|
338
|
+
f'{connection.parameters.connection_interval:.2f}/'
|
|
339
339
|
f'{connection.parameters.peripheral_latency}/'
|
|
340
|
-
f'{connection.parameters.supervision_timeout}'
|
|
340
|
+
f'{connection.parameters.supervision_timeout:.2f}'
|
|
341
341
|
)
|
|
342
342
|
if self.connection_phy is not None:
|
|
343
343
|
phy_state = (
|
|
@@ -18,9 +18,12 @@
|
|
|
18
18
|
import asyncio
|
|
19
19
|
import os
|
|
20
20
|
import logging
|
|
21
|
+
import struct
|
|
22
|
+
|
|
21
23
|
import click
|
|
22
24
|
from prompt_toolkit.shortcuts import PromptSession
|
|
23
25
|
|
|
26
|
+
from bumble.a2dp import make_audio_sink_service_sdp_records
|
|
24
27
|
from bumble.colors import color
|
|
25
28
|
from bumble.device import Device, Peer
|
|
26
29
|
from bumble.transport import open_transport_or_link
|
|
@@ -30,16 +33,20 @@ from bumble.smp import error_name as smp_error_name
|
|
|
30
33
|
from bumble.keys import JsonKeyStore
|
|
31
34
|
from bumble.core import (
|
|
32
35
|
AdvertisingData,
|
|
36
|
+
Appearance,
|
|
33
37
|
ProtocolError,
|
|
34
38
|
PhysicalTransport,
|
|
39
|
+
UUID,
|
|
35
40
|
)
|
|
36
41
|
from bumble.gatt import (
|
|
37
42
|
GATT_DEVICE_NAME_CHARACTERISTIC,
|
|
38
43
|
GATT_GENERIC_ACCESS_SERVICE,
|
|
44
|
+
GATT_HEART_RATE_SERVICE,
|
|
45
|
+
GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC,
|
|
39
46
|
Service,
|
|
40
47
|
Characteristic,
|
|
41
|
-
CharacteristicValue,
|
|
42
48
|
)
|
|
49
|
+
from bumble.hci import OwnAddressType
|
|
43
50
|
from bumble.att import (
|
|
44
51
|
ATT_Error,
|
|
45
52
|
ATT_INSUFFICIENT_AUTHENTICATION_ERROR,
|
|
@@ -62,7 +69,7 @@ class Waiter:
|
|
|
62
69
|
self.linger = linger
|
|
63
70
|
|
|
64
71
|
def terminate(self):
|
|
65
|
-
if not self.linger:
|
|
72
|
+
if not self.linger and not self.done.done:
|
|
66
73
|
self.done.set_result(None)
|
|
67
74
|
|
|
68
75
|
async def wait_until_terminated(self):
|
|
@@ -193,7 +200,7 @@ class Delegate(PairingDelegate):
|
|
|
193
200
|
|
|
194
201
|
# -----------------------------------------------------------------------------
|
|
195
202
|
async def get_peer_name(peer, mode):
|
|
196
|
-
if
|
|
203
|
+
if peer.connection.transport == PhysicalTransport.BR_EDR:
|
|
197
204
|
return await peer.request_name()
|
|
198
205
|
|
|
199
206
|
# Try to get the peer name from GATT
|
|
@@ -225,13 +232,14 @@ def read_with_error(connection):
|
|
|
225
232
|
raise ATT_Error(ATT_INSUFFICIENT_AUTHENTICATION_ERROR)
|
|
226
233
|
|
|
227
234
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
+
# -----------------------------------------------------------------------------
|
|
236
|
+
def sdp_records():
|
|
237
|
+
service_record_handle = 0x00010001
|
|
238
|
+
return {
|
|
239
|
+
service_record_handle: make_audio_sink_service_sdp_records(
|
|
240
|
+
service_record_handle
|
|
241
|
+
)
|
|
242
|
+
}
|
|
235
243
|
|
|
236
244
|
|
|
237
245
|
# -----------------------------------------------------------------------------
|
|
@@ -239,15 +247,19 @@ def on_connection(connection, request):
|
|
|
239
247
|
print(color(f'<<< Connection: {connection}', 'green'))
|
|
240
248
|
|
|
241
249
|
# Listen for pairing events
|
|
242
|
-
connection.on(
|
|
243
|
-
connection.on(
|
|
250
|
+
connection.on(connection.EVENT_PAIRING_START, on_pairing_start)
|
|
251
|
+
connection.on(connection.EVENT_PAIRING, lambda keys: on_pairing(connection, keys))
|
|
244
252
|
connection.on(
|
|
245
|
-
|
|
253
|
+
connection.EVENT_CLASSIC_PAIRING, lambda: on_classic_pairing(connection)
|
|
254
|
+
)
|
|
255
|
+
connection.on(
|
|
256
|
+
connection.EVENT_PAIRING_FAILURE,
|
|
257
|
+
lambda reason: on_pairing_failure(connection, reason),
|
|
246
258
|
)
|
|
247
259
|
|
|
248
260
|
# Listen for encryption changes
|
|
249
261
|
connection.on(
|
|
250
|
-
|
|
262
|
+
connection.EVENT_CONNECTION_ENCRYPTION_CHANGE,
|
|
251
263
|
lambda: on_connection_encryption_change(connection),
|
|
252
264
|
)
|
|
253
265
|
|
|
@@ -288,6 +300,20 @@ async def on_pairing(connection, keys):
|
|
|
288
300
|
Waiter.instance.terminate()
|
|
289
301
|
|
|
290
302
|
|
|
303
|
+
# -----------------------------------------------------------------------------
|
|
304
|
+
@AsyncRunner.run_in_task()
|
|
305
|
+
async def on_classic_pairing(connection):
|
|
306
|
+
print(color('***-----------------------------------', 'cyan'))
|
|
307
|
+
print(
|
|
308
|
+
color(
|
|
309
|
+
f'*** Paired [Classic]! (peer identity={connection.peer_address})', 'cyan'
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
print(color('***-----------------------------------', 'cyan'))
|
|
313
|
+
await asyncio.sleep(POST_PAIRING_DELAY)
|
|
314
|
+
Waiter.instance.terminate()
|
|
315
|
+
|
|
316
|
+
|
|
291
317
|
# -----------------------------------------------------------------------------
|
|
292
318
|
@AsyncRunner.run_in_task()
|
|
293
319
|
async def on_pairing_failure(connection, reason):
|
|
@@ -305,6 +331,7 @@ async def pair(
|
|
|
305
331
|
mitm,
|
|
306
332
|
bond,
|
|
307
333
|
ctkd,
|
|
334
|
+
advertising_address,
|
|
308
335
|
identity_address,
|
|
309
336
|
linger,
|
|
310
337
|
io,
|
|
@@ -313,6 +340,8 @@ async def pair(
|
|
|
313
340
|
request,
|
|
314
341
|
print_keys,
|
|
315
342
|
keystore_file,
|
|
343
|
+
advertise_service_uuids,
|
|
344
|
+
advertise_appearance,
|
|
316
345
|
device_config,
|
|
317
346
|
hci_transport,
|
|
318
347
|
address_or_name,
|
|
@@ -328,29 +357,33 @@ async def pair(
|
|
|
328
357
|
|
|
329
358
|
# Expose a GATT characteristic that can be used to trigger pairing by
|
|
330
359
|
# responding with an authentication error when read
|
|
331
|
-
if mode
|
|
332
|
-
device.le_enabled = True
|
|
360
|
+
if mode in ('le', 'dual'):
|
|
333
361
|
device.add_service(
|
|
334
362
|
Service(
|
|
335
|
-
|
|
363
|
+
GATT_HEART_RATE_SERVICE,
|
|
336
364
|
[
|
|
337
365
|
Characteristic(
|
|
338
|
-
|
|
339
|
-
Characteristic.Properties.READ
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
CharacteristicValue(
|
|
343
|
-
read=read_with_error, write=write_with_error
|
|
344
|
-
),
|
|
366
|
+
GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC,
|
|
367
|
+
Characteristic.Properties.READ,
|
|
368
|
+
Characteristic.READ_REQUIRES_AUTHENTICATION,
|
|
369
|
+
bytes(1),
|
|
345
370
|
)
|
|
346
371
|
],
|
|
347
372
|
)
|
|
348
373
|
)
|
|
349
374
|
|
|
350
|
-
#
|
|
351
|
-
if mode
|
|
375
|
+
# LE and Classic support
|
|
376
|
+
if mode in ('classic', 'dual'):
|
|
352
377
|
device.classic_enabled = True
|
|
353
378
|
device.classic_smp_enabled = ctkd
|
|
379
|
+
if mode in ('le', 'dual'):
|
|
380
|
+
device.le_enabled = True
|
|
381
|
+
if mode == 'dual':
|
|
382
|
+
device.le_simultaneous_enabled = True
|
|
383
|
+
|
|
384
|
+
# Setup SDP
|
|
385
|
+
if mode in ('classic', 'dual'):
|
|
386
|
+
device.sdp_service_records = sdp_records()
|
|
354
387
|
|
|
355
388
|
# Get things going
|
|
356
389
|
await device.power_on()
|
|
@@ -436,13 +469,109 @@ async def pair(
|
|
|
436
469
|
print(color(f'Pairing failed: {error}', 'red'))
|
|
437
470
|
|
|
438
471
|
else:
|
|
439
|
-
if mode
|
|
440
|
-
# Advertise so that peers can find us and connect
|
|
441
|
-
|
|
442
|
-
|
|
472
|
+
if mode in ('le', 'dual'):
|
|
473
|
+
# Advertise so that peers can find us and connect.
|
|
474
|
+
# Include the heart rate service UUID in the advertisement data
|
|
475
|
+
# so that devices like iPhones can show this device in their
|
|
476
|
+
# Bluetooth selector.
|
|
477
|
+
service_uuids_16 = []
|
|
478
|
+
service_uuids_32 = []
|
|
479
|
+
service_uuids_128 = []
|
|
480
|
+
if advertise_service_uuids:
|
|
481
|
+
for uuid in advertise_service_uuids:
|
|
482
|
+
uuid = uuid.replace("-", "")
|
|
483
|
+
if len(uuid) == 4:
|
|
484
|
+
service_uuids_16.append(UUID(uuid))
|
|
485
|
+
elif len(uuid) == 8:
|
|
486
|
+
service_uuids_32.append(UUID(uuid))
|
|
487
|
+
elif len(uuid) == 32:
|
|
488
|
+
service_uuids_128.append(UUID(uuid))
|
|
489
|
+
else:
|
|
490
|
+
print(color('Invalid UUID format', 'red'))
|
|
491
|
+
return
|
|
492
|
+
else:
|
|
493
|
+
service_uuids_16.append(GATT_HEART_RATE_SERVICE)
|
|
494
|
+
|
|
495
|
+
flags = AdvertisingData.Flags.LE_LIMITED_DISCOVERABLE_MODE
|
|
496
|
+
if mode == 'le':
|
|
497
|
+
flags |= AdvertisingData.Flags.BR_EDR_NOT_SUPPORTED
|
|
498
|
+
if mode == 'dual':
|
|
499
|
+
flags |= AdvertisingData.Flags.SIMULTANEOUS_LE_BR_EDR_CAPABLE
|
|
500
|
+
|
|
501
|
+
ad_structs = [
|
|
502
|
+
(
|
|
503
|
+
AdvertisingData.FLAGS,
|
|
504
|
+
bytes([flags]),
|
|
505
|
+
),
|
|
506
|
+
(AdvertisingData.COMPLETE_LOCAL_NAME, 'Bumble'.encode()),
|
|
507
|
+
]
|
|
508
|
+
if service_uuids_16:
|
|
509
|
+
ad_structs.append(
|
|
510
|
+
(
|
|
511
|
+
AdvertisingData.INCOMPLETE_LIST_OF_16_BIT_SERVICE_CLASS_UUIDS,
|
|
512
|
+
b"".join(bytes(uuid) for uuid in service_uuids_16),
|
|
513
|
+
)
|
|
514
|
+
)
|
|
515
|
+
if service_uuids_32:
|
|
516
|
+
ad_structs.append(
|
|
517
|
+
(
|
|
518
|
+
AdvertisingData.INCOMPLETE_LIST_OF_32_BIT_SERVICE_CLASS_UUIDS,
|
|
519
|
+
b"".join(bytes(uuid) for uuid in service_uuids_32),
|
|
520
|
+
)
|
|
521
|
+
)
|
|
522
|
+
if service_uuids_128:
|
|
523
|
+
ad_structs.append(
|
|
524
|
+
(
|
|
525
|
+
AdvertisingData.INCOMPLETE_LIST_OF_128_BIT_SERVICE_CLASS_UUIDS,
|
|
526
|
+
b"".join(bytes(uuid) for uuid in service_uuids_128),
|
|
527
|
+
)
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
if advertise_appearance:
|
|
531
|
+
advertise_appearance = advertise_appearance.upper()
|
|
532
|
+
try:
|
|
533
|
+
advertise_appearance_int = int(advertise_appearance)
|
|
534
|
+
except ValueError:
|
|
535
|
+
category, subcategory = advertise_appearance.split('/')
|
|
536
|
+
try:
|
|
537
|
+
category_enum = Appearance.Category[category]
|
|
538
|
+
except ValueError:
|
|
539
|
+
print(
|
|
540
|
+
color(f'Invalid appearance category {category}', 'red')
|
|
541
|
+
)
|
|
542
|
+
return
|
|
543
|
+
subcategory_class = Appearance.SUBCATEGORY_CLASSES[
|
|
544
|
+
category_enum
|
|
545
|
+
]
|
|
546
|
+
try:
|
|
547
|
+
subcategory_enum = subcategory_class[subcategory]
|
|
548
|
+
except ValueError:
|
|
549
|
+
print(color(f'Invalid subcategory {subcategory}', 'red'))
|
|
550
|
+
return
|
|
551
|
+
advertise_appearance_int = int(
|
|
552
|
+
Appearance(category_enum, subcategory_enum)
|
|
553
|
+
)
|
|
554
|
+
ad_structs.append(
|
|
555
|
+
(
|
|
556
|
+
AdvertisingData.APPEARANCE,
|
|
557
|
+
struct.pack('<H', advertise_appearance_int),
|
|
558
|
+
)
|
|
559
|
+
)
|
|
560
|
+
device.advertising_data = bytes(AdvertisingData(ad_structs))
|
|
561
|
+
await device.start_advertising(
|
|
562
|
+
auto_restart=True,
|
|
563
|
+
own_address_type=(
|
|
564
|
+
OwnAddressType.PUBLIC
|
|
565
|
+
if advertising_address == 'public'
|
|
566
|
+
else OwnAddressType.RANDOM
|
|
567
|
+
),
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
if mode in ('classic', 'dual'):
|
|
443
571
|
# Become discoverable and connectable
|
|
444
572
|
await device.set_discoverable(True)
|
|
445
573
|
await device.set_connectable(True)
|
|
574
|
+
print(color('Ready for connections on', 'blue'), device.public_address)
|
|
446
575
|
|
|
447
576
|
# Run until the user asks to exit
|
|
448
577
|
await Waiter.instance.wait_until_terminated()
|
|
@@ -462,7 +591,10 @@ class LogHandler(logging.Handler):
|
|
|
462
591
|
# -----------------------------------------------------------------------------
|
|
463
592
|
@click.command()
|
|
464
593
|
@click.option(
|
|
465
|
-
'--mode',
|
|
594
|
+
'--mode',
|
|
595
|
+
type=click.Choice(['le', 'classic', 'dual']),
|
|
596
|
+
default='le',
|
|
597
|
+
show_default=True,
|
|
466
598
|
)
|
|
467
599
|
@click.option(
|
|
468
600
|
'--sc',
|
|
@@ -484,6 +616,10 @@ class LogHandler(logging.Handler):
|
|
|
484
616
|
help='Enable CTKD',
|
|
485
617
|
show_default=True,
|
|
486
618
|
)
|
|
619
|
+
@click.option(
|
|
620
|
+
'--advertising-address',
|
|
621
|
+
type=click.Choice(['random', 'public']),
|
|
622
|
+
)
|
|
487
623
|
@click.option(
|
|
488
624
|
'--identity-address',
|
|
489
625
|
type=click.Choice(['random', 'public']),
|
|
@@ -512,9 +648,20 @@ class LogHandler(logging.Handler):
|
|
|
512
648
|
@click.option('--print-keys', is_flag=True, help='Print the bond keys before pairing')
|
|
513
649
|
@click.option(
|
|
514
650
|
'--keystore-file',
|
|
515
|
-
metavar='
|
|
651
|
+
metavar='FILENAME',
|
|
516
652
|
help='File in which to store the pairing keys',
|
|
517
653
|
)
|
|
654
|
+
@click.option(
|
|
655
|
+
'--advertise-service-uuid',
|
|
656
|
+
metavar="UUID",
|
|
657
|
+
multiple=True,
|
|
658
|
+
help="Advertise a GATT service UUID (may be specified more than once)",
|
|
659
|
+
)
|
|
660
|
+
@click.option(
|
|
661
|
+
'--advertise-appearance',
|
|
662
|
+
metavar='APPEARANCE',
|
|
663
|
+
help='Advertise an Appearance ID (int value or string)',
|
|
664
|
+
)
|
|
518
665
|
@click.argument('device-config')
|
|
519
666
|
@click.argument('hci_transport')
|
|
520
667
|
@click.argument('address-or-name', required=False)
|
|
@@ -524,6 +671,7 @@ def main(
|
|
|
524
671
|
mitm,
|
|
525
672
|
bond,
|
|
526
673
|
ctkd,
|
|
674
|
+
advertising_address,
|
|
527
675
|
identity_address,
|
|
528
676
|
linger,
|
|
529
677
|
io,
|
|
@@ -532,6 +680,8 @@ def main(
|
|
|
532
680
|
request,
|
|
533
681
|
print_keys,
|
|
534
682
|
keystore_file,
|
|
683
|
+
advertise_service_uuid,
|
|
684
|
+
advertise_appearance,
|
|
535
685
|
device_config,
|
|
536
686
|
hci_transport,
|
|
537
687
|
address_or_name,
|
|
@@ -550,6 +700,7 @@ def main(
|
|
|
550
700
|
mitm,
|
|
551
701
|
bond,
|
|
552
702
|
ctkd,
|
|
703
|
+
advertising_address,
|
|
553
704
|
identity_address,
|
|
554
705
|
linger,
|
|
555
706
|
io,
|
|
@@ -558,6 +709,8 @@ def main(
|
|
|
558
709
|
request,
|
|
559
710
|
print_keys,
|
|
560
711
|
keystore_file,
|
|
712
|
+
advertise_service_uuid,
|
|
713
|
+
advertise_appearance,
|
|
561
714
|
device_config,
|
|
562
715
|
hci_transport,
|
|
563
716
|
address_or_name,
|
|
@@ -770,27 +770,25 @@ class AttributeValue(Generic[_T]):
|
|
|
770
770
|
def __init__(
|
|
771
771
|
self,
|
|
772
772
|
read: Union[
|
|
773
|
-
Callable[[
|
|
774
|
-
Callable[[
|
|
773
|
+
Callable[[Connection], _T],
|
|
774
|
+
Callable[[Connection], Awaitable[_T]],
|
|
775
775
|
None,
|
|
776
776
|
] = None,
|
|
777
777
|
write: Union[
|
|
778
|
-
Callable[[
|
|
779
|
-
Callable[[
|
|
778
|
+
Callable[[Connection, _T], None],
|
|
779
|
+
Callable[[Connection, _T], Awaitable[None]],
|
|
780
780
|
None,
|
|
781
781
|
] = None,
|
|
782
782
|
):
|
|
783
783
|
self._read = read
|
|
784
784
|
self._write = write
|
|
785
785
|
|
|
786
|
-
def read(self, connection:
|
|
786
|
+
def read(self, connection: Connection) -> Union[_T, Awaitable[_T]]:
|
|
787
787
|
if self._read is None:
|
|
788
788
|
raise InvalidOperationError('AttributeValue has no read function')
|
|
789
789
|
return self._read(connection)
|
|
790
790
|
|
|
791
|
-
def write(
|
|
792
|
-
self, connection: Optional[Connection], value: _T
|
|
793
|
-
) -> Union[Awaitable[None], None]:
|
|
791
|
+
def write(self, connection: Connection, value: _T) -> Union[Awaitable[None], None]:
|
|
794
792
|
if self._write is None:
|
|
795
793
|
raise InvalidOperationError('AttributeValue has no write function')
|
|
796
794
|
return self._write(connection, value)
|
|
@@ -836,6 +834,9 @@ class Attribute(utils.EventEmitter, Generic[_T]):
|
|
|
836
834
|
READ_REQUIRES_AUTHORIZATION = Permissions.READ_REQUIRES_AUTHORIZATION
|
|
837
835
|
WRITE_REQUIRES_AUTHORIZATION = Permissions.WRITE_REQUIRES_AUTHORIZATION
|
|
838
836
|
|
|
837
|
+
EVENT_READ = "read"
|
|
838
|
+
EVENT_WRITE = "write"
|
|
839
|
+
|
|
839
840
|
value: Union[AttributeValue[_T], _T, None]
|
|
840
841
|
|
|
841
842
|
def __init__(
|
|
@@ -868,7 +869,7 @@ class Attribute(utils.EventEmitter, Generic[_T]):
|
|
|
868
869
|
def decode_value(self, value: bytes) -> _T:
|
|
869
870
|
return value # type: ignore
|
|
870
871
|
|
|
871
|
-
async def read_value(self, connection:
|
|
872
|
+
async def read_value(self, connection: Connection) -> bytes:
|
|
872
873
|
if (
|
|
873
874
|
(self.permissions & self.READ_REQUIRES_ENCRYPTION)
|
|
874
875
|
and connection is not None
|
|
@@ -906,11 +907,11 @@ class Attribute(utils.EventEmitter, Generic[_T]):
|
|
|
906
907
|
else:
|
|
907
908
|
value = self.value
|
|
908
909
|
|
|
909
|
-
self.emit(
|
|
910
|
+
self.emit(self.EVENT_READ, connection, b'' if value is None else value)
|
|
910
911
|
|
|
911
912
|
return b'' if value is None else self.encode_value(value)
|
|
912
913
|
|
|
913
|
-
async def write_value(self, connection:
|
|
914
|
+
async def write_value(self, connection: Connection, value: bytes) -> None:
|
|
914
915
|
if (
|
|
915
916
|
(self.permissions & self.WRITE_REQUIRES_ENCRYPTION)
|
|
916
917
|
and connection is not None
|
|
@@ -947,7 +948,7 @@ class Attribute(utils.EventEmitter, Generic[_T]):
|
|
|
947
948
|
else:
|
|
948
949
|
self.value = decoded_value
|
|
949
950
|
|
|
950
|
-
self.emit(
|
|
951
|
+
self.emit(self.EVENT_WRITE, connection, decoded_value)
|
|
951
952
|
|
|
952
953
|
def __repr__(self):
|
|
953
954
|
if isinstance(self.value, bytes):
|
|
@@ -166,8 +166,8 @@ class Protocol:
|
|
|
166
166
|
|
|
167
167
|
# Register to receive PDUs from the channel
|
|
168
168
|
l2cap_channel.sink = self.on_pdu
|
|
169
|
-
l2cap_channel.on(
|
|
170
|
-
l2cap_channel.on(
|
|
169
|
+
l2cap_channel.on(l2cap_channel.EVENT_OPEN, self.on_l2cap_channel_open)
|
|
170
|
+
l2cap_channel.on(l2cap_channel.EVENT_CLOSE, self.on_l2cap_channel_close)
|
|
171
171
|
|
|
172
172
|
def on_l2cap_channel_open(self):
|
|
173
173
|
logger.debug(color("<<< AVCTP channel open", "magenta"))
|