OpenThread منتشر شده توسط Google یک اجرای منبع باز از پروتکل شبکه Thread است. Google Nest OpenThread را منتشر کرده است تا فناوری مورد استفاده در محصولات Nest را به طور گسترده در دسترس توسعه دهندگان قرار دهد تا توسعه محصولات برای خانه متصل را تسریع کند.
مشخصات Thread پروتکل ارتباطی بی سیم و بی سیم مبتنی بر IPv6 را برای برنامه های خانگی تعریف می کند. OpenThread تمام لایه های شبکه Thread از جمله IPv6 ، 6LoWPAN ، IEEE 802.15.4 را با امنیت MAC ، ایجاد مش پیوند و مسیریابی پیاده سازی می کند.
این Codelab شما را از طریق شبیه سازی شبکه Thread در دستگاه های شبیه سازی شده راهنمایی می کند.
آنچه خواهید آموخت
- نحوه راه اندازی ابزار ایجاد OpenThread
- نحوه شبیه سازی شبکه Thread
- نحوه احراز هویت گره های Thread
- نحوه مدیریت شبکه Thread با OpenThread Daemon
آنچه شما نیاز دارید
- گیت
- دانش اولیه لینوکس ، مسیریابی شبکه
گیت
برای تکمیل این Codelab به Git نیاز است. قبل از ادامه آن را بارگیری و نصب کنید.
پس از نصب ، برای بارگیری و ساخت OpenThread دستورالعملهای سیستم عامل خاص خود را دنبال کنید.
XCode برای Mac OS X
XCode برای نصب و ساخت OpenThread در Mac OS X لازم است .
پس از نصب XCode ، ابزار خط فرمان XCode را نصب کنید:
$ xcode-select --install
بر روی Linux / Mac OS X بسازید
این دستورالعمل های نصب روی اوبونتو سرور 14.04 LTS و Mac OS X Sierra 10.12.6 آزمایش شده است.
OpenThread را نصب کنید. دستورات bootstrap
مطمئن می شوند که ابزار ابزار نصب شده و محیط به درستی پیکربندی شده است:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap $ ./bootstrap
استفاده از ویندوز
اگر Windows را ترجیح می دهید ، توصیه می کنیم نسخه Docker این Codelab را امتحان کنید.
پس از اتمام نصب ، نمونه برنامه OpenThread را بسازید. برای این Codelab ما از مثال شبیه سازی استفاده می کنیم.
$ cd ~/src/openthread $ make -f examples/Makefile-simulation
اکنون OpenThread Daemon را بسازید:
$ cd ~/src/openthread $ make -f src/posix/Makefile-posix DAEMON=1
نمونه برنامه ای که برای این Codelab استفاده خواهید کرد ، حداقل یک برنامه OpenThread را نشان می دهد که پیکربندی و رابط مدیریت OpenThread را از طریق یک رابط خط فرمان (CLI) اصلی نشان می دهد.
این تمرین حداقل مراحل لازم برای پینگ یک دستگاه Thread شبیه سازی شده از یک دستگاه Thread شبیه سازی شده دیگر را طی می کند.
شکل زیر یک توپولوژی شبکه اصلی Thread را توصیف می کند. برای این تمرین ، ما دو گره درون دایره سبز را شبیه سازی می کنیم: Thread Leader و Thread Router با یک اتصال واحد بین آنها.
گره زدن
1. گره 1 را شروع کنید
به فهرست openthread
و فرآیند CLI را برای یک دستگاه Thread شبیه سازی شده با استفاده از باینری ot-cli-ftd
تخم ریزی کنید.
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 1
این باینری یک دستگاه OpenThread را که در بالای POSIX شبیه سازی شده است ، پیاده سازی می کند. درایور رادیویی 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
برای موارد دیگر محفوظ است.
اگر شما نمی بینید
>
سریع پس از اجرای این دستور ، را فشار دهید
enter
.
یک مجموعه داده عملیاتی جدید ایجاد کنید و آن را به عنوان یک مجموعه فعال متعهد کنید. مجموعه داده عملیاتی پیکربندی شبکه 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 Master 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 start Done
چند ثانیه صبر کنید و بررسی کنید که دستگاه به Thread Leader تبدیل شده است. Leader دستگاهی است که مسئول تعیین تکلیف شناسه روتر است.
> state leader Done
آدرس های IPv6 اختصاص داده شده به رابط Thread 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
= مش-محلی شروع می شود - با
fe80
= link-local شروع می شود
انواع آدرس محلی-مش بیشتر طبقه بندی می شوند:
- شامل
ff:fe00
= روتر یاب (RLOC) - شامل
ff:fe00
= شناسه نقطه پایانی (EID)
با شناسایی EID در خروجی کنسول خود ، آن را یادداشت کنید تا بعداً استفاده شود. در نمونه خروجی فوق ، EID به شرح زیر است:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. گره 2 را شروع کنید
ترمینال جدیدی را باز کرده و به فهرست openthread
و روند CLI را تخم ریزی کنید. این دومین دستگاه موضوع شبیه سازی شده شما است:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 2
اگر شما نمی بینید
>
سریع پس از اجرای این دستور ، را فشار دهید
enter
.
Thread Master Key و PAN ID را با استفاده از مقادیر مشابه مجموعه داده عملیاتی Node 1 پیکربندی کنید:
> dataset masterkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
این مجموعه داده را به عنوان مجموعه فعال متعهد کنید:
> dataset commit active Done
رابط IPv6 را بیاورید:
> ifconfig up Done
شروع عملیات پروتکل موضوع:
> thread start Done
دستگاه خود را به عنوان یک کودک اولیه می کند. Thread Child معادل End End است که دستگاه Thread است و فقط با دستگاه والدین ترافیک یکپارچه را انتقال و دریافت می کند.
> state child Done
در عرض 2 دقیقه باید تغییر حالت از child
به router
را مشاهده router
. روتر Thread قادر است ترافیک را بین دستگاه های Thread هدایت کند. همچنین از آن به عنوان والدین یاد می شود.
> state router Done
شبکه را تأیید کنید
یک روش آسان برای تأیید شبکه mesh ، نگاه کردن به جدول روتر است.
1. اتصال را بررسی کنید
در گره 2 ، RLOC16 را دریافت کنید. RLOC16 آخرین 16 بیت آدرس RLOC IPv6 دستگاه است.
> rloc16 5800 Done
در گره 1 ، جدول روتر را برای NL 2 RLOC16 بررسی کنید. مطمئن شوید که نود 2 ابتدا به حالت روتر تغییر کرده باشد.
> router table | ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC | +----+--------+----------+----------+-------+---------+-----+------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
RLOC گره 1 از 0xa800
در جدول یافت می شود و تأیید اتصال آن به مش است.
2. Ping Node 1 از Node 2
اتصال بین دو دستگاه Thread شبیه سازی شده را تأیید کنید. در گره 2 ، ping
EID اختصاص داده شده به گره 1:
> 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 شبیه سازی شده با موفقیت پینگ کنید ، با گرفتن یک گره به صورت آفلاین شبکه مش را آزمایش کنید.
بازگشت به گره 1 و توقف موضوع:
> thread stop Done
به گره 2 بروید و وضعیت را بررسی کنید. در عرض دو دقیقه ، گره 2 متوجه می شود که رهبر (گره 1) آفلاین است و شما باید انتقال گره 2 را به عنوان leader
شبکه ببینید:
> state router Done ... > state leader Done
پس از تأیید ، قبل از خروج ، Thread را متوقف کرده و Node 2 را مجدداً تنظیم کنید بازنشانی به کارخانه انجام می شود تا اطمینان حاصل شود که اعتبار شبکه Thread که در این تمرین استفاده کردیم به تمرین بعدی منتقل نمی شود.
> thread stop Done > factoryreset > > exit
همچنین تنظیم مجدد کارخانه و خروج از گره 1:
> factoryreset > > exit
برای کاوش در تمام دستورات CLI موجود ، به مرجع OpenThread CLI مراجعه کنید.
در تمرین قبلی ، شما یک شبکه Thread با دو دستگاه شبیه سازی شده و اتصال تأیید شده راه اندازی کرده اید. با این حال ، این فقط اجازه می دهد ترافیک محلی-پیوند IPv6 غیرمجاز بین دستگاه ها منتقل شود. برای مسیریابی ترافیک IPv6 جهانی بین آنها (و اینترنت از طریق روتر حاشیه Thread) ، باید گره ها احراز هویت شوند.
برای احراز هویت ، یک دستگاه باید به عنوان کمیسر عمل کند. کمیسیون در حال حاضر سرور احراز هویت منتخب برای دستگاه های Thread جدید و مجوز برای ارائه اعتبارات شبکه مورد نیاز برای اتصال دستگاه ها به شبکه است.
در این تمرین ما از همان توپولوژی دو گره ای قبلی استفاده خواهیم کرد. برای احراز هویت ، Thread Leader به عنوان نماینده ، Thread Router به عنوان یک اتصال دهنده عمل خواهد کرد.
1. یک شبکه ایجاد کنید
در صورت ادامه تمرین قبلی ، باید دو پنجره ترمینال باز داشته باشید. در غیر اینصورت ، مطمئن شوید که دو مورد باز و آماده استفاده هستند. یکی به عنوان گره 1 عمل می کند ، دیگری به عنوان گره 2.
در گره 1 ، روند CLI را تخم ریزی کنید:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 1
اگر شما نمی بینید
>
سریع پس از اجرای این دستور ، را فشار دهید
enter
.
یک مجموعه داده عملیاتی جدید ایجاد کنید ، آن را به عنوان فعال متعهد کنید و موضوع را شروع کنید:
> 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 Master 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 start Done
چند ثانیه صبر کنید و بررسی کنید که دستگاه به Thread Leader تبدیل شده است:
> state leader Done
2. نقش کمیسر را شروع کنید
در حالی که هنوز در گره 1 هستید ، نقش کمیسر را شروع کنید:
> commissioner start Done
به هر J01NME
(با استفاده از wildcard *
) با اعتبارنامه J01NME
Joiner اجازه دهید به شبکه راه اندازی شود. Joiner وسیله ای است که توسط یک مدیر انسانی به یک شبکه Thread سفارش داده شده اضافه می شود.
> commissioner joiner add * J01NME Done
3. نقش Joiner را شروع کنید
در پنجره ترمینال دوم ، روند جدید CLI را تخم ریزی کنید. این گره 2 است.
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 2
در گره 2 ، با استفاده از J01NME
نامه J01NME
Joiner نقش Joiner را فعال کنید.
> ifconfig up Done > joiner start J01NME Done
... چند ثانیه صبر کنید تا تأیید شود ...
Join success
به عنوان وصال ، دستگاه (گره 2) با موفقیت در کمیساریا (گره 1) احراز هویت شده و مدارک Thread Network را دریافت کرده است.
اکنون که Node 2 احراز هویت شد ، موضوع را شروع کنید:
> thread start Done
4. تأیید اعتبار شبکه را تأیید کنید
state
Node 2 را بررسی کنید تا تأیید کنید اکنون به شبکه پیوسته است. در عرض دو دقیقه ، گره 2 از child
به router
انتقال می یابد:
> state child Done ... > state router Done
5. تنظیم مجدد تنظیمات
برای آماده شدن برای تمرین بعدی ، پیکربندی را بازنشانی کنید. در هر گره ، Thread را متوقف کنید ، تنظیم مجدد کارخانه را انجام دهید و از دستگاه Thread شبیه سازی شده خارج شوید:
> thread stop Done > factoryreset > > exit
ممکن است مجبور enter
چند بار Enter را فشار دهید تا پس از یک فرمان factoryreset
اعلان >
factoryreset
.
برای این تمرین ، ما می خواهیم یک نمونه CLI (یک دستگاه SoC Thread تعبیه شده) و یک نمونه Radio Co-Processor (RCP) را شبیه سازی کنیم.
ot-daemon
حالتی از برنامه OpenThread Posix است که از سوکت UNIX به عنوان ورودی و خروجی استفاده می کند ، بنابراین هسته OpenThread می تواند به عنوان سرویس کار کند. مشتری می تواند با اتصال به سوکت با استفاده از OpenThread CLI به عنوان پروتکل با این سرویس ارتباط برقرار کند.
ot-ctl
یک CLI است که توسط ot-daemon
برای مدیریت و پیکربندی RCP ارائه شده است. با استفاده از این ، RCP را به شبکه ایجاد شده توسط دستگاه Thread متصل می کنیم.
از ot-daemon استفاده کنید
در این تمرین از سه پنجره ترمینال استفاده می شود که مربوط به موارد زیر است:
- نمونه CLI دستگاه نخ شبیه سازی شده (گره 1)
- روند
ot-daemon
-
ot-ctl
نمونه CLI
در صورت ادامه تمرین قبلی ، باید دو پنجره ترمینال باز داشته باشید. یک سوم را باز کنید تا مطمئن شوید که برای این تمرین سه پنجره ترمینال در دسترس دارید.
1. گره 1 را شروع کنید
در اولین پنجره ترمینال ، فرآیند CLI را برای دستگاه Thread شبیه سازی شده خود تخم ریزی کنید:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 1
اگر شما نمی بینید
>
سریع پس از اجرای این دستور ، را فشار دهید
enter
.
یک مجموعه داده عملیاتی جدید ایجاد کنید ، آن را به عنوان فعال متعهد کنید و موضوع را شروع کنید:
> 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 Master 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 start Done
آدرسهای IPv6 اختصاص داده شده به رابط موضوع گره 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 >
همانطور که در مرحله شبیه سازی یک شبکه موضوع توضیح داده شده است ، یک آدرس link-local ( fe80
) و سه آدرس local- fd
( fd
) است. EID یک آدرس محلی-مش است که شامل ff:fe00
در آدرس نیست. در این خروجی نمونه ، EID fd55:cf34:dea5:7994:460:872c:e807:c4ab
.
EID خاص را از خروجی ipaddr
خود ipaddr
کنید ، که برای برقراری ارتباط با گره استفاده می شود.
2. ot-daemon را شروع کنید
در پنجره ترمینال دوم، حرکت به openthread
دایرکتوری، و شروع به ot-daemon
برای یک گره RCP، که ما پاسخ گره 2. استفاده از -v
طولانی پرچم، بنابراین شما می توانید خروجی ورود و تأیید می کند که آن را در حال اجرا است را مشاهده کنید:
$ cd ~/src/openthread $ ./output/posix/bin/ot-daemon -v \ 'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'
در صورت موفقیت ، ot-daemon
در حالت پر سر و صدا تولید خروجی مشابه موارد زیر را ایجاد می کند:
ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun 7 2020 18:05:15 ot-daemon[228024]: Thread version: 2 ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun 7 2020 18:06:08
3- برای پیوستن به شبکه از ot-ctl استفاده کنید
ما هنوز گره 2 (RCP ot-daemon
) را به هیچ شبکه Thread سفارش نداده ایم. اینجاست که ot-ctl
وارد می شود. ot-ctl
از CLI مشابه برنامه OpenThread CLI استفاده می کند. بنابراین ، شما می توانید گره های ot-daemon
به همان روشی که سایر دستگاه های Thread شبیه سازی شده کنترل کنید.
در پنجره ترمینال سوم ، ot-ctl
شروع کنید:
$ ./output/posix/bin/ot-ctl >
state
گره 2 (گره RCP) را که با ot-daemon
:
> state disabled Done
برای محدود کردن پیوستن به Joiner خاص ، eui64
Node 2 را eui64
:
> eui64 18b4300000000001 Done
در گره 1 ، کمیسر را شروع کرده و پیوستن به آن eui64 را محدود کنید:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
در گره 2 ، رابط شبکه را بیاورید و به شبکه بپیوندید:
> ifconfig up Done > joiner start J01NME Done
... چند ثانیه صبر کنید تا تأیید شود ...
Join success
به عنوان وصال ، RCP (گره 2) با موفقیت احراز هویت خود را در کمیساریا (گره 1) انجام داده و اعتبارات شبکه موضوع را دریافت کرده است.
اکنون گره 2 را به شبکه Thread بپیوندید:
> thread start Done
4. تأیید اعتبار شبکه را تأیید کنید
state
Node 2 را بررسی کنید تا تأیید کنید اکنون به شبکه پیوسته است. در عرض دو دقیقه ، گره 2 از child
به router
انتقال می یابد:
> state child Done ... > state router Done
5. اتصال را تأیید کنید
با استفاده از Ctrl + D و در خط فرمان ماشین میزبان خود ، با استفاده از EID آن با دستور ping6
ot-ctl
ترک کنید و در خط فرمان ماشین میزبان خود قرار دهید. اگر نمونه RCP ot-daemon
با موفقیت به شبکه Thread بپیوندد و با آن ارتباط برقرار کند ، پینگ موفق می شود:
$ 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
شما با استفاده از OpenThread اولین شبکه Thread خود را با موفقیت شبیه سازی کردید. عالی!
در این Codelab شما یاد گرفتید که چگونه:
- ابزار ابزار OpenThread build را تنظیم کنید
- شبیه سازی شبکه Thread
- تأیید اعتبار گره های موضوع
- با OpenThread Daemon شبکه Thread را مدیریت کنید
اگر می خواهید بیشتر بیاموزید ، این منابع را کاوش کنید: