ডকারে ওপেন থ্রেড ব্যবহার করে একটি থ্রেড নেটওয়ার্ক অনুকরণ করা

১. ভূমিকা

26b7f4f6b3ea0700.png

গুগল কর্তৃক প্রকাশিত ওপেনথ্রেড হলো থ্রেড নেটওয়ার্কিং প্রোটোকলের একটি ওপেন-সোর্স বাস্তবায়ন। গুগল নেস্ট, কানেক্টেড হোমের জন্য পণ্যের উন্নয়নকে ত্বরান্বিত করতে এবং নেস্ট পণ্যগুলিতে ব্যবহৃত প্রযুক্তিটি ডেভেলপারদের কাছে ব্যাপকভাবে সহজলভ্য করার জন্য ওপেনথ্রেড প্রকাশ করেছে।

থ্রেড স্পেসিফিকেশনটি হোম অ্যাপ্লিকেশনের জন্য একটি IPv6-ভিত্তিক নির্ভরযোগ্য, সুরক্ষিত এবং স্বল্প-শক্তিসম্পন্ন ওয়্যারলেস ডিভাইস-টু-ডিভাইস কমিউনিকেশন প্রোটোকল সংজ্ঞায়িত করে। ওপেনথ্রেড IPv6, 6LoWPAN, MAC সিকিউরিটিসহ IEEE 802.15.4, মেশ লিঙ্ক এস্টাবলিশমেন্ট এবং মেশ রাউটিং সহ সমস্ত থ্রেড নেটওয়ার্কিং লেয়ার বাস্তবায়ন করে।

এই কোডল্যাবটি আপনাকে ডকার ব্যবহার করে এমুলেটেড ডিভাইসে একটি থ্রেড নেটওয়ার্ক সিমুলেট করার পদ্ধতি ধাপে ধাপে দেখাবে।

আপনি যা শিখবেন

  • ওপেনথ্রেড বিল্ড টুলচেইন কীভাবে সেট আপ করবেন
  • থ্রেড নেটওয়ার্ক কীভাবে সিমুলেট করবেন
  • থ্রেড নোডগুলিকে কীভাবে প্রমাণীকরণ করবেন
  • OpenThread Daemon দিয়ে কীভাবে একটি থ্রেড নেটওয়ার্ক পরিচালনা করবেন

আপনার যা যা লাগবে

  • ডকার
  • লিনাক্স ও নেটওয়ার্ক রাউটিং সম্পর্কে প্রাথমিক জ্ঞান

২. ডকার সেট আপ করুন

এই কোডল্যাবটি লিনাক্স, ম্যাক ওএস এক্স বা উইন্ডোজ মেশিনে ডকার ব্যবহারের জন্য ডিজাইন করা হয়েছে। লিনাক্স হলো প্রস্তাবিত পরিবেশ।

ডকার ইনস্টল করুন

আপনার পছন্দের অপারেটিং সিস্টেমে ডকার ইনস্টল করুন।

ডকার ইমেজটি পুল করুন

ডকার ইনস্টল হয়ে গেলে, একটি টার্মিনাল উইন্ডো খুলুন এবং openthread/environment ডকার ইমেজটি পুল করুন। এই ইমেজটিতে OpenThread এবং OpenThread Daemon আগে থেকেই বিল্ট করা আছে এবং এই কোডল্যাবের জন্য ব্যবহারের জন্য প্রস্তুত।

$ 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 অপশনটি কন্টেইনার থেকে বের হওয়ার সময় কন্টেইনারটি মুছে ফেলে। যদি আপনি না চান যে কন্টেইনারটি মুছে ফেলা হোক, তাহলে এই অপশনটি ব্যবহার করবেন না।

এই কোডল্যাবের জন্য প্রয়োজনীয় ফ্ল্যাগগুলো লক্ষ্য করুন:

  • --sysctl net.ipv6.conf.all.disable_ipv6=0 — এটি কন্টেইনারের মধ্যে IPv6 সক্রিয় করে।
  • --cap-add=net_admin — এটি NET_ADMIN ক্যাপাবিলিটি সক্রিয় করে, যার মাধ্যমে আপনি নেটওয়ার্ক-সম্পর্কিত অপারেশন, যেমন আইপি রুট যোগ করা, সম্পাদন করতে পারেন।

কন্টেইনারের ভিতরে প্রবেশ করলে, আপনি এইরকম একটি প্রম্পট দেখতে পাবেন:

root@c0f3912a74ff:/#

উপরের উদাহরণে, c0f3912a74ff হলো কন্টেইনার আইডি। আপনার ডকার কন্টেইনার ইনস্ট্যান্সের কন্টেইনার আইডিটি এই কোডল্যাবের প্রম্পটে দেখানো আইডি থেকে ভিন্ন হবে।

ডকার ব্যবহার করে

এই কোডল্যাবটি ধরে নেয় যে আপনি ডকার ব্যবহারের প্রাথমিক বিষয়গুলো জানেন। কোডল্যাবের পুরোটা সময় আপনাকে ডকার কন্টেইনারের ভেতরেই থাকতে হবে।

৩. একটি থ্রেড নেটওয়ার্ক অনুকরণ করুন

এই কোডল্যাবের জন্য আপনি যে উদাহরণ অ্যাপ্লিকেশনটি ব্যবহার করবেন, তা একটি ন্যূনতম ওপেনথ্রেড অ্যাপ্লিকেশন প্রদর্শন করে, যা একটি সাধারণ কমান্ড-লাইন ইন্টারফেস (CLI)-এর মাধ্যমে ওপেনথ্রেড কনফিগারেশন এবং ম্যানেজমেন্ট ইন্টারফেসগুলো উন্মুক্ত করে।

এই অনুশীলনীতে একটি এমুলেটেড থ্রেড ডিভাইস থেকে অন্য একটি এমুলেটেড থ্রেড ডিভাইসকে পিং করার জন্য প্রয়োজনীয় ন্যূনতম ধাপগুলো দেখানো হয়েছে।

নিচের চিত্রে একটি মৌলিক থ্রেড নেটওয়ার্ক টপোলজি বর্ণনা করা হয়েছে। এই অনুশীলনের জন্য, আমরা সবুজ বৃত্তের ভেতরের দুটি নোডকে অনুকরণ করব: একটি থ্রেড লিডার এবং একটি মেশ এক্সটেন্ডার, যাদের মধ্যে একটিমাত্র সংযোগ থাকবে।

6e3aa07675f902dc.png

নেটওয়ার্ক তৈরি করুন

১. নোড ১ শুরু করুন

যদি আপনি ইতিমধ্যে তা না করে থাকেন, তাহলে একটি টার্মিনাল উইন্ডোতে ডকার কন্টেইনারটি চালু করুন এবং এর 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 প্রসেসটি চালু করুন।

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

দ্রষ্টব্য: এই কমান্ডটি চালানোর পর যদি আপনি > প্রম্পটটি দেখতে না পান, তাহলে enter চাপুন।

এই বাইনারিটি একটি ওপেনথ্রেড ডিভাইস বাস্তবায়ন করে। IEEE 802.15.4 রেডিও ড্রাইভারটি UDP-এর উপরে বাস্তবায়িত হয়েছে (IEEE 802.15.4 ফ্রেমগুলো UDP পেলোডের মধ্যে প্রেরণ করা হয়)।

আর্গুমেন্ট 1 হলো একটি ফাইল ডেসক্রিপ্টর, যা এমুলেটেড ডিভাইসের জন্য "ফ্যাক্টরি-অ্যাসাইনড" IEEE EUI-64-এর সর্বনিম্ন-গুরুত্বপূর্ণ বিটগুলোকে প্রতিনিধিত্ব করে। IEEE 802.15.4 রেডিও এমুলেশনের জন্য একটি UDP পোর্টে বাইন্ডিং করার সময়ও এই মানটি ব্যবহৃত হয় (পোর্ট = ৯০০০ + ফাইল ডেসক্রিপ্টর)। এই কোডল্যাবে এমুলেটেড থ্রেড ডিভাইসের প্রতিটি ইনস্ট্যান্স একটি ভিন্ন ফাইল ডেসক্রিপ্টর ব্যবহার করবে।

দ্রষ্টব্য: একটি এমুলেটেড ডিভাইসের জন্য প্রসেস স্পন করার সময়, এই কোডল্যাবে উল্লিখিত নিয়ম অনুযায়ী শুধুমাত্র 1 বা তার বেশি মানের ফাইল ডেসক্রিপ্টর ব্যবহার করুন। 0 মানের ফাইল ডেসক্রিপ্টর অন্যান্য ব্যবহারের জন্য সংরক্ষিত।

একটি নতুন অপারেশনাল ডেটাসেট তৈরি করুন এবং এটিকে সক্রিয় হিসেবে কমিট করুন। এই অপারেশনাল ডেটাসেটটি হলো আপনার তৈরি করা থ্রেড নেটওয়ার্কের কনফিগারেশন।

> 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 start
Done

কয়েক সেকেন্ড অপেক্ষা করুন এবং যাচাই করুন যে ডিভাইসটি থ্রেড লিডার হয়েছে। লিডার হলো সেই ডিভাইস যা রাউটার আইডি বরাদ্দ ব্যবস্থাপনার জন্য দায়ী।

> state
leader
Done

নোড ১-এর থ্রেড ইন্টারফেসে বরাদ্দ করা IPv6 অ্যাড্রেসগুলো দেখুন (আপনার আউটপুট ভিন্ন হবে):

> 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 exec -it codelab_otsim_ctnr bash

এই নতুন bash প্রম্পটে, 2 আর্গুমেন্ট দিয়ে CLI প্রসেসটি চালু করুন। এটি আপনার দ্বিতীয় অনুকৃত থ্রেড ডিভাইস:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

দ্রষ্টব্য: এই কমান্ডটি চালানোর পর যদি আপনি > প্রম্পটটি দেখতে না পান, তাহলে enter চাপুন।

নোড ১-এর অপারেশনাল ডেটাসেটের মানগুলোই ব্যবহার করে থ্রেড নেটওয়ার্ক কী এবং প্যান আইডি কনফিগার করুন:

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

এই ডেটাসেটটিকে সক্রিয় হিসেবে কমিট করুন:

> dataset commit active
Done

IPv6 ইন্টারফেসটি চালু করুন:

> ifconfig up
Done

থ্রেড প্রোটোকল অপারেশন শুরু করুন:

> thread start
Done

ডিভাইসটি একটি চাইল্ড হিসেবে নিজেকে ইনিশিয়ালাইজ করবে। একটি থ্রেড চাইল্ড একটি এন্ড ডিভাইসের সমতুল্য, যা এমন একটি থ্রেড ডিভাইস যা শুধুমাত্র একটি প্যারেন্ট ডিভাইসের সাথে ইউনিকাস্ট ট্র্যাফিক প্রেরণ ও গ্রহণ করে।

> state
child
Done

২ মিনিটের মধ্যে আপনি স্টেটটি child থেকে router পরিবর্তিত হতে দেখবেন। একটি মেশ এক্সটেন্ডার থ্রেড ডিভাইসগুলোর মধ্যে ট্র্যাফিক রাউটিং করতে সক্ষম। এটিকে প্যারেন্ট হিসেবেও উল্লেখ করা হয়।

> 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 পাওয়া গেছে, যা নিশ্চিত করে যে এটি মেশের সাথে সংযুক্ত।

২. নোড ২ থেকে নোড ১-কে পিং করুন

দুটি অনুকৃত থ্রেড ডিভাইসের মধ্যে সংযোগ যাচাই করুন। নোড ২ থেকে, নোড ১-কে বরাদ্দ করা 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

> প্রম্পটে ফিরে যেতে enter চাপুন।

নেটওয়ার্ক পরীক্ষা করুন

এখন যেহেতু আপনি দুটি অনুকৃত থ্রেড ডিভাইসের মধ্যে সফলভাবে পিং করতে পারছেন, একটি নোড অফলাইন করে মেশ নেটওয়ার্কটি পরীক্ষা করুন।

নোড ১-এ ফিরে যান এবং থ্রেডটি বন্ধ করুন:

> thread stop
Done

নোড ২-এ সুইচ করুন এবং অবস্থা পরীক্ষা করুন। দুই মিনিটের মধ্যে, নোড ২ শনাক্ত করবে যে লিডার (নোড ১) অফলাইন, এবং আপনি দেখবেন নোড ২ নেটওয়ার্কের leader হয়ে যাচ্ছে:

> state
router
Done
...
> state
leader
Done

নিশ্চিত হয়ে গেলে, ডকার bash প্রম্পটে ফিরে আসার আগে থ্রেডটি বন্ধ করুন এবং নোড ২ ফ্যাক্টরি রিসেট করুন। এই অনুশীলনে ব্যবহৃত থ্রেড নেটওয়ার্ক ক্রেডেনশিয়ালগুলো যেন পরবর্তী অনুশীলনে স্থানান্তরিত না হয়, তা নিশ্চিত করার জন্যই ফ্যাক্টরি রিসেট করা হয়।

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

factoryreset কমান্ডের পর > প্রম্পটটি ফিরিয়ে আনতে আপনাকে কয়েকবার enter চাপতে হতে পারে। ডকার কন্টেইনার থেকে বের হবেন না।

এছাড়াও ফ্যাক্টরি রিসেট করুন এবং নোড ১ থেকে প্রস্থান করুন:

> factoryreset
>
> exit
root@c0f3912a74ff:/#

উপলব্ধ সকল CLI কমান্ড সম্পর্কে জানতে OpenThread CLI Reference দেখুন।

৪. কমিশনিং-এর মাধ্যমে নোডগুলোকে প্রমাণীকরণ করুন

পূর্ববর্তী অনুশীলনে, আপনি দুটি সিমুলেটেড ডিভাইস দিয়ে একটি থ্রেড নেটওয়ার্ক স্থাপন করেছিলেন এবং সংযোগ যাচাই করেছিলেন। তবে, এটি শুধুমাত্র ডিভাইসগুলোর মধ্যে প্রমাণীকরণবিহীন IPv6 লিঙ্ক-লোকাল ট্র্যাফিককে চলাচল করতে দেয়। তাদের মধ্যে (এবং একটি থ্রেড বর্ডার রাউটারের মাধ্যমে ইন্টারনেটে) গ্লোবাল IPv6 ট্র্যাফিক রাউট করার জন্য, নোডগুলোকে অবশ্যই প্রমাণীকৃত হতে হবে।

প্রমাণীকরণের জন্য, একটি ডিভাইসকে কমিশনার হিসেবে কাজ করতে হবে। কমিশনার হলো নতুন থ্রেড ডিভাইসগুলোর জন্য বর্তমানে নির্বাচিত প্রমাণীকরণ সার্ভার এবং নেটওয়ার্কে যোগদানের জন্য প্রয়োজনীয় নেটওয়ার্ক ক্রেডেনশিয়াল সরবরাহকারী অনুমোদনকারী।

এই অনুশীলনে, আমরা আগের মতোই দুই-নোড টপোলজি ব্যবহার করব। অথেনটিকেশনের জন্য, থ্রেড লিডার কমিশনার হিসেবে এবং মেশ এক্সটেন্ডার জয়নার হিসেবে কাজ করবে।

d6a67e8a0d0b5dcb.png

ডকার

বাকি অনুশীলনগুলিতে প্রতিটি নোডের (টার্মিনাল উইন্ডো) জন্য, নিশ্চিত করুন যে আপনি ওপেনথ্রেড বিল্ড সহ ডকার কন্টেইনারটি চালাচ্ছেন। যদি আগের অনুশীলন থেকে চালিয়ে যান, তাহলে একই ডকার কন্টেইনারের মধ্যে আপনার দুটি bash প্রম্পট আগে থেকেই খোলা থাকা উচিত। যদি তা না হয়, তাহলে ডকার ট্রাবলশুটিং ধাপটি দেখুন, অথবা সহজভাবে ‘সিমুলেট এ থ্রেড’ নেটওয়ার্ক অনুশীলনটি পুনরায় করুন।

১. একটি নেটওয়ার্ক তৈরি করুন

নোড ১-এ, CLI প্রসেসটি চালু করুন:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/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
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 start
Done

কয়েক সেকেন্ড অপেক্ষা করুন এবং যাচাই করুন যে ডিভাইসটি থ্রেড লিডার হয়েছে:

> state
leader
Done

২. কমিশনারের ভূমিকা শুরু করুন

নোড ১-এ থাকা অবস্থায়, কমিশনার ভূমিকাটি শুরু করুন:

> commissioner start
Done

J01NME জয়নার ক্রেডেনশিয়াল ব্যবহার করে যেকোনো জয়নারকে ( * ওয়াইল্ডকার্ড ব্যবহার করে) নেটওয়ার্কে কমিশন করার অনুমতি দিন। জয়নার হলো এমন একটি ডিভাইস যা একজন মানব প্রশাসক একটি কমিশনকৃত থ্রেড নেটওয়ার্কে যুক্ত করেন।

> commissioner joiner add * J01NME
Done

৩. যোগদানকারীর ভূমিকা শুরু করুন

ডকার কন্টেইনারের ভেতরে দ্বিতীয় একটি টার্মিনাল উইন্ডোতে, একটি নতুন CLI প্রসেস চালু করুন। এটি হলো নোড ২।

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

নোড ২-এ, J01NME জয়নার ক্রেডেনশিয়াল ব্যবহার করে জয়নার রোলটি সক্রিয় করুন।

> ifconfig up
Done
> joiner start J01NME
Done

নিশ্চিতকরণের জন্য কয়েক সেকেন্ড অপেক্ষা করুন ...

Join success

যোগদানকারী হিসেবে, ডিভাইসটি (নোড ২) কমিশনারের (নোড ১) কাছে সফলভাবে নিজেকে প্রমাণীকরণ করেছে এবং থ্রেড নেটওয়ার্কের পরিচয়পত্র গ্রহণ করেছে।

এখন যেহেতু নোড ২ প্রমাণীকৃত হয়েছে, থ্রেডটি শুরু করুন:

> thread start
Done

৪. নেটওয়ার্ক প্রমাণীকরণ যাচাই করুন

নোড ২ নেটওয়ার্কে যুক্ত হয়েছে কিনা তা যাচাই করতে এর state পরীক্ষা করুন। দুই মিনিটের মধ্যে, নোড ২ child থেকে router রূপান্তরিত হয়।

> state
child
Done
...
> state
router
Done

৫. কনফিগারেশন রিসেট করুন

পরবর্তী অনুশীলনের জন্য প্রস্তুত হতে, কনফিগারেশন রিসেট করুন। প্রতিটি নোডে, থ্রেড বন্ধ করুন, ফ্যাক্টরি রিসেট করুন এবং এমুলেটেড থ্রেড ডিভাইস থেকে প্রস্থান করুন:

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

factoryreset কমান্ডের পর > প্রম্পটটি ফিরিয়ে আনতে আপনাকে কয়েকবার enter চাপতে হতে পারে।

৫. OpenThread Daemon দিয়ে নেটওয়ার্ক পরিচালনা করুন

এই অনুশীলনের জন্য, আমরা একটি CLI ইনস্ট্যান্স (একটি একক এমবেডেড SoC থ্রেড ডিভাইস) এবং একটি রেডিও কো-প্রসেসর (RCP) ইনস্ট্যান্স সিমুলেট করব।

ot-daemon হলো OpenThread Posix অ্যাপের একটি মোড, যা ইনপুট ও আউটপুট হিসেবে একটি UNIX সকেট ব্যবহার করে, যাতে OpenThread কোর একটি সার্ভিস হিসেবে চলতে পারে। কোনো ক্লায়েন্ট OpenThread CLI-কে প্রোটোকল হিসেবে ব্যবহার করে সকেটের সাথে সংযোগ স্থাপনের মাধ্যমে এই সার্ভিসের সাথে যোগাযোগ করতে পারে।

ot-ctl হলো ot-daemon দ্বারা প্রদত্ত একটি CLI, যা RCP পরিচালনা ও কনফিগার করার জন্য ব্যবহৃত হয়। এটি ব্যবহার করে আমরা থ্রেড ডিভাইস দ্বারা তৈরি নেটওয়ার্কের সাথে RCP-কে সংযুক্ত করব।

ডকার

এই অনুশীলনের প্রতিটি নোড (টার্মিনাল উইন্ডো)-এর জন্য, নিশ্চিত করুন যে আপনি ওপেনথ্রেড বিল্ড সহ ডকার কন্টেইনারটি চালাচ্ছেন। যদি পূর্ববর্তী অনুশীলন থেকে চালিয়ে যান, তাহলে আপনার একই ডকার কন্টেইনারের মধ্যে দুটি bash প্রম্পট আগে থেকেই খোলা থাকা উচিত। যদি তা না হয়, তাহলে ডকার ট্রাবলশুটিং ধাপটি দেখুন।

ot-daemon ব্যবহার করুন

এই অনুশীলনীতে নিম্নলিখিত তিনটি টার্মিনাল উইন্ডো ব্যবহার করা হবে:

  1. সিমুলেটেড থ্রেড ডিভাইসের (নোড ১) CLI ইনস্ট্যান্স
  2. ot-daemon প্রক্রিয়া
  3. ot-ctl CLI ইনস্ট্যান্স

১. নোড ১ শুরু করুন

প্রথম টার্মিনাল উইন্ডোতে, আপনার এমুলেটেড থ্রেড ডিভাইসের জন্য CLI প্রসেসটি চালু করুন:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/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
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 start
Done

নোড ১-এর থ্রেড ইন্টারফেসে বরাদ্দকৃত IPv6 অ্যাড্রেসগুলো দেখুন:

> 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

আপনার ipaddr আউটপুট থেকে নির্দিষ্ট EID-টি শনাক্ত করুন, যেটি নোডটির সাথে যোগাযোগের জন্য ব্যবহৃত হবে।

২. ot-daemon চালু করুন।

দ্বিতীয় টার্মিনাল উইন্ডোতে, একটি tun ডিভাইস নোড তৈরি করুন এবং পঠন/লিখন অনুমতি সেট করুন:

root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200
root@c0f3912a74ff:/# chmod 600 /dev/net/tun

এই ডিভাইসটি ভার্চুয়াল ডিভাইসে প্যাকেট প্রেরণ ও গ্রহণের জন্য ব্যবহৃত হয়। ডিভাইসটি আগে থেকেই তৈরি করা থাকলে আপনি একটি ত্রুটি বার্তা পেতে পারেন—এটি স্বাভাবিক এবং উপেক্ষা করা যেতে পারে।

একটি RCP নোডের জন্য ot-daemon চালু করুন, যেটিকে আমরা নোড ২ বলব। -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 নিম্নলিখিতের মতো আউটপুট তৈরি করে:

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 ব্যবহার করুন।

আমরা এখনও নোড ২ ( ot-daemon RCP)-কে কোনো থ্রেড নেটওয়ার্কে যুক্ত করিনি। এখানেই ot-ctl ভূমিকা। ot-ctl OpenThread CLI অ্যাপের মতোই একই CLI ব্যবহার করে। তাই, আপনি অন্যান্য সিমুলেটেড থ্রেড ডিভাইসগুলোর মতোই ot-daemon নোডগুলোকে নিয়ন্ত্রণ করতে পারবেন।

তৃতীয় একটি টার্মিনাল উইন্ডো খুলুন এবং বিদ্যমান কন্টেইনারটি চালান:

$ 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

নির্দিষ্ট জয়নারের জন্য যোগদান সীমাবদ্ধ করতে নোড ২-এর eui64 নিন:

> eui64
18b4300000000001
Done

নোড ১-এ (প্রথম টার্মিনাল উইন্ডো), কমিশনার চালু করুন এবং শুধুমাত্র সেই eui64-এর জন্য যোগদান সীমাবদ্ধ করুন:

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

তৃতীয় টার্মিনাল উইন্ডোতে, নোড ২-এর নেটওয়ার্ক ইন্টারফেসটি চালু করুন এবং নেটওয়ার্কে যোগদান করুন:

> ifconfig up
Done
> joiner start J01NME
Done

নিশ্চিতকরণের জন্য কয়েক সেকেন্ড অপেক্ষা করুন ...

Join success

যোগদানকারী হিসেবে, আরসিপি (নোড ২) কমিশনারের (নোড ১) কাছে সফলভাবে নিজেকে প্রমাণীকরণ করেছে এবং থ্রেড নেটওয়ার্কের পরিচয়পত্র গ্রহণ করেছে।

এখন নোড ২-কে থ্রেড নেটওয়ার্কে যুক্ত করুন (আবারও, তৃতীয় টার্মিনাল উইন্ডোতে):

> thread start
Done

৪. নেটওয়ার্ক প্রমাণীকরণ যাচাই করুন

তৃতীয় টার্মিনালে, নোড ২ নেটওয়ার্কে যুক্ত হয়েছে কিনা তা যাচাই করতে এর state পরীক্ষা করুন। দুই মিনিটের মধ্যে, নোড ২ child থেকে router রূপান্তরিত হয়।

> state
child
Done
...
> state
router
Done

৫. সংযোগ যাচাই করুন

তৃতীয় টার্মিনাল উইন্ডোতে, Ctrl+D অথবা exit কমান্ড ব্যবহার করে ot-ctl থেকে প্রস্থান করুন এবং কন্টেইনারের bash কনসোলে ফিরে আসুন। এই কনসোল থেকে, ping6 কমান্ড ব্যবহার করে নোড ১-এর EID দিয়ে সেটিকে পিং করুন। যদি ot-daemon RCP ইনস্ট্যান্সটি সফলভাবে থ্রেড নেটওয়ার্কে যুক্ত হয়ে থাকে এবং তার সাথে যোগাযোগ স্থাপন করে, তাহলে পিং সফল হবে:

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 প্রম্পট চালু আছে কিনা তা আপনাকে পরীক্ষা করতে হতে পারে এবং প্রয়োজন অনুযায়ী পুনরায় চালু বা পুনরায় প্রবেশ করতে হতে পারে। আপনার তৈরি করা যে সমস্ত ডকার কন্টেইনারে আপনি --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 কমান্ডের আউটপুটে 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 ত্রুটি দেখা দেয়, তাহলে নিশ্চিত করুন যে আপনি এই কোডল্যাবে প্রদত্ত কমান্ড অনুযায়ী রুট ব্যবহারকারী হিসেবে ডকার চালাচ্ছেন। এই কোডল্যাবটি রুটলেস মোডে ডকার চালানো সমর্থন করে না।

৭. অভিনন্দন!

আপনি OpenThread ব্যবহার করে আপনার প্রথম থ্রেড নেটওয়ার্কটি সফলভাবে সিমুলেট করেছেন। চমৎকার!

এই কোডল্যাবে আপনি শিখেছেন কীভাবে:

  • OpenThread Simulation ডকার কন্টেইনারটি চালু এবং পরিচালনা করুন
  • একটি থ্রেড নেটওয়ার্ক অনুকরণ করুন
  • থ্রেড নোডগুলি প্রমাণীকরণ করুন
  • OpenThread Daemon ব্যবহার করে একটি থ্রেড নেটওয়ার্ক পরিচালনা করুন

থ্রেড এবং ওপেনথ্রেড সম্পর্কে আরও জানতে, এই তথ্যসূত্রগুলি দেখুন:

অথবা, ডকার কন্টেইনারে ওপেনথ্রেড বর্ডার রাউটার ব্যবহার করে দেখুন!