Files
TOI_2_student/README.md
2026-03-19 16:06:28 +01:00

5.1 KiB

Cviceni: Thread a CoAP na ESP32-C6

Tento projekt je pripraven jako kostra pro pocitacove cviceni. Cilem je:

  1. nastavit uzel do site Thread pomoci aktivniho datasetu,
  2. vytvorit CoAP POST pozadavek,
  3. 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:

  • leader
  • router
  • child

Aby se uzel pripojil do konkretni site, musi znat parametry aktivniho datasetu:

  • Network Name
  • Channel
  • PAN ID
  • Network Key
  • Extended PAN ID
  • Mesh-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 = 15
  • THREAD_PANID = 0x1234
  • THREAD_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:

  1. vytvorit zpravu
  2. nastavit typ zpravy
  3. nastavit kod POST
  4. pridat URI path
  5. pridat informaci, ze payload je JSON
  6. pridat samotny payload

Pouzij tyto OpenThread funkce:

  • otCoapNewMessage() Vytvori novou CoAP zpravu.
  • otCoapMessageInit() Nastavi typ a kod zpravy. Zde pouzij OT_COAP_TYPE_CONFIRMABLE a OT_COAP_CODE_POST.
  • otCoapMessageGenerateToken() Vygeneruje token, podle ktereho lze sparovat odpoved.
  • otCoapMessageAppendUriPathOptions() Prida URI cestu, napriklad sensor.
  • otCoapMessageAppendContentFormatOption() Nastavi format obsahu. Zde pouzij OT_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-up byva stisk tlacitka casto reprezentovan hodnotou 0

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:

Poznamka

V src/thread_dataset.h jsou zamerne placeholdery. Projekt se zkompiluje, ale bez spravnych hodnot se uzel nepripoji do pozadovane Thread site.