tzok wrote:ylko jak to pogodzić z Arduino? Jeśli ma się przyjąć wśród amatorów, to moim zdaniem, musi działać na bazowym Arduino (ATMega 328PU) i pozostawiać jeszcze miejsce na program użytkownika.
To akurat nie jest problemem. Robisz nagłówki w C (export "C") i dodajesz do Arduino prekompilowany lib na ATM328. Prościej się nie da. Masz same zalety - zwięzłość kodu i prostota użycia poprzez wyeksportowane funkcje.
tzok wrote:Jeden moduł ma własne MCU, który załatwia kodowanie, a może i adresację fizyczną i filtrowanie ramek, pozostaje tylko puścić bitstream na UART, czy SPI (i to jest jego warstwa fizyczna, bo oprogramowanie modułu jest zamknięte), a w innym module, musisz sobie kluczować tranzystorem w nadajniku (może trochę przesadzam). W drugą stronę jest chyba łatwiej - idziemy do warstwy aplikacji, czyli mamy metodę, która przyjmie wiadomość w formie ciągu znaków, czy tablicy bajtów i ją skutecznie prześle, pod wskazany adres (zajmując się jej podziałem na ramki, kontrolą błędów, potwierdzeniami, retransmisją).
Od tej strony (znaczy od góry, a może raczej od środka) bym poszedł. Kilka prostych funkcji umożliwiających wymianę danych. A potem co raz niżej, jak nisko to zależy od użytego modułu. To co wspiera w hardware wykorzystuje sterownik modułu. To czego hardware nie załatwia, załatwia załączony soft. W oparciu o taką koncepcję spokojnie udało mi się napisać prosty kod, który działa z RS485, RFM22, RFM63, z minimalnymi tylko zmianami w funkcjach operujących na sprzęcie.
Jeśli chodzi o protokół to:
- musi być możliwość nadawania z Ack lub bez, jeśli z Ack to automatyczne retransmisje,
- długość pakietu proponuję w zakresie 32-64 bajty - tak jak pisał Atom, powyżej zaczynają się kłopoty,, konieczność retransmisji, która wzrasta wykładniczo ze wzrostem długości pakietu, pojawia się problem zajętości RAM na bufory i po prostu jest to zbędne w większości transmisji. Dłuższe porcje danych można automatycznie segmentować na takie bloki.
- Adres - proponuję 8/16 bitowy (8 bitów adres urządzenia i 8 bitów opcjonalnie - adres sieci). Jeśli ktoś będzie miał powyżej 65000 urządzeń to i tak trzeba to podzielić na segmenty i zorganizować odpowiedni routing między nimi i to można załatwić zupełnie innym protokołem lub dodając kolejną warstwę. Długie adresy, np. 32-bitowe powodują, że już 8 bajtów jest zajęte na same adresy, a przy IoT jak mamy payload kilkubajtowy, to IMHO niepotrzebne.
- TTL pakietu - warto rozważyć, ale chyba też tylko jako opcję - warstwę nadawaną przez urządzenie routujące do innej podsieci.
- szyfrowanie - jak najbardziej, proponuję od razu przyjąć AES128. Tu proponuję osobny temat dotyczący dystrybucji kluczy. Pytanie (co zaproponował Atom) - o szyfrowanie adresu źródła i przeznaczenia. Szyfrowanie tych pól spowoduje, że wszystkie urządzenia muszą odebrać pakiet i go zdeszyfrować, co jest kosztowne. Nie wiem na ile taka opcja jest uzasadniona? Ale to też ciekawy temat na osobną dyskusję.