bumble 0.0.178__tar.gz → 0.0.180__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.
Files changed (521) hide show
  1. {bumble-0.0.178 → bumble-0.0.180}/.vscode/settings.json +4 -0
  2. {bumble-0.0.178 → bumble-0.0.180}/PKG-INFO +1 -1
  3. {bumble-0.0.178 → bumble-0.0.180}/apps/bench.py +180 -24
  4. {bumble-0.0.178 → bumble-0.0.180}/apps/controller_info.py +14 -0
  5. {bumble-0.0.178 → bumble-0.0.180}/apps/pair.py +9 -2
  6. {bumble-0.0.178 → bumble-0.0.180}/bumble/_version.py +2 -2
  7. {bumble-0.0.178 → bumble-0.0.180}/bumble/a2dp.py +83 -68
  8. {bumble-0.0.178 → bumble-0.0.180}/bumble/avdtp.py +3 -3
  9. {bumble-0.0.178 → bumble-0.0.180}/bumble/crypto.py +82 -66
  10. {bumble-0.0.178 → bumble-0.0.180}/bumble/device.py +247 -23
  11. {bumble-0.0.178 → bumble-0.0.180}/bumble/gatt.py +117 -7
  12. {bumble-0.0.178 → bumble-0.0.180}/bumble/gatt_client.py +56 -20
  13. {bumble-0.0.178 → bumble-0.0.180}/bumble/hci.py +351 -78
  14. {bumble-0.0.178 → bumble-0.0.180}/bumble/helpers.py +67 -42
  15. {bumble-0.0.178 → bumble-0.0.180}/bumble/hid.py +8 -7
  16. {bumble-0.0.178 → bumble-0.0.180}/bumble/l2cap.py +8 -0
  17. bumble-0.0.180/bumble/profiles/csip.py +147 -0
  18. {bumble-0.0.178 → bumble-0.0.180}/bumble/rfcomm.py +2 -3
  19. {bumble-0.0.178 → bumble-0.0.180}/bumble/sdp.py +4 -4
  20. {bumble-0.0.178 → bumble-0.0.180}/bumble/smp.py +66 -43
  21. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/common.py +1 -1
  22. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/usb.py +58 -61
  23. {bumble-0.0.178 → bumble-0.0.180}/bumble/utils.py +17 -1
  24. {bumble-0.0.178 → bumble-0.0.180}/bumble.egg-info/PKG-INFO +1 -1
  25. {bumble-0.0.178 → bumble-0.0.180}/bumble.egg-info/SOURCES.txt +52 -0
  26. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/mkdocs.yml +1 -0
  27. bumble-0.0.180/docs/mkdocs/src/extras/android_bt_bench.md +64 -0
  28. bumble-0.0.180/docs/mkdocs/src/extras/index.md +19 -0
  29. {bumble-0.0.178 → bumble-0.0.180}/examples/run_a2dp_info.py +4 -4
  30. {bumble-0.0.178 → bumble-0.0.180}/examples/run_a2dp_source.py +1 -3
  31. {bumble-0.0.178 → bumble-0.0.180}/examples/run_classic_connect.py +2 -2
  32. bumble-0.0.180/examples/run_extended_advertiser.py +69 -0
  33. {bumble-0.0.178 → bumble-0.0.180}/examples/run_hfp_gateway.py +3 -3
  34. {bumble-0.0.178 → bumble-0.0.180}/examples/run_hid_host.py +4 -9
  35. {bumble-0.0.178 → bumble-0.0.180}/examples/run_rfcomm_client.py +5 -5
  36. bumble-0.0.180/extras/android/BtBench/.gitignore +15 -0
  37. bumble-0.0.180/extras/android/BtBench/app/build.gradle.kts +70 -0
  38. bumble-0.0.180/extras/android/BtBench/app/src/main/AndroidManifest.xml +40 -0
  39. bumble-0.0.180/extras/android/BtBench/app/src/main/ic_launcher-playstore.png +0 -0
  40. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/L2capClient.kt +35 -0
  41. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/L2capServer.kt +62 -0
  42. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/MainActivity.kt +307 -0
  43. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Model.kt +163 -0
  44. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Packet.kt +178 -0
  45. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Receiver.kt +60 -0
  46. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/RfcommClient.kt +36 -0
  47. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/RfcommServer.kt +35 -0
  48. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Sender.kt +84 -0
  49. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/SocketClient.kt +63 -0
  50. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/SocketServer.kt +66 -0
  51. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Color.kt +11 -0
  52. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Theme.kt +63 -0
  53. bumble-0.0.180/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Type.kt +33 -0
  54. bumble-0.0.180/extras/android/BtBench/app/src/main/res/drawable/ic_launcher_background.xml +74 -0
  55. bumble-0.0.180/extras/android/BtBench/app/src/main/res/drawable/ic_launcher_foreground.xml +30 -0
  56. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp +0 -0
  57. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  58. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp +0 -0
  59. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  60. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp +0 -0
  61. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  62. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp +0 -0
  63. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  64. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp +0 -0
  65. bumble-0.0.180/extras/android/BtBench/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  66. bumble-0.0.180/extras/android/BtBench/app/src/main/res/values/strings.xml +3 -0
  67. bumble-0.0.180/extras/android/BtBench/app/src/main/res/values/themes.xml +5 -0
  68. bumble-0.0.180/extras/android/BtBench/build.gradle.kts +7 -0
  69. bumble-0.0.180/extras/android/BtBench/gradle/libs.versions.toml +31 -0
  70. bumble-0.0.180/extras/android/BtBench/gradle/wrapper/gradle-wrapper.properties +6 -0
  71. bumble-0.0.180/extras/android/BtBench/gradle.properties +23 -0
  72. bumble-0.0.180/extras/android/BtBench/settings.gradle.kts +24 -0
  73. bumble-0.0.180/extras/android/RemoteHCI/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  74. bumble-0.0.180/extras/android/RemoteHCI/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  75. bumble-0.0.180/extras/android/RemoteHCI/app/src/main/res/values/colors.xml +10 -0
  76. bumble-0.0.180/extras/android/RemoteHCI/app/src/main/res/values/ic_launcher_background.xml +4 -0
  77. bumble-0.0.180/extras/android/RemoteHCI/app/src/main/res/xml/backup_rules.xml +13 -0
  78. bumble-0.0.180/extras/android/RemoteHCI/app/src/main/res/xml/data_extraction_rules.xml +19 -0
  79. bumble-0.0.180/extras/android/RemoteHCI/gradle/wrapper/gradle-wrapper.jar +0 -0
  80. bumble-0.0.180/extras/android/RemoteHCI/gradlew +185 -0
  81. bumble-0.0.180/extras/android/RemoteHCI/gradlew.bat +89 -0
  82. bumble-0.0.180/extras/android/RemoteHCI/lib/.gitignore +1 -0
  83. bumble-0.0.180/extras/android/RemoteHCI/lib/proguard-rules.pro +21 -0
  84. {bumble-0.0.178 → bumble-0.0.180}/setup.cfg +1 -1
  85. bumble-0.0.180/tests/csip_test.py +74 -0
  86. {bumble-0.0.178 → bumble-0.0.180}/tests/gatt_test.py +79 -0
  87. {bumble-0.0.178 → bumble-0.0.180}/tests/hfp_test.py +2 -4
  88. {bumble-0.0.178 → bumble-0.0.180}/tests/sdp_test.py +6 -6
  89. {bumble-0.0.178 → bumble-0.0.180}/tests/self_test.py +3 -12
  90. {bumble-0.0.178 → bumble-0.0.180}/tests/smp_test.py +68 -72
  91. {bumble-0.0.178 → bumble-0.0.180}/tests/test_utils.py +3 -0
  92. bumble-0.0.178/docs/mkdocs/src/extras/index.md +0 -11
  93. {bumble-0.0.178 → bumble-0.0.180}/.git-blame-ignore-revs +0 -0
  94. {bumble-0.0.178 → bumble-0.0.180}/.github/workflows/code-check.yml +0 -0
  95. {bumble-0.0.178 → bumble-0.0.180}/.github/workflows/codeql-analysis.yml +0 -0
  96. {bumble-0.0.178 → bumble-0.0.180}/.github/workflows/python-avatar.yml +0 -0
  97. {bumble-0.0.178 → bumble-0.0.180}/.github/workflows/python-build-test.yml +0 -0
  98. {bumble-0.0.178 → bumble-0.0.180}/.github/workflows/python-publish.yml +0 -0
  99. {bumble-0.0.178 → bumble-0.0.180}/.gitignore +0 -0
  100. {bumble-0.0.178 → bumble-0.0.180}/CONTRIBUTING.md +0 -0
  101. {bumble-0.0.178 → bumble-0.0.180}/LICENSE +0 -0
  102. {bumble-0.0.178 → bumble-0.0.180}/README.md +0 -0
  103. {bumble-0.0.178 → bumble-0.0.180}/apps/README.md +0 -0
  104. {bumble-0.0.178 → bumble-0.0.180}/apps/__init__.py +0 -0
  105. {bumble-0.0.178 → bumble-0.0.180}/apps/console.py +0 -0
  106. {bumble-0.0.178 → bumble-0.0.180}/apps/controllers.py +0 -0
  107. {bumble-0.0.178 → bumble-0.0.180}/apps/gatt_dump.py +0 -0
  108. {bumble-0.0.178 → bumble-0.0.180}/apps/gg_bridge.py +0 -0
  109. {bumble-0.0.178 → bumble-0.0.180}/apps/hci_bridge.py +0 -0
  110. {bumble-0.0.178 → bumble-0.0.180}/apps/l2cap_bridge.py +0 -0
  111. {bumble-0.0.178 → bumble-0.0.180}/apps/link_relay/__init__.py +0 -0
  112. {bumble-0.0.178 → bumble-0.0.180}/apps/link_relay/link_relay.py +0 -0
  113. {bumble-0.0.178 → bumble-0.0.180}/apps/link_relay/logging.yml +0 -0
  114. {bumble-0.0.178 → bumble-0.0.180}/apps/pandora_server.py +0 -0
  115. {bumble-0.0.178 → bumble-0.0.180}/apps/scan.py +0 -0
  116. {bumble-0.0.178 → bumble-0.0.180}/apps/show.py +0 -0
  117. {bumble-0.0.178 → bumble-0.0.180}/apps/speaker/__init__.py +0 -0
  118. {bumble-0.0.178 → bumble-0.0.180}/apps/speaker/logo.svg +0 -0
  119. {bumble-0.0.178 → bumble-0.0.180}/apps/speaker/speaker.css +0 -0
  120. {bumble-0.0.178 → bumble-0.0.180}/apps/speaker/speaker.html +0 -0
  121. {bumble-0.0.178 → bumble-0.0.180}/apps/speaker/speaker.js +0 -0
  122. {bumble-0.0.178 → bumble-0.0.180}/apps/speaker/speaker.py +0 -0
  123. {bumble-0.0.178 → bumble-0.0.180}/apps/unbond.py +0 -0
  124. {bumble-0.0.178 → bumble-0.0.180}/apps/usb_probe.py +0 -0
  125. {bumble-0.0.178 → bumble-0.0.180}/bumble/__init__.py +0 -0
  126. {bumble-0.0.178 → bumble-0.0.180}/bumble/at.py +0 -0
  127. {bumble-0.0.178 → bumble-0.0.180}/bumble/att.py +0 -0
  128. {bumble-0.0.178 → bumble-0.0.180}/bumble/bridge.py +0 -0
  129. {bumble-0.0.178 → bumble-0.0.180}/bumble/codecs.py +0 -0
  130. {bumble-0.0.178 → bumble-0.0.180}/bumble/colors.py +0 -0
  131. {bumble-0.0.178 → bumble-0.0.180}/bumble/company_ids.py +0 -0
  132. {bumble-0.0.178 → bumble-0.0.180}/bumble/controller.py +0 -0
  133. {bumble-0.0.178 → bumble-0.0.180}/bumble/core.py +0 -0
  134. {bumble-0.0.178 → bumble-0.0.180}/bumble/decoder.py +0 -0
  135. {bumble-0.0.178 → bumble-0.0.180}/bumble/drivers/__init__.py +0 -0
  136. {bumble-0.0.178 → bumble-0.0.180}/bumble/drivers/rtk.py +0 -0
  137. {bumble-0.0.178 → bumble-0.0.180}/bumble/gap.py +0 -0
  138. {bumble-0.0.178 → bumble-0.0.180}/bumble/gatt_server.py +0 -0
  139. {bumble-0.0.178 → bumble-0.0.180}/bumble/hfp.py +0 -0
  140. {bumble-0.0.178 → bumble-0.0.180}/bumble/host.py +0 -0
  141. {bumble-0.0.178 → bumble-0.0.180}/bumble/keys.py +0 -0
  142. {bumble-0.0.178 → bumble-0.0.180}/bumble/link.py +0 -0
  143. {bumble-0.0.178 → bumble-0.0.180}/bumble/pairing.py +0 -0
  144. {bumble-0.0.178 → bumble-0.0.180}/bumble/pandora/__init__.py +0 -0
  145. {bumble-0.0.178 → bumble-0.0.180}/bumble/pandora/config.py +0 -0
  146. {bumble-0.0.178 → bumble-0.0.180}/bumble/pandora/device.py +0 -0
  147. {bumble-0.0.178 → bumble-0.0.180}/bumble/pandora/host.py +0 -0
  148. {bumble-0.0.178 → bumble-0.0.180}/bumble/pandora/py.typed +0 -0
  149. {bumble-0.0.178 → bumble-0.0.180}/bumble/pandora/security.py +0 -0
  150. {bumble-0.0.178 → bumble-0.0.180}/bumble/pandora/utils.py +0 -0
  151. {bumble-0.0.178 → bumble-0.0.180}/bumble/profiles/__init__.py +0 -0
  152. {bumble-0.0.178 → bumble-0.0.180}/bumble/profiles/asha_service.py +0 -0
  153. {bumble-0.0.178 → bumble-0.0.180}/bumble/profiles/battery_service.py +0 -0
  154. {bumble-0.0.178 → bumble-0.0.180}/bumble/profiles/device_information_service.py +0 -0
  155. {bumble-0.0.178 → bumble-0.0.180}/bumble/profiles/heart_rate_service.py +0 -0
  156. {bumble-0.0.178 → bumble-0.0.180}/bumble/profiles/py.typed +0 -0
  157. {bumble-0.0.178 → bumble-0.0.180}/bumble/py.typed +0 -0
  158. {bumble-0.0.178 → bumble-0.0.180}/bumble/snoop.py +0 -0
  159. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/__init__.py +0 -0
  160. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/android_emulator.py +0 -0
  161. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/android_netsim.py +0 -0
  162. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/file.py +0 -0
  163. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/__init__.py +0 -0
  164. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/common_pb2.py +0 -0
  165. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/common_pb2.pyi +0 -0
  166. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/common_pb2_grpc.py +0 -0
  167. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.py +0 -0
  168. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.pyi +0 -0
  169. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2_grpc.py +0 -0
  170. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.py +0 -0
  171. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.pyi +0 -0
  172. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2_grpc.py +0 -0
  173. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.py +0 -0
  174. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.pyi +0 -0
  175. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2_grpc.py +0 -0
  176. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.py +0 -0
  177. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.pyi +0 -0
  178. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2_grpc.py +0 -0
  179. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.py +0 -0
  180. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.pyi +0 -0
  181. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2_grpc.py +0 -0
  182. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/hci_packet_pb2.py +0 -0
  183. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/hci_packet_pb2.pyi +0 -0
  184. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/hci_packet_pb2_grpc.py +0 -0
  185. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/packet_streamer_pb2.py +0 -0
  186. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/packet_streamer_pb2.pyi +0 -0
  187. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/packet_streamer_pb2_grpc.py +0 -0
  188. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/startup_pb2.py +0 -0
  189. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/startup_pb2.pyi +0 -0
  190. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/grpc_protobuf/startup_pb2_grpc.py +0 -0
  191. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/hci_socket.py +0 -0
  192. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/pty.py +0 -0
  193. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/py.typed +0 -0
  194. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/pyusb.py +0 -0
  195. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/serial.py +0 -0
  196. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/tcp_client.py +0 -0
  197. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/tcp_server.py +0 -0
  198. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/udp.py +0 -0
  199. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/vhci.py +0 -0
  200. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/ws_client.py +0 -0
  201. {bumble-0.0.178 → bumble-0.0.180}/bumble/transport/ws_server.py +0 -0
  202. {bumble-0.0.178 → bumble-0.0.180}/bumble/vendor/__init__.py +0 -0
  203. {bumble-0.0.178 → bumble-0.0.180}/bumble/vendor/android/__init__.py +0 -0
  204. {bumble-0.0.178 → bumble-0.0.180}/bumble/vendor/android/hci.py +0 -0
  205. {bumble-0.0.178 → bumble-0.0.180}/bumble/vendor/zephyr/__init__.py +0 -0
  206. {bumble-0.0.178 → bumble-0.0.180}/bumble/vendor/zephyr/hci.py +0 -0
  207. {bumble-0.0.178 → bumble-0.0.180}/bumble.egg-info/dependency_links.txt +0 -0
  208. {bumble-0.0.178 → bumble-0.0.180}/bumble.egg-info/entry_points.txt +0 -0
  209. {bumble-0.0.178 → bumble-0.0.180}/bumble.egg-info/requires.txt +0 -0
  210. {bumble-0.0.178 → bumble-0.0.180}/bumble.egg-info/top_level.txt +0 -0
  211. {bumble-0.0.178 → bumble-0.0.180}/docs/README.md +0 -0
  212. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo.png +0 -0
  213. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo.svg +0 -0
  214. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo.vectornator/Artboard0.json +0 -0
  215. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo.vectornator/Document.json +0 -0
  216. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo.vectornator/Manifest.json +0 -0
  217. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo.vectornator/Thumbnail.png +0 -0
  218. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo.vectornator/UndoHistory.json +0 -0
  219. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo_framed.png +0 -0
  220. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo_framed.svg +0 -0
  221. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo_framed.vectornator/Artboard0.json +0 -0
  222. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo_framed.vectornator/Document.json +0 -0
  223. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo_framed.vectornator/Manifest.json +0 -0
  224. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo_framed.vectornator/Thumbnail.png +0 -0
  225. {bumble-0.0.178 → bumble-0.0.180}/docs/images/logo_framed.vectornator/UndoHistory.json +0 -0
  226. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/requirements.txt +0 -0
  227. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/api/examples.md +0 -0
  228. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/api/guide.md +0 -0
  229. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/api/reference.md +0 -0
  230. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/bench.md +0 -0
  231. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/console.md +0 -0
  232. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/gatt_dump.md +0 -0
  233. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/gg_bridge.md +0 -0
  234. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/hci_bridge.md +0 -0
  235. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/index.md +0 -0
  236. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/link_relay.md +0 -0
  237. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/pair.md +0 -0
  238. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/show.md +0 -0
  239. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/speaker.md +0 -0
  240. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/unbond.md +0 -0
  241. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/apps_and_tools/usb_probe.md +0 -0
  242. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/components/controller.md +0 -0
  243. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/components/gatt.md +0 -0
  244. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/components/host.md +0 -0
  245. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/components/security_manager.md +0 -0
  246. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/development/code_style.md +0 -0
  247. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/development/contributing.md +0 -0
  248. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/development/python_environments.md +0 -0
  249. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/downloads/zephyr/hci_usb.zip +0 -0
  250. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/drivers/index.md +0 -0
  251. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/drivers/realtek.md +0 -0
  252. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/examples/index.md +0 -0
  253. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/extras/android_remote_hci.md +0 -0
  254. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/getting_started.md +0 -0
  255. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hardware/index.md +0 -0
  256. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/index.md +0 -0
  257. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/index.toml +0 -0
  258. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/bumble.js +0 -0
  259. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.html +0 -0
  260. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.js +0 -0
  261. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.py +0 -0
  262. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/scanner/scanner.css +0 -0
  263. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/scanner/scanner.html +0 -0
  264. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/scanner/scanner.js +0 -0
  265. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/scanner/scanner.py +0 -0
  266. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/speaker/logo.svg +0 -0
  267. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/speaker/speaker.css +0 -0
  268. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/speaker/speaker.html +0 -0
  269. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/speaker/speaker.js +0 -0
  270. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/speaker/speaker.py +0 -0
  271. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/hive/web/ui.js +0 -0
  272. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/images/bumble_layers.svg +0 -0
  273. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/images/console_screenshot.png +0 -0
  274. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/images/favicon.ico +0 -0
  275. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/images/logo.png +0 -0
  276. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/images/logo_framed.png +0 -0
  277. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/images/speaker_screenshot.png +0 -0
  278. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/index.md +0 -0
  279. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/platforms/android.md +0 -0
  280. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/platforms/index.md +0 -0
  281. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/platforms/linux.md +0 -0
  282. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/platforms/macos.md +0 -0
  283. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/platforms/windows.md +0 -0
  284. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/platforms/winusb_driver.png +0 -0
  285. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/platforms/zephyr.md +0 -0
  286. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/android_emulator.md +0 -0
  287. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/file.md +0 -0
  288. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/hci_socket.md +0 -0
  289. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/index.md +0 -0
  290. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/pty.md +0 -0
  291. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/serial.md +0 -0
  292. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/tcp_client.md +0 -0
  293. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/tcp_server.md +0 -0
  294. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/udp.md +0 -0
  295. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/usb.md +0 -0
  296. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/vhci.md +0 -0
  297. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/ws_client.md +0 -0
  298. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/transports/ws_server.md +0 -0
  299. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/use_cases/index.md +0 -0
  300. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/use_cases/use_case_1.md +0 -0
  301. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/use_cases/use_case_2.md +0 -0
  302. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/use_cases/use_case_3.md +0 -0
  303. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/use_cases/use_case_4.md +0 -0
  304. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/use_cases/use_case_5.md +0 -0
  305. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/src/use_cases/use_case_6.md +0 -0
  306. {bumble-0.0.178 → bumble-0.0.180}/docs/mkdocs/theme/partials/footer.html +0 -0
  307. {bumble-0.0.178 → bumble-0.0.180}/environment.yml +0 -0
  308. {bumble-0.0.178 → bumble-0.0.180}/examples/README.md +0 -0
  309. {bumble-0.0.178 → bumble-0.0.180}/examples/a2dp_sink1.json +0 -0
  310. {bumble-0.0.178 → bumble-0.0.180}/examples/asha_sink1.json +0 -0
  311. {bumble-0.0.178 → bumble-0.0.180}/examples/asha_sink2.json +0 -0
  312. {bumble-0.0.178 → bumble-0.0.180}/examples/async_runner.py +0 -0
  313. {bumble-0.0.178 → bumble-0.0.180}/examples/battery_client.py +0 -0
  314. {bumble-0.0.178 → bumble-0.0.180}/examples/battery_server.py +0 -0
  315. {bumble-0.0.178 → bumble-0.0.180}/examples/classic1.json +0 -0
  316. {bumble-0.0.178 → bumble-0.0.180}/examples/classic2.json +0 -0
  317. {bumble-0.0.178 → bumble-0.0.180}/examples/device1.json +0 -0
  318. {bumble-0.0.178 → bumble-0.0.180}/examples/device2.json +0 -0
  319. {bumble-0.0.178 → bumble-0.0.180}/examples/device3.json +0 -0
  320. {bumble-0.0.178 → bumble-0.0.180}/examples/device_information_client.py +0 -0
  321. {bumble-0.0.178 → bumble-0.0.180}/examples/device_information_server.py +0 -0
  322. {bumble-0.0.178 → bumble-0.0.180}/examples/heart_rate_client.py +0 -0
  323. {bumble-0.0.178 → bumble-0.0.180}/examples/heart_rate_server.py +0 -0
  324. {bumble-0.0.178 → bumble-0.0.180}/examples/hfp_gateway.json +0 -0
  325. {bumble-0.0.178 → bumble-0.0.180}/examples/hfp_handsfree.html +0 -0
  326. {bumble-0.0.178 → bumble-0.0.180}/examples/hfp_handsfree.json +0 -0
  327. {bumble-0.0.178 → bumble-0.0.180}/examples/hid_key_map.py +0 -0
  328. {bumble-0.0.178 → bumble-0.0.180}/examples/hid_report_parser.py +0 -0
  329. {bumble-0.0.178 → bumble-0.0.180}/examples/keyboard.html +0 -0
  330. {bumble-0.0.178 → bumble-0.0.180}/examples/keyboard.json +0 -0
  331. {bumble-0.0.178 → bumble-0.0.180}/examples/keyboard.py +0 -0
  332. {bumble-0.0.178 → bumble-0.0.180}/examples/run_a2dp_sink.py +0 -0
  333. {bumble-0.0.178 → bumble-0.0.180}/examples/run_advertiser.py +0 -0
  334. {bumble-0.0.178 → bumble-0.0.180}/examples/run_asha_sink.py +0 -0
  335. {bumble-0.0.178 → bumble-0.0.180}/examples/run_classic_discoverable.py +0 -0
  336. {bumble-0.0.178 → bumble-0.0.180}/examples/run_classic_discovery.py +0 -0
  337. {bumble-0.0.178 → bumble-0.0.180}/examples/run_connect_and_encrypt.py +0 -0
  338. {bumble-0.0.178 → bumble-0.0.180}/examples/run_controller.py +0 -0
  339. {bumble-0.0.178 → bumble-0.0.180}/examples/run_controller_with_scanner.py +0 -0
  340. {bumble-0.0.178 → bumble-0.0.180}/examples/run_device_with_snooper.py +0 -0
  341. {bumble-0.0.178 → bumble-0.0.180}/examples/run_gatt_client.py +0 -0
  342. {bumble-0.0.178 → bumble-0.0.180}/examples/run_gatt_client_and_server.py +0 -0
  343. {bumble-0.0.178 → bumble-0.0.180}/examples/run_gatt_server.py +0 -0
  344. {bumble-0.0.178 → bumble-0.0.180}/examples/run_hfp_handsfree.py +0 -0
  345. {bumble-0.0.178 → bumble-0.0.180}/examples/run_notifier.py +0 -0
  346. {bumble-0.0.178 → bumble-0.0.180}/examples/run_rfcomm_server.py +0 -0
  347. {bumble-0.0.178 → bumble-0.0.180}/examples/run_scanner.py +0 -0
  348. {bumble-0.0.178 → bumble-0.0.180}/examples/speaker.json +0 -0
  349. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/app/.gitignore +0 -0
  350. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/app/proguard-rules.pro +0 -0
  351. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
  352. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
  353. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/app/src/main/res/values/colors.xml +0 -0
  354. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/app/src/main/res/values/ic_launcher_background.xml +0 -0
  355. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/app/src/main/res/xml/backup_rules.xml +0 -0
  356. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/app/src/main/res/xml/data_extraction_rules.xml +0 -0
  357. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/gradle/wrapper/gradle-wrapper.jar +0 -0
  358. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/gradlew +0 -0
  359. {bumble-0.0.178/extras/android/RemoteHCI → bumble-0.0.180/extras/android/BtBench}/gradlew.bat +0 -0
  360. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/.gitignore +0 -0
  361. {bumble-0.0.178/extras/android/RemoteHCI/lib → bumble-0.0.180/extras/android/RemoteHCI/app}/.gitignore +0 -0
  362. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/build.gradle.kts +0 -0
  363. {bumble-0.0.178/extras/android/RemoteHCI/lib → bumble-0.0.180/extras/android/RemoteHCI/app}/proguard-rules.pro +0 -0
  364. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/AndroidManifest.xml +0 -0
  365. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/IBluetoothHci.aidl +0 -0
  366. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/IBluetoothHciCallbacks.aidl +0 -0
  367. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/Status.aidl +0 -0
  368. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/hidl/bluetooth/1.1/IBluetoothHci.hal +0 -0
  369. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/hidl/bluetooth/1.1/IBluetoothHciCallbacks.hal +0 -0
  370. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/ic_launcher-playstore.png +0 -0
  371. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/IBluetoothHci.java +0 -0
  372. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/IBluetoothHciCallbacks.java +0 -0
  373. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/Status.java +0 -0
  374. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/IBluetoothHci.java +0 -0
  375. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/IBluetoothHciCallbacks.java +0 -0
  376. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/Status.java +0 -0
  377. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_1/IBluetoothHci.java +0 -0
  378. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_1/IBluetoothHciCallbacks.java +0 -0
  379. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciHal.java +0 -0
  380. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciHalCallback.java +0 -0
  381. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciPacket.java +0 -0
  382. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciParser.java +0 -0
  383. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciProxy.java +0 -0
  384. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciServer.java +0 -0
  385. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/MainActivity.kt +0 -0
  386. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Color.kt +0 -0
  387. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Theme.kt +0 -0
  388. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Type.kt +0 -0
  389. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  390. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp +0 -0
  391. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  392. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  393. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp +0 -0
  394. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  395. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  396. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp +0 -0
  397. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  398. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  399. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp +0 -0
  400. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  401. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  402. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp +0 -0
  403. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  404. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/values/strings.xml +0 -0
  405. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/app/src/main/res/values/themes.xml +0 -0
  406. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/build.gradle.kts +0 -0
  407. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/gradle/libs.versions.toml +0 -0
  408. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/gradle/wrapper/gradle-wrapper.properties +0 -0
  409. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/gradle.properties +0 -0
  410. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/build.gradle.kts +0 -0
  411. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/consumer-rules.pro +0 -0
  412. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/AndroidManifest.xml +0 -0
  413. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/internal/hidl/base/V1_0/DebugInfo.java +0 -0
  414. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/internal/hidl/base/V1_0/IBase.java +0 -0
  415. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/os/HidlSupport.java +0 -0
  416. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwBinder.java +0 -0
  417. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwBlob.java +0 -0
  418. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwParcel.java +0 -0
  419. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/os/IHwBinder.java +0 -0
  420. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/os/IHwInterface.java +0 -0
  421. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/os/NativeHandle.java +0 -0
  422. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/lib/src/main/java/android/os/ServiceManager.java +0 -0
  423. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/scripts/generate_java_from_aidl.sh +0 -0
  424. {bumble-0.0.178 → bumble-0.0.180}/extras/android/RemoteHCI/settings.gradle.kts +0 -0
  425. {bumble-0.0.178 → bumble-0.0.180}/noxfile.py +0 -0
  426. {bumble-0.0.178 → bumble-0.0.180}/pyproject.toml +0 -0
  427. {bumble-0.0.178 → bumble-0.0.180}/rust/.gitignore +0 -0
  428. {bumble-0.0.178 → bumble-0.0.180}/rust/CHANGELOG.md +0 -0
  429. {bumble-0.0.178 → bumble-0.0.180}/rust/Cargo.lock +0 -0
  430. {bumble-0.0.178 → bumble-0.0.180}/rust/Cargo.toml +0 -0
  431. {bumble-0.0.178 → bumble-0.0.180}/rust/README.md +0 -0
  432. {bumble-0.0.178 → bumble-0.0.180}/rust/examples/battery_client.rs +0 -0
  433. {bumble-0.0.178 → bumble-0.0.180}/rust/examples/broadcast.rs +0 -0
  434. {bumble-0.0.178 → bumble-0.0.180}/rust/examples/scanner.rs +0 -0
  435. {bumble-0.0.178 → bumble-0.0.180}/rust/pytests/assigned_numbers.rs +0 -0
  436. {bumble-0.0.178 → bumble-0.0.180}/rust/pytests/pytests.rs +0 -0
  437. {bumble-0.0.178 → bumble-0.0.180}/rust/pytests/wrapper/drivers.rs +0 -0
  438. {bumble-0.0.178 → bumble-0.0.180}/rust/pytests/wrapper/hci.rs +0 -0
  439. {bumble-0.0.178 → bumble-0.0.180}/rust/pytests/wrapper/mod.rs +0 -0
  440. {bumble-0.0.178 → bumble-0.0.180}/rust/pytests/wrapper/transport.rs +0 -0
  441. {bumble-0.0.178 → bumble-0.0.180}/rust/resources/test/firmware/realtek/README.md +0 -0
  442. {bumble-0.0.178 → bumble-0.0.180}/rust/resources/test/firmware/realtek/rtl8723b_fw_structure.bin +0 -0
  443. {bumble-0.0.178 → bumble-0.0.180}/rust/resources/test/firmware/realtek/rtl8761bu_fw_structure.bin +0 -0
  444. {bumble-0.0.178 → bumble-0.0.180}/rust/src/adv.rs +0 -0
  445. {bumble-0.0.178 → bumble-0.0.180}/rust/src/cli/firmware/mod.rs +0 -0
  446. {bumble-0.0.178 → bumble-0.0.180}/rust/src/cli/firmware/rtk.rs +0 -0
  447. {bumble-0.0.178 → bumble-0.0.180}/rust/src/cli/l2cap/client_bridge.rs +0 -0
  448. {bumble-0.0.178 → bumble-0.0.180}/rust/src/cli/l2cap/mod.rs +0 -0
  449. {bumble-0.0.178 → bumble-0.0.180}/rust/src/cli/l2cap/server_bridge.rs +0 -0
  450. {bumble-0.0.178 → bumble-0.0.180}/rust/src/cli/mod.rs +0 -0
  451. {bumble-0.0.178 → bumble-0.0.180}/rust/src/cli/usb/mod.rs +0 -0
  452. {bumble-0.0.178 → bumble-0.0.180}/rust/src/internal/drivers/mod.rs +0 -0
  453. {bumble-0.0.178 → bumble-0.0.180}/rust/src/internal/drivers/rtk.rs +0 -0
  454. {bumble-0.0.178 → bumble-0.0.180}/rust/src/internal/hci/mod.rs +0 -0
  455. {bumble-0.0.178 → bumble-0.0.180}/rust/src/internal/hci/packets.pdl +0 -0
  456. {bumble-0.0.178 → bumble-0.0.180}/rust/src/internal/hci/tests.rs +0 -0
  457. {bumble-0.0.178 → bumble-0.0.180}/rust/src/internal/mod.rs +0 -0
  458. {bumble-0.0.178 → bumble-0.0.180}/rust/src/lib.rs +0 -0
  459. {bumble-0.0.178 → bumble-0.0.180}/rust/src/main.rs +0 -0
  460. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/assigned_numbers/company_ids.rs +0 -0
  461. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/assigned_numbers/mod.rs +0 -0
  462. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/assigned_numbers/services.rs +0 -0
  463. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/common.rs +0 -0
  464. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/controller.rs +0 -0
  465. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/core.rs +0 -0
  466. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/device/mod.rs +0 -0
  467. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/device/tests.rs +0 -0
  468. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/drivers/mod.rs +0 -0
  469. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/drivers/rtk.rs +0 -0
  470. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/gatt_client.rs +0 -0
  471. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/hci.rs +0 -0
  472. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/host.rs +0 -0
  473. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/l2cap.rs +0 -0
  474. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/link.rs +0 -0
  475. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/logging.rs +0 -0
  476. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/mod.rs +0 -0
  477. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/profile.rs +0 -0
  478. {bumble-0.0.178 → bumble-0.0.180}/rust/src/wrapper/transport.rs +0 -0
  479. {bumble-0.0.178 → bumble-0.0.180}/rust/tools/file_header.rs +0 -0
  480. {bumble-0.0.178 → bumble-0.0.180}/rust/tools/gen_assigned_numbers.rs +0 -0
  481. {bumble-0.0.178 → bumble-0.0.180}/scripts/process_android_emulator_protos.sh +0 -0
  482. {bumble-0.0.178 → bumble-0.0.180}/scripts/process_android_netsim_protos.sh +0 -0
  483. {bumble-0.0.178 → bumble-0.0.180}/setup.py +0 -0
  484. {bumble-0.0.178 → bumble-0.0.180}/tasks.py +0 -0
  485. {bumble-0.0.178 → bumble-0.0.180}/tests/__init__.py +0 -0
  486. {bumble-0.0.178 → bumble-0.0.180}/tests/a2dp_test.py +0 -0
  487. {bumble-0.0.178 → bumble-0.0.180}/tests/at_test.py +0 -0
  488. {bumble-0.0.178 → bumble-0.0.180}/tests/avdtp_test.py +0 -0
  489. {bumble-0.0.178 → bumble-0.0.180}/tests/codecs_test.py +0 -0
  490. {bumble-0.0.178 → bumble-0.0.180}/tests/core_test.py +0 -0
  491. {bumble-0.0.178 → bumble-0.0.180}/tests/decoder_test.py +0 -0
  492. {bumble-0.0.178 → bumble-0.0.180}/tests/device_test.py +0 -0
  493. {bumble-0.0.178 → bumble-0.0.180}/tests/g722_sample.g722 +0 -0
  494. {bumble-0.0.178 → bumble-0.0.180}/tests/hci_data_001.bin +0 -0
  495. {bumble-0.0.178 → bumble-0.0.180}/tests/hci_test.py +0 -0
  496. {bumble-0.0.178 → bumble-0.0.180}/tests/import_test.py +0 -0
  497. {bumble-0.0.178 → bumble-0.0.180}/tests/keystore_test.py +0 -0
  498. {bumble-0.0.178 → bumble-0.0.180}/tests/l2cap_test.py +0 -0
  499. {bumble-0.0.178 → bumble-0.0.180}/tests/pytest.ini +0 -0
  500. {bumble-0.0.178 → bumble-0.0.180}/tests/rfcomm_test.py +0 -0
  501. {bumble-0.0.178 → bumble-0.0.180}/tests/transport_test.py +0 -0
  502. {bumble-0.0.178 → bumble-0.0.180}/tests/utils_test.py +0 -0
  503. {bumble-0.0.178 → bumble-0.0.180}/tools/__init__.py +0 -0
  504. {bumble-0.0.178 → bumble-0.0.180}/tools/generate_company_id_list.py +0 -0
  505. {bumble-0.0.178 → bumble-0.0.180}/tools/rtk_fw_download.py +0 -0
  506. {bumble-0.0.178 → bumble-0.0.180}/tools/rtk_util.py +0 -0
  507. {bumble-0.0.178 → bumble-0.0.180}/web/README.md +0 -0
  508. {bumble-0.0.178 → bumble-0.0.180}/web/bumble.js +0 -0
  509. {bumble-0.0.178 → bumble-0.0.180}/web/heart_rate_monitor/heart_rate_monitor.html +0 -0
  510. {bumble-0.0.178 → bumble-0.0.180}/web/heart_rate_monitor/heart_rate_monitor.js +0 -0
  511. {bumble-0.0.178 → bumble-0.0.180}/web/heart_rate_monitor/heart_rate_monitor.py +0 -0
  512. {bumble-0.0.178 → bumble-0.0.180}/web/scanner/scanner.css +0 -0
  513. {bumble-0.0.178 → bumble-0.0.180}/web/scanner/scanner.html +0 -0
  514. {bumble-0.0.178 → bumble-0.0.180}/web/scanner/scanner.js +0 -0
  515. {bumble-0.0.178 → bumble-0.0.180}/web/scanner/scanner.py +0 -0
  516. {bumble-0.0.178 → bumble-0.0.180}/web/speaker/logo.svg +0 -0
  517. {bumble-0.0.178 → bumble-0.0.180}/web/speaker/speaker.css +0 -0
  518. {bumble-0.0.178 → bumble-0.0.180}/web/speaker/speaker.html +0 -0
  519. {bumble-0.0.178 → bumble-0.0.180}/web/speaker/speaker.js +0 -0
  520. {bumble-0.0.178 → bumble-0.0.180}/web/speaker/speaker.py +0 -0
  521. {bumble-0.0.178 → bumble-0.0.180}/web/ui.js +0 -0
@@ -21,6 +21,7 @@
21
21
  "cccds",
22
22
  "cmac",
23
23
  "CONNECTIONLESS",
24
+ "csip",
24
25
  "csrcs",
25
26
  "datagram",
26
27
  "DATALINK",
@@ -29,6 +30,7 @@
29
30
  "deregistration",
30
31
  "dhkey",
31
32
  "diversifier",
33
+ "endianness",
32
34
  "Fitbit",
33
35
  "GATTLINK",
34
36
  "HANDSFREE",
@@ -44,6 +46,7 @@
44
46
  "NONCONN",
45
47
  "OXIMETER",
46
48
  "popleft",
49
+ "PRAND",
47
50
  "protobuf",
48
51
  "psms",
49
52
  "pyee",
@@ -55,6 +58,7 @@
55
58
  "SEID",
56
59
  "seids",
57
60
  "SERV",
61
+ "SIRK",
58
62
  "ssrc",
59
63
  "strerror",
60
64
  "subband",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bumble
3
- Version: 0.0.178
3
+ Version: 0.0.180
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Home-page: https://github.com/google/bumble
6
6
  Author: Google
@@ -50,8 +50,10 @@ from bumble.sdp import (
50
50
  SDP_PUBLIC_BROWSE_ROOT,
51
51
  SDP_SERVICE_CLASS_ID_LIST_ATTRIBUTE_ID,
52
52
  SDP_SERVICE_RECORD_HANDLE_ATTRIBUTE_ID,
53
+ SDP_BLUETOOTH_PROFILE_DESCRIPTOR_LIST_ATTRIBUTE_ID,
53
54
  DataElement,
54
55
  ServiceAttribute,
56
+ Client as SdpClient,
55
57
  )
56
58
  from bumble.transport import open_transport_or_link
57
59
  import bumble.rfcomm
@@ -77,6 +79,7 @@ SPEED_SERVICE_UUID = '50DB505C-8AC4-4738-8448-3B1D9CC09CC5'
77
79
  SPEED_TX_UUID = 'E789C754-41A1-45F4-A948-A0A1A90DBA53'
78
80
  SPEED_RX_UUID = '016A2CC7-E14B-4819-935F-1F56EAE4098D'
79
81
 
82
+ DEFAULT_RFCOMM_UUID = 'E6D55659-C8B4-4B85-96BB-B1143AF6D3AE'
80
83
  DEFAULT_L2CAP_PSM = 1234
81
84
  DEFAULT_L2CAP_MAX_CREDITS = 128
82
85
  DEFAULT_L2CAP_MTU = 1022
@@ -128,11 +131,16 @@ def print_connection(connection):
128
131
  if connection.transport == BT_LE_TRANSPORT:
129
132
  phy_state = (
130
133
  'PHY='
131
- f'RX:{le_phy_name(connection.phy.rx_phy)}/'
132
- f'TX:{le_phy_name(connection.phy.tx_phy)}'
134
+ f'TX:{le_phy_name(connection.phy.tx_phy)}/'
135
+ f'RX:{le_phy_name(connection.phy.rx_phy)}'
133
136
  )
