Prosba o dokumentacje + inne sprawy

lukazax
Posts: 12
Joined: Tue Jul 02, 2019 10:56 am

Post

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 ?

Code: Select all

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

Code: Select all

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
Posts: 391
Joined: Wed May 17, 2017 1:27 pm

Post

W czym chcesz napisać ten protokół?
Supla ❤️ Open HAB - https://github.com/magx2/openhab-supla
lukazax
Posts: 12
Joined: Tue Jul 02, 2019 10:56 am

Post

Na razie też w C, ale na ESP32 i FREE RTOS, trochę prościej i wiadomo inaczej ze względu na RTOSa.
magx2
Posts: 391
Joined: Wed May 17, 2017 1:27 pm

Post

Po co pisać w C skoro to jest już napisane w C 😂
Supla ❤️ Open HAB - https://github.com/magx2/openhab-supla
lukazax
Posts: 12
Joined: Tue Jul 02, 2019 10:56 am

Post

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.
User avatar
pzygmunt
Posts: 19474
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków

Post

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.
User avatar
pzygmunt
Posts: 19474
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków

Post

SUPLA_CHANNELMAXCOUNT - zobacz w srpc.c

Reszta w include/boards
lukazax
Posts: 12
Joined: Tue Jul 02, 2019 10:56 am

Post

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:

Code: Select all

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"?
User avatar
pzygmunt
Posts: 19474
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków

Post

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
Posts: 12
Joined: Tue Jul 02, 2019 10:56 am

Post

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ł.

Return to “Zagadnienia ogólne”