خلاصه
MQTT یک پروتکل شبکه سبک وزن و استاندارد ISO باز است که پیام ها را بین دستگاه ها منتقل می کند. یک توپولوژی ارتباطی معمولی MQTT شامل موارد زیر است:
- یک ناشر MQTT → دستگاهی که اطلاعات را به سرور ارسال می کند.
- یک کارگزار MQTT → سروری که داده ها در آن ذخیره می شوند.
- یک مشترک MQTT → دستگاهی که داده های منتشر شده در سرور را می خواند/نظارت می کند.
RouterOS می تواند به عنوان یک ناشر و مشترک MQTT عمل کند (شروع با 7.11beta2 ). همچنین می توانید یک کارگزار/سرور MQTT را از طریق ویژگی کانتینر اجرا کنید . برای پیکربندی بروکر Mosquitto MQTT از پیوند اینجا دیدن کنید .
میتوانید نمونههای کاربردی برای سناریوهای انتشار MQTT را در زیر بیابید:
الف) مثال MQTT/HTTPS با پلتفرم ابری AWS
ب) مثال MQTT با پلتفرم ابری Azure
ج) پیکربندی MQTT و ThingsBoard
لطفاً توجه داشته باشید که نمونههای AWS و Azure (اسکریپتها) انتشار دادههای برچسب بلوتوث را نشان میدهند. در حال حاضر، فقط KNOT دارای تراشه بلوتوث داخلی است.
پیکربندی
منوی فرعی: /iot mqtt
توجه : بسته iot مورد نیاز است.
بسته اینترنت اشیا با RouterOS نسخه 6.48.3 در دسترس است. می توانید آن را از صفحه دانلود ما – در قسمت “بسته های اضافی” دریافت کنید.
ویژگی | شرح |
---|---|
brokers | لیستی از کارگزاران MQTT پیکربندی شده |
connect | دستوری که مشخص می کند به کدام کارگزار متصل شود. |
disconnect | دستوری که مشخص میکند از کدام کارگزار قطع شود. |
publish | دستوری که پیام MQTT را که باید منتشر شود را تعریف می کند. |
subscribe | دستوری که موضوعات MQTT را برای اشتراک تعریف می کند. |
subscriptions | لیستی از موضوعات مشترک و پیام های دریافتی. |
unsubscribe | دستوری که مشخص می کند از کدام موضوع لغو اشتراک کنیم. |
کارگزاران
برای افزودن یک کارگزار MQTT جدید (یا یک سرور MQTT)، دستور زیر را اجرا کنید:
/iot mqtt brokers add
ویژگی های قابل تنظیم در زیر نشان داده شده است:
ویژگی | شرح |
---|---|
address (IP|hostname; Default: ) | آدرس IP یا نام میزبان کارگزار. |
auto-connect (yes | no; Default: no) | هنگامی که فعال شود، پس از قطع شدن یا قطع شدن اتصال با کارگزار MQTT، RouterOS سعی می کند بارها و بارها اتصال را برقرار کند. |
certificate (string; Default: ) | گواهی که قرار است برای اتصال SSL استفاده شود. |
client-id (string; Default: )
| شناسه منحصربهفردی که برای اتصال استفاده میشود. کارگزار از این شناسه برای شناسایی مشتری استفاده می کند. |
keep-alive (integer:30..64800; Default: 60)
| پارامتری که زمان را (بر حسب ثانیه) مشخص میکند، پس از آن مشتری باید به کارگزار MQTT پینگ کند که “زنده” است، تا اطمینان حاصل شود که اتصال ادامه دارد. این مقدار باید بر اساس تنظیمات کارگزار MQTT تنظیم شود. |
name (string; Default: )
| نام توصیفی کارگزار. |
parallel-scripts-limit (integer:3..1000; Default: off)
| پارامتری که تعیین میکند چند اسکریپت قابلیت on-message برای این کارگزار مجاز است دقیقاً همزمان اجرا شود. می تواند برای کاهش CPU مفید باشد، در مواردی که تعداد زیادی پیام به طور مداوم منتشر می شود. |
password (string; Default: )
| رمز عبور کارگزار (در صورت نیاز کارگزار). |
port (integer:0..4294967295; Default: 1883)
| پورت شبکه مورد استفاده کارگزار. |
ssl (yes | no; Default: no)
| پیکربندی لایه سوکت ایمن. |
username (string; Default: ) | نام کاربری برای کارگزار (در صورت نیاز کارگزار). |
نمونه ای از اضافه کردن کارگزار:
/iot mqtt brokers add name="broker" address="192.168.88.33" port=1883 ssl=no client-id="test-client" auto-connect=no keep-alive=60
نتیجه:
/iot mqtt brokers print
0 name="broker" address="192.168.88.33" port=1883 ssl=no client-id="test-client" auto-connect=no keep-alive=60 connected=no
اتصال
برای اتصال به کارگزار MQTT از پیش پیکربندی شده، دستور را صادر کنید:
/iot mqtt connect broker="broker"
اگر اتصال موفقیت آمیز باشد، پارامتر ” connected ” باید به ” yes ” تغییر کند:
/iot mqtt brokers print
0 name="broker" address="192.168.88.33" port=1883 ssl=no client-id="test-client" auto-connect=no keep-alive=60 connected=yes
قطع شدن
برای قطع ارتباط با کارگزار MQTT، دستور زیر را صادر کنید:
/iot mqtt disconnect broker="broker"
برای تأیید قطع ارتباط کارگزار، دستور زیر را صادر کنید و باید ” connect=no ” را نشان دهد:
/iot mqtt brokers print
0 name="broker" address="192.168.88.33" port=1883 ssl=no client-id="test-client" auto-connect=no keep-alive=60 connected=no
انتشار
از منوی انتشار برای ارسال پیام های MQTT به کارگزار MQTT استفاده می شود.
ویژگی | شرح |
---|---|
broker (string; Default: ) | کارگزار را انتخاب کنید، جایی که پیام را منتشر کنید. |
disconnect-after (yes | no; Default: no) | پارامتر، که تضمین می کند که پس از ارسال پیام انتشار، ارتباط با کارگزار به طور خودکار قطع می شود. |
force (yes | no; Default: yes) | اگر روی “بله” تنظیم شود، زمانی که ارتباط با کارگزار هنوز برقرار نشده است (” connect=no “)، و تلاش می شود پیام منتشر شود، RouterOS سعی می کند ابتدا یک اتصال MQTT را با کارگزار مشخص شده برقرار کند و سپس منتشر کند. پیام. اگر روی “خیر” تنظیم شود، RouterOS قادر به ارسال پیام نخواهد بود، مگر اینکه اتصال از قبل برقرار شده باشد (” connect=yes “). |
message (string; Default: )
| پیامی که می خواهید برای کارگزار منتشر کنید. |
qos (integer:0..4294967295; Default: 0)
| پارامتر کیفیت خدمات، همانطور که توسط کارگزار تعریف شده است. |
retain (yes | no; Default: no)
| این که آیا پیام را حفظ کنید یا اگر کسی مشترک موضوع نیست، آن را نادیده گرفت. این پارامتر توسط کارگزار تعریف می شود. |
topic (string; Default: )
| موضوع، همانطور که توسط کارگزار تعریف شده است. |
نمونه ای از انتشار پیام:
/iot mqtt publish message="test-message" broker="broker" topic="my/test/topic"
اشتراک در
لطفاً به یاد داشته باشید که اگر یک ارتباط مداوم با کارگزار دارید (اتصال در وضعیت ” connect=yes ” است) و از طریق آن کارگزار در تاپیک مشترک می شوید، باید ارتباط را دوباره برقرار کنید!
این منو برای اشتراک در موضوعات MQTT از کارگزار استفاده می شود.
ویژگی | شرح |
---|---|
broker (string; Default: ) | کارگزاری را انتخاب کنید که در آن مشترک شوید. |
force (yes | no; Default: yes) | اگر روی “بله” تنظیم شود، هنگامی که ارتباط با کارگزار هنوز برقرار نشده است (” connect=no “)، و اشتراک تلاش می شود، RouterOS سعی می کند ابتدا یک اتصال MQTT با کارگزار مشخص شده برقرار کند و سپس در موضوع مشترک شود. اگر روی “خیر” تنظیم شود، RouterOS نمیتواند در موضوع مشترک شود، مگر اینکه از قبل اتصال برقرار شده باشد (” connect=yes “). |
qos (integer:0..4294967295; Default: 0)
| پارامتر کیفیت خدمات، همانطور که توسط کارگزار تعریف شده است. |
topic (string; Default: )
| موضوع، همانطور که توسط کارگزار تعریف شده است، جایی که باید مشترک شوید. |
نمونه ای از اشتراک:
/iot mqtt subscribe broker="broker" topic="my/test/topic"
اشتراکهای Wildcard (تک سطح ” + ” و چند سطحی ” # “) نیز پشتیبانی میشوند (RouterOS اجازه انتشار در موضوعات عام را نمیدهد ، اما امکان اشتراک در آنها را میدهد):
/iot mqtt subscribe broker="broker" topic="my/test/#"
/iot mqtt subscribe broker="broker" topic="my/test/+"
این بدان معناست که اگر مشترک شوید topic="my/test/#"
، میتوانید پیامهای منتشر شده برای هر موضوعی را دریافت کنید که با الگوی قبل از نماد علامت “#” شروع میشود (مثلاً، "my/test/topic"
) "my/test/topic/something"
.
و اگر مشترک شوید topic="my/test/+"
، میتوانید پیامهای منتشر شده در سطح موضوع 1+ (به عنوان مثال، "my/test/topic"
, "my/test/something"
) را دریافت کنید.
اشتراک ها
این بخش برای مدیریت اشتراکهایی که قبلاً اضافه شدهاند (که قبلاً از طریق بخش اشتراک اضافه شدهاند ) استفاده میشود.
دارای همان ویژگی های بخش Subscribe است .
ویژگی | شرح |
---|---|
on-message (string; Default: ) | اسکریپتی را پیکربندی کنید که هر زمان که پیام جدیدی در موضوع مشترک دریافت میشود، بهطور خودکار راهاندازی/اجرا شود. |
برای بررسی موضوعاتی که قبلاً مشترک شده اند، دستور را صادر کنید:
/iot mqtt subscriptions print
0 broker=broker topic="my/test/topic" qos=0
پس از انتشار یک پیام آزمایشی همانطور که در بخش انتشار در بالا نشان داده شده است:
/iot mqtt publish message="test-message" broker="broker" topic="my/test/topic"
شما باید بتوانید پیام دریافتی را در زیر بررسی کنید:
/iot mqtt subscriptions recv print
0 broker=broker topic="my/test/topic" data="test-message" time=2023-05-22 16:57:00
برای پاک کردن پیام های ذخیره شده، دستور زیر را صادر کنید:
/iot mqtt subscriptions recv clear
برای اجرای یک اسکریپت (به عنوان مثال، یک اسکریپت اولیه “log”) هر زمان که هر پیام جدیدی در موضوع مشترک ظاهر می شود، می توانید از این on-message
ویژگی استفاده کنید:
/iot mqtt subscriptions set on-message={:log info "Got data {$msgData} from topic {$msgTopic}"} broker=broker 0
اسکریپت می تواند از متغیرهای $msgData و $msgTopic استفاده کند. $msgData پیام MQTT را که منتشر شده است و $msgTopic موضوع MQTT را که در آن پیام منتشر شده است، تعریف می کند. هنگامی که یک پیام جدید ظاهر می شود، هر دو متغیر به طور خودکار تولید می شوند.
- متغیرهای $msgData و $msgTopic وقتی در بخش « System>Script » استفاده میشوند، اسکریپتهای ایجاد شده کار نمیکنند، به این معنی که در داخل اسکریپتهای اضافه شده «/iot mqtt set on-message={/system script run x} » کار نمیکنند . هر دو متغیر فقط زمانی کار خواهند کرد که در داخل اسکریپت نوشته شده ” on-message={} ” استفاده شوند ، مانند، برای مثال، ” on-message={:log info “Got data {$msgData} from the topic {$msgTopic}” } “.
- همین امر در مورد استفاده از متغیر جهانی نیز صدق می کند. اگر متغیرهای سراسری وجود داشته باشند که با استفاده از اسکریپت های دیگر “تولید” شده اند (متغیرهایی که در بخش System>Script>Environment ظاهر می شوند)، در داخل اسکریپت “روی پیام” کار نخواهند کرد.
پس از انتشار یک پیام MQTT جدید در موضوع مشترک شده، یک ورودی جدید باید ظاهر شود:
/log print
10:19:15 script,info Got data {test-message} from topic {my/test/topic}
مثال دوم نحوه اجرای یک اسکریپت را هر زمان که یک پیام خاص (کلمات کلیدی از پیام) ظاهر می شود نشان می دهد. برای دستیابی به یک سناریو، که در آن میخواهیم یک اسکریپت را فقط زمانی اجرا کنیم که پیام MQTT دارای محتوای خاص یا یک کلمه کلیدی باشد، میتوانیم از عبارت if استفاده کنیم :
/iot mqtt subscriptions set 0 on-messag={:if ($msgData~"\\{\"test\":\"123\"\\}") do={:log info "Got data {$msgData} from topic {$msgTopic}"}}
یا:
/iot mqtt subscriptions set 0 on-messag={:if ($msgData~"test") do={:log info "Got data {$msgData} from topic {$msgTopic}"}}
در نتیجه، در هر پیام MQTT دریافتی، اسکریپت بررسی می کند که آیا شرط if درست است یا خیر. اگر درست باشد (اگر $msgData حاوی رشته JSON {“test”:”123″} باشد یا اگر $msgData شامل رشته ” تست ” باشد)، ورودی گزارش ایجاد خواهد شد. در غیر این صورت هیچ اتفاقی نمی افتد.
به این معنی که اسکریپت فقط زمانی اجرا می شود که پیامی مانند این را منتشر کنید:
/iot mqtt publish broker=broker topic="my/test/topic" message="{\"test\":\"123\"}"
هنگامی که پیامی از موضوعی دریافت می کنید که تحت چندین اشتراک با on-message
پیکربندی قرار می گیرد، فقط اسکریپت x1 on-message
اجرا می شود. RouterOS on-meesage
با استفاده از منطق/اولویت زیر، اسکریپت مورد نظر را انتخاب می کند:
- اگر موضوع پیکربندی شده برای اشتراک دقیقاً مطابقت دارد → اولویت اول؛
- اگر نام موضوع دقیقاً مطابقت نداشته باشد (از عام استفاده می شود) → اولویت دوم برای موضوعات عام 1 به 1 است.
- اگر موضوع در زیر دسته عام 1v1 قرار نمی گیرد ← اولویت سوم برای موضوعات عام چند سطحی بر اساس سطح موضوع است.
یک مثال:
/iot mqtt subscriptions print
0 broker=broker topic="some/sort/of/topic" qos=0 on-message="/system script run script1"
1 broker=broker topic="some/#" qos=0 on-message="/system script run script2"
2 broker=broker topic="some/sort/of/+" qos=0 on-message="/system script run script3"
3 broker=broker topic="some/thing/#" qos=0 on-message="/system script run script4"
هنگامی که داده ها را در منتشر می کنید some/sort/of/topic
، اسکریپت 1 آغاز می شود → زیرا موضوع دقیقاً مطابقت دارد.
هنگامی که دادهها را در منتشر میکنید some/sort/of/thing
، scrtip3 آغاز میشود ← زیرا تحت نام موضوع عام 1v1 قرار میگیرد.
وقتی دادهها را در منتشر میکنید some/name
، اسکریپت 2 آغاز میشود ← زیرا تحت نام موضوع عام چند سطحی قرار میگیرد.
وقتی دادهها را در منتشر میکنید some/thing/else
، اسکریپت 4 آغاز میشود ← زیرا تحت نام موضوع عام چند سطحی قرار میگیرد (حتی اگر با some/#
علامت عام مطابقت دارد، سطحی نزدیکتر به some/thing/#
ورودی است).
لغو اشتراک
ویژگی | شرح |
---|---|
broker (string; Default: ) | کارگزاری را برای لغو اشتراک انتخاب کنید. |
topic (string; Default: )
| موضوعی را که توسط کارگزار تعریف شده است، برای لغو اشتراک انتخاب کنید. |
نمونه ای از لغو اشتراک از کارگزار و موضوع در زیر نشان داده شده است:
/iot mqtt unsubscribe broker="broker" topic="my/test/topic"
انتشار آمار RouterOS با استفاده از اسکریپت
همچنین میتوانید از اسکریپتهایی برای ساختار پیامهای MQTT که حاوی آمار RouterOS هستند استفاده کنید. سپس، میتوانید زمانبندی را برای اجرای اسکریپت هر زمان که دوست دارید اعمال کنید.
به عنوان مثال، می توانید یک اسکریپت مانند این را اجرا کنید (محتوای کد RouterOS نشان داده شده در زیر را در یک ترمینال جدید کپی کنید و “Enter” را فشار دهید):
/system script add dont-require-permissions=no name=mqttpublish owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
\_Required packages: iot\r\
\n\r\
\n################################ Configuration #########################\
#######\r\
\n# Name of an existing MQTT broker that should be used for publishing\r\
\n:local broker \"broker\"\r\
\n\r\
\n# MQTT topic where the message should be published\r\
\n:local topic \"my/test/topic\"\r\
\n\r\
\n#################################### System ############################\
#######\r\
\n:put (\"[*] Gathering system info...\")\r\
\n:local cpuLoad [/system resource get cpu-load]\r\
\n:local freeMemory [/system resource get free-memory]\r\
\n:local usedMemory ([/system resource get total-memory] - \$freeMemory)\r\
\n:local rosVersion [/system package get value-name=version \\\r\
\n\A0 \A0 [/system package find where name ~ \"^routeros\"]]\r\
\n:local model [/system routerboard get value-name=model]\r\
\n:local serialNumber [/system routerboard get value-name=serial-number]\r\
\n:local upTime [/system resource get uptime]\r\
\n\r\
\n#################################### MQTT ##############################\
#######\r\
\n:local message \\\r\
\n\A0 \A0 \"{\\\"model\\\":\\\"\$model\\\",\\\r\
\n\A0 \A0 \A0 \A0 \A0 \A0 \A0 \A0 \\\"sn\\\":\\\"\$serialNumber\\\",\\\r\
\n\A0 \A0 \A0 \A0 \A0 \A0 \A0 \A0 \\\"ros\\\":\\\"\$rosVersion\\\",\\\r\
\n\A0 \A0 \A0 \A0 \A0 \A0 \A0 \A0 \\\"cpu\\\":\$cpuLoad,\\\r\
\n\A0 \A0 \A0 \A0 \A0 \A0 \A0 \A0 \\\"umem\\\":\$usedMemory,\\\r\
\n\A0 \A0 \A0 \A0 \A0 \A0 \A0 \A0 \\\"fmem\\\":\$freeMemory,\\\r\
\n\A0 \A0 \A0 \A0 \A0 \A0 \A0 \A0 \\\"uptime\\\":\\\"\$upTime\\\"}\"\r\
\n\r\
\n:log info \"\$message\";\r\
\n:put (\"[*] Total message size: \$[:len \$message] bytes\")\r\
\n:put (\"[*] Sending message to MQTT broker...\")\r\
\n/iot mqtt publish broker=\$broker topic=\$topic message=\$message\r\
\n:put (\"[*] Done\")"
اسکریپت داده ها را از RouterOS (نام مدل، شماره سریال، نسخه RouterOS، CPU فعلی، حافظه استفاده شده، حافظه آزاد و زمان آپدیت) جمع آوری می کند و پیام (داده ها) را در قالب JSON برای کارگزار منتشر می کند:
/system script run mqttpublish
[*] Gathering system info...
[*] Total message size: 125 bytes
[*] Sending message to MQTT broker...
[*] Done
برای بررسی نتایج می توانید در تاپیک مشترک شوید:
/iot mqtt subscriptions recv print
0 broker=broker topic="my/test/topic" data="{"model":"RB924i-2nD-BT5&BG77","sn":"E9C80EAEXXXX","ros":"7.9","cpu":13,"umem":47476736,
"fmem":19632128,"uptime":"02:21:18"}"
time=2023-05-22 17:03:52
فراموش نکنید که قسمت “پیکربندی” اسکریپت (موضوع و کارگزار) را بر اساس تنظیمات خود تغییر دهید.
پیکربندی MQTT و ThingsBoard
معرفی
یکی از بسیاری از خدمات ابری که می توانید برای نظارت بر اطلاعات ارسال شده توسط ناشر MQTT استفاده کنید، Thingsboard است . این مقاله نحوه پیکربندی Thingsboard و RouterOS را برای انتشار دادهها با استفاده از پروتکل MQTT نشان میدهد. RouterOS، در این سناریو، قرار است به عنوان یک دروازه عمل کند و داده ها را از RouterBoard به سرور Thingsboard منتشر کند. Thingsboard، در این سناریو، به عنوان یک کارگزار MQTT (سرور، جایی که داده ها پست می شوند) عمل می کند.
قبل از اینکه به تنظیمات ادامه دهیم، باید یکی از موارد زیر را انجام دهید:
- الف) یک حساب کاربری در سیستم Thingsboard ایجاد کنید. با دنبال کردن این لینک می توانید این کار را انجام دهید . این به شما این امکان را می دهد که از راه حل ابری ThingsBoard به صورت رایگان برای یک دوره زمانی محدود/آزمایشی استفاده کنید.
- ب) با دنبال کردن راهنماها سرور خود را راه اندازی کنید . یک نسخه انجمن وجود دارد که می توان آن را به صورت رایگان نصب و استفاده کرد.
لطفاً به جای غیر SSL MQTT (درگاه TCP 1883) از SSL MQTT (درگاه TCP 8883 و گواهیها) استفاده کنید . اگر از MQTT غیر SSL استفاده می کنید، ارتباط بین کلاینت (ناشر MQTT) و سرور (کارگزار MQTT) به راحتی قابل شناسایی/گرفتن بسته است و این امر باعث به خطر افتادن داده های احراز هویت (مانند شناسه مشتری، نام کاربری و رمز عبور) می شود.
پیکربندی Thingsboard
در این راهنما، ما پیکربندی نصب نمونه/سرور محلی را به نمایش خواهیم گذاشت، اما همان اصول برای گزینه ابری اعمال میشود.
از طریق مرورگر خود به صفحه ورود به سیستم دسترسی پیدا کنید و وارد شوید. به منوی ” دستگاه ها ” بروید.
با کلیک بر روی دکمه افزودن “+” و “افزودن دستگاه جدید” یک دستگاه جدید ایجاد کنید:
نام دستگاه را وارد کرده و روی «افزودن» کلیک کنید:
به طور پیش فرض، احراز هویت نشانه دسترسی برای دستگاه جدید ایجاد شده انتخاب شده است.
سناریوی نشانه دسترسی
می توانید با کلیک بر روی دستگاه ایجاد شده و وارد کردن تنظیمات ” مدیریت اعتبارنامه ها ” (در بخش ” جزئیات “)، نشانه را تغییر دهید:
این نشانه به عنوان یک “نام کاربری” برای ناشر MQTT (در تنظیمات RouterOS) استفاده خواهد شد.
با دنبال کردن لینک می توانید اطلاعات بیشتری کسب کنید .
سناریوی پایه MQTT
میتوانید نوع اعتبارنامه را در بخش « معتبر دستگاه » برای دستگاه خاص تغییر دهید:
سناریوی پایه MQTT به شما امکان می دهد شناسه مشتری، نام کاربری و رمز عبور را برای احراز هویت MQTT مشخص کنید.
با دنبال کردن لینک می توانید اطلاعات بیشتری کسب کنید .
سناریوی ارتباط SSL یک طرفه
سناریوی پیشنهادی برای استفاده!
این نوع احراز هویت مستلزم استفاده از گواهی سرور برای ارتباط SSL است. یک گواهی سرور باید تولید و در نمونه ThingsBoard آپلود شود.
برای تولید گواهی سرور، از این راهنما به عنوان مرجع استفاده کنید → گواهی را تولید کنید (به عنوان مثال، با استفاده از ابزار OPENSSL)، آن را در پوشه صحیح نصب/آپلود کنید و MQTT SSL را در فایل پیکربندی ThingsBoard فعال کنید.
پیکربندی همان است که در توکن Access و سناریوهای پایه MQTT نشان داده شده در بالا نشان داده شده است. پس یکی را انتخاب کنید.
تنها تفاوت، در این مورد، ارتباط بین دستگاه و سرور است (شما فقط باید پیکربندی کارگزار MQTT را در تنظیمات RouterOS تغییر دهید که بعداً نشان داده خواهد شد).
هنگام استفاده از این سناریو، ارتباطات رمزگذاری می شود (با استفاده از SSL) .
سناریوی X.509 (ارتباط SSL دو طرفه).
این نوع احراز هویت مستلزم استفاده از گواهی سرور و گواهی مشتری برای ارتباط SSL است. یک گواهی سرور باید تولید و در نمونه ThingsBoard آپلود شود.
برای تولید گواهی سرور، از این راهنما به عنوان مرجع استفاده کنید → گواهی را تولید کنید (به عنوان مثال، با استفاده از ابزار OPENSSL)، آن را در پوشه صحیح نصب/آپلود کنید و MQTT SSL را در فایل پیکربندی ThingsBoard فعال کنید.
برای تولید گواهی مشتری، از این راهنما به عنوان مرجع استفاده کنید.
میتوانید نوع اعتبارنامه را در بخش « معتبر دستگاه » برای دستگاه خاص تغییر دهید:
سناریوی X.509 از گواهی مشتری برای احراز هویت استفاده می کند.
پس از تولید گواهی (به عنوان مثال، با استفاده از OPEN SSL)، کلید عمومی RSA را در فیلد کپی کنید و روی دکمه “ذخیره” کلیک کنید.
پیکربندی RouterOS
توجه : برای پیکربندی MQTT، مطمئن شوید که بسته iot از قبل نصب شده باشد.
کارگزار MQTT
سناریوی نشانه دسترسی
یک کارگزار MQTT مانند شکل زیر اضافه کنید:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=1883 username=access_token
- ”
address
” را به آدرس IP/دامنه واقعی سرور ThingsBoard خود تغییر دهید. - ”
username
” را به نشانه دسترسی که در تنظیمات ThingsBoard استفاده کرده اید، تغییر دهید.
سناریوی پایه MQTT
یک کارگزار MQTT مانند شکل زیر اضافه کنید:
/iot/mqtt/brokers/add name=tb address=x.x.x.x client-id=clientid password=password username=username
- ”
address
” را به آدرس IP/دامنه واقعی سرور ThingsBoard خود تغییر دهید. - ”
username
“، ”password
” و ”client-id
” را به مقادیر واقعی که در تنظیمات ThingsBoard استفاده کرده اید تغییر دهید.
سناریوی ارتباط SSL یک طرفه
سناریوی پیشنهادی برای استفاده!
در این سناریو، RouterOS نیاز به یک گواهی سرور وارد شده به سیستم خود دارد.
گواهی سرور را بکشید و رها کنید، که در ThingsBoard نصب شده است، در منوی “فهرست فایل” روتر:
واردات گواهی سرور:
- ”
/certificate/import file-name=mqttserver.pem passphrase=""
هنگام استفاده از ارتباط یک طرفه SSL و سناریوی نشانه دسترسی ، یک کارگزار MQTT را مانند شکل زیر اضافه کنید:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 username=access_token ssl=yes
- ”
address
” را به آدرس IP/دامنه واقعی سرور ThingsBoard خود تغییر دهید. - ”
username
” را به نشانه دسترسی که در تنظیمات ThingsBoard استفاده کردهاید، تغییر دهید. - مطمئن شوید که از ”
port=8883
” (پورت MQTT SSL که سرور به آن گوش می دهد) استفاده کنید. - مطمئن شوید که ”
ssl=yes
” را فعال کنید.
هنگام استفاده از ارتباط یک طرفه SSL و سناریوی پایه MQTT ، یک کارگزار MQTT را مانند شکل زیر اضافه کنید:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 client-id=clientid password=password username=username ssl=yes
- ”
address
” را به آدرس IP/دامنه واقعی سرور ThingsBoard خود تغییر دهید. - ”
username
“، ”password
” و ”client-id
” را به مقادیر واقعی که در تنظیمات ThingsBoard استفاده کرده اید تغییر دهید. - مطمئن شوید که از ”
port=8883
” (پورت MQTT SSL که سرور به آن گوش می دهد) استفاده کنید. - مطمئن شوید که ”
ssl=yes
” را فعال کنید.
سناریوی X.509 (ارتباط SSL دو طرفه).
گواهیها را در منوی «فایلها/فهرست فایل» → گواهی سرور، گواهی مشتری و کلید خصوصی آن، بکشید و رها کنید.
گواهینامه ها را یک به یک وارد کنید:
- ”
/certificate/import file-name=mqttserver.pem passphrase=""
/certificate/import file-name=cert.pem passphrase=""
/certificate/import file-name=key.pem passphrase=""
یک کارگزار MQTT مانند شکل زیر اضافه کنید:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 certificate=cert.pem_0 ssl=yes
- ”
address
” را به آدرس IP/دامنه واقعی سرور ThingsBoard خود تغییر دهید. - ”
certificate
” انتخاب شده را به نام گواهی مشتری واقعی که وارد کرده اید تغییر دهید. - مطمئن شوید که از ”
port=8883
” (پورت MQTT SSL که سرور به آن گوش می دهد) استفاده کنید. - مطمئن شوید که ”
ssl=yes
” را فعال کنید.
انتشار MQTT
الف) یک آزمایش انتشار سریع MQTT با مقدار ایستا:
/iot/mqtt/publish broker="tb" topic="v1/devices/me/telemetry" message="{\"cpu\":\"7\"}"
ب) به منظور انتشار داده های مربوطه از RouterOS به Thingsboard، می توانید از اسکریپت زیر به عنوان مرجع استفاده کنید. اسکریپت داده ها را از دستگاه RouterOS جمع آوری می کند (نام مدل، شماره سریال، نسخه RouterOS، CPU فعلی، حافظه استفاده شده، حافظه آزاد و زمان آپدیت) و پیام (داده ها) را در قالب JSON برای کارگزار منتشر می کند:
# Required packages: iot
################################ Configuration ################################
# Name of an existing MQTT broker that should be used for publishing
:local broker "tb"
# MQTT topic where the message should be published
:local topic "v1/devices/me/telemetry"
#################################### System ###################################
:put ("[*] Gathering system info...")
:local cpuLoad [/system resource get cpu-load]
:local freeMemory [/system resource get free-memory]
:local usedMemory ([/system resource get total-memory] - $freeMemory)
:local rosVersion [/system package get value-name=version \
[/system package find where name ~ "^routeros"]]
:local model [/system routerboard get value-name=model]
:local serialNumber [/system routerboard get value-name=serial-number]
:local upTime [/system resource get uptime]
#################################### MQTT #####################################
:local message \
"{\"model\":\"$model\",\
\"sn\":\"$serialNumber\",\
\"ros\":\"$rosVersion\",\
\"cpu\":$cpuLoad,\
\"umem\":$usedMemory,\
\"fmem\":$freeMemory,\
\"uptime\":\"$upTime\"}"
:log info "$message";
:put ("[*] Total message size: $[:len $message] bytes")
:put ("[*] Sending message to MQTT broker...")
/iot mqtt publish broker=$broker topic=$topic message=$message
:put ("[*] Done")
2 خط اسکریپت باید در نظر گرفته شود.
:local broker "tb"
خط، جایی که باید نام کارگزار را در علامت نقل قول “”.
:local topic "v1/devices/me/telemetry"
خط، جایی که باید موضوع صحیح را در علامت نقل قول “” مشخص کنید ( مستندات Thingsboard را برای موضوع دقیقی که باید استفاده شود بررسی کنید).
بقیه تنظیمات اسکریپت به نیازهای کلی بستگی دارد.
اسکریپت بالا را کپی کرده و در یک دفترچه یادداشت قرار دهید و دوباره آن را کپی کنید. به منوی System>Scripts بروید، یک اسکریپت جدید را در آنجا اضافه کنید و اسکریپتی را که در بالا نشان داده شده است جایگذاری کنید. نام آن را مثلا script1 بگذارید.
برای اجرای اسکریپت می توانید از خط فرمان استفاده کنید:
/system script run script1
تایید
میتوانید دادههای دریافتی/منتشر شده برای دستگاه را در بخش «آخرین تلهمتری» بررسی کنید: