شبیه سازی شبکه Thread با استفاده از OpenThread در Docker

۱. مقدمه

۲۶b7f4f6b3ea0700.png

OpenThread که توسط گوگل منتشر شده است، یک پیاده‌سازی متن‌باز از پروتکل شبکه Thread است. گوگل نست (Google Nest) OpenThread را منتشر کرده است تا فناوری مورد استفاده در محصولات Nest را به طور گسترده در دسترس توسعه‌دهندگان قرار دهد تا توسعه محصولات برای خانه‌های متصل را تسریع کند.

مشخصات Thread یک پروتکل ارتباطی بی‌سیم دستگاه به دستگاه مبتنی بر IPv6، قابل اعتماد، امن و کم‌مصرف را برای کاربردهای خانگی تعریف می‌کند. OpenThread تمام لایه‌های شبکه Thread شامل IPv6، 6LoWPAN، IEEE 802.15.4 را با امنیت MAC، ایجاد لینک مش و مسیریابی مش پیاده‌سازی می‌کند.

این Codelab شما را در شبیه‌سازی یک شبکه Thread روی دستگاه‌های شبیه‌سازی شده با استفاده از Docker راهنمایی می‌کند.

آنچه یاد خواهید گرفت

  • نحوه تنظیم ابزار ساخت OpenThread
  • نحوه شبیه‌سازی یک شبکه Thread
  • نحوه احراز هویت گره‌های Thread
  • نحوه مدیریت شبکه Thread با OpenThread Daemon

آنچه نیاز دارید

  • داکر
  • آشنایی اولیه با لینوکس، مسیریابی شبکه

۲. راه‌اندازی داکر

این Codelab برای استفاده از Docker روی لینوکس، Mac OS X یا ویندوز طراحی شده است. لینوکس محیط پیشنهادی است.

نصب داکر

داکر را روی سیستم عامل مورد نظر خود نصب کنید.

ایمیج داکر را دریافت کنید

پس از نصب داکر، یک پنجره ترمینال باز کنید و ایمیج openthread/environment Docker را دریافت کنید. این ایمیج شامل OpenThread و OpenThread Daemon از پیش ساخته شده و آماده استفاده برای این Codelab است.

$ docker pull openthread/environment:latest

توجه داشته باشید که ممکن است دانلود کامل چند دقیقه طول بکشد.

در یک پنجره ترمینال، یک کانتینر داکر را از روی تصویر اجرا کنید و به پوسته bash آن متصل شوید:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

گزینه --rm هنگام خروج از کانتینر، آن را حذف می‌کند. اگر نمی‌خواهید کانتینر حذف شود، از این گزینه استفاده نکنید.

به پرچم‌هایی که برای این Codelab مورد نیاز هستند توجه کنید:

  • --sysctl net.ipv6.conf.all.disable_ipv6=0 — این IPv6 را درون کانتینر فعال می‌کند
  • --cap-add=net_admin — قابلیت NET_ADMIN را فعال می‌کند که به شما امکان می‌دهد عملیات مرتبط با شبکه، مانند اضافه کردن مسیرهای IP، را اجرا کنید.

وقتی داخل کانتینر قرار گرفتید، باید با پیامی مشابه این مواجه شوید:

root@c0f3912a74ff:/#

در مثال بالا، c0f3912a74ff شناسه کانتینر است. شناسه کانتینر برای نمونه کانتینر داکر شما با آنچه در دستورالعمل‌های این Codelab نشان داده شده است، متفاوت خواهد بود.

استفاده از داکر

این Codelab فرض می‌کند که شما اصول اولیه استفاده از Docker را می‌دانید. شما باید در کل Codelab در کانتینر Docker بمانید.

۳. شبیه‌سازی یک شبکه Thread

برنامه نمونه‌ای که برای این Codelab استفاده خواهید کرد، یک برنامه OpenThread مینیمال را نشان می‌دهد که رابط‌های پیکربندی و مدیریت OpenThread را از طریق یک رابط خط فرمان (CLI) پایه در معرض نمایش قرار می‌دهد.

