BLE Supla Gateway - wyzwanie dla programistów

Beku
Posts: 453
Joined: Tue Nov 06, 2018 1:49 pm

Post

krycha88 wrote: Mon Jan 13, 2020 9:15 am
klew wrote: Mon Jan 13, 2020 8:57 am
Beku wrote: Mon Jan 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
Posts: 52
Joined: Fri Aug 30, 2019 10:06 am

Post

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
te labelki trzeba pozmieniac bo taki mix pol-eng słabo wygląda :D
You do not have the required permissions to view the files attached to this post.
User avatar
klew
Posts: 13909
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

hZkgZK wrote: Tue Jan 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
Najlepsze suple dla Twojego domu :mrgreen:
hZkgZK
Posts: 52
Joined: Fri Aug 30, 2019 10:06 am

Post

klew wrote: Tue Jan 14, 2020 9:06 pm
hZkgZK wrote: Tue Jan 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
User avatar
klew
Posts: 13909
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

hZkgZK wrote: Tue Jan 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

Code: Select all

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ą

Code: Select all

char address[MAX_SIZE_OF_ADDRES];
i kopiować dane np. funkcją strncpy (http://www.cplusplus.com/reference/cstring/strncpy/)
Najlepsze suple dla Twojego domu :mrgreen:
hZkgZK
Posts: 52
Joined: Fri Aug 30, 2019 10:06 am

Post

klew wrote: Tue Jan 14, 2020 9:34 pm
hZkgZK wrote: Tue Jan 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

Code: Select all

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ą

Code: Select all

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 ;)
User avatar
klew
Posts: 13909
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

hZkgZK wrote: Tue Jan 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 ;)
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

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;
SUPLA.... Nareszcie w domu.
Beku
Posts: 453
Joined: Tue Nov 06, 2018 1:49 pm

Post

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.
User avatar
fracz
Posts: 2342
Joined: Fri Oct 28, 2016 10:56 pm
Location: Kraków
Has thanked: 4 times
Been thanked: 6 times

Post

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

Return to “Ogólna dyskusja”