پرش به مطلب اصلی

ارسال مستقیم دستورات از سرور به ابزار و از ابزار به سرور بدون واسطه و نیاز به آنالیزر

یکی از راه های تعامل با سرور از طریق فایل آنالیزر می باشد که امکانات بسیار زیادی به تولید کنندگان می دهد. اما جهت تسریع ورود تولید کنندگان راه ساده تری نیز وجود دارد. ارسال دستورات در قالب استاندارد اِیر اِنجین بین ابزار و سرور است.

در این روش داده های دریافتی از نرم افزار موبایل مستقیما برای شما ارسال شده و از مترجم و مفسری برای تبدیل به پروتکل قابل مفهموم برای ابزار استفاده نشده و ابزار میتواند مستقیما کد های دریافت شده از نرم افزار موبایل را درک کندو همچنین به صورت برعکس داده های ارسالی شما از ابزار مستقیما برای نرم افزار موبایل قابل درک است و نرم افزار میتواند آپدیت شود.

این زبان مشترک همان operationName است که شما برای ابزار خود در پنل تولید کنندگان تعریف کرده اید که هر operationName تعدادی دستور (command) دارد مانند روشن و خاموش. ابزار شما مستقیما همین operationName و command را میشناسد و طبق این مقادیر آپدیت می شود.

تاپیک ارسال دستور از سرور به ابزار


Topic : projectCode/ServerToDevice/{serial}

تاپیک ارسال دستور از ابزار به سرور


Topic : projectCode/DeviceToServer

این روش به معنی این است که دستورات (قابلیت) ابزار شما طبق استاندارد های AirNgin انتخاب شده است و شما نیاز به یک مفسر یا مترجم داخلی ندارید. این به چه معناست؟

زمانی که یک دستور (قابلیت) (operationName) برای ابزار خود تعریف میکنید این دستور شامل یک سری Command اجرایی است و ابزار شما برای تغییر وضعیت خود همین operationName و Command را میشناسد.

در واقع ابزار شما و سرور مستقیما با هم صحبت میکنند و کد های شما را درک میکند و ابزار شما طبق operationName و Command که شما برای ابزار خود تعریف میکنید مستقیما کار میکند و کد های سرور را مستقیما درک میکند.

نحوه ارسال از ابزار به سرور

زمانی که از سمت ابزار میخواهید اطلاعاتی ارسال کنید (DeviceToServer) یک لیست json ارسال کنید که شامل key و value است.key همان operationName است و value همان command است. این لیست مستقیما برای نرم افزار موبایل ارسال میشود. جنس این json لیست است به این دلیل که در صورتی که بر فرض مثال یکی از پل های کلید شما دستور All on است و همه پل های کلید را روشن میکند میتوانید به صورت لیست همه پل های مورد نظر را ارسال کنید.

همانطور که در مثال زیر مشاهده می نمایید شما می توانید تمامی operationName های خود را که مربوط به یک ابزار است آپدیت نمایید. البته فراموش نکنید شما می توانید صرفا یک operation از ایزار خود را نیز آپد یت نمایید و تمام این موارد متناسب با نیاز شما و دستگاه تولیدی شما است.

نمونه json ارسالی برای یک operationName

[
{ "key": "operationName", "value": "command" },
]

نمونه json ارسالی برای دو operationName

[
{ "key": "operationName", "value": "command" },
{ "key": "operationName", "value": "command" },
]

نمونه json ارسالی برای شش operationName

[
{ "key": "operationName", "value": "command" },
{ "key": "operationName", "value": "command" },
{ "key": "operationName", "value": "command" },
{ "key": "operationName", "value": "command" },
{ "key": "operationName", "value": "command" },
{ "key": "operationName", "value": "command" },
]

نمونه json ارسالی برای یک رله و سنسور دما operationName

[
{ "key": "ch1", "value": "on" },
{ "key": "temp", "value": "28" },
]

نحوه ارسال از سرور به ابزار

زمانی که سرور برای ابزار شما اطلاعاتی ارسال میکند (ServerToDevice) یک json ارسال میکند که شامل دو پارامتر است.پارامتر اول data است که این پارامتر مجددا json است و شامل دو مقدار key و value است. Key همان operationName و value هم همان command است. مقدار دوم deviceSerial است که سریال ابزار است.

نمونه json ارسالی برای یک operationName


{"deviceSerial":"AIRN0000000000","data":"{\"key\":\"OPERATION_NAME\",\"value\":\"COMMAND\"}"}

نمونه json ارسالی برای یک operationName


{"deviceSerial":"AIRN0000000000","data":"{\"key\":\"ch1\",\"value\":\"on\"}"}

من توسط json بالا از طریق اپلیکیشن موبایل برای ابزار خودم یک دستور روشن کردن رله 1 ارسال می کنم. زمانی که این دستور را دریافت می کنم با توجه به اطلاعات دریافتی ابتدا چک می کنم:

1- آیا این دستور برای این ابزار است یا خیر. این کار توسط مقایسه سریال دریافتی و سریال ابزار انجام می شود.

2- بعد چک می نمایم که این دستور برای کدام قابلیت از ابزار من می باشد. این کار توسط مقایسه key که در مثال بالا مقدار آن ch1 می باشد صورت می پذیرد. من برای ابزار خودم تعیین کرده ام ch1 یعنی کانال 1 رله.

3- تعیین می نمایم آن قابلیت ابزار من به چه شکلی تغییر نماید. این کار توسط مقایسه مقدار value صورت می پذیرد. من برای ابزار خودم تعیین کرده ام اگر value برابر on باشد یعنی رله روشن شود.


void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("پیام دریافتی: ");
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);

// تجزیه JSON
StaticJsonDocument<256> doc;
DeserializationError error = deserializeJson(doc, message);

if (error) {
Serial.println("خطا در تجزیه JSON");
return;
}

const char* deviceSerial = doc["deviceSerial"];


// بررسی اینکه پیام برای این دستگاه هست یا نه
if (strcmp(deviceSerial, myDeviceSerial) != 0) {
Serial.println("این پیام برای دستگاه دیگری است.");
return;
}

message = doc["data"];
deserializeJson(doc, message);
const char* key = doc["key"];
const char* value = doc["value"];

// بررسی key و value
if (strcmp(key, "ch1") == 0) {
if (strcmp(value, "on") == 0) {
digitalWrite(relayPin, HIGH);
Serial.println("رله روشن شد");
} else if (strcmp(value, "off") == 0) {
digitalWrite(relayPin, LOW);
Serial.println("رله خاموش شد");
} else {
Serial.println("مقدار ناشناخته برای value");
}
} else {
Serial.println("کلید ناشناخته");
}
}

ویدیو آموزشی ارسال مستقیم

login