5.1 KiB
Cviceni: Thread a CoAP na ESP32-C6
Tento projekt je pripraven jako kostra pro pocitacove cviceni. Cilem je:
- nastavit uzel do site
Threadpomoci aktivniho datasetu, - vytvorit CoAP
POSTpozadavek, - odeslat simulovana senzorova data ve formatu JSON.
V projektu jsou nektere casti jiz hotove a nektere jsou pripraveny jako TODO pro doplneni.
Co je Thread
Thread je sitovy protokol pro zarizeni nad IEEE 802.15.4. Umoznuje IPv6 komunikaci mezi uzly s malou rezii a nizkou spotrebou. V siti se mohou objevit napriklad role:
leaderrouterchild
Aby se uzel pripojil do konkretni site, musi znat parametry aktivniho datasetu:
Network NameChannelPAN IDNetwork KeyExtended PAN IDMesh-Local Prefix
Tyto hodnoty se v projektu vyplnuji do src/thread_dataset.h.
Co je CoAP
CoAP je lehky aplikacni protokol pro vestavene systemy. Bezi nad UDP a pripomina zjednodusene HTTP. V tomto cviceni budeme pouzivat:
- metodu
POST - URI cestu
/sensor - payload ve formatu JSON
Server, na ktery bude klient odesilat data, ma adresu:
coap://[fd11:2233:4455:6677::1]:5683/sensor
Parsovani teto URL je v projektu jiz hotove. Studenti implementuji jen vytvoreni JSON payloadu a sestaveni CoAP zpravy.
Postup cviceni
1. Doplneni Thread datasetu
Otevri src/thread_dataset.h. V souboru jsou placeholdery, ktere je potreba nahradit hodnotami ze zadani.
Vypln:
THREAD_NETWORK_NAME = "OpenThread-ESP"THREAD_CHANNEL = 15THREAD_PANID = 0x1234THREAD_MESH_LOCAL_PREFIX_STRING = "fd11:2233:4455:6677"THREAD_GATEWAY_STATIC_ADDR = "fd11:2233:4455:6677::1"THREAD_NODE_STATIC_ADDR = "fd11:2233:4455:6677::10"THREAD_GATEWAY_COAP_URL = "coap://[fd11:2233:4455:6677::1]:5683/sensor"
Network Key:
{
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00,
}
Extended PAN ID:
{
0xde, 0xad, 0x00, 0xbe, 0xef, 0x00, 0xca, 0xfe,
}
Mesh-Local Prefix jako pole bajtu:
{
0xfd, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
}
Po doplneni by mel byt uzel schopny se pripojit do site Thread.
2. Sestaveni JSON payloadu
Otevri src/coap_client.c a dopln funkci coap_client_build_json_payload().
Tato funkce ma:
- vzit hodnoty ze struktury
sensor_data_t - vytvorit z nich textovy JSON
- ulozit vysledek do bufferu
payload - vratit
true, pokud se payload podarilo vytvorit
Ocekavany format:
{"node_id":"node_1","temp":23.4,"humidity":48,"button":1}
K tomu je vhodne pouzit funkci snprintf().
snprintf():
- zapisuje formatovany text do bufferu
- hlida maximalni velikost bufferu
- vraci pocet znaku, ktere by byly zapsany
Co je potreba zkontrolovat:
- navratova hodnota neni zaporna
- vysledny text se vesel do
payload_size
3. Vytvoreni CoAP POST zpravy
Ve stejnem souboru dopln funkci coap_client_create_post_request().
Tato funkce ma z vytvoreneho JSON payloadu pripravit CoAP zpravu pro OpenThread.
Postup:
- vytvorit zpravu
- nastavit typ zpravy
- nastavit kod
POST - pridat URI path
- pridat informaci, ze payload je
JSON - pridat samotny payload
Pouzij tyto OpenThread funkce:
otCoapNewMessage()Vytvori novou CoAP zpravu.otCoapMessageInit()Nastavi typ a kod zpravy. Zde pouzijOT_COAP_TYPE_CONFIRMABLEaOT_COAP_CODE_POST.otCoapMessageGenerateToken()Vygeneruje token, podle ktereho lze sparovat odpoved.otCoapMessageAppendUriPathOptions()Prida URI cestu, naprikladsensor.otCoapMessageAppendContentFormatOption()Nastavi format obsahu. Zde pouzijOT_COAP_OPTION_CONTENT_FORMAT_JSON.otCoapMessageSetPayloadMarker()Oddeli CoAP options od samotneho payloadu.otMessageAppend()Prida do zpravy data payloadu.
Pokud nektery krok selze:
- uvolni zpravu pomoci
otMessageFree(message) - vrat
NULL
4. Prepinani intervalu pomoci D1
Na kitu je pripojen pin D1, ktery bude slouzit pro prepinani periody odesilani.
V src/main.c je pripraveno:
- inicializovani vstupu pro tlacitko na
D1 - funkce
application_get_send_interval_ms(), kterou je potreba doplnit
Student ma dopsat logiku:
- pokud je tlacitko stisknute, pouzij rychly interval
1000 ms - pokud tlacitko stisknute neni, pouzij pomaly interval
5000 ms
Napoveda:
- pro cteni vstupu lze pouzit
gpio_get_level() - pri zapnutem
pull-upbyva stisk tlacitka casto reprezentovan hodnotou0
5. Otestovani
Po doplneni sleduj log na seriove lince. Zajimaji te hlavne:
- zmena role uzlu v Thread siti
- informace o inicializaci CoAP klienta
- vypis odesilaneho payloadu
- zmena intervalu po stisku tlacitka
D1 - pripadna odpoved od CoAP serveru
Co uz je hotove
V projektu je jiz pripraveno:
- spusteni OpenThread stacku v src/main.c
- nacitani datasetu a start site v src/main.c
- parsovani CoAP URL v src/coap_client.c
- volani
coap_send_data()a odesilani periodickych dat
Poznamka
V src/thread_dataset.h jsou zamerne placeholdery. Projekt se zkompiluje, ale bez spravnych hodnot se uzel nepripoji do pozadovane Thread site.