1. مقدمه
Thread & OTNS چیست
Thread یک پروتکل شبکه بی سیم کم مصرف مبتنی بر IP است که ارتباطات دستگاه به دستگاه و دستگاه به ابر را ایمن می کند. شبکه های نخ می توانند با تغییرات توپولوژی سازگار شوند تا از یک نقطه شکست جلوگیری کنند.
OpenThread منتشر شده توسط گوگل یک پیاده سازی منبع باز Thread است. OpenThread علیرغم اندازه کد کوچک و ردپای حافظه اش، از تمام ویژگی های تعریف شده در Thread Specification پشتیبانی می کند.
از OpenThread Network Simulator (OTNS) می توان برای شبیه سازی شبکه های Thread با اجرای گره های OpenThread شبیه سازی شده بر روی پلتفرم های posix استفاده کرد. OTNS یک رابط وب با کاربری آسان (OTNS-Web) برای تجسم و عملکرد شبکه های Thread شبیه سازی شده فراهم می کند. شبیه سازی اسکریپت شده (با پایتون) نیز امکان پذیر است.
چیزی که یاد خواهید گرفت
- OTNS و وابستگی های آن را نصب کنید
- با اصول اولیه OTNS-CLI آشنا شوید
- نحوه افزودن/انتقال/حذف گره های OpenThread در OTNS-Web
- از دیگر ویژگی های مفید OTNS-Web برای کنترل شبیه سازی شبکه استفاده کنید
- عدم وجود یک نقطه شکست OpenThread را تأیید کنید
- ترافیک داده بین گره های OpenThread در Wireshark را ببینید
این کد لبه روی OTNS-CLI و OTNS-Web برای استفاده تعاملی متمرکز شده است. سایر ویژگیهای OTNS، مانند برنامهنویسی پایتون، پوشش داده نمیشوند.
آنچه شما نیاز دارید
- ترجیحاً Linux x86_64 یا Mac OS با Homebrew . اوبونتو 22/24 در ویندوز WSL2 نیز باید کار کند، اما ممکن است نیاز به تغییرات دستی تنظیمات داشته باشد.
- گیت .
- مرورگر وب. OTNS-Web از یک مرورگر وب برای نمایش شبیه سازی ها استفاده می کند.
- پرایمر نخ . برای درک آنچه در این Codelab آموزش داده می شود، باید مفاهیم اولیه Thread را بدانید.
اصطلاحات
اصطلاح Router به عنوان اصطلاح فنی برای Thread Mesh Extender استفاده می شود که در ابتدا Thread Router نامیده می شد. "Node" به هر دستگاه OpenThread شبیه سازی شده در یک شبیه سازی OTNS اشاره دارد.
2. نصب و راه اندازی
کد OTNS را دریافت کنید
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
تمام دستورات بعدی کنسول در این Codelab از دایرکتوری otns
اجرا می شوند.
بوت استرپ کنید و نصب کنید
اسکریپت bootstrap
وابستگی ها (از جمله Python3 و Go/Golang، در صورت نیاز) را نصب می کند و OTNS را نصب می کند. همچنین انواع مختلفی از گره های 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.
در صورت بروز خطاهای دیگر، مشکل GitHub می تواند ایجاد شود.
3. 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
یاد خواهید گرفت.
4. OTNS-CLI و OTNS-Web را بشناسید
OTNS-CLI
OTNS-CLI
رابط خط فرمان (CLI) برای مدیریت شبیهسازیهای OTNS است.
$ otns >_ ← OTNS-CLI prompt
می توانید دستورات را از طریق OTNS-CLI
تایپ کنید. برای لیست کامل دستورات به مرجع OTNS CLI مراجعه کنید. نگران نباشید، شما فقط از تعدادی از این دستورات در این Codelab استفاده می کنید.
دستور help
را برای یک نمای کلی از دستورات CLI تایپ کنید. این لیست با مرجع 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-Web
OTNS-Web
ابزار تجسم و مدیریت شبکه OTNS است. این یک نمایش بصری از گره ها، پیام ها و پیوندهای شبکه Thread شبیه سازی شده را ارائه می دهد. به عناصر مختلف OTNS-Web
توجه کنید:
5. گره ها را اضافه کنید
اضافه کردن گره ها از طریق 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
، این امکان وجود دارد که هر یک از گره ها را انتخاب کنید تا پانلی با اطلاعات بیشتر در مورد گره دریافت کنید. برای مثال در شکل زیر گره 1 انتخاب شده است. ورودی "نقش" در پانل تأیید می کند که یک رهبر است.
اضافه کردن گره توسط OTNS-Web
شما همچنین می توانید گره ها را از طریق OTNS-Web
اضافه کنید. روی دکمه New Router
در Action Bar
کلیک کنید. باید ببینید که یک گره در سمت راست گره انتخاب شده ایجاد می شود. روتر جدید باید به پارتیشن Thread موجود بپیوندد:
همچنین روی دکمههای FED، MED، SSED و BR در Action Bar کلیک کنید تا این انواع دیگر گرهها را ایجاد کنید. اکنون در مجموع باید 9 گره وجود داشته باشد. اگر می خواهید، تعدادی گره را به موقعیت های دیگر بکشید تا توپولوژی شبکه فیزیکی متفاوتی ایجاد کنید.
اکنون یک شبکه Thread از یک پارتیشن ایجاد کرده اید که شامل گره های زیادی است. در قسمت بعدی قصد داریم سرعت شبیه سازی را تنظیم کنیم تا شبیه سازی سریعتر اجرا شود.
6. تنظیم سرعت
در حال حاضر، شبیه سازی باید با سرعت 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
7. رادیو را روشن/خاموش کنید
در حال حاضر، شبیه سازی باید شامل حداقل 2 روتر (شکل شش ضلعی)، احتمالاً یک مسیریاب مرزی (مربع شکل) و تعداد زیادی کودک باشد و با سرعت 10 برابر اجرا شود.
لیدر فعلی (حاشیه قرمز) 2 روتر را پیدا کنید، برای انتخاب آن تنها کلیک کنید:
رادیو را خاموش کنید
را کلیک کنید دکمه Action Bar را برای خاموش کردن رادیو گره Leader. رهبر نمی تواند با رادیو خاموش پیام ارسال یا دریافت کند.
حدود 12 ثانیه (120 ثانیه در زمان شبیه سازی) صبر کنید تا روتر یا مسیریاب مرزی دیگر رهبر جدید شود:
شبکه Thread با ایجاد یک پارتیشن جدید با یک Leader به طور خودکار از شکست Leader بازیابی می شود. پارتیشن جدید یک رنگ پارتیشن جدید نیز دارد.
رادیو را روشن کنید
لیدری که رادیو آن خاموش است را انتخاب کنید. را کلیک کنید دکمه روی
Action Bar
برای بازیابی اتصال رادیویی:
رهبر باید پس از بازیابی اتصال رادیویی دوباره به شبکه متصل شود.
8. حرکت گره ها
OTNS کاربران را قادر می سازد تا گره ها را به راحتی از طریق OTNS-CLI
یا OTNS-Web
جابجا کنند.
گره را از طریق OTNS-CLI
منتقل کنید
نود 9 Border Router را به یک مکان جدید منتقل کنید:
> move 9 50 50 Done
گره را از طریق OTNS-Web منتقل کنید
با کشیدن گره 5 را تا انتها به سمت راست پایین ببرید. از آنجا که گره 5 اکنون از پوشش رادیویی سایر روترها خارج است، پارتیشن خود را با شناسه پارتیشن جدید تشکیل می دهد. شناسه های پارتیشن را می توان در پانل اطلاعات گره با کلیک روی گره ها بررسی کرد.
توجه داشته باشید که هنوز یک خط سبز منفرد بین گره 5 و گره 9 کشیده می شود. این اغلب به دلیل اطلاعات قدیمی در مورد یک کودک است که هنوز در جدول فرزند یکی از والدین سابق نگهداری می شود. یا ممکن است اطلاعات قدیمی مربوط به پیوند روتر به روتر قبلی بین گره 9 و گره 5 باشد. (یا احتمالاً، در این مورد، حتی یک اشکال رندر.) در نهایت، اطلاعات قدیمی پس از مهلت زمانی مناسب روی گره ها پاک می شوند.
9. گره ها را حذف کنید
حذف گره ها از طریق OTNS-CLI
حذف گره 5:
> del 5 Done
گره 5 باید از شبیه سازی محو شود:
حذف گره ها از طریق OTNS-Web
گره Border Router 9 را انتخاب کرده و روی آن کلیک کنید دکمه روی
Action Bar
برای حذف گره 9:
Node 1
باید Leader یک پارتیشن جدید شود و تمام گره های باقی مانده به عنوان Child به گره 1 متصل می شوند.
10. زمینه گره OTNS-CLI
OTNS-CLI
حالت زمینه گره را برای تعامل آسان با گره ها فراهم می کند تا به توسعه دهندگان کمک کند تا وضعیت یک گره را تشخیص دهند. همچنین اقدامات گره را می توان از این حالت آغاز کرد.
حالت بافت گره را وارد کنید
زمینه گره گره 1 را وارد کنید:
> 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
است.
11. مشاهده سیاهههای مربوط به گره و ضبط بسته
گزارش گره های OpenThread
بهطور پیشفرض، OTNS فایلهای گزارش دقیق را برای همه گرههای OpenThread شبیهسازی شده تولید میکند. اینها را می توان در دایرکتوری ./tmp
مشاهده کرد. نام فایل 0_
است 0_
. به عنوان مثال، گزیده ای از فایل log در زیر نشان داده شده است:
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 است که ممکن است با زمان شبیهسازی مطلق متفاوت باشد.
ضبط بسته های Wireshark
بهطور پیشفرض، تمام فریمهای ارسالی IEEE 802.15.4 در فایل PCAP current.pcap
ضبط میشوند. این فایل توسط Wireshark در حین یا بعد از شبیه سازی قابل خواندن است. با توجه به رمزگذاری لایه پیوند Thread، برای تنظیم صحیح کلید رمزگشایی برای OTNS، یک عمل پیکربندی یک بار در Wireshark لازم است. به طور پیش فرض، از یک کلید شبکه معروف استفاده می شود تا رمزگشایی فریم توسط Wireshark آسان شود.
برای نمونه ای از بازرسی بسته OpenThread در Wireshark به تصویر زیر مراجعه کنید.
برای پیکربندی کلید رمزگشایی، در منوی Edit -> Preferences را انتخاب کنید. سپس در پنجره تنظیمات، Protocols -> IEEE 802.15.4 را انتخاب کنید. روی دکمه ویرایش... در کنار «کلیدهای رمزگشایی» کلیک کنید. برای ایجاد یک ورودی جدید روی + کلیک کنید و کلید 00112233445566778899aabbccddeeff
(32 کاراکتر) را وارد کنید و در قسمت "Key hash" گزینه "Thread hash" را انتخاب کنید. "شاخص کلید رمزگشایی" را می توان روی 0
گذاشت. سپس بر روی OK کلیک کنید و دوباره OK کنید . اکنون فایل OTNS PCAP باید هنگام بارگذاری به درستی رمزگشایی شود.
مهرهای زمانی نشان داده شده در ستون "زمان" (بر حسب ثانیه) با مقادیر زمان شبیه سازی مطلق نشان داده شده در گزارش گره های OpenThread مطابقت دارد. این کار ارتباط پیام های گزارش را با فریم های رادیویی ارسال شده یا دریافتی آسان تر می کند. با این حال، مقادیر معمولاً با دقت یک میکروثانیه یکسان نیستند: سخت افزار رادیویی IEEE 802.15.4 شبیه سازی شده ممکن است پس از درخواست یک فریم رادیویی برای ارسال توسط پشته OpenThread، تأخیر بیشتری اضافه کند.
12. تبریک می گویم
تبریک میگوییم، شما اولین شبیهسازی OTNS خود را با موفقیت اجرا کردید!
شما یاد گرفته اید که چگونه OTNS و وابستگی های آن را نصب کنید. شما یک شبیه سازی OTNS را با گره های شبیه سازی شده OpenThread شروع کردید. شما یاد گرفته اید که چگونه شبیه سازی را به روش های مختلف از طریق OTNS-CLI
و OTNS-Web
دستکاری کنید.
اکنون می دانید OTNS چیست و چگونه می توانید از OTNS برای شبیه سازی شبکه های OpenThread استفاده کنید.
بعدش چی؟
برخی از این کدها را بررسی کنید...
- شبیه سازی شبکه Thread با OpenThread
- شبیه سازی شبکه Thread با استفاده از OpenThread در Docker
- با بردهای nRF52840 و OpenThread یک شبکه Thread بسازید