134
137
 
135
- data_length = f'DL={connection.data_length}'
138
+ data_length = (
139
+ 'DL=('
140
+ f'TX:{connection.data_length[0]}/{connection.data_length[1]},'
141
+ f'RX:{connection.data_length[2]}/{connection.data_length[3]}'
142
+ ')'
143
+ )
136
144
  connection_parameters = (
137
145
  'Parameters='
138
146
  f'{connection.parameters.connection_interval * 1.25:.2f}/'
@@ -169,9 +177,7 @@ def make_sdp_records(channel):
169
177
  ),
170
178
  ServiceAttribute(
171
179
  SDP_SERVICE_CLASS_ID_LIST_ATTRIBUTE_ID,
172
- DataElement.sequence(
173
- [DataElement.uuid(UUID('E6D55659-C8B4-4B85-96BB-B1143AF6D3AE'))]
174
- ),
180
+ DataElement.sequence([DataElement.uuid(UUID(DEFAULT_RFCOMM_UUID))]),
175
181
  ),
176
182
  ServiceAttribute(
177
183
  SDP_PROTOCOL_DESCRIPTOR_LIST_ATTRIBUTE_ID,
@@ -191,6 +197,48 @@ def make_sdp_records(channel):
191
197
  }
192
198
 
193
199
 
200
+ async def find_rfcomm_channel_with_uuid(connection: Connection, uuid: str) -> int:
201
+ # Connect to the SDP Server
202
+ sdp_client = SdpClient(connection)
203
+ await sdp_client.connect()
204
+
205
+ # Search for services with an L2CAP service attribute
206
+ search_result = await sdp_client.search_attributes(
207
+ [BT_L2CAP_PROTOCOL_ID],
208
+ [
209
+ SDP_PROTOCOL_DESCRIPTOR_LIST_ATTRIBUTE_ID,
210
+ SDP_BLUETOOTH_PROFILE_DESCRIPTOR_LIST_ATTRIBUTE_ID,
211
+ SDP_SERVICE_CLASS_ID_LIST_ATTRIBUTE_ID,
212
+ ],
213
+ )
214
+ for attribute_list in search_result:
215
+ service_uuid = None
216
+ service_class_id_list = ServiceAttribute.find_attribute_in_list(
217
+ attribute_list, SDP_SERVICE_CLASS_ID_LIST_ATTRIBUTE_ID
218
+ )
219
+ if service_class_id_list:
220
+ if service_class_id_list.value:
221
+ for service_class_id in service_class_id_list.value:
222
+ service_uuid = service_class_id.value
223
+ if str(service_uuid) != uuid:
224
+ # This service doesn't have a UUID or isn't the right one.
225
+ continue
226
+
227
+ # Look for the RFCOMM Channel number
228
+ protocol_descriptor_list = ServiceAttribute.find_attribute_in_list(
229
+ attribute_list, SDP_PROTOCOL_DESCRIPTOR_LIST_ATTRIBUTE_ID
230
+ )
231
+ if protocol_descriptor_list:
232
+ for protocol_descriptor in protocol_descriptor_list.value:
233
+ if len(protocol_descriptor.value) >= 2:
234
+ if protocol_descriptor.value[0].value == BT_RFCOMM_PROTOCOL_ID:
235
+ await sdp_client.disconnect()
236
+ return protocol_descriptor.value[1].value
237
+
238
+ await sdp_client.disconnect()
239
+ return 0
240
+
241
+
194
242
  class PacketType(enum.IntEnum):
