This shows you the differences between two versions of the page.
| — |
iothings:laboratoare:2025_code:lab4_1 [2025/10/21 11:37] (current) dan.tudose created |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | <code C main.cpp> | ||
| + | #include <Arduino.h> | ||
| + | #include <WiFi.h> | ||
| + | #include <WiFiUdp.h> | ||
| + | #include <coap-simple.h> // hirotakaster/CoAP simple library | ||
| + | |||
| + | // ===== Wi-Fi creds ===== | ||
| + | const char* WIFI_SSID = "UPB-Guest"; | ||
| + | const char* WIFI_PASS = ""; | ||
| + | |||
| + | // ===== CoAP server (Californium demo) ===== | ||
| + | const char* COAP_HOST = "californium.eclipseprojects.io"; | ||
| + | const uint16_t COAP_PORT = 5683; // RFC 7252 default port | ||
| + | |||
| + | // UDP + CoAP objects | ||
| + | WiFiUDP udp; | ||
| + | Coap coap(udp); | ||
| + | |||
| + | // ----- Response callback: prints payload as text ----- | ||
| + | void onCoapResponse(CoapPacket &packet, IPAddress ip, int port) { | ||
| + | // Copy payload into a printable buffer | ||
| + | const size_t n = packet.payloadlen; | ||
| + | String from = ip.toString() + ":" + String(port); | ||
| + | Serial.printf("[CoAP] Response from %s code=%u (0x%02X) len=%u\n", | ||
| + | from.c_str(), (packet.code >> 5), packet.code, (unsigned)n); | ||
| + | |||
| + | if (n > 0) { | ||
| + | // Make it printable; not all payloads are ASCII | ||
| + | size_t m = n; | ||
| + | if (m > 1023) m = 1023; // clamp for serial | ||
| + | char buf[1024]; | ||
| + | memcpy(buf, packet.payload, m); | ||
| + | buf[m] = '\0'; | ||
| + | Serial.println(F("[CoAP Payload]")); | ||
| + | Serial.println(buf); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Re-resolves hostname and sends GET to "/" | ||
| + | bool coapGetRoot() { | ||
| + | IPAddress remote; | ||
| + | if (!WiFi.hostByName(COAP_HOST, remote)) { | ||
| + | Serial.println(F("[CoAP] DNS failed")); | ||
| + | return false; | ||
| + | } | ||
| + | Serial.printf("[CoAP] GET coap://%s:%u/\n", COAP_HOST, COAP_PORT); | ||
| + | // Path is "" for "/", per library examples | ||
| + | int msgid = coap.get(remote, COAP_PORT, ""); | ||
| + | (void)msgid; // not used further in this demo | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | unsigned long lastGetMs = 0; | ||
| + | const unsigned long GET_PERIOD_MS = 10000; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(115200); | ||
| + | delay(200); | ||
| + | Serial.println(F("\n== CoAP client (Californium demo) ==")); | ||
| + | |||
| + | // Wi-Fi | ||
| + | WiFi.mode(WIFI_STA); | ||
| + | WiFi.begin(WIFI_SSID, WIFI_PASS); | ||
| + | Serial.print(F("Connecting")); | ||
| + | while (WiFi.status() != WL_CONNECTED) { delay(300); Serial.print('.'); } | ||
| + | Serial.println(); | ||
| + | Serial.print(F("Wi-Fi OK. IP: ")); Serial.println(WiFi.localIP()); | ||
| + | |||
| + | // Bind UDP so we can receive responses (use standard CoAP port or 0 for ephemeral) | ||
| + | udp.begin(5683); | ||
| + | |||
| + | // Register response handler and start CoAP | ||
| + | coap.response(onCoapResponse); | ||
| + | coap.start(); | ||
| + | |||
| + | // First GET right away | ||
| + | coapGetRoot(); | ||
| + | lastGetMs = millis(); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | // Let the library process incoming UDP (and fire onCoapResponse) | ||
| + | coap.loop(); | ||
| + | |||
| + | // Periodic GET | ||
| + | unsigned long now = millis(); | ||
| + | if (now - lastGetMs >= GET_PERIOD_MS) { | ||
| + | lastGetMs = now; | ||
| + | coapGetRoot(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </code> | ||