kopia lustrzana https://github.com/micropython/micropython-lib
106 wiersze
2.3 KiB
Python
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()
|