Prosba o dokumentacje + inne sprawy

lukazax
Posty: 12
Rejestracja: wt lip 02, 2019 10:56 am

Cześć, też jestem zainteresowany tym, jak dokładnie dział protokół, chciałbym zaimplementować suplę w swoich projektach urządzeń na innym sprzęcie i napisac prosty kod od nowa. Przeanalizowałem to, co do tej pory tutaj było napisane, udało mi się zarejestrować "wirtualny" Zamel ROW wysyłając odpowiednią ramkę do serwera. Chciałbym teraz po kolei zapytać o całość na przykładzie najnowszej wersji protokołu v10.

Na początek struktury:
TDS_SuplaRegisterDevice_E
TDS_SuplaDeviceChannel_C

Czym są lub jaką funkcję pełnią:
- AuthKey ?
- Flags ?
- ManufacturerID ?
- ProductID ?
- ServerName ?

Czy SUPLA_CHANNELMAXCOUNT może być mniejsze i równe ilości użytych kanałów w danym urządzeniu (zredukuje długość danych przesyłanych do serwera podczas rejestracji) ?

Gdzie znajdę w jaki sposób kodowane są odpowiednie funkcje i wartości w zmiennych:
_supla_int_t Type ?
_supla_int_t FuncList ?
_supla_int_t Default ?
_supla_int_t Flags ?

Kod: Zaznacz cały

typedef struct {
  char Email[SUPLA_EMAIL_MAXSIZE];  // UTF8
  char AuthKey[SUPLA_AUTHKEY_SIZE];
  char GUID[SUPLA_GUID_SIZE];
  char Name[SUPLA_DEVICE_NAME_MAXSIZE];  // UTF8
  char SoftVer[SUPLA_SOFTVER_MAXSIZE];
  char ServerName[SUPLA_SERVER_NAME_MAXSIZE];
  _supla_int_t Flags;
  _supla_int16_t ManufacturerID;
  _supla_int16_t ProductID;
  
  unsigned char channel_count;
  TDS_SuplaDeviceChannel_C
      channels[SUPLA_CHANNELMAXCOUNT];  // Last variable in struct!
} TDS_SuplaRegisterDevice_E;            // ver. >= 10

Kod: Zaznacz cały

typedef struct {
  unsigned char Number;
  _supla_int_t Type;
  _supla_int_t FuncList;
  _supla_int_t Default;
  _supla_int_t Flags;
  char value[SUPLA_CHANNELVALUE_SIZE];
} TDS_SuplaDeviceChannel_C;  // ver. >= 10
magx2
Posty: 351
Rejestracja: śr maja 17, 2017 1:27 pm
Kontakt:

W czym chcesz napisać ten protokół?
Java 4 Life :twisted:

API Java
GUI
Server Mock

lukazax
Posty: 12
Rejestracja: wt lip 02, 2019 10:56 am

Na razie też w C, ale na ESP32 i FREE RTOS, trochę prościej i wiadomo inaczej ze względu na RTOSa.
magx2
Posty: 351
Rejestracja: śr maja 17, 2017 1:27 pm
Kontakt:

Po co pisać w C skoro to jest już napisane w C 😂
Java 4 Life :twisted:

API Java
GUI
Server Mock

lukazax
Posty: 12
Rejestracja: wt lip 02, 2019 10:56 am

Mniejsza o to po co, temat przyda się potomnym, bo poza paroma osobami które w tym siedziały i napisały pod ESP8266 nadal nikt nie wie co tam dokładnie się dzieje, funkcjonalności przybywa, a dokumentacji brak. Będę wdzięczny za odpowiedź na moje pytania, mam też kolejne.
Awatar użytkownika
pzygmunt
Posty: 18280
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Pisanie obsługi protokołu jeszcze raz w c jest bez sensu. Użyj to co już jest przenosząc na eap32.

Odpowiedzi na Twoje pytania są w kodzie ale...

AuthKey - jak sama nawa mówi - klucz autoryzacyjny (takie hasło) urządzenia.
Flags - flagi/opcje - póki co nieużywane
ManufacturerID - id producenta sprzętu
ProductID - id produktu
ServerName - adres serwera (domena) - w przyszłości będzie wykorzystywana przez autorski router/lodad balancer wewnątrz nasze infrastruktury.
Awatar użytkownika
pzygmunt
Posty: 18280
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

SUPLA_CHANNELMAXCOUNT - zobacz w srpc.c

Reszta w include/boards
lukazax
Posty: 12
Rejestracja: wt lip 02, 2019 10:56 am

Dobra, namówiłeś, zostawię proto, srpc i część funkcji z supla_esp_devconn.
Ponieważ jestem bardziej elektronikiem niż programistą, będę miał jeszcze pytania.
Zacząć należy zapewne od tego:

Kod: Zaznacz cały

supla_esp_srpc_init(void) {
	
supla_esp_srpc_free();
TsrpcParams srpc_params;
srpc_params_init(&srpc_params);
srpc_params.data_read = &supla_esp_data_read;
srpc_params.data_write = &supla_esp_data_write;
srpc_params.on_remote_call_received = &supla_esp_on_remote_call_received;
devconn->srpc = srpc_init(&srpc_params);
srpc_set_proto_version(devconn->srpc, ESP8266_SUPLA_PROTO_VERSION);

os_timer_setfn(&devconn->supla_iterate_timer, (os_timer_func_t *)supla_esp_devconn_iterate, NULL);
os_timer_arm(&devconn->supla_iterate_timer, 100, 1);
}
Jeżeli dobrze rozumiem, to po inicjacji srpc wywołuje zewnętrzne funkcje:
supla_esp_data_read(); // obsługa odczytu danych z serwera
supla_esp_data_write(); // obsługa wysłania danych do serwera
supla_esp_on_remote_call_received(); // obsługa (dekodowanie) odebranego wywołania od serwera

Aby całość działała, cyklicznie (co 100 ms?) musi być wywoływana funkcja supla_esp_devconn_iterate(),
która z kolei wywołuje srpc_iterate() oraz rejestruje urządzenie i potem sprawdza, czy jest zarejestrowane.

Proszę o sprawdzenie poprawności powyższego.

Mam jeszcze pytanie o pozostałe pola w strukturze TsrpcParams, które nie są używane:

_func_srpc_event_OnVersionError on_version_error;
_func_srpc_event_BeforeCall before_async_call;
_func_srpc_event_OnMinVersionRequired on_min_version_required;
TEventHandler *eh;
void *user_params;

Czy mają jakieś zastosowanie / przeznaczenie "na zewnątrz"?
Awatar użytkownika
pzygmunt
Posty: 18280
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Wszystko ma jakieś zastosowanie.
Ta biblioteka jest bezpieczna z punktu widzenia wątków. W nonrtos-ie nie ma współbieżność dlatego iterate jest odpalane w kółko. Dla esp32 trzeba wykorzystać właściwości srpc które czekają i jak jest potrzeba to wchodzą w iterate. Zerknij sobie w przykład dla raspberry (supla-dev) tam masz przykład dla środowiska wielowątkowego.
lukazax
Posty: 12
Rejestracja: wt lip 02, 2019 10:56 am

Ok, przyjrzałem się temu trochę.
Żeby było ładnie, trzeba będzie jeszcze dopisać ifologię dla ESP32 w lck, eh, log.
Zajmę się przenoszeniem kodu za jakieś 2 tygodnie. Jak wyjdą jakieś problemy/wątpliwości będę pytał.
ODPOWIEDZ

Wróć do „Zagadnienia ogólne”