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)