۱. مقدمه

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 با یک اتصال واحد بین آنها.

شبکه را ایجاد کنید
۱. گره ۱ را شروع کنید
اگر قبلاً این کار را نکردهاید، در یک پنجره ترمینال، کانتینر داکر را اجرا کرده و به پوسته 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 عمل خواهند کرد.

داکر
برای هر گره (پنجره ترمینال) در تمرینهای باقیمانده، مطمئن شوید که کانتینر 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 استفاده کنید
این تمرین از سه پنجره ترمینال استفاده خواهد کرد که مربوط به موارد زیر هستند:
- نمونه CLI از دستگاه Thread شبیهسازی شده (گره ۱)
- فرآیند
ot-daemon - نمونه خط فرمان
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.io
- مشخصات رزوه
- مخزن گیتهاب OpenThread
- مرجع OpenThread CLI
- پشتیبانی اضافی از OpenThread Docker
یا، سعی کنید از OpenThread Border Router در یک کانتینر Docker استفاده کنید!