BLE Supla Gateway - wyzwanie dla programistów

Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

pn sty 13, 2020 9:51 am

krycha88 pisze:
pn sty 13, 2020 9:15 am
klew pisze:
pn sty 13, 2020 8:57 am
Beku pisze:
pn sty 13, 2020 7:22 am


No niby tak, może nawet taniej by wyszło.
ESP32 na allegro chodzi po 30 zł. Naprawdę jest sens jeszcze bardziej oszczędzać? Tym bardziej, że mowa tutaj o czymś w rodzaju bramki, więc będzie to raczej jedno takie urządzenie "to rule them all" ;)
linka wrzuciłem jako ciekawostka :)
A ja odpisałem z grzeczności i napisałem ze esp32 to rozsądny wybór 🙂🙂
hZkgZK
Posty: 34
Rejestracja: pt sie 30, 2019 10:06 am

wt sty 14, 2020 4:51 pm

Spoko pomysł z tą bramką. Akurat ostatnio zrobiłem sobie obsługę Xiaomi Flora https://www.aliexpress.com/item/32841210035.html. Tu mój kod do obsługi urządzenia jakbyście chcieli dodać https://github.com/pikciu/Arduino-Flora. W wolnej chwili zrobie z tego libkę do PlatformIO bo na razie mi się nie chciało
działa od wczoraj na esp32
IMG_3967.png
IMG_3967.png (277.92 KiB) Przejrzano 450 razy
te labelki trzeba pozmieniac bo taki mix pol-eng słabo wygląda :D
Awatar użytkownika
klew
Posty: 662
Rejestracja: czw cze 27, 2019 12:16 pm

wt sty 14, 2020 9:06 pm

hZkgZK pisze:
wt sty 14, 2020 4:51 pm
Spoko pomysł z tą bramką. Akurat ostatnio zrobiłem sobie obsługę Xiaomi Flora
Dzięki za udostępnienie projektu :)
W konstruktorze klasy Flora używasz mało bezpiecznego rozwiązania: https://github.com/pikciu/Arduino-Flora ... ora.cpp#L4
Przypisujesz wskaźnik do ciągu znaków. To się może dość łatwo wysypać w wielu sytuacjach. Taki ciąg znaków powinien być kopiowany
hZkgZK
Posty: 34
Rejestracja: pt sie 30, 2019 10:06 am

wt sty 14, 2020 9:19 pm

klew pisze:
wt sty 14, 2020 9:06 pm
hZkgZK pisze:
wt sty 14, 2020 4:51 pm
Spoko pomysł z tą bramką. Akurat ostatnio zrobiłem sobie obsługę Xiaomi Flora
Dzięki za udostępnienie projektu :)
W konstruktorze klasy Flora używasz mało bezpiecznego rozwiązania: https://github.com/pikciu/Arduino-Flora ... ora.cpp#L4
Przypisujesz wskaźnik do ciągu znaków. To się może dość łatwo wysypać w wielu sytuacjach. Taki ciąg znaków powinien być kopiowany
Dzięki za code review ;) jak powinno być poprawnie? na codzień zajmuję się programowaniem na iOS (Swift) i do c++ mi daleko :D
Awatar użytkownika
klew
Posty: 662
Rejestracja: czw cze 27, 2019 12:16 pm

wt sty 14, 2020 9:34 pm

hZkgZK pisze:
wt sty 14, 2020 9:19 pm
Dzięki za code review ;) jak powinno być poprawnie? na codzień zajmuję się programowaniem na iOS (Swift) i do c++ mi daleko :D
W

Kod: Zaznacz cały

char *
jest trzymany wskaźnik do miejsca w pamięci zawierającego jeden bajt (char). Twój aktualny kod po prostu kopiuje ten adres w pamięci. Gdy więc stworzysz instancję klasy Flora przekazując ciąg znaków w jakimś obiekcie tymczasowym, to później ta klasa może się odwoływać do pamięci, w której mogą być już inne dane.

Najprościej jest zrobić w klasie Flora zmienną

Kod: Zaznacz cały

char address[MAX_SIZE_OF_ADDRES];
i kopiować dane np. funkcją strncpy (http://www.cplusplus.com/reference/cstring/strncpy/)
hZkgZK
Posty: 34
Rejestracja: pt sie 30, 2019 10:06 am

wt sty 14, 2020 9:49 pm

klew pisze:
wt sty 14, 2020 9:34 pm
hZkgZK pisze:
wt sty 14, 2020 9:19 pm
Dzięki za code review ;) jak powinno być poprawnie? na codzień zajmuję się programowaniem na iOS (Swift) i do c++ mi daleko :D
W

Kod: Zaznacz cały

char *
jest trzymany wskaźnik do miejsca w pamięci zawierającego jeden bajt (char). Twój aktualny kod po prostu kopiuje ten adres w pamięci. Gdy więc stworzysz instancję klasy Flora przekazując ciąg znaków w jakimś obiekcie tymczasowym, to później ta klasa może się odwoływać do pamięci, w której mogą być już inne dane.

Najprościej jest zrobić w klasie Flora zmienną

Kod: Zaznacz cały

char address[MAX_SIZE_OF_ADDRES];
i kopiować dane np. funkcją strncpy (http://www.cplusplus.com/reference/cstring/strncpy/)
A czy const nie zabezpiecza mnie przed tym, że w tym miejscu w pamięci coś mi nadpisze dane? O ile dobrze rozumiem odpowiedz https://stackoverflow.com/questions/983 ... r/47300995 to właśnie tak jest. Mam wskaźnik na niemodyfikowany ciąg znaków. Wskaźnik mam zapamiętany w klasie Flora i dopóki go "nie przesunę" będzie on wskazywać na ten sam obszar w pamięci, a obszar ten jest "zarezerwowany" przez const i nie można go zmienić. Tak to rozumiem ale bardzo możliwe że jestem w błędzie :D
W każdym razie chyba nie ma co zaśmiecać tematu ale jak Ci się chce dalej mi to tłumaczyć to jest priv ;)
Awatar użytkownika
klew
Posty: 662
Rejestracja: czw cze 27, 2019 12:16 pm

wt sty 14, 2020 9:56 pm

hZkgZK pisze:
wt sty 14, 2020 9:49 pm
A czy const nie zabezpiecza mnie przed tym, że w tym miejscu w pamięci coś mi nadpisze dane? O ile dobrze rozumiem odpowiedz https://stackoverflow.com/questions/983 ... r/47300995 to właśnie tak jest. Mam wskaźnik na niemodyfikowany ciąg znaków. Wskaźnik mam zapamiętany w klasie Flora i dopóki go "nie przesunę" będzie on wskazywać na ten sam obszar w pamięci, a obszar ten jest "zarezerwowany" przez const i nie można go zmienić. Tak to rozumiem ale bardzo możliwe że jestem w błędzie :D
W każdym razie chyba nie ma co zaśmiecać tematu ale jak Ci się chce dalej mi to tłumaczyć to jest priv ;)
To tak tylko dla potomnych napiszę, że nie, to Cię przed niczym nie zabezpiecza ;)
"const" informuje kompilator, aby nie pozwalał Tobie modyfikować zawartości wskazywanej przez ten wskaźnik.
Natomiast nic nie stoi na przeszkodzie, aby inne częsci programu coś po tej pamięci pisały, gdy dostaną taki przydział (a to się może zdarzyć).
Dalej możemy ciągnąć tego offtopa na priv ;)
Awatar użytkownika
pzygmunt
Posty: 7974
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontaktowanie:

wt sty 14, 2020 10:01 pm

Używając strncpy zwróć uwagę na problem możliwego skopiowania ciągu znaków bez nulla na końcu. Jeśli nie użyjesz tej funkcji świadomie to możesz mieć problem z uzyskaną kopią.

Dla bezpieczeństwa użyj snprintf do skopiowaniu ciągu lub jeśli już użyjesz strncpy to po jego wystąpieniu
wykonaj
dest[sizeof(dest)-1] = 0;
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

śr sty 15, 2020 9:11 pm

Się dowiedziałem że te nowe kwadratowe czujniki mają zakodowane komunikaty.
Są już rozkodowane ale trzeba je inaczej obsłużyć

https://github.com/custom-components/se ... ZDCgB8EEEU

Te okrągłe podobno wysyłają czystym tekstem.
Awatar użytkownika
fracz
Posty: 1812
Rejestracja: pt paź 28, 2016 10:56 pm
Lokalizacja: Rybna

czw sty 16, 2020 7:55 am

Podejrzewałem że cena tych prostokątnych jest podchwytliwa :D
ODPOWIEDZ