این تمرین شما را با حداقل مراحل مورد نیاز برای پینگ کردن یک دستگاه Thread شبیه‌سازی شده از یک دستگاه Thread شبیه‌سازی شده دیگر آشنا می‌کند.

شکل زیر یک توپولوژی شبکه Thread پایه را توصیف می‌کند. برای این تمرین، دو گره درون دایره سبز را شبیه‌سازی خواهیم کرد: یک Thread Leader و یک Thread Router با یک اتصال واحد بین آنها.

6e3aa07675f902dc.png

شبکه را ایجاد کنید

۱. گره ۱ را شروع کنید

اگر قبلاً این کار را نکرده‌اید، در یک پنجره ترمینال، کانتینر داکر را اجرا کرده و به پوسته bash آن متصل شوید:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

در کانتینر داکر، با استفاده از فایل باینری ot-cli-ftd فرآیند CLI را برای یک دستگاه Thread شبیه‌سازی شده ایجاد کنید.

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

نکته: اگر بعد از اجرای این دستور، اعلان > را مشاهده نکردید، enter فشار دهید.

این فایل باینری یک دستگاه OpenThread را پیاده‌سازی می‌کند. درایور رادیویی IEEE 802.15.4 بر روی UDP پیاده‌سازی شده است (فریم‌های IEEE 802.15.4 درون بارهای داده UDP منتقل می‌شوند).

آرگومان 1 یک توصیف‌گر فایل است که نشان‌دهنده‌ی کم‌ارزش‌ترین بیت‌های IEEE EUI-64 «اختصاص‌یافته از کارخانه» برای دستگاه شبیه‌سازی‌شده است. این مقدار همچنین هنگام اتصال به پورت UDP برای شبیه‌سازی رادیویی IEEE 802.15.4 (پورت = ۹۰۰۰ + توصیف‌گر فایل) استفاده می‌شود. هر نمونه از یک دستگاه Thread شبیه‌سازی‌شده در این Codelab از یک توصیف‌گر فایل متفاوت استفاده خواهد کرد.

نکته: فقط از توصیف‌گرهای فایل 1 یا بالاتر، همانطور که در این Codelab ذکر شده است، هنگام ایجاد فرآیند برای یک دستگاه شبیه‌سازی شده استفاده کنید. توصیف‌گر فایل 0 برای استفاده‌های دیگر رزرو شده است.

یک مجموعه داده عملیاتی جدید ایجاد کنید و آن را به عنوان مجموعه داده فعال ثبت کنید. مجموعه داده عملیاتی، پیکربندی شبکه Thread ای است که شما ایجاد می کنید.

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 20
Channel Mask: 07fff800
Ext PAN ID: d6263b6d857647da
Mesh Local Prefix: fd61:2344:9a52:ede0/64
Network Key: e4344ca17d1dca2a33f064992f31f786
Network Name: OpenThread-c169
PAN ID: 0xc169
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

این مجموعه داده را به عنوان مجموعه داده فعال ثبت کنید:

> dataset commit active
Done

رابط IPv6 را اجرا کنید:

> ifconfig up
Done

شروع عملیات پروتکل Thread:

> thread start
Done

چند ثانیه صبر کنید و تأیید کنید که دستگاه به عنوان رهبر رشته (Thread Leader) انتخاب شده است. رهبر، دستگاهی است که مسئولیت مدیریت تخصیص شناسه روتر (router ID) را بر عهده دارد.

> state
leader
Done

آدرس‌های IPv6 اختصاص داده شده به رابط Thread گره ۱ را مشاهده کنید (خروجی شما متفاوت خواهد بود):

> ipaddr
fd61:2344:9a52:ede0:0:ff:fe00:fc00
fd61:2344:9a52:ede0:0:ff:fe00:5000
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
fe80:0:0:0:94da:92ea:1353:4f3b
Done

به انواع خاص آدرس IPv6 توجه کنید:

  • با fd = mesh-local شروع می‌شود
  • با fe80 شروع می‌شود = لینک-محلی

انواع آدرس‌های محلی مش به صورت زیر طبقه‌بندی می‌شوند:

  • شامل ff:fe00 = یابنده مسیریاب (RLOC)
  • شامل ff:fe00 = شناسه نقطه پایانی (EID) نمی‌شود.

EID را در خروجی کنسول خود مشخص کنید و آن را برای استفاده‌های بعدی یادداشت کنید. در خروجی نمونه بالا، EID به صورت زیر است:

fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6

۲. گره ۲ را شروع کنید

یک ترمینال جدید باز کنید و یک پوسته bash را در کانتینر Docker که در حال حاضر در حال اجرا است، اجرا کنید تا برای Node 2 استفاده شود.

$ docker exec -it codelab_otsim_ctnr bash

در این اعلان bash جدید، فرآیند CLI را با آرگومان 2 ایجاد کنید. این دومین دستگاه Thread شبیه‌سازی شده شماست:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

نکته: اگر بعد از اجرای این دستور، اعلان > را مشاهده نکردید، enter فشار دهید.

کلید شبکه نخ و شناسه PAN را با استفاده از همان مقادیر مجموعه داده‌های عملیاتی گره ۱ پیکربندی کنید:

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

این مجموعه داده را به عنوان مجموعه داده فعال ثبت کنید:

> dataset commit active
Done

رابط IPv6 را اجرا کنید:

> ifconfig up
Done

شروع عملیات پروتکل Thread:

> thread start
Done

دستگاه خود را به عنوان یک Child مقداردهی اولیه می‌کند. یک Thread Child معادل یک End Device است که یک دستگاه Thread است که ترافیک Unicast را فقط با یک دستگاه Parent ارسال و دریافت می‌کند.

> state
child
Done

ظرف ۲ دقیقه باید شاهد تغییر وضعیت از child به router باشید. یک روتر Thread قادر به مسیریابی ترافیک بین دستگاه‌های Thread است. به آن والد نیز گفته می‌شود.

> state
router
Done

شبکه را تأیید کنید

یک راه آسان برای تأیید شبکه مش، نگاه کردن به جدول روتر است.

۱. اتصال را بررسی کنید

در گره ۲، RLOC16 را دریافت کنید. RLOC16 آخرین ۱۶ بیت آدرس RLOC IPv6 دستگاه است.

> rloc16
5800
Done

در گره ۱، جدول روتر را برای RLOC16 گره ۲ بررسی کنید. مطمئن شوید که گره ۲ ابتدا به حالت روتر تغییر وضعیت داده است.

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In  | LQ Out  | Age | Extended MAC   |
+----+--------+----------+-----------+--------+-------+---+--------------------+
| 20 | 0x5000 |       63 |         0 |      0 |     0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |      3 |     3 |  23 | 5a4eb647eb6bc66c |

مقدار RLOC گره ۲ برابر با 0x5800 در جدول یافت می‌شود که اتصال آن به شبکه را تأیید می‌کند.

۲. پینگ کردن گره ۱ از گره ۲

اتصال بین دو دستگاه Thread شبیه‌سازی شده را تأیید کنید. در گره ۲، EID اختصاص داده شده به گره ۱ ping :

> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
> 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms

برای بازگشت به اعلان > CLI، enter فشار دهید.

شبکه را آزمایش کنید

حالا که می‌توانید با موفقیت بین دو دستگاه شبیه‌سازی شده Thread پینگ کنید، شبکه مش را با آفلاین کردن یک گره آزمایش کنید.

بازگشت به گره ۱ و متوقف کردن نخ:

> thread stop
Done

به گره ۲ سوئیچ کنید و وضعیت را بررسی کنید. ظرف دو دقیقه، گره ۲ تشخیص می‌دهد که رهبر (گره ۱) آفلاین است و باید شاهد انتقال گره ۲ به leader شبکه باشید:

> state
router
Done
...
> state
leader
Done

پس از تأیید، Thread را متوقف کنید و قبل از بازگشت به اعلان Docker bash ، Node 2 را به تنظیمات کارخانه برگردانید. تنظیم مجدد کارخانه برای اطمینان از عدم انتقال اعتبارنامه‌های شبکه Thread که در این تمرین استفاده کردیم به تمرین بعدی انجام می‌شود.

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

ممکن است لازم باشد چند بار کلید enter فشار دهید تا بعد از دستور factoryreset اعلان > نمایش داده شود. از کانتینر داکر خارج نشوید.

همچنین تنظیمات کارخانه را بازنشانی کنید و از گره ۱ خارج شوید:

> factoryreset
>
> exit
root@c0f3912a74ff:/#

برای بررسی تمام دستورات CLI موجود، به مرجع OpenThread CLI مراجعه کنید.

۴. احراز هویت گره‌ها با راه‌اندازی

در تمرین قبلی، شما یک شبکه Thread با دو دستگاه شبیه‌سازی شده و اتصال تأیید شده راه‌اندازی کردید. با این حال، این فقط به ترافیک لینک-محلی IPv6 احراز هویت نشده اجازه عبور بین دستگاه‌ها را می‌دهد. برای مسیریابی ترافیک جهانی IPv6 بین آنها (و اینترنت از طریق یک روتر مرزی Thread)، گره‌ها باید احراز هویت شوند.

برای احراز هویت، یک دستگاه باید به عنوان کمیسر عمل کند. کمیسر، سرور احراز هویت منتخب فعلی برای دستگاه‌های جدید Thread و مجوز دهنده برای ارائه اعتبارنامه‌های شبکه مورد نیاز برای پیوستن دستگاه‌ها به شبکه است.

در این تمرین، ما از همان توپولوژی دو گره‌ای قبلی استفاده خواهیم کرد. برای احراز هویت، Thread Leader به عنوان کمیسر و Thread Router به عنوان Joiner عمل خواهند کرد.

d6a67e8a0d0b5dcb.png

داکر

برای هر گره (پنجره ترمینال) در تمرین‌های باقی‌مانده، مطمئن شوید که کانتینر Docker را با ساختار OpenThread اجرا می‌کنید. اگر از تمرین قبلی ادامه می‌دهید، هنوز باید دو خط فرمان bash در همان کانتینر Docker که از قبل باز هستند، داشته باشید. در غیر این صورت، به مرحله عیب‌یابی Docker مراجعه کنید، یا به سادگی تمرین شبکه Simulate a Thread را دوباره انجام دهید.

۱. یک شبکه ایجاد کنید

در گره ۱، فرآیند CLI را ایجاد کنید:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

نکته: اگر بعد از اجرای این دستور، اعلان > را مشاهده نکردید، enter فشار دهید.

یک مجموعه داده عملیاتی جدید ایجاد کنید، آن را به عنوان مجموعه داده فعال ثبت کنید و Thread را شروع کنید:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 12
Channel Mask: 07fff800
Ext PAN ID: e68d05794bf13052
Mesh Local Prefix: fd7d:ddf7:877b:8756/64
Network Key: a77fe1d03b0e8028a4e13213de38080e
Network Name: OpenThread-8f37
PAN ID: 0x8f37
PSKc: f9debbc1532487984b17f92cd55b21fc
Security Policy: 0, onrcb
Done

این مجموعه داده را به عنوان مجموعه داده فعال ثبت کنید:

> dataset commit active
Done

رابط IPv6 را اجرا کنید:

> ifconfig up
Done

شروع عملیات پروتکل Thread:

> thread start
Done

چند ثانیه صبر کنید و تأیید کنید که دستگاه به یک رهبر رشته تبدیل شده است:

> state
leader
Done

۲. نقش کمیسر را شروع کنید

در حالی که هنوز در گره ۱ هستید، نقش کمیسر را شروع کنید:

> commissioner start
Done

به هر Joiner (با استفاده از علامت * ) که دارای اعتبارنامه Joiner J01NME است، اجازه دهید تا به شبکه متصل شود. Joiner دستگاهی است که توسط یک مدیر انسانی به یک شبکه Thread متصل شده اضافه می‌شود.

> commissioner joiner add * J01NME
Done

۳. نقش Joiner را شروع کنید

در پنجره ترمینال دوم، در کانتینر داکر، یک فرآیند CLI جدید ایجاد کنید. این Node 2 است.

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

در گره ۲، نقش Joiner را با استفاده از اعتبارنامه J01NME Joiner فعال کنید.

> ifconfig up
Done
> joiner start J01NME
Done

... چند ثانیه برای تأیید صبر کنید ...

Join success

به عنوان یک Joiner، دستگاه (Node 2) با موفقیت خود را توسط Commissioner (Node 1) احراز هویت کرده و اعتبارنامه‌های شبکه Thread را دریافت کرده است.

حالا که نود ۲ احراز هویت شد، Thread را شروع کنید:

> thread start
Done

۴. اعتبارسنجی احراز هویت شبکه

state گره ۲ را بررسی کنید تا تأیید شود که اکنون به شبکه پیوسته است. ظرف دو دقیقه، گره ۲ از child به router منتقل می‌شود:

> state
child
Done
...
> state
router
Done

۵. تنظیمات را ریست کنید

برای آماده شدن برای تمرین بعدی، پیکربندی را مجدداً تنظیم کنید. در هر گره، Thread را متوقف کنید، آن را به تنظیمات کارخانه برگردانید و از دستگاه Thread شبیه‌سازی شده خارج شوید:

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

ممکن است لازم باشد چند بار enter فشار دهید تا بعد از دستور factoryreset اعلان > نمایش داده شود.

۵. مدیریت شبکه با OpenThread Daemon

برای این تمرین، ما قصد داریم یک نمونه CLI (یک دستگاه SoC Thread تعبیه‌شده) و یک نمونه کمک‌پردازنده رادیویی (RCP) را شبیه‌سازی کنیم.

ot-daemon حالتی از برنامه OpenThread Posix است که از یک سوکت یونیکس به عنوان ورودی و خروجی استفاده می‌کند، به طوری که هسته OpenThread می‌تواند به عنوان یک سرویس اجرا شود. یک کلاینت می‌تواند با اتصال به سوکت با استفاده از OpenThread CLI به عنوان پروتکل، با این سرویس ارتباط برقرار کند.

ot-ctl یک رابط خط فرمان (CLI) است که توسط ot-daemon برای مدیریت و پیکربندی RCP ارائه شده است. با استفاده از این، RCP را به شبکه ایجاد شده توسط دستگاه Thread متصل خواهیم کرد.

داکر

برای هر گره (پنجره ترمینال) در این تمرین، مطمئن شوید که کانتینر Docker را با نسخه OpenThread اجرا می‌کنید. اگر از تمرین قبلی پیروی می‌کنید، باید دو خط فرمان bash در همان کانتینر Docker از قبل باز شده داشته باشید. در غیر این صورت، به مرحله عیب‌یابی Docker مراجعه کنید.

از ot-daemon استفاده کنید

این تمرین از سه پنجره ترمینال استفاده خواهد کرد که مربوط به موارد زیر هستند:

  1. نمونه CLI از دستگاه Thread شبیه‌سازی شده (گره ۱)
  2. فرآیند ot-daemon
  3. نمونه خط فرمان ot-ctl

۱. گره ۱ را شروع کنید

در اولین پنجره ترمینال، فرآیند CLI را برای دستگاه Thread شبیه‌سازی شده خود ایجاد کنید:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

نکته: اگر بعد از اجرای این دستور، اعلان > را مشاهده نکردید، enter فشار دهید.

یک مجموعه داده عملیاتی جدید ایجاد کنید، آن را به عنوان مجموعه داده فعال ثبت کنید و Thread را شروع کنید:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 07fff800
Ext PAN ID: 97d584bcd493b824
Mesh Local Prefix: fd55:cf34:dea5:7994/64
Network Key: ba6e886c7af50598df1115fa07658a83
Network Name: OpenThread-34e4
PAN ID: 0x34e4
PSKc: 38d6fd32c866927a4dfcc06d79ae1192
Security Policy: 0, onrcb
Done