195
243
  RESET = 0
196
244
  SEQUENCE = 1
@@ -224,7 +272,7 @@ class Sender:
224
272
 
225
273
  if self.tx_start_delay:
226
274
  print(color(f'*** Startup delay: {self.tx_start_delay}', 'blue'))
227
- await asyncio.sleep(self.tx_start_delay) # FIXME
275
+ await asyncio.sleep(self.tx_start_delay)
228
276
 
229
277
  print(color('=== Sending RESET', 'magenta'))
230
278
  await self.packet_io.send_packet(bytes([PacketType.RESET]))
@@ -364,7 +412,7 @@ class Ping:
364
412
 
365
413
  if self.tx_start_delay:
366
414
  print(color(f'*** Startup delay: {self.tx_start_delay}', 'blue'))
367
- await asyncio.sleep(self.tx_start_delay) # FIXME
415
+ await asyncio.sleep(self.tx_start_delay)
368
416
 
369
417
  print(color('=== Sending RESET', 'magenta'))
370
418
  await self.packet_io.send_packet(bytes([PacketType.RESET]))
@@ -710,14 +758,14 @@ class L2capServer(StreamedPacketIO):
710
758
  self.l2cap_channel = None
711
759
  self.ready = asyncio.Event()
712
760
 
713
- # Listen for incoming L2CAP CoC connections
761
+ # Listen for incoming L2CAP connections
714
762
  device.create_l2cap_server(
715
763
  spec=l2cap.LeCreditBasedChannelSpec(
716
764
  psm=psm, mtu=mtu, mps=mps, max_credits=max_credits
717
765
  ),
718
766
  handler=self.on_l2cap_channel,
719
767
  )
