Отправка данных с nRF52840 на машину Windows 10 с помощью бле - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь отправить простые пакеты данных на 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

...