Skocz do zawartości

YABLE - Debugger BLE na Windowsa


Pomocna odpowiedź

Napisano (edytowany)

Opis

Już od jakiegoś czasu projektuję urządzenia używające BLE i strasznie męczące było zawsze ich testowanie. Wszystkie aplikacje / debuggery, których używałem albo działały bardzo topornie (i często nie znajdowały urządzeń), nie wyświetlały deskryptorów, miały beznadziejny UX albo występowały jeszcze jakieś inne efekty uboczne.

Najlepszą aplikacją jaką udało mi się znaleźć był BLE Hero, ale niestety też miał jedną wadę. Nie korzystał z deskryptora CUD (Custom User Descriptor) by wyświetlić nazwę danej charakterystyki (typowe zastosowanie dla tego deskryptora) i odpowiednich usług/charakterystyk musiałem szukać po identyfikatorach.

Postanowiłem więc wykorzystać to, że obecnie kod jest tani i stworzyć sobie prosty debugger BLE wykorzystując ChatGPT Codex (generatywne SI) oraz Pythona. 

obraz.thumb.png.8774f0c67d14c307292f2e91dda309f8.png
Panel debuggera

Funkcjonalność

  • Automatyczne rozpoznawanie usług/charakterystyk po UUID oraz wyświetlanie nazwy z CUD.
  • Wyświetlanie nazwy firmy oraz prezencji urządzenia, gdy są dostępne (np. mój iPhone wyświetla jako Apple Inc.; niestety iPhone nie zgłasza się jako telefon)
  • Standardowe opcje odczytu/zapisu, podłączenia subskrypcji pod notyfikacje i przestawianie trybu odczytu (ASCII, BIN, OCT, DEC, HEX, data)

Jak to powstało?

Samo wykonanie debuggera zajęło mi trzy rozmowy z AI (przy czym jedna z nich to było porządkowanie, a druga to dodanie kilku "bajerów"). Oryginalny prompt wyglądał następująco:

Cytat

Create a BLE debug application.
Color scheme: same as Codex application (modern with cyan accents)
Main screen: list of BLE devices which are advertised and discovered with time display since last advertisement was received, RSSI display (with signal icon) and option to connect and discover GATT
After device is connected: GATT discovery, display of all services - Service name (if name descriptor is found or "BLE Service" otherwise), display of all characteristics same way, on right of each characteristics its value is displayed (if read is available), write button is displayed (if characteristics is writable) and notify enable button is available for automatic notification handling (same as read)
Services should be foldout groups with foldout triangles on left.
Characteristic value on right click should be changable between different formats (HEX, DEC, OCT, BIN, ASCII, DATETIME), same formats should be available in Write dialog that pops-up upon "Write" button is clicked.

Feel free to AskUserQuestion if necessary.

Krótko, zwięźle i na temat. Po tym prompcie większość problemów to były bugi graficzne, które Codex naprawił po kolejnym zapytaniu w tej samej rozmowie.

Cytat

1. Improve panel background color, it's too weird
2. Replace BLE Debugger with logo
3. Remove top bar and add minimize/maximize/close icons in top right corner
4. RSSI icon is bugged

Potem, w drugiej rozmowie postanowiłem dodać "bajery" w postaci automatycznego rozpoznawania popularnych identyfikatorów UUID (np. usług termometru etc.), które są opisane w dokumentacji BLE. Do tego celu z pomocą przyszły pliki od Nordic Semiconductors, które zawierały wszystkie niezbędne dane i to ustrukturyzowane w formacie JSON.

Cytat

Implement automatic loading of standardized UUIDs based on provided project: https://github.com/nordicsemi/bluetooth-numbers-database/tree/master You can copy JSON files provided in this repository to ./data/uuids directory. It would be great to also add support for displaying Company Name, GAP Appearance on device selector (maybe rework device selector from current list to more card-like?) and add Descriptors reading/writing ability on right panel, descriptors for services should be after characteristics and descriptors for characteristics should be in foldout group (triangle on left of characteristic name), collapsed by default.

Kolejnym problemem okazało się, złe umieszczenie deskyptorów, które zawsze lądowały na samym końcu usługi, zamiast po charakterystyce, której dotyczą. Widać mój opis był niezbyt precyzyjny. Poprawienie tego chwilę zajęło:

Cytat

Descriptor display is broken. All descriptors are displayed at end of service, but only service descriptors should be moved to end. Characteristic descriptors should be displayed after their characteristic (when foldout is open).

