Na razie napisałem z grubsza warstwę niskopoziomową tj. automatyczne przechodzenie w stan RX po wysłaniu pakietu lub potwierdzenia, odczyt danych z FIFO RFM'a po nadejściu rozkazu, obsługę CSMA ze slotami czasowymi i losowym wyborem slotu oraz timingi na oczekiwanie na odpowiedź - i jeśli nie przyjdzie w ustalonym czasie, zgłoszenie błędu do warstwy wyższej.
Przy czym są dwa rodzaje response - krótki 1 bajtowy, potwierdzający tylko poprawne odebranie pakietu, oraz drugi 'długi', który jednocześnie zwraca dane (jeśli życzy ich sobie nadawca).
Tak, żeby nie marnować czasu na dodatkowy rozkaz typu "przyślij dane".
I to jak wydaje się działa OK.
Żeby uniknąć sytuacji, że któryś z nadajników asynchronicznych może się władować ze swoim pakietem w moment między wysłaniem pakietu, a response, ustaliłem minimalny czas oczekiwania po wykryciu wolnej linii zanim rozpocznie się nadawanie, na dłuższy niż czas rozpoczęcia wysyłania response (plus oczywiście losowe sloty czasowe, ale z tą losowością to bym nie przesadzał dla liczby 4 bitowej
).
Przy kolejnych powtórkach wymyśliłem sobie, że nadawca będzie stopniowo zwiększał moc nadawania po każdej powtórce.
Pakiet jest o zmiennej długości - o jego wielkości powiadamia odbiorcę bajt 'length' - wykorzystałem tutaj sprzętową właściwość RFM'ów.
Wielkość pakietu max 64bajty danych (tyle ile się mieści jednorazowo w buforze FIFO.
Tak to mniej więcej wygląda.
Warstwa wyższa jeszcze nie jest napisana - trzeba ją dopiero wymyślić
Z tymi sesjami to możesz mieć rację
- czytałem o zastosowaniu RTC/CTS w protokole CSMA/CA, aczkolwiek jak piszą "nie wszyscy to implementują".
Jak rozumiem, po wysłaniu żądania dostępu RTS do odbiorcy, odbiorca wysyła potwierdzenie CTS do nadawcy, ale jednocześnie jest to broadcast do wszystkich w sieci, żeby wstrzymali się ze swoimi próbami nadawania (czyli otwarcie kanału dostępu 1-na-1)?
Mówisz, że to musi być z time-out'em, żeby nie zablokować sieci?
Zastanawiam się jeszcze nad sposobem zaimplementowania automatycznego logowania urządzeń/nowych urządzeń w sieci po włączeniu ich zasilania.
Generalnie - mimo protokołu wielodostępowego chciałem, aby był jakiś sterownik nadrzędny (Master Controller), który mógłby być jednocześnie bramką do innych sieci (np. różne sieci bezprzewodowe, ethernet) oraz mógł on sterować pracą urządzeń na podstawie jakiś zdarzeń, itp...
Z drugiej strony intersująca byłaby inteligencja rozproszona, gdzie każde urządzenie mogłoby gadać z każdym niezależnie od MC.
Jeszcze nie mam ostatecznej koncepcji
Może da się zmieszać jedno z drugim.
W tym kontekście "logowanie do sieci" musi wyglądać trochę inaczej dla każdego z rodzajów.
Na szczęście moduły oferują możliwość rozkazów typu broadcast, więc można porobić kategorie urządzeń - i w przypadku logowania do sieci z rozproszoną inteligencją można by informować o swojej obecności tylko pewną grupę urządzeń (takim grupowym rozkazem) - tą którą taka obecność "może zainteresować".
Z drugiej strony - co rozumieć przez "zalogowanie do sieci" - bo jeżeli nowe urządzenie ma być "wpięte w ciąg zdarzeń" jaki się w sieci rozgrywa, to nie unikniemy chyba ręcznej konfiguracji "jak na jakie zdarzenie ma dane urządzenie reagować"?
Chyba, że przez zalogowanie rozumieć tylko "hej, nie bylem dostępny, ale już jestem, jak mieliście do mnie jakieś sprawy, to czekam na rozkazy"
Generalnie ma to służyć do automatyki domowej - na razie nic do końca nie jest jeszcze ustalone