Popularny post H1M4W4R1 Napisano 5 czerwca Popularny post Udostępnij Napisano 5 czerwca (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. 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 5 czerwca przez H1M4W4R1 3 1
H1M4W4R1 7 czerwca Autor tematu Udostępnij 7 czerwca 23 minuty temu, _LM_ napisał: Przydałby się link do repozytorium z tą aplikacją Zapomniało mi się Proszę tutaj 2
orb777 8 czerwca Udostępnij 8 czerwca (edytowany) Fajna aplikacja. Na linuxie też działa, ale jest jakiś problem z oknem, nie minimalizuje się, tylko zawiesza. Szkoda, że nie ma interfejsu webowego. Edytowano 8 czerwca przez orb777 1
H1M4W4R1 8 czerwca Autor tematu Udostępnij 8 czerwca (edytowany) 5 godzin temu, orb777 napisał: Na linuxie też działa, ale jest jakiś problem z oknem, nie minimalizuje się, tylko zawiesza. Tk jak to tk... zawsze coś pójdzie nie tak. Zrobiłem port na PyQt6, możesz przetestować jeżeli chcesz (jest już na GH). A i przy okazji nieco poprawiłem UX, bo IMO przyciski od łączenia na panelu po lewej były dziwne. EDIT: Kilka drobnych poprawek, ładne wyświetlanie nazw usług, gdy dostępna jest charakterystyka z deskryptorem "Service Name", ikonka oraz przerzucenie statusu na dół aplikacji, bo tutaj lepiej pasuje (plus dostęp do dziennika zdarzeń po podwójnym kliknięciu). Edytowano 8 czerwca przez H1M4W4R1 2
H1M4W4R1 8 czerwca Autor tematu Udostępnij 8 czerwca Do kompletu dorobiłem bleid - konsolowe narzędzie do generowania UUID na podstawie nazwy urządzenia (oraz do zapisywania nazw na dysku, co by nie zaliczyć jakiejś nieplanowanej kolizji). Czemu nie okienkowe, a konsolowe - by agenci AI mogli sobie z niego spokojnie korzystać do generowania identyfikatorów 2
H1M4W4R1 9 czerwca Autor tematu Udostępnij 9 czerwca 37 minut temu, orb777 napisał: Lol... ciekawy przypadek masz tam otwarty
orb777 9 czerwca Udostępnij 9 czerwca @H1M4W4R1, tani gamepad. Ulepiłem do niego bibliotekę w uPy, ale nie zawsze zaskakuje szyfrowanie. Twoje narzędzie będzie pomocne, sniffer ble (nRF52840) też. 1
Pomocna odpowiedź
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ę »