Witam,
Zaczalem wreszcie finalne prace nad w/w protokolem, ale w trakcie tworzenia po przeanalizowaniu sposobu dzialania niektorych procedur, odkrylem ze niestety pewne moje zalozenia chyba nie dadza sie zrealizowac w praktyce. No i wlasnie pytanie - czy rzeczywiscie jest to nierozwiazywalne - moze ktos ma jakis pomysl? Po krotce w czym rzecz. Otoz zalozylem sobie, ze protokol transmisji przez siec 220V bedzie typu CSMA/CD. Opieralem sie tu na protokole LonTalk jesli chodzi o samo CSMA/CD. Zalozylem sobie jednak jedna rzecz dodatkowa - a mianowicie sposob obslugi powtorzen, ktore zdarzaja sie gdy nastapi jakies zaklocenie. Przesyanie danych wyglada nastepujaco: Nadawca przesyla pakiet, odbiorca po poprawnym odebraniu pakietu odsyla potwierdzenie. Jezeli nastapi jakies zaklocenie - nadawca nie dostaje potwierdzenia lub jest bledne, wiec ponawia przesylanie - az do 3 prob. Otorz moze sie zdarzyc nastepujaca sytuacja: po poprawnym przeslaniu pakietu, odbiorca wysyla potwierdzenie, ktore jednak z powodu zaklocenia nie jest poprawnie odebrane przez nadawce. Nadawca wiec ponawia wysylanie. Jest jednak jedno male ale - odbiorca, z ktorego punktu widzenia pakiet zostal poprawnie przeslany (odebrany), wykonuje rozkaz jaki byl mu przeslany. Przy ponownym przeslaniu pakietu (2 proba) tez pakiet zostaje odebrany dobrze i wowczas odbiorca wykonuje jeszcze raz ten sam rozkaz - mimo, ze nadawca tak naprawde wysylal tylko jeden pakiet, tyle ze z powodu bledu transmisji powtorzony.
Oczywiscie - mozna zalozyc , ze dwukrotne wykonanie tego samego rozkazu nie przeszkadza. Czasami sa jednak rozkazy typu "toggle", ktorych dzialanie polega na "zmien stan na przeciwny". Wowczas podwojne wykonanie rozkazu sprawi, ze jeden rozkaz wlaczy urzadzenie, a drugi je wylaczy.
Aby temu zaradzic umyslilem sobie tzw. serializacje czyli numerowanie kolejnych takich samych pakietow. I tak pakiet pierwszy ma nr 0, a kolejne o numer wyzej. Odbiornik ma zatem mozliwosc stwierdzenia, czy dany pakiet jest tym pierwotnym czy tez kolejna powtorka - zatem jesli wykonal rozkaz po pierwszym pakiecie, ale nadawca nie uslyszal odpowiedzi i wyslal drugi raz ten sam pakiet, to za tym drugim razem powinien wyslac potwierdzenie, ale rozkazu nie wykonywac.
Udalo mi sie opracowac sposob jak to zrobic, ale niestety to dziala tylko w obrebie jednego pakietu i kolejnych po nim powtorek.
Problem jest z odroznieniem powtorki od kolejnego tzw. nowego pakietu. Nie wiadomo jak stwierdzic ze nadawca skonczyl juz nadawac powtorki, a zaczal nowy pakiet - zwlaszcza, ze tych powtorek moze byc rozna ilosc - raz wcale, raz 1 raz 2... a dodatkowo pakiety moga byc roznych dlugosci od 1 do
64 bitow danych + bajt kontrolny, adresy i CRC.No i ugrzazlem - wyglada na to , ze trzeba by zrezygnowac z serializacji i pozwolic na sytuacje gdy czasami bedzie sie kilkakrotnie wykonywal ten sam rozkaz - tylko nie dopuscic rozkazow typu toggle. Jednak to powazne ograniczenie, bo nie mozna sobie wyobrazic wowczas rozkazu typu "zwieksz glosnosc o 5" - bo po podwojnym wykonaniu glosnosc zwiekszy sie o 10. Musialby byc zastapiony rozkazem np "ustaw glosnosc na 50".
Moze ktos ma pomysl jak sobie z tym poradzic? Nie wspominam tutaj o calej masie rzeczy typu wykrywanie nosnej, bledow transmisji i roznych zwlok typu time-out, ale to juz inny temat.