środa, 1 sierpnia 2018

VIRUINO contra BLYNK > runda 2 < DANE

VIRTUINO - ten niewielki, niesłychanie prosty system zawarty w kilkuset liniach kodu uzupełniony niesamowitą telefoniczną aplikacją mocno zafrapował mnie swoimi możliwościami. Kilkaset linii kodu wystarcza by stworzyć elegancki serwer i bibliotekę obsługi mikroprocesora.
A ile linii kodu zajmuje BLYNK by udostępnić podobne funkcje? 5 ? 10 x więcej?
Postanowiłem więc przyjrzeć się temu programowi bliżej. Dziś o wymianie danych pomiędzy telefoniczną aplikacją  VIRTUINO a mikrokontrolerem.


DANE


VIRTUINO operuje na trzech typach zmiennych

  • binarne (bool)
  • liczby rzeczywiste zmiennoprzecinkowe (float)
  • ciągi tekstowe (string)

Każdy typ zmiennej przesyłany jest innym poleceniem z/do mikrokontrolera. Zdecydowana większość widgetów aplikacji może przyjmować lub wysyłać zarówno dane binarne jak i liczbowe ale nie jednocześnie gdyż wybór typu obsługiwanej zmiennej następuje na etapie konfiguracji elementu. Dane tekstowe przesyłane do aplikacji (APP) obsługuje tylko element o nazwie "Terminal". Wysyłanie danych do urządzenia (uC) jest możliwe widgetem "Text command".

VIRTUINO podobnie jak BLYNK przesyła dane za pomocą pinów. Tym sposobem przesyłane ( i zapamiętywane w mikrokontrolerze) są dane bitowe i liczbowe.
Dane typu string przysyłane są tak zwanymi kanałami.

Jak to działa w praktyce?



Na pierwszy rzut oka - dość zawile.
Każdy z typów zmiennych ma swoje procedury przekazywania danych. Dla zmiennych bitowych i liczbowych dane lądują w 32 wymiarowych tablicach służących jako bufor/ pamięć danych. Oznacza to, że do dyspozycji mamy po 32 wirtualne piny dla bitów i liczb. Z bufora dane zostaną przesłane do aplikacji w czasie okresowo wysyłanego żądania. Można dowiązać kilka widgetów i zmiennych do konkretnego pinu.

Wysyłanie / odbiór danych binarnych

Program użytkownika wysyła do aplikacji - a dokładniej  - umieszcza w tablicy danych  bitowych wartości za pomocą polecenia

   void vDigitalMemoryWrite(int digitalMemoryIndex, int value)

zaś odczytuje przesłane z telefonu dane bitowe poleceniem

   int  vDigitalMemoryRead(int digitalMemoryIndex)  

digitalMemoryIndex          to pozycja tablicy danych bitowych od 0 do 31
value                                   to wartość 0 , 1  lub  różne od 0 lub 1

Poprzez value możemy wysyłać liczby typu int  ale widgety w aplikacji potrafią wyświetlić jedynie trzy wartości: 0, 1 i inna liczba. Czemu więc autor zadeklarował tu dwu bajtową zmienną jeszcze nie wiem.



Wysyłanie / odbiór danych liczbowych

Wysłanie danych liczbowych do aplikacji następuje poleceniem

  void vMemoryWrite(int analogMemoryIndex, float value) 

zaś odbiór poleceniem

  float vMemoryRead(int analogMemoryIndex) 

Liczby przesyłane są w formacie float.  Dostępny w Arduino zakres zmiennej to
- 3.4028235E+38  do +3.4028235E+38

Typ float zawiera tylko 6 lub 7 cyfr znaczących. Jakie ma to znaczenie ?Wysyłając do aplikacji liczbę 999 999 990 na wyświetlaczu pojawi nam się okrągły miliard 1 000 000 000. Czy ma to jakieś znaczenie? Tak jeśli zależy nam na bardzo dużej dokładności lub przez liczbę przenosimy inną informacją złożoną z więcej niż z 7 cyfr. Należy o tym pamiętać i tego typu przypadki obsługiwać zmienną tekstową.



Wysyłanie / odbiór danych tekstowych

Teoretycznie  zmienne tekstowe przesyłane są bezpośrednio pomiędzy widgetami a zmiennymi programu. Teoretycznie, bo istnieje w programie bufor nadawania i obioru danych typu string analogiczny do bufora danych łącza szeregowego RS232. W buforze znajduje się tylko ostatnio przesłana wiadomość tekstowa wraz z numerem kanału do którego jest przypisana.
Kanał to nic innego jak etykieta dołączona do tekstu według której dowiązuje się nadawcę i odbiorcę wiadomości. Kanałów transmisji danych tekstowych jest łącznie 100 dla obu kierunków nadawania.

Wysyłanie danych tekstowych dokonujemy poleceniem

   void sendText(byte ID, String text); 