Cytat

Characteristic descriptors are still in wrong place.

Ostatnim dodatekiem z drugiej rozmowy było zrobienie autołączenia na dwukliku (drobny UX).

Cytat

Also add automatic connection to device when its card is clicked twice using LMB.

Finalna rozmowa to było szlifowanie repo, by było bardziej czytelne (rozbicie plików) i drobne poprawki UX:

Cytat

Can we split main.py into smaller chunks located in subdirectories? Especially UI components: ui/panels/devices/panel.py ui/panels/devices/header.py ui/panels/devices/device_card.py ui/main/header.py ui/panels/gatt/header.py ui/panels/gatt/panel.py ui/panels/gatt/service_header.py ui/panels/gatt/characteristic_card.py ui/panels/gatt/descriptor_card.py Also extract database helpers into helpers/data/uuids.py Perform other extractions you find necessary too.

Cytat

Add scroll-wheel support for scrolling both panels.

Cytat

Add window resize handler in right bottom corner of main panel.

Cytat

Can we replace icons with FontAwesome ones? 
https://pypi.org/project/tkfontawesome/

This package seems good for this purpose.

Oczywiście nie wszystko poszło tak ładnie i potrzebne były drobne poprawki:

Cytat

1. Minimize/maximize/close icon scale is broken (too small)
2. BT Logo icon is slightly too big
3. Connect+GATT is missing last T on display and icon is not separated by space
4. Foldout icon when collapsed is bigger than when open

Cytat

1. When descriptors are not available and foldout icon is disabled name of characteristic is significantly moved to right (same appears in fallback path, but for all characteristics, in such case even foldout group icon is moved to right)
2. Replace "Connect + GATT" with regular "Connect", this will solve trunct issues
3. Resizing is laggish, wait for resize completion before re-drawing

Cytat

Okay wait for resize caused significant issue...
1. When any part of window (including device panel) is scaled we should hide contents of panels to improve performance because redrawing them is very costly.

Cytat

We should also make resize handler icon a bit bigger and maybe use FontAwesome icon for that (if there's any suitable)

Cytat

This icon looks bad. It should be a corner-like icon pointing towards right bottom corner while ensuring it won't cover any panel.

Cytat

1. Device card is colliding with device panel scroll bar. 2. We should somehow indicate connected device card.

Jak widać generatywne AI zachowuje się jak Junior z wiedzą Seniora. Często potrzebuje dość precyzyjnych instrukcji, ale patrząc z perspektywy czasu przez ostatnie pół roku nastąpił ogromny skok jakościowy. Niestety zapowiada się, że ceny AI znacząco się podniosą.

Cache w AI

W przypadku korzystania z AI ważne jest roztropne korzystanie z opcji "cache", która przechowuje rozmowę przez krótki czas po ostatnim zapytaniu. Pozwala to na zmniejszenie kosztów rozmowy, gdyż np. po 5h wymagane jest już wczytanie całej rozmowy od zera, co pochłania ogromne ilości tokenów. Oczywiście należy stosować takie zabiegi z umiarem, gdyż możemy osiągnąć limit kontekstu (ilość danych w rozmowie), co poskutkuje zmniejszeniem jakości, a potem kompresją rozmowy.

Ogólną zasadą jest, by dla jednej funkcjonalności stosować jedną rozmowę. Jeżeli ta funkcjonalność dotyka miejsca, w którym chcemy inną funkcjonalność możemy kontynuować w tym samym wątku. W innym przypadku rozpoczynamy nową rozmowę.

Post Scriptum

Projekt jest prosty i jest to odgrzewanie kotleta, ale czasem lepiej mieć narzędzia dostosowane do siebie niż męczyć się z czymś ogólnodostępnym. Plusem dla mnie jest to, że projekt działa na Windowsie i nie muszę za każdym razem sięgać po telefon, by coś przetestować (a iPhone ma jeszcze tendencję, że BLE trzeba wyłączać za każdym razem w ustawieniach, a nie na szybkim panelu, bo inaczej uruchomi się ponownie po 24h).

Najpewniej jeszcze pozostało tam kilka błędów (jak to przy kodzie w 100% wygenerowanym przez AI), ale prędzej czy później wyjdą na wierzch i się je załata 🙂 

Edytowano przez H1M4W4R1
  • Lubię! 1
  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...