add bcst testcase
This commit is contained in:
100
src/qualification/GAP/BROB/BCST/test_bcst.py
Normal file
100
src/qualification/GAP/BROB/BCST/test_bcst.py
Normal file
@@ -0,0 +1,100 @@
|
||||
"""
|
||||
GAP/BROB/BCST/BV-01-C: Broadcaster role with non-connectable advertising.
|
||||
|
||||
Advertising with TSPX_advertising_data value (27 bytes):
|
||||
- Flags: BR/EDR Not Supported
|
||||
- 16-bit Service UUIDs: 0x1800, 0x1801
|
||||
- Local Name: "PTS-GAP-06B8"
|
||||
- Appearance: 0x0000
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
import os
|
||||
|
||||
import bumble.device
|
||||
import bumble.transport
|
||||
from bumble import hci
|
||||
from bumble.device import DeviceConfiguration, AdvertisingParameters, AdvertisingEventProperties
|
||||
|
||||
|
||||
async def run_broadcaster():
|
||||
"""Configure and start non-connectable advertising for GAP/BROB/BCST/BV-01-C."""
|
||||
|
||||
# Transport - adjust as needed for your setup
|
||||
transport_str = "serial:/dev/ttyAMA3,1000000,rtscts"
|
||||
|
||||
async with await bumble.transport.open_transport(transport_str) as (hci_source, hci_sink):
|
||||
# Device configuration
|
||||
device_config = DeviceConfiguration(
|
||||
name="PTS-GAP-06B8",
|
||||
address=hci.Address("F0:F1:F2:F3:F4:F5"),
|
||||
)
|
||||
|
||||
device = bumble.device.Device.from_config_with_hci(
|
||||
device_config,
|
||||
hci_source,
|
||||
hci_sink,
|
||||
)
|
||||
await device.power_on()
|
||||
|
||||
# Exact advertising data payload (27 bytes) as specified:
|
||||
# 0x02, 0x01, 0x04 - Flags: BR/EDR Not Supported
|
||||
# 0x05, 0x03, 0x00, 0x18, 0x01, 0x18 - 16-bit Service UUIDs: 0x1800, 0x1801
|
||||
# 0x0D, 0x09, 0x50, 0x54, 0x53, 0x2D, 0x47, - Complete Local Name: "PTS-GAP-06B8"
|
||||
# 0x41, 0x50, 0x2D, 0x30, 0x36, 0x42, 0x38
|
||||
# 0x03, 0x19, 0x00, 0x00 - Appearance: 0x0000
|
||||
adv_data = bytes([
|
||||
0x02, 0x01, 0x04, # Flags: BR/EDR Not Supported
|
||||
0x05, 0x03, 0x00, 0x18, 0x01, 0x18, # 16-bit Service UUIDs
|
||||
0x0D, 0x09, 0x50, 0x54, 0x53, 0x2D, 0x47, 0x41, # Local Name: "PTS-GAP-06B8"
|
||||
0x50, 0x2D, 0x30, 0x36, 0x42, 0x38,
|
||||
0x03, 0x19, 0x00, 0x00 # Appearance
|
||||
])
|
||||
|
||||
logging.info("Advertising data (%d bytes): %s", len(adv_data), adv_data.hex())
|
||||
|
||||
# Create advertising set with non-connectable parameters (ADV_NONCONN_IND equivalent)
|
||||
advertising_set = await device.create_advertising_set(
|
||||
advertising_parameters=AdvertisingParameters(
|
||||
advertising_event_properties=AdvertisingEventProperties(
|
||||
is_connectable=False, # Non-connectable (ADV_NONCONN_IND)
|
||||
is_scannable=False, # Not scannable
|
||||
is_directed=False,
|
||||
is_high_duty_cycle_directed_connectable=False,
|
||||
is_legacy=True, # Use legacy advertising PDUs
|
||||
is_anonymous=False,
|
||||
),
|
||||
primary_advertising_interval_min=0x0800, # 1.28s
|
||||
primary_advertising_interval_max=0x0800, # 1.28s
|
||||
primary_advertising_phy=hci.Phy.LE_1M,
|
||||
),
|
||||
advertising_data=adv_data,
|
||||
auto_start=True,
|
||||
)
|
||||
|
||||
logging.info("Non-connectable advertising started (ADV_NONCONN_IND)")
|
||||
logging.info("Advertising set handle: %s", advertising_set.advertising_handle)
|
||||
|
||||
# Keep advertising until interrupted
|
||||
logging.info("Press Ctrl+C to stop...")
|
||||
try:
|
||||
while True:
|
||||
await asyncio.sleep(1)
|
||||
except asyncio.CancelledError:
|
||||
pass
|
||||
finally:
|
||||
await advertising_set.stop()
|
||||
logging.info("Advertising stopped")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
logging.basicConfig(
|
||||
level=os.environ.get("LOG_LEVEL", logging.INFO),
|
||||
format="%(module)s.py:%(lineno)d %(levelname)s: %(message)s",
|
||||
)
|
||||
|
||||
try:
|
||||
asyncio.run(run_broadcaster())
|
||||
except KeyboardInterrupt:
|
||||
logging.info("Interrupted by user")
|
||||
Reference in New Issue
Block a user