micropython-lib/micropython/bluetooth/aioble/multitests/perf_l2cap.py

106 wiersze
2.3 KiB
Python

import sys
sys.path.append("")
from micropython import const
import time, machine
import uasyncio as asyncio
import aioble
import bluetooth
import random
TIMEOUT_MS = 5000
_L2CAP_PSM = const(22)
_L2CAP_MTU = const(512)
_PAYLOAD_LEN = const(_L2CAP_MTU)
_NUM_PAYLOADS = const(20)
_RANDOM_SEED = 22
# Acting in peripheral role.
async def instance0_task():
multitest.globals(BDADDR=aioble.config("mac"))
multitest.next()
connection = await aioble.advertise(
20_000, adv_data=b"\x02\x01\x06\x04\xffMPY", timeout_ms=TIMEOUT_MS
)
channel = await connection.l2cap_accept(_L2CAP_PSM, _L2CAP_MTU, timeout_ms=TIMEOUT_MS)
random.seed(_RANDOM_SEED)
buf = bytearray(_PAYLOAD_LEN)
for i in range(_NUM_PAYLOADS):
for j in range(_PAYLOAD_LEN):
buf[j] = random.randint(0, 255)
await channel.send(buf)
await channel.flush()
await asyncio.sleep_ms(500)
await channel.disconnect()
# Disconnect the central.
await connection.disconnect()
def instance0():
try:
asyncio.run(instance0_task())
finally:
aioble.stop()
# Acting in central role.
async def instance1_task():
multitest.next()
device = aioble.Device(*BDADDR)
connection = await device.connect(timeout_ms=TIMEOUT_MS)
await asyncio.sleep_ms(500)
channel = await connection.l2cap_connect(_L2CAP_PSM, _L2CAP_MTU, timeout_ms=TIMEOUT_MS)
random.seed(_RANDOM_SEED)
buf = bytearray(_PAYLOAD_LEN)
recv_bytes, recv_correct = 0, 0
expected_bytes = _PAYLOAD_LEN * _NUM_PAYLOADS
ticks_first_byte = 0
while recv_bytes < expected_bytes:
n = await channel.recvinto(buf)
if not ticks_first_byte:
ticks_first_byte = time.ticks_ms()
recv_bytes += n
for i in range(n):
if buf[i] == random.randint(0, 255):
recv_correct += 1
ticks_end = time.ticks_ms()
total_ticks = time.ticks_diff(ticks_end, ticks_first_byte)
print(
"Received {}/{} bytes in {} ms. {} B/s".format(
recv_bytes, recv_correct, total_ticks, recv_bytes * 1000 // total_ticks
)
)
# Wait for the peripheral to disconnect us.
await connection.disconnected(timeout_ms=20000)
def instance1():
try:
asyncio.run(instance1_task())
finally:
aioble.stop()