Я пытаюсь отправить простые пакеты данных на Windows 10 с микроконтроллера nRF52840 (Adafruit bluefruit Feather). Я пробовал разные библиотеки (pybluez, blatann), но добился наибольшего прогресса, используя bleak на машине Windows и adafruit_ble на nRF52840. Теперь я могу обнаружить и подключиться к nRF52840, но не могу понять, как на самом деле отправлять какие-либо данные, и мрачная документация кажется довольно тупой. Я подозреваю, что пропускаю базовый шаг c, но не могу понять, что это такое. В текущем коде данные, которые должны быть отправлены nRF52840 и получены windows, представляют собой простую строку «ken unreal», но в конечном итоге это будет массив целых чисел.
Windows 10 код:
import asyncio
from bleak import discover
from uuid import UUID
devices = []
async def scan():
dev = await discover()
for i in range(0,len(dev)):
print("["+str(i)+"]"+str(dev[i]))
devices.append(dev[i])
from bleak import BleakClient
async def connect(address, loop):
async with BleakClient(address, loop=loop) as client:
services = await client.get_services()
for ser in services:
if ser.description == 'Nordic UART Service':
print(f'Service UUID {ser.uuid}')
print(ser.description)
# client.read_gatt_char(ser.uuid)
loop = asyncio.get_event_loop()
loop.run_until_complete(scan())
index = input('please select device from 0 to '+str(len(devices))+":")
index = int(index)
loop.run_until_complete(connect(devices[index].address, loop))
print('complete')
Adafruit bluefruit nRF52840 код:
# import board
import time
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
# from adafruit_bluefruit_connect.packet import Packet
# from adafruit_bluefruit_connect.color_packet import ColorPacket
print('started')
ble = BLERadio()
uart_server = UARTService()
advertisement = ProvideServicesAdvertisement(uart_server)
while True:
print("WAITING...")
# Advertise when not connected.
ble.start_advertising(advertisement)
while not ble.connected:
pass
# Connected
ble.stop_advertising()
while ble.connected:
msg = 'ken unreal'
print(msg)
uart_server.write(msg)
time.sleep(1)
Выход Windows:
PS C:\Users\ggoldrick\Projects\cp_timing_gates> & "C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python37_64/python.exe" c:/Users/ggoldrick/Projects/cp_timing_gates/desktop_app/ble_connect.py
[0]D4:38:B6:FD:63:5F: CIRCUITPY635f
[1]50:0C:D3:B7:77:9A: Apple, Inc. (b'\x10\x05Q\x1ck\x08\xfe')
[2]04:F9:BD:F5:21:E5: Microsoft (b"\x01\t \x02'\xe5\xf6\xa4\xfa\x9f]n\xea8v\xb4\x1d|\x84\xe6*:\xc3\xdas&\xc6")
please select device from 0 to 3:0
Service UUID 6e400001-b5a3-f393-e0a9-e50e24dcca9e
Nordic UART Service
complete
PS C:\Users\ggoldrick\Projects\cp_timing_gates>
Выход nRF52840:
started
WAITING...
ken unreal
ken unreal
...
WAITING...
Библиотека adafruit_ble реализует услугу Nordi c UART, но я не могу понять, как получать данные из этой службы с помощью мрачного, и я не могу найти никаких примеров.
Все это легко сделать с помощью Linux, но Windows такая боль, и, к сожалению, для этого проекта она должна быть windows. Любые идеи будут с благодарностью.
Thx