Skip to content

Commit e5ba864

Browse files
committed
aioble/server.py: Add data arg for indicate.
In micropython/micropython#11239 we added support for passing data to gatts_indicate (to make it match gatts_notify). This adds the same to aioble. Also update the documentation to mention this (and fix some mistakes and add a few more examples). This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
1 parent 55d1d23 commit e5ba864

File tree

4 files changed

+78
-13
lines changed

4 files changed

+78
-13
lines changed

micropython/bluetooth/aioble-server/manifest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
metadata(version="0.3.0")
1+
metadata(version="0.4.0")
22

33
require("aioble-core")
44

micropython/bluetooth/aioble/README.md

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Alternatively, install the `aioble` package, which will install everything.
7070
Usage
7171
-----
7272

73-
Passive scan for nearby devices for 5 seconds: (Observer)
73+
#### Passive scan for nearby devices for 5 seconds: (Observer)
7474

7575
```py
7676
async with aioble.scan(duration_ms=5000) as scanner:
@@ -87,7 +87,7 @@ async with aioble.scan(duration_ms=5000, interval_us=30000, window_us=30000, act
8787
print(result, result.name(), result.rssi, result.services())
8888
```
8989

90-
Connect to a peripheral device: (Central)
90+
#### Connect to a peripheral device: (Central)
9191

9292
```py
9393
# Either from scan result
@@ -101,7 +101,7 @@ except asyncio.TimeoutError:
101101
print('Timeout')
102102
```
103103

104-
Register services and wait for connection: (Peripheral, Server)
104+
#### Register services and wait for connection: (Peripheral, Server)
105105

106106
```py
107107
_ENV_SENSE_UUID = bluetooth.UUID(0x181A)
@@ -126,30 +126,95 @@ while True:
126126
print("Connection from", device)
127127
```
128128

129-
Update characteristic value: (Server)
129+
#### Update characteristic value: (Server)
130130

131131
```py
132+
# Write the local value.
132133
temp_char.write(b'data')
134+
```
135+
136+
```py
137+
# Write the local value and notify/indicate subscribers.
138+
temp_char.write(b'data', send_update=True)
139+
```
140+
141+
#### Send notifications: (Server)
133142

134-
temp_char.notify(b'optional data')
143+
```py
144+
# Notify with the current value.
145+
temp_char.notify(connection)
146+
```
135147

136-
await temp_char.indicate(timeout_ms=2000)
148+
```py
149+
# Notify with a custom value.
150+
temp_char.notify(connection, b'optional data')
137151
```
138152

139-
Query the value of a characteristic: (Client)
153+
#### Send indications: (Server)
154+
155+
```py
156+
# Indicate with current value.
157+
await temp_char.indicate(connection, timeout_ms=2000)
158+
```
159+
160+
```py
161+
# Indicate with custom value.
162+
await temp_char.indicate(connection, b'optional data', timeout_ms=2000)
163+
```
164+
165+
This will raise `GattError` if the indication is not acknowledged.
166+
167+
#### Wait for a write from the client: (Server)
168+
169+
```py
170+
# Normal characteristic, returns the connection that did the write.
171+
connection = await char.written(timeout_ms=2000)
172+
```
173+
174+
```py
175+
# Characteristic with capture enabled, also returns the value.
176+
char = Characteristic(..., capture=True)
177+
connection, data = await char.written(timeout_ms=2000)
178+
```
179+
180+
#### Query the value of a characteristic: (Client)
140181

141182
```py
142183
temp_service = await connection.service(_ENV_SENSE_UUID)
143184
temp_char = await temp_service.characteristic(_ENV_SENSE_TEMP_UUID)
144185

145186
data = await temp_char.read(timeout_ms=1000)
187+
```
188+
189+
#### Wait for a notification/indication: (Client)
190+
191+
```py
192+
# Notification
193+
data = await temp_char.notified(timeout_ms=1000)
194+
```
146195

196+
```py
197+
# Indication
198+
data = await temp_char.indicated(timeout_ms=1000)
199+
```
200+
201+
#### Subscribe to a characteristic: (Client)
202+
203+
```py
204+
# Subscribe for notification.
147205
await temp_char.subscribe(notify=True)
148206
while True:
149207
data = await temp_char.notified()
150208
```
151209

152-
Open L2CAP channels: (Listener)
210+
```py
211+
# Subscribe for indication.
212+
await temp_char.subscribe(indicate=True)
213+
while True:
214+
data = await temp_char.indicated()
215+
```
216+
217+
#### Open L2CAP channels: (Listener)
153218

154219
```py
155220
channel = await connection.l2cap_accept(_L2CAP_PSN, _L2CAP_MTU)
@@ -158,7 +223,7 @@ n = channel.recvinto(buf)
158223
channel.send(b'response')
159224
```
160225

161-
Open L2CAP channels: (Initiator)
226+
#### Open L2CAP channels: (Initiator)
162227

163228
```py
164229
channel = await connection.l2cap_connect(_L2CAP_PSN, _L2CAP_MTU)

micropython/bluetooth/aioble/aioble/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def notify(self, connection, data=None):
257257
raise ValueError("Not supported")
258258
ble.gatts_notify(connection._conn_handle, self._value_handle, data)
259259

260-
async def indicate(self, connection, timeout_ms=1000):
260+
async def indicate(self, connection, data=None, timeout_ms=1000):
261261
if not (self.flags & _FLAG_INDICATE):
262262
raise ValueError("Not supported")
263263
if self._indicate_connection is not None:
@@ -270,7 +270,7 @@ async def indicate(self, connection, timeout_ms=1000):
270270

271271
try:
272272
with connection.timeout(timeout_ms):
273-
ble.gatts_indicate(connection._conn_handle, self._value_handle)
273+
ble.gatts_indicate(connection._conn_handle, self._value_handle, data)
274274
await self._indicate_event.wait()
275275
if self._indicate_status != 0:
276276
raise GattError(self._indicate_status)

micropython/bluetooth/aioble/manifest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# code. This allows (for development purposes) all the files to live in the
44
# one directory.
55

6-
metadata(version="0.3.1")
6+
metadata(version="0.4.0")
77

88
# Default installation gives you everything. Install the individual
99
# components (or a combination of them) if you want a more minimal install.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy