১. ভূমিকা

গুগল নেস্ট টিম কর্তৃক প্রকাশিত ওপেনথ্রেড হলো থ্রেড® নেটওয়ার্কিং প্রোটোকলের একটি ওপেন-সোর্স বাস্তবায়ন, যা কানেক্টেড হোমের জন্য পণ্যের উন্নয়নকে ত্বরান্বিত করার উদ্দেশ্যে ডিজাইন করা হয়েছে। থ্রেড স্পেসিফিকেশনটি বাড়ি এবং বাণিজ্যিক ভবনের অ্যাপ্লিকেশনের জন্য একটি IPv6-ভিত্তিক নির্ভরযোগ্য, সুরক্ষিত এবং স্বল্প-শক্তিসম্পন্ন ওয়্যারলেস ডিভাইস-টু-ডিভাইস যোগাযোগ প্রোটোকল সংজ্ঞায়িত করে।
এসপ্রেসিফ FreeRTOS এবং LwIP-এর উপর ভিত্তি করে OpenThread স্ট্যাকটি পোর্ট করেছে, যা ডেভেলপারদের দ্রুত থ্রেড নেটওয়ার্ক তৈরি করতে সক্ষম করে। এর সম্পর্কিত সোর্স কোড গিটহাব থেকে পাওয়া যাবে। একই সাথে, এসপ্রেসিফ RTOS-এর উপর ভিত্তি করে একটি থ্রেড বর্ডার রাউটারও বাস্তবায়ন করেছে।
এই কোডল্যাবে, আপনি বাস্তব হার্ডওয়্যারে ওপেনথ্রেড প্রোগ্রাম করবেন, একটি থ্রেড নেটওয়ার্ক তৈরি ও পরিচালনা করবেন এবং নোডগুলোর মধ্যে বার্তা আদান-প্রদান করবেন।

আপনি যা শিখবেন
- ESP বোর্ডে OpenThread CLI বাইনারি তৈরি ও ফ্ল্যাশ করা।
- ESP থ্রেড বর্ডার রাউটার বোর্ডে বর্ডার রাউটার তৈরি এবং ফ্ল্যাশ করা হচ্ছে।
- ESP মনিটর এবং OpenThread CLI ব্যবহার করে থ্রেড নোডগুলি ম্যানুয়ালি পরিচালনা করা।
- থ্রেড বর্ডার রাউটারে একটি থ্রেড নেটওয়ার্ক গঠন করা।
- থ্রেড নেটওয়ার্কে ডিভাইসগুলোর সংযোগ স্থাপন সুরক্ষিত করা।
- থ্রেড নোডগুলোর মধ্যে IPv6 অ্যাড্রেস পিং করা হচ্ছে।
- UDP ব্যবহার করে থ্রেড নোডগুলোর মধ্যে বার্তা আদান-প্রদান।
আপনার যা যা লাগবে
হার্ডওয়্যার:
সফটওয়্যার:
২. শুরু করা
- ESP-IDF ইনস্টলেশন।
সফটওয়্যার ডেভেলপমেন্ট এনভায়রনমেন্ট ইনস্টল করার জন্য অনুগ্রহ করে ESP-IDF প্রোগ্রামিং গাইড অনুসরণ করুন।
- ESP থ্রেড বর্ডার রাউটার SDK-টি ক্লোন করুন।
ESP-THREAD-BR হলো অফিসিয়াল ESP থ্রেড বর্ডার রাউটার SDK। এটি একটি থ্রেড বর্ডার রাউটার তৈরির জন্য সমস্ত মৌলিক নেটওয়ার্ক বৈশিষ্ট্য সমর্থন করে এবং দ্রুত পণ্যায়নের জন্য সমৃদ্ধ পণ্য-স্তরের বৈশিষ্ট্যসমূহ সমন্বিত করে।
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
৩. নির্মাণ ও ফ্ল্যাশ
IEEE 802.15.4 মডিউলযুক্ত ESP বোর্ডে ot-cli-ftd বাইনারি ফাইলটি বিল্ড এবং ফ্ল্যাশ করার জন্য, আরও বিস্তারিত তথ্যের জন্য আপনি ESP-IDF উদাহরণ ot_cli দেখতে পারেন:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
মেনুকনফিগ-এর মাধ্যমে জয়েনার ফিচারটি সক্রিয় করুন:
$ idf.py menuconfig
কম্পোনেন্ট কনফিগ > ওপেনথ্রেড > জয়নার সক্রিয় করুন, তারপর বিল্ড এবং ফ্ল্যাশ করুন।
$ idf.py -p <your-local-port> build flash monitor
ESP থ্রেড বর্ডার রাউটার বোর্ডে ot-br বাইনারি ফাইল বিল্ড এবং ফ্ল্যাশ করার জন্য, আপনাকে প্রথমে RCP বাইনারি ফাইলটি বিল্ড করতে হবে। এই RCP বাইনারি ফাইলটি ESP থ্রেড বর্ডার রাউটার বোর্ডের ডিভাইসে আলাদাভাবে ফ্ল্যাশ করার প্রয়োজন নেই। এটি বর্ডার রাউটার বাইনারি ফাইলের মধ্যে অন্তর্ভুক্ত থাকবে এবং প্রথম বুটের সময় (অথবা RCP ফার্মওয়্যার পরিবর্তিত হলে) ESP32-H2 চিপে ফ্ল্যাশ হয়ে যাবে। আরও বিস্তারিত তথ্যের জন্য আপনি ESP থ্রেড BR ডকুমেন্টেশন দেখতে পারেন।
$ cd <your-idf-path>/examples/openthread/ot_rcp $ idf.py set-target esp32h2 $ idf.py build $ cd <your-esp-thread-br-path>/examples/basic_thread_border_router $ idf.py set-target esp32s3
মেনুকনফিগ-এর মাধ্যমে কমিশনার ফিচারটি সক্রিয় করুন:
$ idf.py menuconfig
কম্পোনেন্ট কনফিগ > ওপেনথ্রেড > কমিশনার সক্রিয় করুন, তারপর বিল্ড এবং ফ্ল্যাশ করুন।
$ idf.py -p <your-local-port> build flash monitor
৪. থ্রেড বর্ডার রাউটারে একটি থ্রেড নেটওয়ার্ক গঠন করা
এখন আপনি ESP থ্রেড বর্ডার রাউটার বোর্ড (BR কমিশনার)-এ OpenThread কমান্ড লাইন ব্যবহার করে একটি থ্রেড নেটওয়ার্ক গঠন করতে পারেন:
## BR Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 21 Channel Mask: 0x07fff800 Ext PAN ID: 151975d11bea97b5 Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64 Network Key: 731ab6a60a64a0a0b14b259b86b2be01 Network Name: OpenThread-1444 PAN ID: 0x1444 PSKc: 54e7f18d2575014da94db09df29c5df0 Security Policy: 672 onrc 0 Done
এই ডেটাসেটটিকে সক্রিয় হিসেবে কমিট করুন:
> dataset commit active Done
IPv6 ইন্টারফেসটি চালু করুন:
> ifconfig up I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
থ্রেড প্রোটোকল অপারেশন শুরু করুন:
> thread start I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11 I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00 I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 I (69099) OPENTHREAD: Platform UDP bound to port 49154
কিছুক্ষণ পর ডিভাইসটির অবস্থা পরীক্ষা করুন। এটির অবস্থা লিডার হওয়া উচিত।
> state leader Done >
৫. নেটওয়ার্ক কী (networkkey) ব্যবহার করে থ্রেড নেটওয়ার্কে যোগদান করুন।
এই কোডল্যাবে, BR দ্বারা গঠিত নেটওয়ার্কে যোগদানের জন্য IEEE 802.15.4 মডিউলসহ দুটি ESP বোর্ড প্রস্তুত করা হয়েছে। এই সেশনে, আমরা বোর্ড১-কে নেটওয়ার্কে যুক্ত করব।
BR থেকে নেটওয়ার্ক-কী সংগ্রহ করুন:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
IEEE 802.15.4 মডিউলযুক্ত একটি ESP বোর্ডে (বোর্ড১ জয়নার) এই নেটওয়ার্ক-কীটি সেট করুন:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
এই ডেটাসেটটিকে সক্রিয় হিসেবে কমিট করুন:
> dataset commit active Done
IPv6 ইন্টারফেসটি চালু করুন:
> ifconfig up Done I (20308) OT_STATE: netif up
থ্রেড প্রোটোকল অপারেশন শুরু করুন:
> thread start I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01 I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child
কিছুক্ষণ পর ডিভাইসটির অবস্থা পরীক্ষা করুন। এটি চাইল্ড (Child) অবস্থায় থাকা উচিত।
> state child Done
ভূমিকাটি মেশ এক্সটেন্ডার-এ সেট করুন (যা CLI এবং লগ-এ router হিসাবে উল্লেখ করা হয়)।
> state router Done I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800 I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >

৬. সুরক্ষিত কমিশনিংয়ের মাধ্যমে থ্রেড নেটওয়ার্কে যোগদান করুন।
এই সেশনে, আমরা সিকিউরিটি কমিশনিং-এর মাধ্যমে বোর্ড২-কে নেটওয়ার্কে যুক্ত করব:
বিআর কমিশনারের কাছ থেকে পিএসকেসি এবং প্যানিড সংগ্রহ করুন:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Board2-তে নেটওয়ার্ক তথ্য কনফিগার করুন:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
এই ডেটাসেটটিকে সক্রিয় হিসেবে কমিট করুন:
## Board2 Joiner ## ---------------------- > dataset commit active Done
IPv6 ইন্টারফেসটি চালু করুন:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Board2 থেকে eui64 সংগ্রহ করুন:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
BR কমিশনার- এ, কমিশনারটি চালু করুন এবং যে ডিভাইসটি যোগদান করতে পারবে তার eui64 , জয়নার ক্রেডেনশিয়াল-সহ নির্দিষ্ট করুন, যেমন J01NME । জয়নার ক্রেডেনশিয়াল হলো একটি ডিভাইস-নির্দিষ্ট স্ট্রিং, যা পাঠযোগ্যতার জন্য I, O, Q এবং Z বাদে (0-9 এবং AY) সব বড় হাতের অ্যালফানিউমেরিক অক্ষর দিয়ে গঠিত এবং এর দৈর্ঘ্য ৬ থেকে ৩২ অক্ষরের মধ্যে হয়।
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
Board2 Joiner- এ সুইচ করুন। BR Commissioner-এ আপনি এইমাত্র যে Joiner Credential সেট আপ করেছেন, তা দিয়ে joiner রোলটি শুরু করুন:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
মিনিটখানেকের মধ্যেই আপনি সফল প্রমাণীকরণের একটি নিশ্চিতকরণ বার্তা পাবেন:
## Board2 Joiner ## ---------------------- > Join success
এরপরে, আপনি বিআর কমিশনার কর্তৃক গঠিত থ্রেড নেটওয়ার্কটি শুরু করতে এবং তাতে যোগদান করতে পারবেন।
থ্রেড প্রোটোকল অপারেশন শুরু করুন:
> thread start I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801 I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child
ভূমিকাটি মেশ এক্সটেন্ডার-এ সেট করুন (যা CLI এবং লগ-এ router হিসাবে উল্লেখ করা হয়)।
> state router Done I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400 I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
এখন আপনি নিচে দেখানো টপোলজি সহ একটি থ্রেড নেটওয়ার্ক পাবেন:

৭. থ্রেড নোডগুলির মধ্যে IPv6 ঠিকানা পিং করা
যেকোনো দুটি বোর্ডের মধ্যে যোগাযোগ করতে আপনি পিং কমান্ড ব্যবহার করতে পারেন। প্রতিটি বোর্ডের IPv6 অ্যাড্রেস প্রিন্ট করতে ipaddr কমান্ডটি ব্যবহার করুন:
## BR Commissioner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 # Mesh-Local EID (ML-EID) fe80:0:0:0:687c:7248:cc14:9c4d # Link-Local Address (LLA) Done >
## Board1 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:2800 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 # Mesh-Local EID (ML-EID) fe80:0:0:0:18ac:df04:4671:6a45 # Link-Local Address (LLA) Done
## Board2 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:4400 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc # Mesh-Local EID (ML-EID) fe80:0:0:0:a8cc:1483:f696:91a2 # Link-Local Address (LLA) Done
উদাহরণস্বরূপ, BR Commissioner থেকে Board2 MLE-ID পিং করতে, আপনি BR Commissioner-এ এই কমান্ডটি চালাতে পারেন:
## BR Commissioner ## ---------------------- > ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc 16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms. Done
৮. UDP ব্যবহার করে থ্রেড নোডগুলির মধ্যে বার্তা আদান-প্রদান
এই সেশনে, আপনি শিখবেন কিভাবে দুটি থ্রেড ডিভাইসের মধ্যে বার্তা পাঠাতে হয়। উদাহরণস্বরূপ, ইউডিপি (udp) খুলুন এবং এটিকে 20617 পোর্টে বাইন্ড করুন এবং বিআর (BR)-এর সমস্ত অ্যাড্রেসের জন্য লিসেন করুন:
## BR Commissioner ## ---------------------- > udp open Done > udp bind :: 20617 I (1298739) OPENTHREAD: Platform UDP bound to port 20617 Done
এরপর Board1 থেকে BR MLE-ID অ্যাড্রেস এবং পোর্ট 20617 এ একটি মেসেজ পাঠান:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
আপনি BR-এ প্রাপ্ত বার্তাটি দেখতে পারেন:
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
৯. অভিনন্দন!
আপনি ESP বোর্ড ব্যবহার করে একটি ফিজিক্যাল থ্রেড নেটওয়ার্ক তৈরি করেছেন!

আপনি এখন জানেন:
- ESP বোর্ডে OpenThread CLI বাইনারি তৈরি ও ফ্ল্যাশ করা।
- ESP থ্রেড বর্ডার রাউটার বোর্ডের জন্য একটি ফ্ল্যাশিং বর্ডার রাউটার তৈরি করা।
- ESP মনিটর এবং OpenThread CLI ব্যবহার করে থ্রেড নোডগুলি ম্যানুয়ালি পরিচালনা করা।
- থ্রেড বর্ডার রাউটারে একটি থ্রেড নেটওয়ার্ক গঠন করা।
- থ্রেড নেটওয়ার্কে ডিভাইসগুলোর সংযোগ স্থাপন সুরক্ষিত করা।
- থ্রেড নোডগুলোর মধ্যে IPv6 অ্যাড্রেস পিং করা হচ্ছে।
- UDP ব্যবহার করে থ্রেড নোডগুলোর মধ্যে বার্তা আদান-প্রদান।
আরও পড়ুন
বিভিন্ন ধরনের ওপেনথ্রেড রিসোর্সের জন্য openthread.io এবং GitHub দেখুন, যার মধ্যে রয়েছে:
- সমর্থিত প্ল্যাটফর্ম — ওপেনথ্রেড সমর্থন করে এমন সমস্ত প্ল্যাটফর্ম সম্পর্কে জানুন
- OpenThread তৈরি করুন — OpenThread তৈরি ও কনফিগার করার বিষয়ে আরও বিস্তারিত তথ্য
- থ্রেড প্রাইমার — এই কোডল্যাবে আলোচিত থ্রেডের সমস্ত ধারণা এখানে আলোচনা করা হয়েছে।
তথ্যসূত্র: