1. مقدمه
OpenThread منتشر شده توسط گوگل یک پیاده سازی متن باز از پروتکل شبکه Thread است. Google Nest برای تسریع در توسعه محصولات برای خانه متصل، OpenThread را منتشر کرده است تا فناوری مورد استفاده در محصولات Nest را به طور گسترده در دسترس توسعه دهندگان قرار دهد.
مشخصات Thread یک پروتکل ارتباطی دستگاه به دستگاه بی سیم قابل اعتماد، ایمن و کم مصرف مبتنی بر IPv6 را برای برنامه های خانگی تعریف می کند. OpenThread تمام لایه های شبکه Thread از جمله IPv6، 6LoWPAN، IEEE 802.15.4 را با امنیت MAC، Mesh Link Establishment و Mesh Routing پیاده سازی می کند.
این Codelab شما را در شبیه سازی شبکه Thread بر روی دستگاه های شبیه سازی شده با استفاده از Docker راهنمایی می کند.
چیزی که یاد خواهید گرفت
- چگونه زنجیره ابزار ساخت OpenThread را راه اندازی کنیم
- چگونه یک شبکه Thread را شبیه سازی کنیم
- نحوه احراز هویت گره های Thread
- نحوه مدیریت شبکه Thread با OpenThread Daemon
آنچه شما نیاز دارید
- داکر
- دانش مقدماتی لینوکس، مسیریابی شبکه
2. Docker را راه اندازی کنید
این Codelab برای استفاده از Docker در لینوکس، Mac OS X یا ماشین ویندوز طراحی شده است. لینوکس محیط پیشنهادی است.
Docker را نصب کنید
Docker را بر روی سیستم عامل مورد نظر خود نصب کنید.
تصویر داکر را بکشید
پس از نصب Docker، یک پنجره ترمینال را باز کنید و تصویر openthread/environment
Docker را بکشید. این تصویر دارای OpenThread و OpenThread Daemon از پیش ساخته شده و آماده استفاده برای این Codelab است.
$ docker pull openthread/environment:latest
توجه داشته باشید که دانلود کامل ممکن است چند دقیقه طول بکشد.
در یک پنجره ترمینال، یک ظرف Docker را از تصویر شروع کنید و به پوسته 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
شناسه Container است. شناسه Container برای نمونه شما از کانتینر Docker با آنچه در دستورات این Codelab نشان داده شده است متفاوت است.
با استفاده از داکر
این Codelab فرض می کند که شما اصول اولیه استفاده از Docker را می دانید. شما باید برای کل Codelab در ظرف Docker بمانید.
3. یک شبکه Thread را شبیه سازی کنید
برنامه مثالی که برای این Codelab استفاده می کنید، یک برنامه OpenThread حداقلی را نشان می دهد که پیکربندی OpenThread و رابط های مدیریتی را از طریق یک رابط خط فرمان اولیه (CLI) در معرض دید قرار می دهد.
این تمرین شما را با حداقل مراحل مورد نیاز برای پینگ کردن یک دستگاه Thread شبیه سازی شده از یک دستگاه Thread شبیه سازی شده دیگر طی می کند.
شکل زیر یک توپولوژی پایه شبکه Thread را توصیف می کند. برای این تمرین، ما دو گره را در دایره سبز شبیه سازی می کنیم: یک Thread Leader و Thread Router با یک اتصال واحد بین آنها.
شبکه را ایجاد کنید
1. نود 1 را راه اندازی کنید
اگر قبلاً این کار را نکردهاید، در یک پنجره ترمینال، ظرف Docker را راهاندازی کنید و به پوسته bash
آن متصل شوید:
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
در ظرف Docker، فرآیند CLI را برای دستگاه Thread شبیه سازی شده با استفاده از باینری ot-cli-ftd
ایجاد کنید.
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 (پورت = 9000 + توصیفگر فایل) استفاده می شود. هر نمونه از یک دستگاه 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 تبدیل شده است. Leader دستگاهی است که مسئول مدیریت تخصیص شناسه روتر است.
> state leader Done
آدرس های IPv6 اختصاص داده شده به رابط Thread Node 1 را مشاهده کنید (خروجی شما متفاوت خواهد بود):
> 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
2. نود 2 را راه اندازی کنید
یک ترمینال جدید باز کنید و یک پوسته 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
فشار دهید.
کلید شبکه Thread و PAN ID را با استفاده از مقادیر مشابه مجموعه داده عملیاتی Node 1 پیکربندی کنید:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
این مجموعه داده را به عنوان مجموعه فعال متعهد کنید:
> dataset commit active Done
رابط IPv6 را بیاورید:
> ifconfig up Done
شروع عملیات پروتکل Thread:
> thread start Done
دستگاه خود را به عنوان یک کودک راه اندازی می کند. Thread Child معادل یک دستگاه End است، که یک دستگاه Thread است که فقط با یک دستگاه والد، ترافیک unicast را ارسال و دریافت می کند.
> state child Done
در عرض 2 دقیقه باید تغییر حالت از child
به router
را مشاهده کنید. Thread Router می تواند ترافیک بین دستگاه های Thread را مسیریابی کند. به آن پدر و مادر نیز گفته می شود.
> state router Done
شبکه را تایید کنید
یک راه آسان برای تأیید شبکه مش، نگاه کردن به جدول روتر است.
1. اتصال را بررسی کنید
در Node 2، RLOC16 را دریافت کنید. RLOC16 آخرین 16 بیت آدرس RLOC IPv6 دستگاه است.
> rloc16 5800 Done
در Node 1، جدول روتر را برای RLOC16 Node 2 بررسی کنید. اطمینان حاصل کنید که Node 2 ابتدا به وضعیت روتر تغییر کرده است.
> 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 Node 2 با اندازه 0x5800
در جدول یافت می شود که تأیید می کند که به مش متصل است.
2. نود 1 را از نود 2 پینگ کنید
اتصال بین دو دستگاه Thread شبیه سازی شده را تأیید کنید. در Node 2، EID اختصاص داده شده به Node 1 را 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 شبیه سازی شده پینگ کنید، شبکه مش را با آفلاین کردن یک گره آزمایش کنید.
به Node 1 برگردید و Thread را متوقف کنید:
> thread stop Done
به Node 2 بروید و وضعیت را بررسی کنید. در عرض دو دقیقه، Node 2 تشخیص می دهد که لیدر (Node 1) آفلاین است، و شما باید Node 2 Transition را به عنوان leader
شبکه ببینید:
> state router Done ... > state leader Done
پس از تأیید، Thread را متوقف کرده و Node 2 را به حالت Factory Reset کنید قبل از اینکه دوباره به Docker bash
prompt خارج شوید. بازنشانی کارخانه ای انجام می شود تا اطمینان حاصل شود که اعتبار شبکه Thread که در این تمرین استفاده کردیم به تمرین بعدی منتقل نمی شود.
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
ممکن است مجبور شوید چند بار enter
فشار دهید تا فرمان >
را پس از یک فرمان factoryreset
بازگردانید. از ظرف داکر خارج نشوید.
همچنین تنظیم مجدد کارخانه و خروج از Node 1:
> factoryreset > > exit root@c0f3912a74ff:/#
برای بررسی همه دستورات CLI موجود، به مرجع OpenThread CLI مراجعه کنید.
4. تصدیق گره ها با راه اندازی
در تمرین قبلی، یک شبکه Thread با دو دستگاه شبیه سازی شده و اتصال تایید شده راه اندازی کردید. با این حال، این فقط اجازه می دهد تا ترافیک پیوند محلی IPv6 تایید نشده بین دستگاه ها منتقل شود. برای هدایت ترافیک جهانی IPv6 بین آنها (و اینترنت از طریق روتر مرزی Thread)، گره ها باید احراز هویت شوند.
برای احراز هویت، یک دستگاه باید به عنوان کمیسیونر عمل کند. کمیسیونر سرور احراز هویت منتخب در حال حاضر برای دستگاههای Thread جدید و مجوز دهنده برای ارائه اعتبار شبکه مورد نیاز برای پیوستن دستگاهها به شبکه است.
در این تمرین از همان توپولوژی دو گره ای قبلی استفاده خواهیم کرد. برای احراز هویت، Thread Leader به عنوان کمیسیونر و Thread Router به عنوان Joiner عمل می کند.
داکر
برای هر گره (پنجره پایانی) در تمرینهای باقیمانده، مطمئن شوید که ظرف Docker را با ساخت OpenThread اجرا میکنید. اگر تمرین قبلی را ادامه دهید، هنوز باید دو دستور bash
در همان ظرف داکر باز داشته باشید. اگر نه، مرحله عیبیابی Docker را ببینید یا به سادگی تمرین شبکه شبیهسازی یک موضوع را دوباره انجام دهید.
1. یک شبکه ایجاد کنید
در Node 1، فرآیند 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
چند ثانیه صبر کنید و بررسی کنید که دستگاه به Thread Leader تبدیل شده است:
> state leader Done
2. نقش کمیسر را شروع کنید
در حالی که هنوز در Node 1 هستید، نقش کمیسیونر را شروع کنید:
> commissioner start Done
به هر Joiner (با استفاده از علامت *
) با J01NME
Joiner Credential اجازه دهید تا در شبکه راه اندازی شود. Joiner دستگاهی است که توسط یک مدیر انسانی به شبکه Thread راه اندازی شده اضافه می شود.
> commissioner joiner add * J01NME Done
3. نقش Joiner را شروع کنید
در پنجره ترمینال دوم، در ظرف Docker، یک فرآیند CLI جدید ایجاد کنید. این نود 2 است.
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
در Node 2، نقش Joiner را با استفاده از J01NME
Joiner Credential فعال کنید.
> ifconfig up Done > joiner start J01NME Done
برای تایید چند ثانیه صبر کنید...
Join success
به عنوان یک Joiner، دستگاه (Node 2) با موفقیت خود را با کمیسیونر (Node 1) احراز هویت کرده و اعتبار شبکه Thread را دریافت کرده است.
اکنون که Node 2 احراز هویت شد، Thread را شروع کنید:
> thread start Done
4. تأیید اعتبار شبکه
state
گره 2 را بررسی کنید تا تأیید کنید که اکنون به شبکه پیوسته است. در عرض دو دقیقه، Node 2 از child
به router
منتقل می شود:
> state child Done ... > state router Done
5. تنظیمات را بازنشانی کنید
برای آماده شدن برای تمرین بعدی، پیکربندی را بازنشانی کنید. در هر گره، Thread را متوقف کنید، بازنشانی کارخانه ای انجام دهید و از دستگاه Thread شبیه سازی شده خارج شوید:
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
ممکن است مجبور شوید چند بار enter
فشار دهید تا فرمان >
را پس از یک فرمان factoryreset
بازگردانید.
5. شبکه را با OpenThread Daemon مدیریت کنید
برای این تمرین، یک نمونه CLI (یک دستگاه SoC Thread منفرد تعبیه شده) و یک نمونه رادیویی Co-Processor (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 شبیه سازی شده (گره 1)
- فرآیند
ot-daemon
- نمونه
ot-ctl
CLI
1. نود 1 را راه اندازی کنید
در اولین پنجره ترمینال، فرآیند 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 Node 1:
> 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 >
همانطور که در مرحله شبیه سازی یک موضوع شبکه توضیح داده شد، یک آدرس لینک-محلی ( fe80
) و سه آدرس مش-محلی ( fd
) هستند. EID یک آدرس محلی مش است که حاوی ff:fe00
در آدرس نیست. در این خروجی نمونه، EID fd55:cf34:dea5:7994:460:872c:e807:c4ab
است.
EID خاص را از خروجی ipaddr
خود که برای ارتباط با گره استفاده می شود، شناسایی کنید.
2. ot-daemon را شروع کنید
در پنجره ترمینال دوم، یک گره دستگاه tun
ایجاد کنید و مجوزهای خواندن/نوشتن را تنظیم کنید:
root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200 root@c0f3912a74ff:/# chmod 600 /dev/net/tun
این دستگاه برای ارسال و دریافت بسته در دستگاه های مجازی استفاده می شود. اگر دستگاه قبلاً ایجاد شده باشد، ممکن است با خطا مواجه شوید - این طبیعی است و می توان آن را نادیده گرفت.
ot-daemon
را برای یک گره RCP، که ما آن را Node 2 می نامیم، راه اندازی کنید. از پرچم -v
verbose استفاده کنید تا بتوانید خروجی log را ببینید و تأیید کنید که در حال اجرا است:
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
در حالت کلامی خروجی مشابه زیر تولید می کند:
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
این ترمینال را باز بگذارید و در پس زمینه اجرا شود. شما هیچ دستور دیگری را در آن وارد نخواهید کرد.
3. برای پیوستن به شبکه از ot-ctl استفاده کنید
ما هنوز Node 2 (RCP ot-daemon
) را به هیچ شبکه 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
در این پنجره ترمینال سوم برای مدیریت Node 2 (گره RCP) که در پنجره ترمینال دوم با ot-daemon
شروع کردید استفاده خواهید کرد. state
Node 2 را بررسی کنید:
> state disabled Done
برای محدود کردن اتصال به Joiner خاص، eui64
Node 2 را دریافت کنید:
> eui64 18b4300000000001 Done
در Node 1 (اولین پنجره ترمینال)، Commiser را راه اندازی کنید و اتصال را فقط به آن eui64 محدود کنید:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
در پنجره سوم ترمینال، رابط شبکه برای Node 2 را باز کرده و به شبکه بپیوندید:
> ifconfig up Done > joiner start J01NME Done
برای تایید چند ثانیه صبر کنید...
Join success
به عنوان یک Joiner، RCP (Node 2) با موفقیت خود را با کمیسیونر (Node 1) احراز هویت کرده و اعتبار شبکه Thread را دریافت کرده است.
حالا Node 2 را به شبکه Thread بپیوندید (دوباره در پنجره ترمینال سوم):
> thread start Done
4. تأیید اعتبار شبکه
در ترمینال سوم، state
نود 2 را بررسی کنید تا تأیید کنید که اکنون به شبکه پیوسته است. در عرض دو دقیقه، Node 2 از child
به router
منتقل می شود:
> state child Done ... > state router Done
5. اعتبارسنجی اتصال
در پنجره سوم ترمینال، با استفاده از دستورات Ctrl+D یا exit
از ot-ctl
خارج شده و به کنسول bash
ظرف بازگردید. از این کنسول، Node 1 را با استفاده از EID آن با دستور ping6
پینگ کنید. اگر نمونه ot-daemon
RCP با موفقیت به شبکه 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
6. عیب یابی Docker
اگر از کانتینر Docker خارج شده اید
درخواست bash
، ممکن است لازم باشد بررسی کنید که آیا در حال اجرا است یا خیر و در صورت نیاز مجدداً راه اندازی / وارد کنید. هر کانتینر Docker که ایجاد کردهاید در جایی که از گزینه --rm
استفاده نکردهاید باید همچنان وجود داشته باشد.
برای نشان دادن اینکه کدام کانتینرهای Docker در حال اجرا هستند:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 505fc57ffc72 environment "bash" 10 minutes ago Up 10 minutes codelab_otsim_ctnr
برای نمایش همه کانتینرهای Docker (هم در حال اجرا و هم متوقف شده):
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 505fc57ffc72 environment "bash" 10 minutes ago Up 10 minutes codelab_otsim_ctnr
اگر کانتینر codelab_otsim_ctnr
در خروجی هر یک از دستورات docker ps
نمیبینید، آن را دوباره اجرا کنید:
$ 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 از قبل در حال اجرا است (در فهرست docker ps
آمده است)، دوباره به کانتینر در هر ترمینال متصل شوید:
$ docker exec -it codelab_otsim_ctnr bash
خطاهای "عملیات مجاز نیست".
اگر هنگام ایجاد گرههای OpenThread جدید (با استفاده از دستور mknod
) با خطاهای Operation not permitted
مواجه شدید، مطمئن شوید که Docker را به عنوان کاربر اصلی طبق دستورات ارائه شده در این Codelab اجرا میکنید. این Codelab از اجرای Docker در حالت بدون ریشه پشتیبانی نمی کند.
7. تبریک می گویم!
شما با موفقیت اولین شبکه Thread خود را با استفاده از OpenThread شبیه سازی کرده اید. عالی!
در این Codelab یاد گرفتید که چگونه:
- کانتینر OpenThread Simulation Docker را راه اندازی و مدیریت کنید
- شبیه سازی شبکه Thread
- احراز هویت گره های Thread
- یک شبکه Thread را با OpenThread Daemon مدیریت کنید
برای کسب اطلاعات بیشتر در مورد Thread و OpenThread، این منابع را بررسی کنید:
- Thread Primer در openthread.io
- مشخصات موضوع
- مخزن OpenThread GitHub
- مرجع OpenThread CLI
- پشتیبانی اضافی OpenThread Docker
یا سعی کنید از OpenThread Border Router در ظرف Docker استفاده کنید!