blob: 99ed359da5a910235696417c8290d4b1c5b5a2ff [file] [log] [blame]
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -07001# Copyright 2021-2022 Google LLC
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15# -----------------------------------------------------------------------------
16# Imports
17# -----------------------------------------------------------------------------
18import asyncio
19import sys
20import os
21import logging
22from colors import color
Gilles Boccon-Gibodc2959da2022-12-10 09:29:51 -080023from bumble.device import Device
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -070024from bumble.transport import open_transport
25from bumble.profiles.heart_rate_service import HeartRateServiceProxy
26
27
28# -----------------------------------------------------------------------------
29async def main():
30 if len(sys.argv) != 3:
31 print('Usage: heart_rate_client.py <transport-spec> <bluetooth-address>')
32 print('example: heart_rate_client.py usb:0 E1:CA:72:48:C4:E8')
33 return
34
35 print('<<< connecting to HCI...')
36 async with await open_transport(sys.argv[1]) as (hci_source, hci_sink):
37 print('<<< connected')
38
39 # Create and start a device
40 device = Device.with_hci('Bumble', 'F0:F1:F2:F3:F4:F5', hci_source, hci_sink)
41 await device.power_on()
42
43 # Connect to the peer
44 target_address = sys.argv[2]
45 print(f'=== Connecting to {target_address}...')
Jayson Messenger9cd18902022-07-26 10:34:37 -040046 async with device.connect_as_gatt(target_address) as peer:
47 print(f'=== Connected to {peer}')
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -070048
Jayson Messenger9cd18902022-07-26 10:34:37 -040049 heart_rate_service = peer.create_service_proxy(HeartRateServiceProxy)
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -070050
Jayson Messenger9cd18902022-07-26 10:34:37 -040051 # Check that the service was found
52 if not heart_rate_service:
53 print('!!! Service not found')
54 return
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -070055
Jayson Messenger9cd18902022-07-26 10:34:37 -040056 # Read the body sensor location
57 if heart_rate_service.body_sensor_location:
58 location = await heart_rate_service.body_sensor_location.read_value()
59 print(color('Sensor Location:', 'green'), location)
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -070060
Jayson Messenger9cd18902022-07-26 10:34:37 -040061 # Subscribe to the heart rate measurement
62 if heart_rate_service.heart_rate_measurement:
63 await heart_rate_service.heart_rate_measurement.subscribe(
Gilles Boccon-Gibod135df0d2022-12-10 08:53:51 -080064 lambda value: print(
65 f'{color("Heart Rate Measurement:", "green")} {value}'
66 )
Jayson Messenger9cd18902022-07-26 10:34:37 -040067 )
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -070068
Jayson Messenger9cd18902022-07-26 10:34:37 -040069 await peer.sustain()
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -070070
71
72# -----------------------------------------------------------------------------
Gilles Boccon-Gibod135df0d2022-12-10 08:53:51 -080073logging.basicConfig(level=os.environ.get('BUMBLE_LOGLEVEL', 'DEBUG').upper())
Gilles Boccon-Gibod3040df32022-07-23 09:38:44 -070074asyncio.run(main())