Prosba o dokumentacje + inne sprawy

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

Fri Jul 05, 2019 10:10 pm

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

Fri Jul 05, 2019 10:16 pm

Na razie też w C, ale na ESP32 i FREE RTOS, trochę prościej i wiadomo inaczej ze względu na RTOSa.
lukazax
Posts: 12
Joined: Tue Jul 02, 2019 10:56 am

Fri Jul 05, 2019 10:38 pm

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: 5963
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Sat Jul 06, 2019 6:45 am

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: 5963
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Sat Jul 06, 2019 6:47 am

SUPLA_CHANNELMAXCOUNT - zobacz w srpc.c

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

Sat Jul 06, 2019 4:36 pm

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: 5963
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Sat Jul 06, 2019 5:56 pm

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

Thu Jul 11, 2019 5:29 pm

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