نحوه اتصال WeMos D1 R2 به ThingsConnect
مقدمه
تابلوی WeMos D1 که توسط شرکت WeMos توسعه داده شده است، بر پایه ماژول وایفای ESP8266 ESP-12 است.
برنامهنویسی برد با استفاده از محیط توسعه استاندارد Arduino IDE انجام میشود.
کنترلکننده شامل یک پردازنده، لوازم جانبی، حافظه RAM و دستگاههای ورودی/خروجی است.
بیشتر به کار میروند میکروکنترلرها در تجهیزات کامپیوتری، لوازم خانگی و سایر دستگاههای الکترونیکی.
WeMos با هزینه کم و آسانی اتصال و برنامهنویسی خود متمایز میشود.
در این راهنما، یاد خواهیم گرفت که چگونه دستگاه را در Thingsboard ایجاد کنیم، کتابخانهها و ابزارهای مورد نیاز را نصب کنیم.
سپس کد خود را تغییر داده و به دستگاه بارگذاری کرده و نتایج کدنویسی و دادهها را در Thingsboard با استفاده از داشبورد وارد شده بررسی کنیم. دستگاه ما با استفاده از قابلیت درخواستهای مشترک و ویژگیهای به اشتراک گذاشته شده، با Thingsboard هماهنگ میشود.
البته، خواهیم توانست دستگاه خود را با استفاده از قابلیتهای ارائه شده مانند ویژگیهای به اشتراک گذاشته شده یا درخواستهای RPC کنترل کنیم.
پیشنیازها:
برای ادامه این راهنما، به موارد زیر نیاز داریم:
- WeMos D1 R2
- Arduino IDE
- حساب ThingsBoard
ایجاد دستگاه در ThingsBoard
به منظور سادگی، ما دستگاه را به صورت دستی با استفاده از رابط کاربری ایجاد خواهیم کرد.
- وارد نمایید ThingsBoard خود و به “موجودیتها” مراجعه کنید. سپس روی صفحه “دستگاهها” کلیک کنید.
- روی آیکون “+” در گوشه بالا سمت راست جدول کلیک کرده و سپس “اضافه کردن دستگاه جدید” را انتخاب کنید.
- نام دستگاه را وارد کنید. به عنوان مثال، “دستگاه من”. در این مرحله تغییرات دیگری لازم نیست. برای اضافه کردن دستگاه روی “اضافه کردن” کلیک کنید.
- دستگاه شما اضافه شده است.
//img
نصب کتابخانهها و ابزارهای مورد نیاز
برای نصب برد در Arduino IDE: به مسیر File > Preferences بروید و URL زیر را به فیلد Additional Boards Manager URLs اضافه کنید.
http://arduino.esp8266.com/stable/package_esp8266com_index.json
سپس، به قسمت Tools > Board > Board Manager بروید و برد ESP8266 را نصب کنید.
- ESP8266 را در قسمت جستجو وارد کرده و بسته esp8266 توسط Espressif Community را نصب کنید.
//img
پس از اتمام نصب، برد را از طریق منوی Board انتخاب کنید:
Tools > Board > ESP8266 > LOLIN(WEMOS) D1 R2 & mini.
برای نصب ThingsBoard Arduino SDK – باید مراحل زیر را انجام دهید:
- به برگه “Tools” بروید و روی “Manage libraries” کلیک کنید.
- “ThingsBoard” را در جعبه جستجو وارد کنید و برای کتابخانه پیدا شده روی دکمه “INSTALL” کلیک کنید.
//img
همچنین، برای بردهایی که بر پایه تراشه ESP8266 هستند، باید کتابخانه “mbedtls” را نصب کنیم.
- عبارت “mbedtls” را در جعبه جستجوی کتابخانه قرار داده و کتابخانه “Seeed_Arduino_mbedtls توسط Peter Yang” را نصب کنید.
//img
در این مرحله، تمام کتابخانهها و ابزارهای مورد نیاز را نصب کردهایم.
اتصال دستگاه به ThingsBoard
برای اتصال دستگاه، ابتدا باید اطلاعات احراز هویت دستگاه را دریافت کنید. ThingsBoard از انواع مختلف احراز هویت دستگاه پشتیبانی میکند. ما توصیه میکنیم از احراز هویت پیشفرض و خودکار، که یک توکن دسترسی است، در این راهنما استفاده کنید.
- برای باز کردن جزئیات دستگاه، روی ردیف دستگاه در جدول کلیک کنید.
- روی “کپی توکن دسترسی” کلیک کنید. توکن در کلیپبورد شما کپی خواهد شد. لطفاً آن را در یک مکان امن ذخیره کنید.
//img
حالا وقت آن رسیده است که برد را برنامهریزی کنید تا به ThingsBoard متصل شود.
برای این کار، میتوانید از کد زیر استفاده کنید. این کد حاوی تمامی قابلیتهای مورد نیاز برای این راهنما است.
#if defined(ESP8266) #include <ESP8266WiFi.h> #define THINGSBOARD_ENABLE_PROGMEM 0 #elif defined(ARDUINO_NANO_RP2040_CONNECT) #include <WiFiNINA_Generic.h> #elif defined(ESP32) || defined(RASPBERRYPI_PICO) || defined(RASPBERRYPI_PICO_W) #include <WiFi.h> #include <WiFiClientSecure.h> #endif #define THINGSBOARD_ENABLE_PSRAM 0 #define THINGSBOARD_ENABLE_DYNAMIC 1 #ifndef LED_BUILTIN #define LED_BUILTIN 99 #endif #include <ThingsBoard.h> constexpr char WIFI_SSID[] = "YOUR_WIFI_SSID"; constexpr char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // See https://thingsboard.io/docs/getting-started-guides/helloworld/ // to understand how to obtain an access token constexpr char TOKEN[] = "YOUR_ACCESS_TOKEN"; // Thingsboard we want to establish a connection too constexpr char THINGSBOARD_SERVER[] = "demo.thingsboard.io"; // MQTT port used to communicate with the server, 1883 is the default unencrypted MQTT port. constexpr uint16_t THINGSBOARD_PORT = 1883U; // Maximum size packets will ever be sent or received by the underlying MQTT client, // if the size is to small messages might not be sent or received messages will be discarded constexpr uint32_t MAX_MESSAGE_SIZE = 256U; // Baud rate for the debugging serial connection. // If the Serial output is mangled, ensure to change the monitor speed accordingly to this variable constexpr uint32_t SERIAL_DEBUG_BAUD = 115200U; // Initialize underlying client, used to establish a connection WiFiClient wifiClient; // Initialize ThingsBoard instance with the maximum needed buffer size ThingsBoard tb(wifiClient, MAX_MESSAGE_SIZE); // Attribute names for attribute request and attribute updates functionality constexpr char BLINKING_INTERVAL_ATTR[] = "blinkingInterval"; constexpr char LED_MODE_ATTR[] = "ledMode"; constexpr char LED_STATE_ATTR[] = "ledState"; // Statuses for subscribing to rpc bool subscribed = false; // handle led state and mode changes volatile bool attributesChanged = false; // LED modes: 0 - continious state, 1 - blinking volatile int ledMode = 0; // Current led state volatile bool ledState = false; // Settings for interval in blinking mode constexpr uint16_t BLINKING_INTERVAL_MS_MIN = 10U; constexpr uint16_t BLINKING_INTERVAL_MS_MAX = 60000U; volatile uint16_t blinkingInterval = 1000U; uint32_t previousStateChange; // For telemetry constexpr int16_t telemetrySendInterval = 2000U; uint32_t previousDataSend; // List of shared attributes for subscribing to their updates constexpr std::array<const char *, 2U> SHARED_ATTRIBUTES_LIST = { LED_STATE_ATTR, BLINKING_INTERVAL_ATTR }; // List of client attributes for requesting them (Using to initialize device states) constexpr std::array<const char *, 1U> CLIENT_ATTRIBUTES_LIST = { LED_MODE_ATTR }; /// @brief Initalizes WiFi connection, // will endlessly delay until a connection has been successfully established void InitWiFi() { Serial.println("Connecting to AP ..."); // Attempting to establish a connection to the given WiFi network WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { // Delay 500ms until a connection has been succesfully established delay(500); Serial.print("."); } Serial.println("Connected to AP"); } /// @brief Reconnects the WiFi uses InitWiFi if the connection has been removed /// @return Returns true as soon as a connection has been established again const bool reconnect() { // Check to ensure we aren't connected yet const wl_status_t status = WiFi.status(); if (status == WL_CONNECTED) { return true; } // If we aren't establish a new connection to the given WiFi network InitWiFi(); return true; } /// @brief Processes function for RPC call "setLedMode" /// RPC_Data is a JSON variant, that can be queried using operator[] /// See https://arduinojson.org/v5/api/jsonvariant/subscript/ for more details /// @param data Data containing the rpc data that was called and its current value /// @return Response that should be sent to the cloud. Useful for getMethods RPC_Response processSetLedMode(const RPC_Data &data) { Serial.println("Received the set led state RPC method"); // Process data int new_mode = data; Serial.print("Mode to change: "); Serial.println(new_mode); if (new_mode != 0 && new_mode != 1) { return RPC_Response("error", "Unknown mode!"); } ledMode = new_mode; attributesChanged = true; // Returning current mode return RPC_Response("newMode", (int)ledMode); } // Optional, keep subscribed shared attributes empty instead, // and the callback will be called for every shared attribute changed on the device, // instead of only the one that were entered instead const std::array<RPC_Callback, 1U> callbacks = { RPC_Callback{ "setLedMode", processSetLedMode } }; /// @brief Update callback that will be called as soon as one of the provided shared attributes changes value, /// if none are provided we subscribe to any shared attribute change instead /// @param data Data containing the shared attributes that were changed and their current value void processSharedAttributes(const Shared_Attribute_Data &data) { for (auto it = data.begin(); it != data.end(); ++it) { if (strcmp(it->key().c_str(), BLINKING_INTERVAL_ATTR) == 0) { const uint16_t new_interval = it->value().as<uint16_t>(); if (new_interval >= BLINKING_INTERVAL_MS_MIN && new_interval <= BLINKING_INTERVAL_MS_MAX) { blinkingInterval = new_interval; Serial.print("Updated blinking interval to: "); Serial.println(new_interval); } } else if(strcmp(it->key().c_str(), LED_STATE_ATTR) == 0) { ledState = it->value().as<bool>(); digitalWrite(LED_BUILTIN, ledState ? HIGH : LOW); Serial.print("Updated state to: "); Serial.println(ledState); } } attributesChanged = true; } void processClientAttributes(const Shared_Attribute_Data &data) { for (auto it = data.begin(); it != data.end(); ++it) { if (strcmp(it->key().c_str(), LED_MODE_ATTR) == 0) { const uint16_t new_mode = it->value().as<uint16_t>(); ledMode = new_mode; } } } const Shared_Attribute_Callback attributes_callback(SHARED_ATTRIBUTES_LIST.cbegin(), SHARED_ATTRIBUTES_LIST.cend(), &processSharedAttributes); const Attribute_Request_Callback attribute_shared_request_callback(SHARED_ATTRIBUTES_LIST.cbegin(), SHARED_ATTRIBUTES_LIST.cend(), &processSharedAttributes); const Attribute_Request_Callback attribute_client_request_callback(CLIENT_ATTRIBUTES_LIST.cbegin(), CLIENT_ATTRIBUTES_LIST.cend(), &processClientAttributes); void setup() { // Initalize serial connection for debugging Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); delay(1000); InitWiFi(); } void loop() { // delay(10); if (!reconnect()) { subscribed = false; return; } if (!tb.connected()) { subscribed = false; // Connect to the ThingsBoard Serial.print("Connecting to: "); Serial.print(THINGSBOARD_SERVER); Serial.print(" with token "); Serial.println(TOKEN); if (!tb.connect(THINGSBOARD_SERVER, TOKEN, THINGSBOARD_PORT)) { Serial.println("Failed to connect"); return; } // Sending a MAC address as an attribute tb.sendAttributeString("macAddress", WiFi.macAddress().c_str()); } if (!subscribed) { Serial.println("Subscribing for RPC..."); // Perform a subscription. All consequent data processing will happen in // processSetLedState() and processSetLedMode() functions, // as denoted by callbacks array. if (!tb.RPC_Subscribe(callbacks.cbegin(), callbacks.cend())) { Serial.println("Failed to subscribe for RPC"); return; } if (!tb.Shared_Attributes_Subscribe(attributes_callback)) { Serial.println("Failed to subscribe for shared attribute updates"); return; } Serial.println("Subscribe done"); subscribed = true; // Request current states of shared attributes if (!tb.Shared_Attributes_Request(attribute_shared_request_callback)) { Serial.println("Failed to request for shared attributes"); return; } // Request current states of client attributes if (!tb.Client_Attributes_Request(attribute_client_request_callback)) { Serial.println("Failed to request for client attributes"); return; } } if (attributesChanged) { attributesChanged = false; if (ledMode == 0) { previousStateChange = millis(); } tb.sendTelemetryInt(LED_MODE_ATTR, ledMode); tb.sendTelemetryBool(LED_STATE_ATTR, ledState); tb.sendAttributeInt(LED_MODE_ATTR, ledMode); tb.sendAttributeBool(LED_STATE_ATTR, ledState); } if (ledMode == 1 && millis() - previousStateChange > blinkingInterval) { previousStateChange = millis(); ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); tb.sendTelemetryBool(LED_STATE_ATTR, ledState); tb.sendAttributeBool(LED_STATE_ATTR, ledState); if (LED_BUILTIN == 99) { Serial.print("LED state changed to: "); Serial.println(ledState); } } // Sending telemetry every telemetrySendInterval time if (millis() - previousDataSend > telemetrySendInterval) { previousDataSend = millis(); tb.sendTelemetryInt("temperature", random(10, 20)); tb.sendAttributeInt("rssi", WiFi.RSSI()); tb.sendAttributeInt("channel", WiFi.channel()); tb.sendAttributeString("bssid", WiFi.BSSIDstr().c_str()); tb.sendAttributeString("localIp", WiFi.localIP().toString().c_str()); tb.sendAttributeString("ssid", WiFi.SSID().c_str()); } tb.loop(); }
در کد، جایگزین کردن مکاننماها با SSID شبکه WiFi، رمز عبور و توکن دسترسی دستگاه ThingsBoard شما مورد نیاز است.
متغیرهای ضروری برای اتصال عبارتند از:
//جدول
... constexpr char WIFI_SSID[] = "YOUR_WIFI_SSID"; constexpr char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; constexpr char TOKEN[] = "YOUR_ACCESS_TOKEN"; constexpr char THINGSBOARD_SERVER[] = "demo.thingsboard.io"; constexpr uint16_t THINGSBOARD_PORT = 1883U; constexpr uint32_t MAX_MESSAGE_SIZE = 256U; constexpr uint32_t SERIAL_DEBUG_BAUD = 115200U; ...
قسمت ارسال دادهها (به طور پیش فرض، مثال مقدار تصادفی برای کلید دما و برخی اطلاعات WiFi را ارسال میکند):
... tb.sendTelemetryInt("temperature", random(10, 20)); tb.sendAttributeInt("rssi", WiFi.RSSI()); tb.sendAttributeString("bssid", WiFi.BSSIDstr().c_str()); tb.sendAttributeString("localIp", WiFi.localIP().toString().c_str()); tb.sendAttributeString("ssid", WiFi.SSID().c_str()); tb.sendAttributeInt("channel", WiFi.channel()); ...
سپس با فشردن دکمه “آپلود” یا ترکیب صفحه کلید Ctrl+U، کد را به دستگاه بارگذاری کنید.
//img
اگر نتوانید کد را بارگذاری کنید و خطای “Property ‘upload.tool.serial’ is undefined” دریافت میکنید، میتوانید مراحل زیر را انجام دهید:
- به منوی “ابزارها” بروید و بخش “برنامه نویس” را انتخاب کنید و “Esptool” را به عنوان برنامه نویس انتخاب کنید.
- به منوی “اسکچ” بروید و گزینه “با استفاده از برنامه نویس بارگذاری کنید” را انتخاب کنید.
//img
برسی داده ها در ThingsConnect
برای بررسی دادهها و قابلیت ارسال دستورات یا داده به دستگاه، ما نیازمند ایجاد داشبورد هستیم.
ابتدا فایل داشبورد بررسی و کنترل داده دستگاه را دانلود کنید.
برای اضافه کردن داشبورد به ThingsBoard، باید آن را وارد کنید و برای انجام این کار، باید مراحل زیر را طی کنید:
- از طریق منوی اصلی در سمت چپ صفحه به قسمت “داشبوردها” بروید.
- روی دکمه “+” در گوشه بالا و سمت راست صفحه کلیک کرده و “وارد کردن داشبورد” را انتخاب کنید.
- فایل dashboard.json خود را انتخاب کنید و دکمه وارد کردن را فشار دهید.
- اکنون میتوانید داشبورد وارد شده را در جدول مشاهده کنید.
//img
بعد از وارد کردن، باید برای دستگاه خود یک نام مستعار انتخاب کنیم.
برای انجام این کار، باید روی آیکون قلم کلیک کرده و “نام مستعار موجودیت” را انتخاب کنیم، سپس نام مستعار “دستگاه من” را انتخاب کرده و با فشار دادن آیکون قلم، آن را برای ویرایش باز کنیم.
سپس از لیست کشویی یک دستگاه با نام “دستگاه من” را انتخاب کنید و نام مستعار موجودیت را ذخیره کنید، حالا باید بتوانید دادهها را از دستگاه مشاهده کنید.
برای بررسی دادهها از دستگاه خود، باید داشبورد وارد شده را باز کنید:
- با کلیک بر روی داشبورد در جدول، آن را باز کنید.
- مشاهده داشبورد برای بررسی دادهها و کنترل دستگاه ما.
- مشاهده ویژگیهای دریافت شده از دستگاه.
- اطلاعات دستگاه از سرور ThingsBoard.
- ابزارک برای مشاهده تاریخچه تغییرات حالت LED.
- ابزارک برای مشاهده تاریخچه دمای شبیهسازی شده ما.
//img
همزمانسازی وضعیت دستگاه با استفاده از درخواستهای کلاینت و ویژگیهای مشترک
برای دریافت وضعیت دستگاه از ThingsBoard در هنگام راهاندازی، ما قابلیتی برای انجام این کار در کد داریم.
قسمتهای مسئول در نمونه کد:
- بازخوانی ویژگیها (Attribute callbacks):
... void processSharedAttributes(const Shared_Attribute_Data &data) { for (auto it = data.begin(); it != data.end(); ++it) { if (strcmp(it->key().c_str(), BLINKING_INTERVAL_ATTR) == 0) { const uint16_t new_interval = it->value().as<uint16_t>(); if (new_interval >= BLINKING_INTERVAL_MS_MIN && new_interval <= BLINKING_INTERVAL_MS_MAX) { blinkingInterval = new_interval; Serial.print("Updated blinking interval to: "); Serial.println(new_interval); } } else if(strcmp(it->key().c_str(), LED_STATE_ATTR) == 0) { ledState = it->value().as<bool>(); digitalWrite(LED_BUILTIN, ledState ? HIGH : LOW); Serial.print("Updated state to: "); Serial.println(ledState); } } attributesChanged = true; } void processClientAttributes(const Shared_Attribute_Data &data) { for (auto it = data.begin(); it != data.end(); ++it) { if (strcmp(it->key().c_str(), LED_MODE_ATTR) == 0) { const uint16_t new_mode = it->value().as<uint16_t>(); ledMode = new_mode; } } } ... const Attribute_Request_Callback attribute_shared_request_callback(SHARED_ATTRIBUTES_LIST.cbegin(), SHARED_ATTRIBUTES_LIST.cend(), &processSharedAttributes); const Attribute_Request_Callback attribute_client_request_callback(CLIENT_ATTRIBUTES_LIST.cbegin(), CLIENT_ATTRIBUTES_LIST.cend(), &processClientAttributes); ...
همانطور که میبینید، ما 2 کالبک داریم، کالبک اول برای ویژگیهای مشترک و کالبک دوم برای ویژگیهای مشتری است.
کالبک اول پاسخی با فاصله زمانی چشمکزنی دریافت میکند تا دوره مناسب برای چشمکزنی تنظیم شود.
کالبک دوم حالت و وضعیت LED را دریافت میکند تا آنها را ذخیره و تنظیم کند.
این قابلیت به ما امکان میدهد تا پس از راهاندازی مجدد، وضعیت فعلی را حفظ کنیم.
- درخواستهای ویژگی
... // Request current states of shared attributes if (!tb.Shared_Attributes_Request(attribute_shared_request_callback)) { Serial.println("Failed to request for shared attributes"); return; } // Request current states of client attributes if (!tb.Client_Attributes_Request(attribute_client_request_callback)) { Serial.println("Failed to request for client attributes"); return; } ...
برای اینکه کالبکهای ما اطلاعات را دریافت کنند، باید یک درخواست به ThingsBoard ارسال کنیم.
کنترل دستگاه با استفاده از ویژگیهای مشترک
همچنین میتوانیم با استفاده از قابلیت به روزرسانی ویژگی مشترک، دوره چشمکزنی را تغییر دهیم.
- برای تغییر دوره چشمکزنی، فقط کافیست مقدار را در داشبورد خود تغییر دهیم.
- پس از اعمال تغییر با فشردن علامت تیک، یک پیام تأیید را مشاهده خواهید کرد.
//هئل
برای تغییر وضعیت وقتی که چشمکزنی غیرفعال است، میتوانیم از کلید سوئیچ در همان ویجت استفاده کنیم:
- این کار فقط زمانی امکان پذیر است که حالت چشمکزنی غیرفعال باشد.
//img
برای رسیدن به این هدف، یک متغیر به نام “blinkingInterval” در بخشهای زیر کد استفاده میشود:
- کالبک برای بهروزرسانی ویژگیهای مشترک:
... void processSharedAttributes(const Shared_Attribute_Data &data) { for (auto it = data.begin(); it != data.end(); ++it) { if (strcmp(it->key().c_str(), BLINKING_INTERVAL_ATTR) == 0) { const uint16_t new_interval = it->value().as<uint16_t>(); if (new_interval >= BLINKING_INTERVAL_MS_MIN && new_interval <= BLINKING_INTERVAL_MS_MAX) { blinkingInterval = new_interval; Serial.print("Updated blinking interval to: "); Serial.println(new_interval); } } else if(strcmp(it->key().c_str(), LED_STATE_ATTR) == 0) { ledState = it->value().as<bool>(); digitalWrite(LED_BUILTIN, ledState ? HIGH : LOW); Serial.print("Updated state to: "); Serial.println(ledState); } } attributesChanged = true; } ... const Shared_Attribute_Callback attributes_callback(SHARED_ATTRIBUTES_LIST.cbegin(), SHARED_ATTRIBUTES_LIST.cend(), &processSharedAttributes); ...
- اشتراک در بهروزرسانی ویژگیهای مشترک:
... if (!tb.Shared_Attributes_Request(attribute_shared_request_callback)) { Serial.println("Failed to request for shared attributes"); return; } ...
- قسمتی از کد برای چشمک زدن (Blink):
... if (ledMode == 1 && millis() - previousStateChange > blinkingInterval) { previousStateChange = millis(); ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); tb.sendTelemetryBool(LED_STATE_ATTR, ledState); tb.sendAttributeBool(LED_STATE_ATTR, ledState); if (LED_BUILTIN == 99) { Serial.print("LED state changed to: "); Serial.println(ledState); } } ...
شما میتوانید منطق را برای دستیابی به اهداف خود تغییر دهید و پردازشی برای ویژگیهای خود اضافه کنید.
کنترل دستگاه با استفاده از RPC
شما میتوانید به صورت دستی وضعیت LED را تغییر داده و بین حالت روشنایی مداوم و چشمک زنی تغییر دهید. برای این کار، میتوانید از بخشهای زیر در داشبورد ما استفاده کنید:
- برای تغییر وضعیت LED به حالت روشنایی مداوم، از ویجت سوئیچ استفاده کنید.
- برای تغییر وضعیت LED به حالت چشمک زن، از ویجت سوئیچ گرد استفاده کنید.
//img
لطفاً توجه کنید که شما تنها میتوانید وضعیت LED را تغییر دهید اگر حالت چشمک زننده غیرفعال باشد.
در مثال کد، قابلیت بررسی دستورات RPC وجود دارد.
برای به دست آوردن قابلیت کنترل دستگاه، از قسمتهای زیر در کد استفاده شده است:
- بازخوانی برای درخواستهای RPC:
... RPC_Response processSetLedMode(const RPC_Data &data) { Serial.println("Received the set led state RPC method"); // Process data int new_mode = data; Serial.print("Mode to change: "); Serial.println(new_mode); if (new_mode != 0 && new_mode != 1) { return RPC_Response("error", "Unknown mode!"); } ledMode = new_mode; attributesChanged = true; // Returning current mode return RPC_Response("newMode", (int)ledMode); } ... const std::array<RPC_Callback, 1U> callbacks = { RPC_Callback{ "setLedMode", processSetLedMode } }; ...
- عضویت در درخواستهای RPC:
... if (!tb.RPC_Subscribe(callbacks.cbegin(), callbacks.cend())) { Serial.println("Failed to subscribe for RPC"); return; } ...
می توانید کد را تغییر دهید تا به اهداف خود برسید و پردازشی برای دستورات RPC خود اضافه کنید.
نتیجه
با دانش بیان شده در این راهنما، می توانید به راحتی WeMos D1 R2 خود را متصل کرده و داده ها را به ThingsBoard ارسال کنید.
برای کسب اطلاعات بیشتر در مورد مفاهیم و ویژگی های کلیدی، اسناد پلت فرم را کاوش کنید. به عنوان مثال، قوانین هشدار یا داشبورد را پیکربندی کنید.