۱. مقدمه

Thread و OTNS چیست؟
ترد (Thread) یک پروتکل شبکه مش بیسیم کممصرف مبتنی بر IP است که ارتباطات امن دستگاه به دستگاه و دستگاه به ابر را امکانپذیر میکند. شبکههای ترد میتوانند با تغییرات توپولوژی سازگار شوند تا از بروز یک نقطه شکست (Single Point of Failure) جلوگیری کنند.
OpenThread که توسط گوگل منتشر شده است، یک پیادهسازی متنباز از Thread است. با وجود حجم کد کم و اشغال فضای حافظه کم، OpenThread از تمام ویژگیهای تعریفشده در مشخصات Thread پشتیبانی میکند.
شبیهساز شبکه OpenThread (OTNS) میتواند برای شبیهسازی شبکههای Thread با اجرای گرههای شبیهسازی شده OpenThread روی پلتفرمهای posix مورد استفاده قرار گیرد. OTNS یک رابط وب آسان برای استفاده (OTNS-Web) برای تجسم و بهرهبرداری از شبکههای Thread شبیهسازی شده فراهم میکند. شبیهسازیهای اسکریپتشده (با پایتون) نیز امکانپذیر است.
آنچه یاد خواهید گرفت
- نصب OTNS و وابستگیهای آن
- با اصول اولیه OTNS-CLI آشنا شوید
- نحوه اضافه کردن/جابجایی/حذف گرههای OpenThread در OTNS-Web
- از سایر ویژگیهای مفید OTNS-Web برای کنترل شبیهسازی شبکه استفاده کنید.
- عدم وجود یک نقطه شکست در OpenThread را تأیید کنید
- ترافیک داده بین گرههای OpenThread را در Wireshark مشاهده کنید
این آزمایشگاه کد بر روی OTNS-CLI و OTNS-Web برای استفاده تعاملی تمرکز دارد. سایر ویژگیهای OTNS، مانند اسکریپتنویسی پایتون، پوشش داده نشده است.
آنچه نیاز دارید
- مبانی Thread . برای درک آنچه در این Codelab آموزش داده میشود، باید مفاهیم اولیه Thread را بدانید.
- ترجیحاً لینوکس x86_64 یا مک او اس با Homebrew . نسخه اوبونتو ۲۴ یا بالاتر در ویندوز WSL2 نیز باید کار کند، اما ممکن است نیاز به تنظیمات دستی داشته باشد.
- گیت
- مرورگر وب. OTNS-Web از یک مرورگر وب برای نمایش شبیهسازیها استفاده میکند.
- تحلیلگر پروتکل شبکه Wireshark (اختیاری).
- برو به نسخه ۱.۲۳ یا بالاتر.
- اسکریپت نصب، نسخه Go نصب شده را بررسی میکند.
- اگر Go نصب نشده باشد، در صورت موجود بودن از طریق مدیریت بسته، نسخهای >= 1.23 را نصب خواهد کرد.
- اگر از طریق مدیریت بستهها در دسترس نباشد، نصب دستی لازم است.
- توجه داشته باشید که اوبونتو ۲۴.۰۴ یا پایینتر به طور خودکار از Go 1.23 پشتیبانی نمیکند. برای جزئیات بیشتر به صفحه نسخههای موجود Golang در مستندات اوبونتو مراجعه کنید. نصب دستی، با استفاده از
snapیا سایر روشها امکانپذیر است.
- پایتون نسخه ۳.۹ یا بالاتر.
- اسکریپت نصب، نسخه پایتون نصب شده را بررسی میکند.
- اگر پایتون ۳ هنوز نصب نشده باشد، در صورت وجود نسخه >= ۳.۹ از طریق مدیریت بسته، آن را نصب خواهد کرد.
- اگر از طریق مدیریت بستهها در دسترس نباشد، نصب دستی لازم است.
اصطلاحات
اصطلاح «روتر» به عنوان اصطلاح فنی برای توسعهدهندهی شبکهی ترد (Thread Mesh Extender) استفاده میشود که در ابتدا روتر ترد (Thread Router) نامیده میشد. «گره» به هر دستگاه شبیهسازیشدهی OpenThread در یک شبیهسازی OTNS اشاره دارد.
۲. نصب
دریافت کد OTNS
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
تمام دستورات کنسول بعدی در این Codelab از دایرکتوری otns اجرا میشوند.
بوتاسترپ و نصب آن
اسکریپت bootstrap وابستگیها (از جمله پایتون ۳ و Go/Golang، در صورت نیاز) و OTNS را نصب میکند. توجه داشته باشید که اگر اسکریپت نتواند وابستگیهای خاصی مانند نسخه پایتون >= ۳.۹ یا نسخه Go >= ۱.۲۳ را به طور خودکار نصب کند، ممکن است متوقف شود. نصب خودکار مستلزم آن است که بستهها در مخزن بسته پیکربندی شده سیستم عامل یافت شوند.
این اسکریپت همچنین انواع مختلف گره OT را که میتوانند مستقیماً در شبیهسازی استفاده شوند، میسازد و برخی آزمایشهای اولیه را انجام میدهد. به دلیل این ساخت گرهها، ممکن است چندین دقیقه طول بکشد.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
ممکن است در حین اجرای اسکریپت از شما خواسته شود که رمز عبور sudo را وارد کنید.
اگر otns به درستی نصب نشده باشد
اسکریپت ممکن است خطایی مانند زیر را گزارش دهد:
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
در این حالت، باید $(go env GOPATH)/bin به متغیر $PATH خود اضافه کنید.
در صورت بروز خطاهای دیگر، میتوان یک مشکل گیتهاب ایجاد کرد.
۳. برای اولین بار OTNS را اجرا کنید
اجرای دستور otns :
$ otns >_ ← OTNS-CLI prompt
وقتی OTNS با موفقیت شروع به کار کند، وارد یک کنسول CLI ( OTNS-CLI ) میشود و یک مرورگر وب برای تجسم و مدیریت شبکه ( OTNS-Web ) راهاندازی میکند:

اگر فقط یک صفحه خالی برای OTNS-Web میبینید، احتمالاً WebGL در مرورگر شما فعال نیست. لطفاً برای نحوه فعال کردن WebGL به https://superuser.com/a/836833 مراجعه کنید.
در بخشهای بعدی، مدیریت شبیهسازیهای OTNS را از طریق OTNS-CLI و OTNS-Web خواهید آموخت.
۴. با OTNS-CLI و OTNS-Web آشنا شوید
رابط خط فرمان OTNS
OTNS-CLI رابط خط فرمان (CLI) برای مدیریت شبیهسازیهای OTNS است.
$ otns >_ ← OTNS-CLI prompt
شما میتوانید دستورات را از طریق OTNS-CLI تایپ کنید. برای مشاهده لیست کامل دستورات به مرجع OTNS CLI مراجعه کنید. نگران نباشید، شما فقط از تعدادی از این دستورات در این Codelab استفاده خواهید کرد.
برای مشاهدهی کلی دستورات CLI، دستور help را تایپ کنید. این لیست با مرجع CLI یکسان است.
> help add Add a node to the simulation and get the node ID. .... .... Done >
برای دریافت راهنمایی بیشتر در مورد یک دستور خاص، از نام دستور استفاده کنید، برای مثال:
> help add add Add a node to the simulation and get the node ID. Definition: .... .... >
OTNS-وب
OTNS-Web ابزار تجسم و مدیریت شبکه OTNS است. این ابزار نمایش بصری از گرهها، پیامها و لینکهای شبکه Thread شبیهسازی شده را ارائه میدهد. به عناصر مختلف OTNS-Web توجه کنید:

۵. اضافه کردن گرهها
اضافه کردن گرهها از طریق OTNS-CLI
یک مسیریاب نخ (Thread Router) به شبیهسازی اضافه کنید:
> add router 1 Done
شما باید یک گره ایجاد شده در OTNS-Web را ببینید. این گره به عنوان یک روتر شروع به کار میکند و در عرض چند ثانیه به یک رهبر تبدیل میشود:

برای آسانتر کردن شروع شبیهسازیها به صورت تعاملی، هر گره جدید OpenThread به طور پیشفرض با مجموعهای استاندارد از پارامترهای شبکه راهاندازی میشود.
اضافه کردن گرههای بیشتر از طریق OTNS-CLI
حالا چند گره از انواع مختلف اضافه خواهیم کرد.
> add fed 2 Done > add med 3 Done > add sed 4 Done
چند ثانیه صبر کنید تا گرهها در یک پارتیشن ادغام شوند. باید گرهها را در OTNS-Web مشاهده کنید:

همچنین در OTNS-Web ، میتوان هر یک از گرهها را انتخاب کرد تا پنلی با اطلاعات بیشتر در مورد گره نمایش داده شود. برای مثال، در شکل زیر گره ۱ انتخاب شده است. ورودی "نقش" در پنل، رهبر بودن آن را تأیید میکند.

اضافه کردن گرهها توسط OTNS-Web
همچنین میتوانید گرهها را از طریق OTNS-Web اضافه کنید. روی دکمه New Router در Action Bar کلیک کنید. باید یک گره در سمت راست گره انتخاب شده ایجاد شود. روتر جدید باید به پارتیشن Thread موجود بپیوندد:

همچنین برای ایجاد انواع دیگر گرهها، روی دکمههای FED، MED، SSED و BR در نوار اقدام کلیک کنید. اکنون باید در مجموع 9 گره وجود داشته باشد. در صورت تمایل، برخی از گرهها را به موقعیتهای دیگر بکشید تا توپولوژی شبکه فیزیکی متفاوتی ایجاد شود.

حالا شما یک شبکه Thread از یک پارتیشن ایجاد کردهاید که شامل گرههای زیادی است. در بخش بعدی، قصد داریم سرعت شبیهسازی را تنظیم کنیم تا شبیهسازی سریعتر اجرا شود.
۶. تنظیم سرعت
در حال حاضر، شبیهسازی باید با سرعت 1X اجرا شود، به این معنی که زمان سپری شده برای شبیهسازی تاکنون برابر با زمان واقعی از زمانی است که اولین گره را ایجاد کردهایم.
تنظیم سرعت از طریق OTNS-CLI
شما میتوانید سرعت شبیهسازی را از طریق OTNS-CLI تنظیم کنید.
سرعت شبیهسازی را روی 100X تنظیم کنید
> speed 100 Done
باید ببینید که گرهها پیامها را بسیار بیشتر از قبل ارسال میکنند.
سرعت شبیهسازی را روی MAX تنظیم کنید
> speed max Done
اکنون، OTNS تمام تلاش خود را میکند تا شبیهسازی را با حداکثر سرعت ممکن انجام دهد، بنابراین باید شاهد ارسال تعداد زیادی پیام توسط گرهها باشید.
شبیهسازی را متوقف کنید
> speed 0 Done
تنظیم سرعت شبیهسازی روی 0 شبیهسازی را متوقف میکند.
شبیهسازی را با سرعت عادی بازیابی کنید
> speed 1 Done
تنظیم سرعت شبیهسازی روی مقداری بزرگتر از 0 شبیهسازی را از سر میگیرد.
تنظیم سرعت از طریق OTNS-Web
دکمههای کنترل سرعت
دکمههای کنترل سرعت را پیدا کنید
روی Action Bar . دکمهها سرعت شبیهسازی فعلی را نشان میدهند و میتوانند برای تنظیم سرعت شبیهسازی و مکث/ازسرگیری شبیهسازی استفاده شوند.
افزایش سرعت شبیهسازی
شما میتوانید با کلیک کردن روی []، سرعت شبیهسازی را افزایش دهید.
دکمه را فشار دهید تا سرعت به MAX برسد:
.
کاهش سرعت شبیهسازی
شما میتوانید با کلیک کردن روی [علامت]، سرعت شبیهسازی را کاهش دهید.
دکمه
شبیهسازی را متوقف کنید
کلیک کنید
دکمهای برای مکث شبیهسازی هنگام اجرا. این دکمه به ... تغییر خواهد کرد.
.
شبیهسازی رزومه
کلیک کنید
دکمهای برای از سرگیری شبیهسازی پس از توقف آن. این دکمه به حالت قبل برمیگردد.
.
سرعت شبیهسازی را روی 10X تنظیم کنید
برای صرفه جویی در وقت، از
OTNS-CLI برای تنظیم سرعت شبیهسازی
10X تا بتوانیم تغییرات توپولوژی در شبکه را خیلی سریعتر مشاهده کنیم.
> speed 10 Done
۷. روشن/خاموش کردن رادیو
حالا، شبیهسازی باید حداقل شامل ۲ روتر (شش ضلعی)، احتمالاً یک روتر مرزی (مربعی شکل) و تعداد زیادی روتر فرزند باشد و با سرعت ۱۰ برابر اجرا شود.
رهبر فعلی (حاشیه قرمز) از بین دو روتر را پیدا کنید، برای انتخاب آن یک کلیک کنید:

رادیو را خاموش کنید
کلیک کنید
برای خاموش کردن رادیوی گره رهبر، روی دکمهی «در نوار اقدام» کلیک کنید. رهبر قادر به ارسال یا دریافت پیام با رادیوی خاموش نخواهد بود.
حدود ۱۲ ثانیه (۱۲۰ ثانیه در زمان شبیهسازی) صبر کنید تا روتر دیگر یا روتر مرزی به عنوان رهبر جدید انتخاب شود:

شبکه Thread با تشکیل یک پارتیشن جدید با یک Leader جدید، به طور خودکار از خرابی Leader بهبود مییابد. پارتیشن جدید همچنین دارای یک رنگ پارتیشن جدید است.
رادیو را روشن کنید
رهبری را که رادیوی او خاموش بود انتخاب کنید. روی
برای بازیابی اتصال رادیویی، روی Action Bar کلیک کنید:

پس از برقراری مجدد اتصال رادیویی، رهبر باید دوباره به شبکه متصل شود.
۸. جابجایی گرهها
OTNS به کاربران این امکان را میدهد که گرهها را به راحتی از طریق OTNS-CLI یا OTNS-Web جابجا کنند.
انتقال گره از طریق OTNS-CLI
گره Border Router 9 را به مکان جدید منتقل کنید:
> move 9 50 50 Done
انتقال گره از طریق OTNS-Web
گره ۵ را با کشیدن، کاملاً به پایین سمت راست منتقل کنید. از آنجایی که گره ۵ اکنون از پوشش رادیویی سایر روترها خارج شده است، پارتیشن مخصوص به خود را با یک شناسه پارتیشن جدید تشکیل میدهد. شناسههای پارتیشن را میتوان با کلیک روی گرهها در پنل اطلاعات گره بررسی کرد.

توجه داشته باشید که هنوز یک خط سبز واحد بین گره ۵ و گره ۹ کشیده شده است. این اغلب به دلیل اطلاعات قدیمی در مورد یک فرزند است که هنوز در جدول فرزند گره والد قبلی نگهداری میشود. یا میتواند اطلاعات قدیمی در مورد لینک روتر به روتر قبلی بین گره ۹ و گره ۵ باشد. (یا احتمالاً، در این مورد، حتی یک اشکال رندرینگ.) در نهایت، اطلاعات قدیمی پس از اتمام زمان مناسب در گرهها پاک میشوند.
۹. حذف گرهها
حذف گرهها از طریق OTNS-CLI
حذف گره ۵:
> del 5 Done
گره ۵ باید از شبیهسازی حذف شود:

حذف گرهها از طریق OTNS-Web
گره Border Router 9 را انتخاب کرده و روی آن کلیک کنید
دکمهی روی Action Bar برای حذف گره ۹:

Node 1 باید رهبر (Leader) یک پارتیشن جدید شود و تمام گرههای باقیمانده به عنوان فرزند (Child) به گره ۱ متصل شوند.
۱۰. زمینه گره OTNS-CLI
OTNS-CLI حالت زمینه گره را برای تعامل آسان با گرهها فراهم میکند تا به توسعهدهندگان در تشخیص وضعیت گره کمک کند. همچنین میتوان اقدامات گره را از این حالت آغاز کرد.
حالت زمینه گره را وارد کنید
متن گره گره ۱ را وارد کنید:
> node 1 Done node 1>
اعلان CLI به node 1> تغییر کرد که نشاندهندهی زمینهی گرهی فعلی است. میتوانید دستورات OpenThread CLI را برای اجرا روی گره تایپ کنید، گویی مستقیماً با گره در تعامل هستید.
اجرای دستورات در متن گره
node 1> state leader Done node 1> channel 11 Done node 1> panid 0xface Done node 1> networkname otns Done node 1> ipaddr fdde:ad00:beef:0:0:ff:fe00:fc00 fdde:ad00:beef:0:0:ff:fe00:b400 fd00:f00d:cafe:0:2505:8719:3685:ebfb fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb fe80:0:0:0:e86a:e07:ec97:777 Done
به یک زمینه گره دیگر بروید
node 1> node 2 Done node 2>
زمینه گره خروجی
node 1> exit Done >
یک روش جایگزین برای خروج از زمینه گره، دستور node 0 است.
۱۱. مشاهده لاگهای گره و ضبط بستهها
سیاهههای گره OpenThread
به طور پیشفرض، OTNS فایلهای گزارش دقیقی را برای همه گرههای شبیهسازی شده OpenThread ایجاد میکند. این فایلها را میتوان در دایرکتوری ./tmp مشاهده کرد. نام فایل 0_ است. 0_ . برای مثال، گزیدهای از یک فایل لاگ در زیر نشان داده شده است:
7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-: src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6 | ..&..!.eSZCN.Y. |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-: src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---: 12 0x3000 - me - leader
زمان شبیهسازی مطلق بر حسب میکروثانیه در سمت چپ نشان داده شده است. مهر زمانی hh:mm:ss مهر زمانی لاگ خود گره OpenThread را نشان میدهد که ممکن است با زمان شبیهسازی مطلق متفاوت باشد.
ضبط بستههای وایرشارک
به طور پیشفرض، تمام فریمهای IEEE 802.15.4 منتقل شده در فایل PCAP current.pcap ضبط میشوند. این فایل میتواند توسط Wireshark در حین یا بعد از شبیهسازی خوانده شود. با توجه به رمزگذاری لایه پیوند Thread، یک اقدام پیکربندی یکباره در Wireshark برای تنظیم صحیح کلید رمزگشایی برای OTNS مورد نیاز است. به طور پیشفرض، از یک کلید شبکه شناخته شده استفاده میشود تا رمزگشایی فریم توسط Wireshark آسان شود.
برای مثالی از بازرسی بسته OpenThread در Wireshark، به تصویر زیر مراجعه کنید.

برای پیکربندی کلید رمزگشایی، از منو Edit -> Preferences را انتخاب کنید. سپس در پنجره تنظیمات، Protocols -> IEEE 802.15.4 را انتخاب کنید. روی دکمه Edit... در کنار "Decryption Keys" کلیک کنید. برای ایجاد یک ورودی جدید، روی + کلیک کنید و کلید 00112233445566778899aabbccddeeff (32 کاراکتر) را وارد کنید و "Thread hash" را در فیلد "Key hash" انتخاب کنید. "Decryption key index" را میتوان روی 0 تنظیم کرد. سپس روی OK و دوباره OK کلیک کنید. اکنون فایل OTNS PCAP باید هنگام بارگذاری به درستی رمزگشایی شود.
مهرهای زمانی نشان داده شده در ستون "زمان" (به ثانیه) مطابق با مقادیر زمان شبیهسازی مطلق نشان داده شده در گزارشهای گره OpenThread هستند. این امر ارتباط پیامهای گزارش با فریمهای رادیویی ارسالی یا دریافتی را آسانتر میکند. با این حال، مقادیر معمولاً تا دقت یک میکروثانیه یکسان نیستند: سختافزار رادیویی شبیهسازی شده IEEE 802.15.4 ممکن است پس از درخواست ارسال یک فریم رادیویی توسط پشته OpenThread، مقداری تأخیر اضافی ایجاد کند.
۱۲. تبریک
تبریک میگویم، شما با موفقیت اولین شبیهسازی OTNS خود را اجرا کردید!
شما یاد گرفتهاید که چگونه OTNS و وابستگیهای آن را نصب کنید. یک شبیهسازی OTNS را با گرههای شبیهسازی شده OpenThread شروع کردید. یاد گرفتهاید که چگونه شبیهسازی را به روشهای مختلف از طریق OTNS-CLI و OTNS-Web دستکاری کنید.
اکنون میدانید OTNS چیست و چگونه میتوانید از OTNS برای شبیهسازی شبکههای OpenThread استفاده کنید.
بعدش چی؟
به برخی از این آزمایشگاههای کد نگاهی بیندازید...
- شبیهسازی شبکه Thread با OpenThread
- شبیهسازی یک شبکه Thread با استفاده از OpenThread در Docker
- ساخت یک شبکه Thread با بردهای nRF52840 و OpenThread