odbiór zaś

  String getText(byte ID);       gdzie ID  jest numerem kanału

Jaka jest maksymalna długość tekstu? Jeszcze nie wiem. Cała komenda przesyłana do aplikacji domyślnie powinna zawierać się w 80 znakach. Sądzę że maksymalna długość tekstu nie powinna przekraczać 50-60 znaków. (do sprawdzenia)

W elegancji i łatwości operowania różnymi typami zmiennych BLYNK bije na głowę VIRTUINO. Możliwość ładowania do pinu dowolnego typu danych i ich dowolna konwersja na wyjściu daje ogromną elastyczność i swobodę programowania. VIRTUINO nadrabia tę różnicę rozbudowanymi możliwościami konfiguracji widgetów powalając uzyskać efekty zbliżone do tych w aplikacji BLYNKa.

Protokół wymiany danych


Elementy systemu BLYNK komunikują się własnym protokołem nałożonym na protokół TCP/IP. Można przyjąć, iż połączenie elementów jest stale online toteż opóźnienia w przekazywaniu informacji we wszystkich kierunkach są stosunkowo niewielkie rzędu dzięsiątek czy setek ms i zależą głównie od opóźnień w sieci Internet.

VIRTUINO wykorzystuje (najprawdopodobniej) standardową usługę REST na bazie protokołu HTTP.  Z tego co widać jest to metoda GET do wysyłania i pobierania danych z serwera WWW (zainstalowanego w mikroprocesorze) przez klienta telefonicznej aplikacji. Oznacza to, iż ZAWSZE połączenie nawiązuje klient (telefon) niezależnie od kierunku przesyłanych danych. Taka konstrukcja protokołu transmisji danych daje w konsekwencji to, że dane z aplikacji do mikrokontrolera wysyłane są natychmiast po zmianie stanu widgeta. Zaś w odwrotnym kierunku zamiany na portach lub zmiennych w programie mikroprocesora pobierane są cyklicznie przez aplikację w określonych w konfiguracji interwałach czasu lub w momencie wysyłania danych przez widget. Standardowy okres to 3 sekundy i z takim opóźnieniem należy się liczyć w przekazywaniu danych do telefonu. Można to oczywiście zmniejszyć ale wtedy zapychamy sobie sieć zbędnymi wywołaniami i zmuszamy procesor do obsługi większej ilości wywołań. Ja ustawiam to na 1 sekundę co praktycznie eliminuje efekt opóźnienia a jeszcze zbytnie nie obciąża mikrokontrolera.
Generalnie nie jest to duży problem w zarządzaniu domową automatyką ale może stanowić istotną barierę przy konstrukcji wieloprocesorowych systemów w oparciu o VIRTUINO.



Odbiór danych z aplikacji bez zbędnego opóźnienia wymaga umieszczenia procedur
 vDigitalMemoryRead  i vMemoryRead  w pętli głównej programu i przeglądania ich z maksymalną częstotliwością.  Procedury te odczytują wartość zmiennej w tablicy danych ( pinów). Nasz program musi zdekodować czy wartość pinu uległa zmianie i co z tym fantem zrobić. W BLYNKu robiła to jego biblioteka. W VIRTUINO musimy się zatroszczyć o to sami.

Prędkość wysyłania danych do telefonu, ze względu na opóźnienie, nie jest krytyczna. Jeżeli informacja wysyłana do aplikacji będzie się zmieniać kilkakrotnie w jednym okresie odczytywania, to do telefonu zostanie przekazana ostatnia z wprowadzonych do pinu danych. Nie ma więc sensu uaktualnianie danych do wysłania częściej niż raz na okres ustawiony w konfiguracji aplikacji.

Dane konkretnego pinu są przesyłane jedynie wtedy gdy zadeklarowaliśmy widget z  dowiązanym tym właśnie pinem.Jeśli więc w programie nie użyjemy danego pinu to jego aktualna wartość i tak będzie zawarta w tablicy pinów mikrokontrolera.
Natomiast użycie poleceń programu odczytujących lub zapisujących dane do pinów nie powoduje ich przesłania do telefonu. Pozostają one jedynie zapamiętane w tablicy pinów.

Mimo opisanych wyżej niedogodności VIRTUINO spisuje się nad podziw sprawnie w obsłudze mikrokontrolera domowej automatyki telefoniczną aplikacją. I robi to całkiem za free ale za cenę konieczności oglądania krótkich reklam przy pobieraniu widgetów do aplikacji. Za 50 zł możemy się ich pozbyć na zawsze.

Bez dwóch zdań ciąg dalszy powinien nastąpić.

Przydatne linki
VIRTUINO strona autora http://virtuino.com
Nowa strona o VIRTUINO     http://virtuino.blogspot.com/

Poprzednie wpisy w tym temacie
http://100-x-arduino.blogspot.com/2018/07/blynk-contra-viruino-pierwsze-starcie.html
147

Brak komentarzy:

Publikowanie komentarza