این مجموعه داده را به عنوان مجموعه داده فعال ثبت کنید:

> dataset commit active
Done

رابط IPv6 را اجرا کنید:

> ifconfig up
Done

شروع عملیات پروتکل Thread:

> thread start
Done

آدرس‌های IPv6 اختصاص داده شده به رابط Thread گره ۱ را مشاهده کنید:

> ipaddr
fd55:cf34:dea5:7994:0:ff:fe00:fc00
fd55:cf34:dea5:7994:0:ff:fe00:d000
fd55:cf34:dea5:7994:460:872c:e807:c4ab
fe80:0:0:0:9cd8:aab6:482f:4cdc
Done
>

همانطور که در مرحله شبیه‌سازی شبکه Thread توضیح داده شد، یک آدرس link-local ( fe80 ) و سه آدرس mesh-local ( fd ) هستند. EID آدرس mesh-local است که شامل ff:fe00 در آدرس نیست. در این خروجی نمونه، EID به fd55:cf34:dea5:7994:460:872c:e807:c4ab است.

EID خاص را از خروجی ipaddr خود شناسایی کنید، که برای ارتباط با گره استفاده خواهد شد.

۲. شروع ot-daemon

در پنجره ترمینال دوم، یک گره دستگاه تنظیم tun device node) ایجاد کنید و مجوزهای خواندن/نوشتن را تنظیم کنید:

root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200
root@c0f3912a74ff:/# chmod 600 /dev/net/tun

این دستگاه برای ارسال و دریافت بسته در دستگاه‌های مجازی استفاده می‌شود. اگر دستگاه قبلاً ایجاد شده باشد، ممکن است با خطایی مواجه شوید - این طبیعی است و می‌توان آن را نادیده گرفت.

ot-daemon برای یک گره RCP که آن را گره ۲ می‌نامیم، آغاز کنید. از آپشن -v verbose استفاده کنید تا بتوانید خروجی لاگ را مشاهده کنید و از اجرای آن اطمینان حاصل کنید:

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-daemon -v \
'spinel+hdlc+forkpty:///openthread/build/examples/apps/ncp/ot-rcp?forkpty-arg=2'

در صورت موفقیت، ot-daemon در حالت verbose خروجی مشابه زیر تولید می‌کند:

ot-daemon[31]: Running OPENTHREAD/297a880; POSIX; Feb  1 2022 04:43:39
ot-daemon[31]: Thread version: 3
ot-daemon[31]: Thread interface: wpan0
ot-daemon[31]: RCP version: OPENTHREAD/297a880; SIMULATION; Feb  1 2022 04:42:50

این ترمینال را باز و در پس‌زمینه اجرا کنید. هیچ دستور دیگری در آن وارد نخواهید کرد.

۳. برای اتصال به شبکه از ot-ctl استفاده کنید

ما هنوز Node 2 ( ot-daemon RCP) را به هیچ شبکه Thread ای راه اندازی نکرده ایم. اینجاست که ot-ctl وارد عمل می شود. ot-ctl از همان رابط خط فرمان (CLI) برنامه OpenThread CLI استفاده می کند. بنابراین، می توانید گره های ot-daemon را به همان روشی که سایر دستگاه های Thread شبیه سازی شده کنترل می کنید، کنترل کنید.

یک پنجره ترمینال سوم باز کنید و کانتینر موجود را اجرا کنید:

$ docker exec -it codelab_otsim_ctnr bash

وقتی در کانتینر قرار گرفتید، ot-ctl را اجرا کنید:

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-ctl
>

شما در این پنجره ترمینال سوم ot-ctl برای مدیریت گره ۲ (گره RCP) که در پنجره ترمینال دوم با ot-daemon شروع کرده‌اید، استفاده خواهید کرد. state گره ۲ را بررسی کنید:

> state
disabled
Done

برای محدود کردن اتصال به Joiner خاص، eui64 گره ۲ را دریافت کنید:

> eui64
18b4300000000001
Done

در گره ۱ (پنجره ترمینال اول)، کمیسر را اجرا کنید و اتصال را فقط به آن eui64 محدود کنید:

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

در پنجره ترمینال سوم، رابط شبکه Node 2 را باز کنید و به شبکه متصل شوید:

> ifconfig up
Done
> joiner start J01NME
Done

... چند ثانیه برای تأیید صبر کنید ...

Join success

به عنوان یک عضو، RCP (گره ۲) با موفقیت خود را نزد کمیسر (گره ۱) احراز هویت کرده و اعتبارنامه‌های شبکه Thread را دریافت کرده است.

حالا گره ۲ را به شبکه Thread وصل کنید (دوباره، در پنجره ترمینال سوم):

> thread start
Done

۴. اعتبارسنجی احراز هویت شبکه

در ترمینال سوم، state گره ۲ را بررسی کنید تا تأیید شود که اکنون به شبکه پیوسته است. ظرف دو دقیقه، گره ۲ از child به router منتقل می‌شود:

> state
child
Done
...
> state
router
Done

۵. اعتبارسنجی اتصال

در پنجره ترمینال سوم، با استفاده از Ctrl+D یا دستور exit از ot-ctl خارج شوید و به کنسول bash کانتینر بازگردید. از این کنسول، Node 1 را با استفاده از EID آن و با دستور ping6 پینگ کنید. اگر نمونه RCP ot-daemon با موفقیت به شبکه Thread متصل شده و با آن ارتباط برقرار کند، پینگ با موفقیت انجام می‌شود:

root@c0f3912a74ff:/# ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab
PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms
--- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms

۶. عیب‌یابی داکر

اگر از کانتینر داکر خارج شده‌اید

bash prompts ، ممکن است لازم باشد بررسی کنید که آیا در حال اجرا است و در صورت نیاز آن را مجدداً راه‌اندازی یا دوباره وارد کنید. هر کانتینر داکری که در جایی که از گزینه --rm استفاده نکرده‌اید ایجاد کرده‌اید، باید هنوز وجود داشته باشد.

برای نشان دادن اینکه کدام کانتینرهای داکر در حال اجرا هستند:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

برای نمایش تمام کانتینرهای داکر (چه در حال اجرا و چه متوقف شده):

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

اگر در خروجی هر یک از دستورهای docker ps عبارت container codelab_otsim_ctnr مشاهده نکردید، آن را دوباره اجرا کنید:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

فقط در صورتی از گزینه --rm استفاده کنید که می‌خواهید کانتینر پس از خروج از کانتینر حذف شود.

اگر کانتینر متوقف شده است (در docker ps -a ذکر شده اما docker ps نیست)، آن را مجدداً راه‌اندازی کنید:

$ docker start -i codelab_otsim_ctnr

اگر کانتینر داکر از قبل در حال اجرا است (در docker ps ذکر شده است)، در هر ترمینال دوباره به کانتینر متصل شوید:

$ docker exec -it codelab_otsim_ctnr bash

خطاهای «عملیات مجاز نیست»

اگر هنگام ایجاد گره‌های جدید OpenThread (با استفاده از دستور mknod ) با خطای Operation not permitted مواجه شدید، مطمئن شوید که Docker را به عنوان کاربر root طبق دستورات ارائه شده در این Codelab اجرا می‌کنید. این Codelab از اجرای Docker در حالت rootless پشتیبانی نمی‌کند.

۷. تبریک می‌گویم!

شما با موفقیت اولین شبکه Thread خود را با استفاده از OpenThread شبیه‌سازی کردید. عالی!

در این Codelab شما یاد گرفتید که چگونه:

  • شروع و مدیریت کانتینر OpenThread Simulation Docker
  • شبیه‌سازی یک شبکه Thread
  • احراز هویت گره‌های Thread
  • مدیریت شبکه Thread با OpenThread Daemon

برای کسب اطلاعات بیشتر در مورد Thread و OpenThread، این منابع را بررسی کنید:

یا، سعی کنید از OpenThread Border Router در یک کانتینر Docker استفاده کنید!