720
- print(color(f'### Listening for CoC connection on PSM {psm}', 'yellow'))
768
+ print(color(f'### Listening for L2CAP connection on PSM {psm}', 'yellow'))
721
769
 
722
770
  async def on_connection(self, connection):
723
771
  connection.on('disconnection', self.on_disconnection)
@@ -743,21 +791,35 @@ class L2capServer(StreamedPacketIO):
743
791
  # RfcommClient
744
792
  # -----------------------------------------------------------------------------
745
793
  class RfcommClient(StreamedPacketIO):
746
- def __init__(self, device):
794
+ def __init__(self, device, channel, uuid):
747
795
  super().__init__()
748
796
  self.device = device
797
+ self.channel = channel
798
+ self.uuid = uuid
749
799
  self.ready = asyncio.Event()
750
800
 
751
801
  async def on_connection(self, connection):
752
802
  connection.on('disconnection', self.on_disconnection)
753
803
 
804
+ # Find the channel number if not specified
805
+ channel = self.channel
806
+ if channel == 0:
807
+ print(
808
+ color(f'@@@ Discovering channel number from UUID {self.uuid}', 'cyan')
809
+ )
810
+ channel = await find_rfcomm_channel_with_uuid(connection, self.uuid)
811
+ print(color(f'@@@ Channel number = {channel}', 'cyan'))
812
+ if channel == 0:
813
+ print(color('!!! No RFComm service with this UUID found', 'red'))
814
+ await connection.disconnect()
815
+ return
816
+
754
817
  # Create a client and start it
755
818
  print(color('*** Starting RFCOMM client...', 'blue'))
756
- rfcomm_client = bumble.rfcomm.Client(self.device, connection)
819
+ rfcomm_client = bumble.rfcomm.Client(connection)
757
820
  rfcomm_mux = await rfcomm_client.start()
758
821
  print(color('*** Started', 'blue'))
759
822
 
760
- channel = DEFAULT_RFCOMM_CHANNEL
761
823
  print(color(f'### Opening session for channel {channel}...', 'yellow'))
762
824
  try:
763
825
  rfcomm_session = await rfcomm_mux.open_dlc(channel)
@@ -780,7 +842,7 @@ class RfcommClient(StreamedPacketIO):
780
842
  # RfcommServer
781
843
  # -----------------------------------------------------------------------------
782
844
  class RfcommServer(StreamedPacketIO):
783
- def __init__(self, device):
845
+ def __init__(self, device, channel):
784
846
  super().__init__()
785
847
  self.ready = asyncio.Event()
786
848
 
@@ -788,7 +850,7 @@ class RfcommServer(StreamedPacketIO):
788
850
  rfcomm_server = bumble.rfcomm.Server(device)
789
851
 
790
852
  # Listen for incoming DLC connections
791
- channel_number = rfcomm_server.listen(self.on_dlc, DEFAULT_RFCOMM_CHANNEL)
853
+ channel_number = rfcomm_server.listen(self.on_dlc, channel)
792
854
 
793
855
  # Setup the SDP to advertise this channel
794
856
  device.sdp_service_records = make_sdp_records(channel_number)
@@ -825,6 +887,9 @@ class Central(Connection.Listener):
825
887
  mode_factory,
826
888
  connection_interval,
827
889
  phy,
890
+ authenticate,
891
+ encrypt,
892
+ extended_data_length,
828
893
  ):
829
894
  super().__init__()
830
895
  self.transport = transport
@@ -832,6 +897,9 @@ class Central(Connection.Listener):
832
897
  self.classic = classic
833
898
  self.role_factory = role_factory
834
899
  self.mode_factory = mode_factory
900
+ self.authenticate = authenticate
901
+ self.encrypt = encrypt or authenticate
902
+ self.extended_data_length = extended_data_length
835
903
  self.device = None
836
904
  self.connection = None
837
905
 
@@ -904,7 +972,26 @@ class Central(Connection.Listener):
904
972
  self.connection.listener = self
905
973
  print_connection(self.connection)
906
974
 
907
- await mode.on_connection(self.connection)
975
+ # Request a new data length if requested
976
+ if self.extended_data_length:
977
+ print(color('+++ Requesting extended data length', 'cyan'))
978
+ await self.connection.set_data_length(
979
+ self.extended_data_length[0], self.extended_data_length[1]
980
+ )
981
+
982
+ # Authenticate if requested
983
+ if self.authenticate:
984
+ # Request authentication
985
+ print(color('*** Authenticating...', 'cyan'))
986
+ await self.connection.authenticate()
987
+ print(color('*** Authenticated', 'cyan'))
988
+
989
+ # Encrypt if requested
990
+ if self.encrypt:
991
+ # Enable encryption
992
+ print(color('*** Enabling encryption...', 'cyan'))
993
+ await self.connection.encrypt()
994
+ print(color('*** Encryption on', 'cyan'))
908
995
 
909
996
  # Set the PHY if requested
910
997
  if self.phy is not None:
@@ -919,6 +1006,8 @@ class Central(Connection.Listener):
919
1006
  )
920
1007
  )
921
1008
 
1009
+ await mode.on_connection(self.connection)
1010
+
922
1011
  await role.run()
923
1012
  await asyncio.sleep(DEFAULT_LINGER_TIME)
924
1013
 
@@ -943,9 +1032,12 @@ class Central(Connection.Listener):
943
1032
  # Peripheral
944
1033
  # -----------------------------------------------------------------------------
945
1034
  class Peripheral(Device.Listener, Connection.Listener):
946
- def __init__(self, transport, classic, role_factory, mode_factory):
1035
+ def __init__(
1036
+ self, transport, classic, extended_data_length, role_factory, mode_factory
1037
+ ):
947
1038
  self.transport = transport
948
1039
  self.classic = classic
1040
+ self.extended_data_length = extended_data_length
949
1041
  self.role_factory = role_factory
950
1042
  self.role = None
951
1043
  self.mode_factory = mode_factory
@@ -1006,6 +1098,15 @@ class Peripheral(Device.Listener, Connection.Listener):
1006
1098
  self.connection = connection
1007
1099
  self.connected.set()
1008
1100
 
1101
+ # Request a new data length if needed
1102
+ if self.extended_data_length:
1103
+ print("+++ Requesting extended data length")
1104
+ AsyncRunner.spawn(
1105
+ connection.set_data_length(
1106
+ self.extended_data_length[0], self.extended_data_length[1]
1107
+ )
1108
+ )
1109
+
1009
1110
  def on_disconnection(self, reason):
1010
1111
  print(color(f'!!! Disconnection: reason={reason}', 'red'))
1011
1112
  self.connection = None
@@ -1038,16 +1139,18 @@ def create_mode_factory(ctx, default_mode):
1038
1139
  return GattServer(device)
1039
1140
 
1040
1141
  if mode == 'l2cap-client':
1041
- return L2capClient(device)
1142
+ return L2capClient(device, psm=ctx.obj['l2cap_psm'])
1042
1143
 
1043
1144
  if mode == 'l2cap-server':
1044
- return L2capServer(device)
1145
+ return L2capServer(device, psm=ctx.obj['l2cap_psm'])
1045
1146
 
1046
1147
  if mode == 'rfcomm-client':
1047
- return RfcommClient(device)
1148
+ return RfcommClient(
1149
+ device, channel=ctx.obj['rfcomm_channel'], uuid=ctx.obj['rfcomm_uuid']
1150
+ )
1048
1151
 
1049
1152
  if mode == 'rfcomm-server':
1050
- return RfcommServer(device)
1153
+ return RfcommServer(device, channel=ctx.obj['rfcomm_channel'])
1051
1154
 
1052
1155
  raise ValueError('invalid mode')
1053
1156
 
@@ -1113,6 +1216,27 @@ def create_role_factory(ctx, default_role):
1113
1216
  type=click.IntRange(23, 517),
1114
1217
  help='GATT MTU (gatt-client mode)',
1115
1218
  )
1219
+ @click.option(
1220
+ '--extended-data-length',
1221
+ help='Request a data length upon connection, specified as tx_octets/tx_time',
1222
+ )
1223
+ @click.option(
1224
+ '--rfcomm-channel',
1225
+ type=int,
1226
+ default=DEFAULT_RFCOMM_CHANNEL,
1227
+ help='RFComm channel to use',
1228
+ )
1229
+ @click.option(
1230
+ '--rfcomm-uuid',
1231
+ default=DEFAULT_RFCOMM_UUID,
1232
+ help='RFComm service UUID to use (ignored is --rfcomm-channel is not 0)',
1233
+ )
1234
+ @click.option(
1235
+ '--l2cap-psm',
1236
+ type=int,
1237
+ default=DEFAULT_L2CAP_PSM,
1238
+ help='L2CAP PSM to use',
1239
+ )
1116
1240
  @click.option(
1117
1241
  '--packet-size',
1118
1242
  '-s',
@@ -1139,17 +1263,36 @@ def create_role_factory(ctx, default_role):
1139
1263
  )
1140
1264
  @click.pass_context
1141
1265
  def bench(
1142
- ctx, device_config, role, mode, att_mtu, packet_size, packet_count, start_delay
1266
+ ctx,
1267
+ device_config,
1268
+ role,
1269
+ mode,
1270
+ att_mtu,
1271
+ extended_data_length,
1272
+ packet_size,
1273
+ packet_count,
1274
+ start_delay,
1275
+ rfcomm_channel,
1276
+ rfcomm_uuid,
1277
+ l2cap_psm,
1143
1278
  ):
1144
1279
  ctx.ensure_object(dict)
1145
1280
  ctx.obj['device_config'] = device_config
1146
1281
  ctx.obj['role'] = role
1147
1282
  ctx.obj['mode'] = mode
1148
1283
  ctx.obj['att_mtu'] = att_mtu
1284
+ ctx.obj['rfcomm_channel'] = rfcomm_channel
1285
+ ctx.obj['rfcomm_uuid'] = rfcomm_uuid
1286
+ ctx.obj['l2cap_psm'] = l2cap_psm
1149
1287
  ctx.obj['packet_size'] = packet_size
1150
1288
  ctx.obj['packet_count'] = packet_count
1151
1289
  ctx.obj['start_delay'] = start_delay
1152
1290
 
1291
+ ctx.obj['extended_data_length'] = (
1292
+ [int(x) for x in extended_data_length.split('/')]
1293
+ if extended_data_length
1294
+ else None
1295
+ )
1153
1296
  ctx.obj['classic'] = mode in ('rfcomm-client', 'rfcomm-server')
1154
1297
 
1155
1298
 
@@ -1170,8 +1313,12 @@ def bench(
1170
1313
  help='Connection interval (in ms)',
1171
1314
  )
1172
1315
  @click.option('--phy', type=click.Choice(['1m', '2m', 'coded']), help='PHY to use')
1316
+ @click.option('--authenticate', is_flag=True, help='Authenticate (RFComm only)')
1317
+ @click.option('--encrypt', is_flag=True, help='Encrypt the connection (RFComm only)')
1173
1318
  @click.pass_context
1174
- def central(ctx, transport, peripheral_address, connection_interval, phy):
1319
+ def central(
1320
+ ctx, transport, peripheral_address, connection_interval, phy, authenticate, encrypt
1321
+ ):
1175
1322
  """Run as a central (initiates the connection)"""
1176
1323
  role_factory = create_role_factory(ctx, 'sender')
1177
1324
  mode_factory = create_mode_factory(ctx, 'gatt-client')
@@ -1186,6 +1333,9 @@ def central(ctx, transport, peripheral_address, connection_interval, phy):
1186
1333
  mode_factory,
1187
1334
  connection_interval,
1188
1335
  phy,
1336
+ authenticate,
1337
+ encrypt or authenticate,
1338
+ ctx.obj['extended_data_length'],
1189
1339
  ).run()
1190
1340
  )
1191
1341
 
@@ -1199,7 +1349,13 @@ def peripheral(ctx, transport):
1199
1349
  mode_factory = create_mode_factory(ctx, 'gatt-server')
1200
1350
 
1201
1351
  asyncio.run(
1202
- Peripheral(transport, ctx.obj['classic'], role_factory, mode_factory).run()
1352
+ Peripheral(
1353
+ transport,
1354
+ ctx.obj['classic'],
1355
+ ctx.obj['extended_data_length'],
1356
+ role_factory,
1357
+ mode_factory,
1358
+ ).run()
1203
1359
  )
1204
1360
 
1205
1361
 
@@ -42,6 +42,8 @@ from bumble.hci import (
42
42
  HCI_LE_Read_Number_Of_Supported_Advertising_Sets_Command,
43
43
  HCI_LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH_COMMAND,
44
44
  HCI_LE_Read_Maximum_Advertising_Data_Length_Command,
45
+ HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH_COMMAND,
46
+ HCI_LE_Read_Suggested_Default_Data_Length_Command,
45
47
  )
46
48
  from bumble.host import Host
47
49
  from bumble.transport import open_transport_or_link
@@ -117,6 +119,18 @@ async def get_le_info(host):
117
119
  '\n',
118
120
  )
119
121
 
122
+ if host.supports_command(HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH_COMMAND):
123
+ response = await host.send_command(
124
+ HCI_LE_Read_Suggested_Default_Data_Length_Command()
125
+ )
126
+ if command_succeeded(response):
127
+ print(
128
+ color('Suggested Default Data Length:', 'yellow'),
129
+ f'{response.return_parameters.suggested_max_tx_octets}/'
130
+ f'{response.return_parameters.suggested_max_tx_time}',
131
+ '\n',
132
+ )
133
+
120
134
  print(color('LE Features:', 'yellow'))
121
135
  for feature in host.supported_le_features:
122
136
  print(' ', name_or_number(HCI_LE_SUPPORTED_FEATURES_NAMES, feature))
@@ -291,6 +291,7 @@ async def pair(
291
291
  mitm,
292
292
  bond,
293
293
  ctkd,
294
+ linger,
294
295
  io,
295
296
  oob,
296
297
  prompt,
@@ -395,6 +396,7 @@ async def pair(
395
396
  address_or_name,
396
397
  transport=BT_LE_TRANSPORT if mode == 'le' else BT_BR_EDR_TRANSPORT,
397
398
  )
399
+ pairing_failure = False
398
400
 
399
401
  if not request:
400
402
  try:
@@ -402,10 +404,12 @@ async def pair(
402
404
  await connection.pair()
403
405
  else:
404
406
  await connection.authenticate()
405
- return
406
407
  except ProtocolError as error:
408
+ pairing_failure = True
407
409
  print(color(f'Pairing failed: {error}', 'red'))
408
- return
410
+
411
+ if not linger or pairing_failure:
412
+ return
409
413
  else:
410
414
  if mode == 'le':
411
415
  # Advertise so that peers can find us and connect
@@ -455,6 +459,7 @@ class LogHandler(logging.Handler):
455
459
  help='Enable CTKD',
456
460
  show_default=True,
457
461
  )
462
+ @click.option('--linger', default=True, is_flag=True, help='Linger after pairing')
458
463
  @click.option(
459
464
  '--io',
460
465
  type=click.Choice(
@@ -490,6 +495,7 @@ def main(
490
495
  mitm,
491
496
  bond,
492
497
  ctkd,
498
+ linger,
493
499
  io,
494
500
  oob,
495
501
  prompt,
@@ -514,6 +520,7 @@ def main(
514
520
  mitm,
515
521
  bond,
516
522
  ctkd,
523
+ linger,
517
524
  io,
518
525
  oob,
519
526
  prompt,
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.0.178'
16
- __version_tuple__ = version_tuple = (0, 0, 178)
15
+ __version__ = version = '0.0.180'
16
+ __version_tuple__ = version_tuple = (0, 0, 180)