Google is committed to advancing racial equity for Black communities. See how.
This page was translated by the Cloud Translation API.
Switch to English

ওপেনথ্রেড API গুলি বিকাশ করছে

26b7f4f6b3ea0700.png

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

থ্রেড স্পেসিফিকেশনটি হোম অ্যাপ্লিকেশনগুলির জন্য একটি আইপিভি 6-ভিত্তিক নির্ভরযোগ্য, সুরক্ষিত এবং লো-পাওয়ার ওয়্যারলেস ডিভাইস-টু-ডিভাইস যোগাযোগ প্রোটোকলকে সংজ্ঞায়িত করে। ওপেনথ্রেড ম্যাক সিকিউরিটি, মেশ লিংক স্থাপনা, এবং মেশ রাউটিং সহ আইপিভি,, L লোওয়ান, আইইইই ৮০২.১৫.৪ সহ সমস্ত থ্রেড নেটওয়ার্কিং স্তর প্রয়োগ করে।

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

2a6db2e258c32237.png

আপনি কি শিখবেন

  • নর্ডিক এনআরএফ 52840 ডেভ বোর্ডগুলিতে কীভাবে বোতাম এবং এলইডি প্রোগ্রাম করবেন
  • সাধারণ ওপেনথ্রেড এপিআই এবং otInstance ক্লাস কীভাবে ব্যবহার করবেন
  • ওপেনথ্রেড স্থিতি পরিবর্তনের উপর কীভাবে নজরদারি করা যায় এবং কীভাবে প্রতিক্রিয়া জানানো হয়
  • কোনও থ্রেড নেটওয়ার্কের সমস্ত ডিভাইসে কীভাবে ইউডিপি বার্তা প্রেরণ করা যায়
  • মেকফিলগুলি কীভাবে পরিবর্তন করবেন

আপনার যা দরকার

হার্ডওয়্যার:

  • 3 নর্ডিক অর্ধপরিবাহী nRF52840 দেব বোর্ড dev
  • বোর্ডগুলি সংযোগের জন্য 3 ইউএসবি থেকে মাইক্রো-ইউএসবি কেবলগুলি
  • কমপক্ষে 3 টি ইউএসবি পোর্ট সহ একটি লিনাক্স মেশিন

সফটওয়্যার:

  • জিএনইউ টুলচেন
  • Nordic nRF5x কমান্ড লাইন সরঞ্জাম
  • সেগার জে-লিংক সফ্টওয়্যার
  • ওপেনথ্রেড
  • গিট

ছাড়া অন্যথায় সুপরিচিত, এই Codelab বিষয়বস্তুর আওতায় লাইসেন্সকৃত ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন 3.0 লাইসেন্সের এবং কোড নমুনার অধীনে লাইসেন্স করা হয় Apache 2.0 লাইন্সের লাইসেন্স

হার্ডওয়্যার কোডল্যাব সম্পূর্ণ করুন

এই কোডল্যাবটি শুরু করার আগে, আপনার nRF52840 বোর্ড এবং ওপেনথ্রেড কোডল্যাব সহ একটি থ্রেড নেটওয়ার্ক তৈরি করা উচিত যা:

  • বিল্ডিং এবং ফ্ল্যাশিংয়ের জন্য আপনার প্রয়োজনীয় সমস্ত সফ্টওয়্যার সম্পর্কিত বিশদ
  • কীভাবে ওপেনথ্রেড তৈরি করতে এবং নর্ডিক এনআরএফ 52840 বোর্ডগুলিতে এটি ফ্ল্যাশ করতে শেখায়
  • একটি থ্রেড নেটওয়ার্কের বেসিকগুলি প্রদর্শন করে

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

বিল্ড এ থ্রেড নেটওয়ার্ক কোডল্যাব সম্পূর্ণ করুন

লিনাক্স মেশিন

এই কোডল্যাবটি সমস্ত থ্রেড ডেভলপমেন্ট বোর্ড ফ্ল্যাশ করতে i386- বা x86- ভিত্তিক লিনাক্স মেশিন ব্যবহার করার জন্য ডিজাইন করা হয়েছিল। সমস্ত পদক্ষেপগুলি উবুন্টু 14.04.5 এলটিএসে (ট্রাস্টি তাহর) পরীক্ষিত হয়েছিল।

নর্ডিক অর্ধপরিবাহী nRF52840 বোর্ড

এই কোডল্যাব তিনটি এনআরএফ 52840 পিডিকে বোর্ড ব্যবহার করে।

a6693da3ce213856.png

সফটওয়্যার ইনস্টল

ওপেনথ্রেড তৈরি এবং ফ্ল্যাশ করতে আপনার SEGGER জে-লিংক, এনআরএফ 5 এক্স কমান্ড লাইন সরঞ্জাম, এআরএম জিএনইউ টুলচেন এবং বিভিন্ন লিনাক্স প্যাকেজ ইনস্টল করতে হবে। আপনি যদি প্রয়োজন অনুসারে বিল্ড একটি থ্রেড নেটওয়ার্ক কোডল্যাবটি সম্পন্ন করে থাকেন তবে আপনার ইনস্টল করা প্রয়োজন এমন সমস্ত কিছু আপনার কাছে ইতিমধ্যে থাকবে। যদি তা না হয় তবে আপনি এনআরএফ 52840 দেব বোর্ডে ওপেনথ্রেড তৈরি করতে এবং ফ্ল্যাশ করতে পারবেন তা নিশ্চিত করার আগে এই কোডল্যাবটি সম্পূর্ণ করুন।

বিল্ড এ থ্রেড নেটওয়ার্ক কোডল্যাব সম্পূর্ণ করুন

ওপেনথ্রেড উদাহরণস্বরূপ অ্যাপ্লিকেশন কোড সহ আসে যা আপনি এই কোডল্যাবের জন্য একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করতে পারেন।

ওপেনথ্রেড ক্লোন করুন এবং ইনস্টল করুন:

$ cd ~
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./bootstrap

ওপেনথ্রেডের পাবলিক এপিআইগুলি ওপেনথ্রেড সংগ্রহস্থলে include/openthread অবস্থিত। এই এপিআইগুলি আপনার অ্যাপ্লিকেশনগুলিতে ব্যবহারের জন্য একটি থ্রেড- এবং প্ল্যাটফর্ম-স্তরের উভয় ক্ষেত্রে বিভিন্ন ওপেন ট্র্যাড বৈশিষ্ট্য এবং কার্যকারিতা অ্যাক্সেস সরবরাহ করে:

  • ওপেনথ্রেড উদাহরণ তথ্য এবং নিয়ন্ত্রণ
  • অ্যাপ্লিকেশন পরিষেবা যেমন আইপিভি 6, ইউডিপি এবং কোপ
  • কমিশনার এবং যোগদানকারীর ভূমিকা সহ নেটওয়ার্ক শংসাপত্র পরিচালনা
  • বর্ডার রাউটার পরিচালনা
  • শিশু তদারকি এবং জাম সনাক্তকরণের মতো বর্ধিত বৈশিষ্ট্য

সমস্ত ওপেনথ্রেড এপিআইয়ের রেফারেন্স তথ্য ওপেনথ্রেড.আইও / রেফারেন্সে উপলভ্য

একটি এপিআই ব্যবহার করে

একটি এপিআই ব্যবহার করতে, আপনার অ্যাপ্লিকেশন ফাইলের একটিতে এর শিরোনাম ফাইলটি অন্তর্ভুক্ত করুন। তারপরে কাঙ্ক্ষিত ফাংশনটি কল করুন।

উদাহরণস্বরূপ, ওপেনথ্রেডের সাথে অন্তর্ভুক্ত সিএলআই উদাহরণ অ্যাপ্লিকেশনটি নিম্নলিখিত এপিআই শিরোনামগুলি ব্যবহার করে:

উদাহরণস্বরূপ / অ্যাপ্লিকেশন / ক্লিপ / মেন

#include <openthread/config.h>
#include <openthread/cli.h>
#include <openthread/diag.h>
#include <openthread/tasklet.h>
#include <openthread/platform/logging.h>

ওপেনথ্রেড দৃষ্টান্ত

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

উদাহরণস্বরূপ, ওপেনথ্রেড উদাহরণটি সিএলআই উদাহরণ অ্যাপের main() ফাংশনটিতে আরম্ভ করা হয়েছে:

উদাহরণস্বরূপ / অ্যাপ্লিকেশন / ক্লিপ / মেন

int main(int argc, char *argv[])
{
    otInstance *instance

...

#if OPENTHREAD_ENABLE_MULTIPLE_INSTANCES
    // Call to query the buffer size
    (void)otInstanceInit(NULL, &otInstanceBufferLength);

    // Call to allocate the buffer
    otInstanceBuffer = (uint8_t *)malloc(otInstanceBufferLength);
    assert(otInstanceBuffer);

    // Initialize OpenThread with the buffer
    instance = otInstanceInit(otInstanceBuffer, &otInstanceBufferLength);
#else
    instance = otInstanceInitSingle();
#endif

...

    return 0;
}

প্ল্যাটফর্ম-নির্দিষ্ট ফাংশন

আপনি যদি ওপেনথ্রেডের সাথে অন্তর্ভুক্ত উদাহরণ অ্যাপ্লিকেশনগুলির একটিতে প্ল্যাটফর্ম-নির্দিষ্ট ফাংশন যুক্ত করতে চান তবে প্রথমে সমস্ত ফাংশনগুলির জন্য otSys ব্যবহার করে examples/platforms/openthread-system.h । তারপরে এগুলি প্ল্যাটফর্ম-নির্দিষ্ট উত্স ফাইলে প্রয়োগ করুন। এইভাবে বিমূর্ত করা, আপনি অন্যান্য উদাহরণ প্ল্যাটফর্মগুলির জন্য একই ফাংশন শিরোনাম ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, আমরা যে জিপিআইও ফাংশনগুলি ব্যবহার করতে যাচ্ছি সেগুলি এনআরএফ 52840 বোতামগুলিতে এবং এলইডিগুলি অবশ্যই openthread-system.h ঘোষণা করতে হবে openthread-system.h

আপনার পছন্দের পাঠ্য সম্পাদকটিতে examples/platforms/openthread-system.h ফাইলটি খুলুন।

উদাহরণ / প্ল্যাটফর্ম / ওপেনথ্রেড-সিস্টেম

ক্রিয়া: প্ল্যাটফর্ম-নির্দিষ্ট GPIO ফাংশন ঘোষণা যুক্ত করুন

এই ফাংশন ঘোষণা ফাইলের মধ্যে যে কোনও জায়গায় যুক্ত করুন:

/**
 * Init LED module.
 *
 */
void otSysLedInit(void);
void otSysLedSet(uint8_t aLed, bool aOn);
void otSysLedToggle(uint8_t aLed);

/**
* A callback will be called when GPIO interrupts occur.
*
*/
typedef void (*otSysButtonCallback)(otInstance *aInstance);
void otSysButtonInit(otSysButtonCallback aCallback);
void otSysButtonProcess(otInstance *aInstance);

আমরা এটি পরবর্তী পদক্ষেপে প্রয়োগ করব।

মনে রাখবেন যে otSysButtonProcess ফাংশন ঘোষণায় একটি otInstance ব্যবহার করে। প্রয়োজনে যদি কোনও বোতাম টিপে দেওয়া হয় তখন অ্যাপ্লিকেশনটি ওপেনথ্রেড উদাহরণ সম্পর্কে তথ্য অ্যাক্সেস করতে পারে। এটি সব আপনার আবেদনের প্রয়োজনের উপর নির্ভর করে। আপনার যদি ফাংশনটি প্রয়োগের ক্ষেত্রে এটির প্রয়োজন না হয় তবে আপনি কিছু OT_UNUSED_VARIABLE জন্য অব্যবহৃত ভেরিয়েবলের চারপাশে বিল্ড ত্রুটিগুলি দমন করতে ওপেনথ্রেড এপিআই থেকে OT_UNUSED_VARIABLE ম্যাক্রো ব্যবহার করতে পারেন। আমরা এর উদাহরণগুলি পরে দেখব।

পূর্ববর্তী পদক্ষেপে, আমরা examples/platforms/openthread-system.h জন্য ব্যবহার করা যেতে পারে এমন examples/platforms/openthread-system.h এ প্ল্যাটফর্ম-নির্দিষ্ট ফাংশন ঘোষণার উপর examples/platforms/openthread-system.h । NRF52840 ডেভ বোর্ডগুলিতে বোতাম এবং এলইডি অ্যাক্সেস করার জন্য, আপনাকে nRF52840 প্ল্যাটফর্মের জন্য সেই ফাংশনগুলি প্রয়োগ করতে হবে। এই কোডটিতে, আপনি এমন ফাংশন যুক্ত করবেন যা:

  • জিপিআইও পিন এবং মোডগুলি শুরু করুন
  • একটি পিনে ভোল্টেজ নিয়ন্ত্রণ করুন
  • GPIO বিঘ্ন সক্ষম করুন এবং একটি কলব্যাক নিবন্ধন করুন

examples/platforms/nrf528xx/src ডিরেক্টরিতে, gpio.c নামে একটি ফাইল তৈরি করুন। এই নতুন ফাইলে, নিম্নলিখিত সামগ্রী যুক্ত করুন।

উদাহরণ / প্ল্যাটফর্ম / এনআরএফ 528xx / এসআরসি / জিপিও.সি (নতুন ফাইল)

ক্রিয়া: সংজ্ঞা যুক্ত করুন

এই সংজ্ঞায়িতগুলি nRF52840-নির্দিষ্ট মান এবং ওপেনথ্রেড অ্যাপ্লিকেশন স্তরে ব্যবহৃত ভেরিয়েবলগুলির মধ্যে বিমূর্ততা হিসাবে কাজ করে।

/**
 * @file
 *   This file implements the system abstraction for GPIO and GPIOTE.
 *
 */

#define BUTTON_GPIO_PORT 0x50000300UL
#define BUTTON_PIN 11 // button #1

#define GPIO_LOGIC_HI 0
#define GPIO_LOGIC_LOW 1

#define LED_GPIO_PORT 0x50000300UL
#define LED_1_PIN 13 // turn on to indicate leader role
#define LED_2_PIN 14 // turn on to indicate router role
#define LED_3_PIN 15 // turn on to indicate child role
#define LED_4_PIN 16 // turn on to indicate UDP receive

এনআরএফ 52840 বোতাম এবং এলইডি সম্পর্কিত আরও তথ্যের জন্য, নর্ডিক সেমিকন্ডাক্টর ইনফেন্সেন্টারটি দেখুন

ক্রিয়া: শিরোনাম যুক্ত অন্তর্ভুক্ত

এরপরে, শিরোনাম যুক্ত করুন এতে আপনার জিপিআইও কার্যকারিতা প্রয়োজন।

/* Header for the functions defined here */
#include "openthread-system.h"

#include <string.h>

/* Header to access an OpenThread instance */
#include <openthread/instance.h>

/* Headers for lower-level nRF52840 functions */
#include "platform-nrf5.h"
#include "hal/nrf_gpio.h"
#include "hal/nrf_gpiote.h"
#include "nrfx/drivers/include/nrfx_gpiote.h"

ক্রিয়া: কলব্যাক যোগ করুন এবং বোতাম 1 এর জন্য বাধা ফাংশন

এই কোডটি পরবর্তী যুক্ত করুন। in_pin1_handler ফাংশনটি কলব্যাক যা নিবন্ধিত হয় যখন বোতাম in_pin1_handler কার্যকারিতা শুরু হয় (পরে এই ফাইলটিতে)।

নোট কিভাবে এই কলব্যাক ব্যবহার OT_UNUSED_VARIABLE ম্যাক্রো, যেমন ভেরিয়েবল পাস in_pin1_handler আসলে ফাংশনে ব্যবহার করা হয় না।

/* Declaring callback function for button 1. */
static otSysButtonCallback sButtonHandler;
static bool                sButtonPressed;

/**
 * @brief Function to receive interrupt and call back function
 * set by the application for button 1.
 *
 */
static void in_pin1_handler(uint32_t pin, nrf_gpiote_polarity_t action)
{
    OT_UNUSED_VARIABLE(pin);
    OT_UNUSED_VARIABLE(action);
    sButtonPressed = true;
}

ক্রিয়া: এলইডি কনফিগার করতে একটি ফাংশন যুক্ত করুন

আরম্ভের সময় সমস্ত এলইডিগুলির মোড এবং স্থিতি কনফিগার করতে এই কোডটি যুক্ত করুন।

/**
 * @brief Function for configuring: PIN_IN pin for input, PIN_OUT pin for output,
 * and configures GPIOTE to give an interrupt on pin change.
 */

void otSysLedInit(void)
{
    /* Configure GPIO mode: output */
    nrf_gpio_cfg_output(LED_1_PIN);
    nrf_gpio_cfg_output(LED_2_PIN);
    nrf_gpio_cfg_output(LED_3_PIN);
    nrf_gpio_cfg_output(LED_4_PIN);

    /* Clear all output first */
    nrf_gpio_pin_write(LED_1_PIN, GPIO_LOGIC_LOW);
    nrf_gpio_pin_write(LED_2_PIN, GPIO_LOGIC_LOW);
    nrf_gpio_pin_write(LED_3_PIN, GPIO_LOGIC_LOW);
    nrf_gpio_pin_write(LED_4_PIN, GPIO_LOGIC_LOW);

    /* Initialize gpiote for button(s) input.
     Button event handlers are set in the application (main.c) */
    ret_code_t err_code;
    err_code = nrfx_gpiote_init();
    APP_ERROR_CHECK(err_code);
}

ক্রিয়া: একটি নেতৃত্বের মোড সেট করতে একটি ফাংশন যুক্ত করুন।

ডিভাইসের ভূমিকা পরিবর্তন হলে এই ফাংশনটি ব্যবহৃত হবে।

/**
 * @brief Function to set the mode of an LED.
 */

void otSysLedSet(uint8_t aLed, bool aOn)
{
    switch (aLed)
    {
    case 1:
        nrf_gpio_pin_write(LED_1_PIN, (aOn == GPIO_LOGIC_HI));
        break;
    case 2:
        nrf_gpio_pin_write(LED_2_PIN, (aOn == GPIO_LOGIC_HI));
        break;
    case 3:
        nrf_gpio_pin_write(LED_3_PIN, (aOn == GPIO_LOGIC_HI));
        break;
    case 4:
        nrf_gpio_pin_write(LED_4_PIN, (aOn == GPIO_LOGIC_HI));
        break;
    }
}

ক্রিয়া: একটি LED এর মোড টগল করতে একটি ফাংশন যুক্ত করুন।

ডিভাইসটি মাল্টিকাস্ট ইউডিপি বার্তা পেলে এই ফাংশনটি এলইডি 4 টগল করতে ব্যবহৃত হবে।

/**
 * @brief Function to toggle the mode of an LED.
 */
void otSysLedToggle(uint8_t aLed)
{
    switch (aLed)
    {
    case 1:
        nrf_gpio_pin_toggle(LED_1_PIN);
        break;
    case 2:
        nrf_gpio_pin_toggle(LED_2_PIN);
        break;
    case 3:
        nrf_gpio_pin_toggle(LED_3_PIN);
        break;
    case 4:
        nrf_gpio_pin_toggle(LED_4_PIN);
        break;
    }
}

ক্রিয়া: বোতাম টিপতে প্রারম্ভিককরণ এবং প্রক্রিয়া করার জন্য ফাংশন যুক্ত করুন।

প্রথম ফাংশনটি বোতাম টিপে বোর্ডটির সূচনা করে এবং দ্বিতীয় বোতামটি টিপলে দ্বিতীয়টি মাল্টিকাস্ট ইউডিপি বার্তা প্রেরণ করে।

/**
 * @brief Function to toggle the mode of an LED.
 */
void otSysButtonInit(otSysButtonCallback aCallback)
{
    nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true);
    in_config.pull                    = NRF_GPIO_PIN_PULLUP;

    ret_code_t err_code;
    err_code = nrfx_gpiote_in_init(BUTTON_PIN, &in_config, in_pin1_handler);
    APP_ERROR_CHECK(err_code);

    sButtonHandler = aCallback;
    sButtonPressed = false;

    nrfx_gpiote_in_event_enable(BUTTON_PIN, true);
}

void otSysButtonProcess(otInstance *aInstance)
{
    if (sButtonPressed)
    {
        sButtonPressed = false;
        sButtonHandler(aInstance);
    }
}

gpio.c : gpio.c ফাইলটি সংরক্ষণ এবং বন্ধ করুন।

আমাদের অ্যাপ্লিকেশনটিতে আমরা ডিভাইসের ভূমিকার উপর নির্ভর করে বিভিন্ন এলইডি আলোকিত করতে চাই। আসুন নীচের ভূমিকাগুলি ট্র্যাক করুন: লিডার, রাউটার, শেষ ডিভাইস। আমরা তাদের যেমন LEDs এ নিয়োগ করতে পারি:

  • নেতৃত্বে 1 = নেতা
  • LED2 = রাউটার
  • LED3 = শেষ ডিভাইস

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

আপনার পছন্দসই পাঠ্য সম্পাদকটিতে examples/apps/cli/main.c ফাইলটি খুলুন।

উদাহরণস্বরূপ / অ্যাপ্লিকেশন / ক্লিপ / মেন

ক্রিয়া: শিরোনাম যুক্ত অন্তর্ভুক্ত

main.c ফাইলের অন্তর্ভুক্ত বিভাগে, ভূমিকা পরিবর্তন বৈশিষ্ট্যটির জন্য আপনার প্রয়োজনীয় এপিআই শিরোনাম ফাইলগুলি যুক্ত করুন।

#include <openthread/instance.h>
#include <openthread/thread.h>
#include <openthread/thread_ftd.h>

ক্রিয়া: ওপেনথ্রেড দৃষ্টান্তের রাজ্যের পরিবর্তনের জন্য হ্যান্ডলার ফাংশন ঘোষণা যুক্ত করুন

এই ঘোষণা যোগ main.c পর হেডার অন্তর্ভুক্ত এবং কোন পূর্বে #IF বিবৃতি। এই ফাংশনটি মূল প্রয়োগের পরে সংজ্ঞায়িত করা হবে।

void handleNetifStateChanged(uint32_t aFlags, void *aContext);

ক্রিয়া: রাষ্ট্র পরিবর্তন হ্যান্ডলার ফাংশনের জন্য একটি কলব্যাক নিবন্ধ যুক্ত করুন

main.c , এই ফাংশনটি main() ফাংশনে যুক্ত করুন otCliUartInit কল করার পরে। এই কলব্যাক রেজিস্ট্রেশন ওপেনথ্রেডকে হ্যান্ডেলনিফটিস্টেট চেঞ্জ ফাংশনটিতে কল করতে handleNetifStateChange যখনই ওপেনথ্রেড দৃষ্টান্তের স্থিতি পরিবর্তন হয়।

/* Register Thread state change handler */
otSetStateChangedCallback(instance, handleNetifStateChanged, instance);

ক্রিয়া: রাষ্ট্র পরিবর্তন বাস্তবায়ন যুক্ত করুন

ইন main.c পর main() ফাংশন, বাস্তবায়ন handleNetifStateChanged ফাংশন। এই ফাংশনটি ওপেনথ্রেড দৃষ্টান্তের OT_CHANGED_THREAD_ROLE পতাকাটি পরীক্ষা করে এবং যদি এটি পরিবর্তিত হয়, প্রয়োজন অনুযায়ী এলইডিগুলি চালু / বন্ধ করে দেয়।

void handleNetifStateChanged(uint32_t aFlags, void *aContext)
{
   if ((aFlags & OT_CHANGED_THREAD_ROLE) != 0)
   {
       otDeviceRole changedRole = otThreadGetDeviceRole(aContext);

       switch (changedRole)
       {
       case OT_DEVICE_ROLE_LEADER:
           otSysLedSet(1, true);
           otSysLedSet(2, false);
           otSysLedSet(3, false);
           break;

       case OT_DEVICE_ROLE_ROUTER:
           otSysLedSet(1, false);
           otSysLedSet(2, true);
           otSysLedSet(3, false);
           break;

       case OT_DEVICE_ROLE_CHILD:
           otSysLedSet(1, false);
           otSysLedSet(2, false);
           otSysLedSet(3, true);
           break;

       case OT_DEVICE_ROLE_DETACHED:
       case OT_DEVICE_ROLE_DISABLED:
           /* Clear LED4 if Thread is not enabled. */
           otSysLedSet(4, false);
           break;
        }
    }
}

আমাদের অ্যাপ্লিকেশনটিতে, বাটন 1 যখন একটি বোর্ডে টিপানো হয় তখন আমরা নেটওয়ার্কের অন্যান্য সমস্ত ডিভাইসে ইউডিপি বার্তা প্রেরণ করতে চাই। বার্তাটি প্রাপ্তির বিষয়টি নিশ্চিত করতে, আমরা প্রতিক্রিয়াতে অন্য বোর্ডগুলিতে LED4 টগল করব।

এই কার্যকারিতা সক্ষম করতে, অ্যাপ্লিকেশনটির প্রয়োজন:

  • শুরু হওয়ার পরে একটি ইউডিপি সংযোগ শুরু করুন
  • জাল-স্থানীয় মাল্টিকাস্ট ঠিকানায় একটি ইউডিপি বার্তা প্রেরণে সক্ষম হোন
  • আগত ইউডিপি বার্তা হ্যান্ডেল করুন
  • আগত ইউডিপি বার্তার প্রতিক্রিয়াতে LED4 টগল করুন

আপনার পছন্দসই পাঠ্য সম্পাদকটিতে examples/apps/cli/main.c ফাইলটি খুলুন।

উদাহরণস্বরূপ / অ্যাপ্লিকেশন / ক্লিপ / মেন

ক্রিয়া: শিরোনাম যুক্ত অন্তর্ভুক্ত

main.c ফাইলের শীর্ষে অন্তর্ভুক্ত বিভাগে, মাল্টিকাস্ট ইউডিপি বৈশিষ্ট্যটির জন্য আপনার প্রয়োজনীয় এপিআই হেডার ফাইলগুলি যুক্ত করুন।

#include <string.h>

#include <openthread/message.h>
#include <openthread/udp.h>

#include "utils/code_utils.h"

code_utils.h otEXPECT এবং otEXPECT_ACTION ম্যাক্রোগুলির জন্য ব্যবহৃত হয় যা রান-টাইম শর্তাদি বৈধ করে এবং otEXPECT_ACTION ত্রুটিগুলি পরিচালনা করে।

ক্রিয়া: সংজ্ঞা এবং স্থিরতা যুক্ত করুন:

ইন main.c ফাইল, অধ্যায় অন্তর্ভুক্ত এবং পরে কোনো সামনে #IF বিবৃতি, যোগ ফলে UDP-নির্দিষ্ট ধ্রুবক এবং করবেঃ

#define UDP_PORT 1212

static const char UDP_DEST_ADDR[] = "ff03::1";
static const char UDP_PAYLOAD[]   = "Hello OpenThread World!";

ff03::1 হ'ল জাল-স্থানীয় মাল্টিকাস্ট ঠিকানা। এই ঠিকানায় প্রেরিত কোনও বার্তা নেটওয়ার্কের সমস্ত সম্পূর্ণ থ্রেড ডিভাইসে প্রেরণ করা হবে। ওপেনথ্রেডে মাল্টিকাস্ট সমর্থন সম্পর্কে আরও তথ্যের জন্য ওপেনথ্রেড.ওটিতে মাল্টিকাস্ট দেখুন।

ক্রিয়া: ফাংশন ঘোষণা যুক্ত করুন

ইন main.c ফাইল, পরে otTaskletsSignalPending সংজ্ঞা আগে main() ফাংশন, এর ফলে UDP-নির্দিষ্ট ফাংশন, সেইসাথে একটি স্ট্যাটিক পরিবর্তনশীল একটি UDP সকেট প্রতিনিধিত্ব করতে যোগ করুন:

static void initUdp(otInstance *aInstance);
static void sendUdp(otInstance *aInstance);

static void handleButtonInterrupt(otInstance *aInstance);

void handleUdpReceive(void *aContext, otMessage *aMessage, 
                      const otMessageInfo *aMessageInfo);

static otUdpSocket sUdpSocket;

ক্রিয়া: জিপিআইও এলইডি এবং বোতামটি আরম্ভ করার জন্য কলগুলি যুক্ত করুন

ইন main.c , এর এই ফাংশান কল যোগ main() পরে ফাংশন otSetStateChangedCallback কল। এই ফাংশনগুলি GPIO এবং GPIOTE পিনগুলি আরম্ভ করে এবং বোতাম পুশ ইভেন্টগুলি পরিচালনা করতে একটি বোতাম হ্যান্ডলার সেট করে।

/* init GPIO LEDs and button */
otSysLedInit();
otSysButtonInit(handleButtonInterrupt);

ক্রিয়া: ইউডিপি সূচনা কল যুক্ত করুন

ইন main.c , এর এই ফাংশন যোগ main() পরে ফাংশন otSysButtonInit কল আপনি শুধু যোগ করেছেন:

initUdp(instance);

এই কলটি নিশ্চিত করে যে কোনও ইউডিপি সকেট অ্যাপ্লিকেশন শুরু হওয়ার পরে শুরু করা হবে। এটি ছাড়া ডিভাইসটি ইউডিপি বার্তা প্রেরণ বা গ্রহণ করতে পারে না।

ক্রিয়া: GPIO বোতাম ইভেন্টটি প্রক্রিয়া করতে কল যুক্ত করুন

ইন main.c , এর এই ফাংশন কল যোগ main() ফাংশন পর otSysProcessDrivers , কল while লুপ। gpio.c ঘোষিত এই ফাংশনটি বোতামটি gpio.c কিনা তা পরীক্ষা করে এবং যদি তা হয় তবে হ্যান্ডলারের (হ্যান্ডেলবটন handleButtonInterrupt ) কল করে যা উপরের পদক্ষেপে সেট করা হয়েছিল।

otSysButtonProcess(instance);

ক্রিয়া: বাটন ইন্টারপট হ্যান্ডলার প্রয়োগ করুন

ইন main.c , বাস্তবায়ন যোগ handleButtonInterrupt পর ফাংশন handleNetifStateChanged ফাংশন আগের পদক্ষেপে আপনার আরো বলেন:

/**
 * Function to handle button push event
 */
void handleButtonInterrupt(otInstance *aInstance)
{
    sendUdp(aInstance);
}

ক্রিয়া: ইউডিপি সূচনা প্রয়োগ করুন

ইন main.c , বাস্তবায়ন যোগ initUdp পর ফাংশন handleButtonInterrupt ফাংশন আপনি শুধু যোগ করেছেন:

/**
 * Initialize UDP socket
 */
void initUdp(otInstance *aInstance)
{
    otSockAddr  listenSockAddr;

    memset(&sUdpSocket, 0, sizeof(sUdpSocket));
    memset(&listenSockAddr, 0, sizeof(listenSockAddr));

    listenSockAddr.mPort    = UDP_PORT;

    otUdpOpen(aInstance, &sUdpSocket, handleUdpReceive, aInstance);
    otUdpBind(&sUdpSocket, &listenSockAddr);
}

UDP_PORT হ'ল পোর্টটি যা আপনি পূর্বে সংজ্ঞায়িত করেছেন (1212) এবং OT_NETIF_INTERFACE_ID_THREAD হ'ল থ্রেড নেটওয়ার্ক ইন্টারফেস আইডি। otUdpOpen ফাংশন সকেট এবং রেজিস্টার একটি কলব্যাক ফাংশন (প্রর্দশিত handleUdpReceive যখন একটি UDP বার্তা গৃহীত হয় জন্য)।

ক্রিয়া: ইউডিপি মেসেজিং প্রয়োগ করুন

ইন main.c , বাস্তবায়ন যোগ sendUdp পর ফাংশন initUdp ফাংশন আপনি শুধু যোগ করেছেন:

/**
 * Send a UDP datagram
 */
void sendUdp(otInstance *aInstance)
{
    otError       error = OT_ERROR_NONE;
    otMessage *   message;
    otMessageInfo messageInfo;
    otIp6Address  destinationAddr;

    memset(&messageInfo, 0, sizeof(messageInfo));

    otIp6AddressFromString(UDP_DEST_ADDR, &destinationAddr);
    messageInfo.mPeerAddr    = destinationAddr;
    messageInfo.mPeerPort    = UDP_PORT;

    message = otUdpNewMessage(aInstance, NULL);
    otEXPECT_ACTION(message != NULL, error = OT_ERROR_NO_BUFS);

    error = otMessageAppend(message, UDP_PAYLOAD, sizeof(UDP_PAYLOAD));
    otEXPECT(error == OT_ERROR_NONE);

    error = otUdpSend(&sUdpSocket, message, &messageInfo);

 exit:
    if (error != OT_ERROR_NONE && message != NULL)
    {
        otMessageFree(message);
    }
}

otEXPECT এবং otEXPECT_ACTION ম্যাক্রোগুলি নোট করুন। এগুলি নিশ্চিত করে যে ইউডিপি বার্তাটি বৈধ এবং বাফারে সঠিকভাবে বরাদ্দ করা হয়েছে, এবং যদি না হয় তবে ফাংশনটি নিখরচায় exit ব্লকে জাম্পিং করে ত্রুটিগুলি পরিচালনা করে, যেখানে এটি বাফারকে মুক্ত করে।

ইউডিপি আরম্ভ করার জন্য ব্যবহৃত ফাংশন সম্পর্কে আরও তথ্যের জন্য ওপেনথ্রেড.আইপিতে আইপিভি 6 এবং ইউডিপি রেফারেন্সগুলি দেখুন।

ক্রিয়া: ইউডিপি বার্তা হ্যান্ডলিং প্রয়োগ করুন

ইন main.c , বাস্তবায়ন যোগ handleUdpReceive পর ফাংশন sendUdp ফাংশন আপনি শুধু এখনো যোগ করেনি। এই ফাংশনটি কেবল এলইডি 4 টগল করে।

/**
 * Function to handle UDP datagrams received on the listening socket
 */
void handleUdpReceive(void *aContext, otMessage *aMessage,
                      const otMessageInfo *aMessageInfo)
{
    OT_UNUSED_VARIABLE(aContext);
    OT_UNUSED_VARIABLE(aMessage);
    OT_UNUSED_VARIABLE(aMessageInfo);

    otSysLedToggle(4);
}

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

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

আবার আপনার পছন্দের পাঠ্য সম্পাদকটিতে examples/apps/cli/main.c ফাইলটি খুলুন।

উদাহরণস্বরূপ / অ্যাপ্লিকেশন / ক্লিপ / মেন

ক্রিয়া: শিরোনাম যুক্ত অন্তর্ভুক্ত

main.c ফাইলের শীর্ষে অন্তর্ভুক্ত বিভাগের মধ্যে, API টি শিরোনাম ফাইলটি যুক্ত করুন যা আপনার থ্রেড নেটওয়ার্কটি কনফিগার করতে হবে:

#include <openthread/dataset_ftd.h>

ক্রিয়া: নেটওয়ার্ক কনফিগারেশন সেট করার জন্য ফাংশন ঘোষণা যুক্ত করুন

এই ঘোষণা যোগ main.c পর হেডার অন্তর্ভুক্ত এবং কোন পূর্বে #IF বিবৃতি। এই ফাংশনটি মূল অ্যাপ্লিকেশন ফাংশনের পরে সংজ্ঞায়িত করা হবে।

static void setNetworkConfiguration(otInstance *aInstance);

ক্রিয়া: নেটওয়ার্ক কনফিগারেশন কল যুক্ত করুন

ইন main.c , এর এই ফাংশন কল যোগ main() পরে ফাংশন otSetStateChangedCallback কল। এই ফাংশন থ্রেড নেটওয়ার্ক ডেটাসেট কনফিগার করে।

/* Override default network credentials */
setNetworkConfiguration(instance);

ক্রিয়া: থ্রেড নেটওয়ার্ক ইন্টারফেস এবং স্ট্যাক সক্ষম করার জন্য কলগুলি যুক্ত করুন

main.c , এই ফাংশন কলগুলিকে otSysButtonInit কল করার পরে main() ফাংশনে otSysButtonInit করুন। এই ফাংশন থ্রেড নেটওয়ার্ক ডেটাসেট কনফিগার করে।

/* Start the Thread network interface (CLI cmd > ifconfig up) */
otIp6SetEnabled(instance, true);

/* Start the Thread stack (CLI cmd > thread start) */
otThreadSetEnabled(instance, true);

ক্রিয়া: থ্রেড নেটওয়ার্ক কনফিগারেশন প্রয়োগ করুন

ইন main.c , বাস্তবায়ন যোগ setNetworkConfiguration পর ফাংশন main() ফাংশন:

/**
 * Override default network settings, such as panid, so the devices can join a
 network
 */
void setNetworkConfiguration(otInstance *aInstance)
{
    static char          aNetworkName[] = "OTCodelab";
    otOperationalDataset aDataset;

    memset(&aDataset, 0, sizeof(otOperationalDataset));

    /*
     * Fields that can be configured in otOperationDataset to override defaults:
     *     Network Name, Mesh Local Prefix, Extended PAN ID, PAN ID, Delay Timer,
     *     Channel, Channel Mask Page 0, Network Master Key, PSKc, Security Policy
     */
    aDataset.mActiveTimestamp                      = 1;
    aDataset.mComponents.mIsActiveTimestampPresent = true;

    /* Set Channel to 15 */
    aDataset.mChannel                      = 15;
    aDataset.mComponents.mIsChannelPresent = true;

    /* Set Pan ID to 2222 */
    aDataset.mPanId                      = (otPanId)0x2222;
    aDataset.mComponents.mIsPanIdPresent = true;

    /* Set Extended Pan ID to C0DE1AB5C0DE1AB5 */
    uint8_t extPanId[OT_EXT_PAN_ID_SIZE] = {0xC0, 0xDE, 0x1A, 0xB5, 0xC0, 0xDE, 0x1A, 0xB5};
    memcpy(aDataset.mExtendedPanId.m8, extPanId, sizeof(aDataset.mExtendedPanId));
    aDataset.mComponents.mIsExtendedPanIdPresent = true;

    /* Set master key to 1234C0DE1AB51234C0DE1AB51234C0DE */
    uint8_t key[OT_MASTER_KEY_SIZE] = {0x12, 0x34, 0xC0, 0xDE, 0x1A, 0xB5, 0x12, 0x34, 0xC0, 0xDE, 0x1A, 0xB5};
    memcpy(aDataset.mMasterKey.m8, key, sizeof(aDataset.mMasterKey));
    aDataset.mComponents.mIsMasterKeyPresent = true;

    /* Set Network Name to OTCodelab */
    size_t length = strlen(aNetworkName);
    assert(length <= OT_NETWORK_NAME_MAX_SIZE);
    memcpy(aDataset.mNetworkName.m8, aNetworkName, length);
    aDataset.mComponents.mIsNetworkNamePresent = true;

#if OPENTHREAD_FTD
    otDatasetSetActive(aInstance, &aDataset);

    /* Set the router selection jitter to override the 2 minute default.
       CLI cmd > routerselectionjitter 20
       Warning: For demo purposes only - not to be used in a real product */
    uint8_t jitterValue = 20;
    otThreadSetRouterSelectionJitter(aInstance, jitterValue);
#else
    OT_UNUSED_VARIABLE(aInstance);
#endif
}

ফাংশনটিতে বিশদ হিসাবে, থ্রেড নেটওয়ার্ক প্যারামিটারগুলি আমরা এই অ্যাপ্লিকেশনটির জন্য ব্যবহার করছি:

  • চ্যানেল = 15
  • প্যান আইডি = 0x2222
  • প্রসারিত প্যান আইডি = C0DE1AB5C0DE1AB5
  • নেটওয়ার্ক মাস্টার কী = 1234C0DE1AB51234C0DE1AB51234C0DE
  • নেটওয়ার্কের নাম = ওটিসিডেলাব

তদ্ব্যতীত, আমরা এখানে রাউটার সিলেকশন জিটার হ্রাস করি, তাই আমাদের ডিভাইসগুলি ডেমো উদ্দেশ্যে দ্রুত ভূমিকা পরিবর্তন করে। নোটটি যদি একটি FTD (সম্পূর্ণ থ্রেড ডিভাইস) হয় তবে এটি করা হবে মনে রাখবেন। পরবর্তী পদক্ষেপে যে সম্পর্কে আরও।

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

উদাহরণস্বরূপ, otThreadSetRouterSelectionJitter ফাংশনটি সময় (সেকেন্ডে) সামঞ্জস্য করে যে otThreadSetRouterSelectionJitter নিজেকে প্রচার করতে এন্ড ডিভাইস লাগবে। থ্রেড স্পেসিফিকেশন অনুসারে এই মানটির জন্য ডিফল্ট 120 হয়। এই কোডল্যাবে সহজেই ব্যবহারের জন্য, আমরা এটিকে 20 এ পরিবর্তন করতে যাচ্ছি, সুতরাং থ্রেড নোডের ভূমিকা পরিবর্তন করতে আপনাকে খুব বেশি সময় অপেক্ষা করতে হবে না।

তবে, আপনি লক্ষ্য করেছেন যে এই ফাংশনটি একটি প্রিপ্রসেসর নির্দেশিকার মধ্যে ডাকা হয়:

#if OPENTHREAD_FTD
    otDatasetSetActive(aInstance, &aDataset);

    /* Set the router selection jitter to override the 2 minute default.
       CLI cmd >routerselectionjitter 20
       Warning: For demo purposes only - not to be used in a real product */
    uint8_t jitterValue = 20;
    otThreadSetRouterSelectionJitter(aInstance, jitterValue);
#else
    OT_UNUSED_VARIABLE(aInstance);
#endif

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

আপনি এটি otThreadSetRouterSelectionJitter ফাংশন সংজ্ঞাটি otThreadSetRouterSelectionJitter নিশ্চিত করতে পারেন, যা OPENTHREAD_FTD এর একটি OPENTHREAD_FTD নির্দেশকের OPENTHREAD_FTD :

src / কোর / এপি / থ্রেড_ফিড_এপিসিপিপি

#if OPENTHREAD_FTD

#include <openthread/thread_ftd.h>

...

void otThreadSetRouterSelectionJitter(otInstance *aInstance, uint8_t aRouterJitter)
{
    Instance &instance = *static_cast<Instance *>(aInstance);

    instance.GetThreadNetif().GetMle().SetRouterSelectionJitter(aRouterJitter);
}

...

#endif // OPENTHREAD_FTD

আপনি আপনার অ্যাপ্লিকেশনটি তৈরির আগে, তিনটি মেকফিলের জন্য কয়েকটি ছোট ছোট আপডেট দরকার। এগুলি বিল্ড সিস্টেম দ্বারা আপনার অ্যাপ্লিকেশনটি সংকলন এবং লিঙ্ক করতে ব্যবহৃত হয়।

উদাহরণ / অ্যাপ্লিকেশন / ক্লিপ / মেকফিল.এম

সমস্ত OPENTHREAD_FTD ব্লকগুলি OPENTHREAD_FTD অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করতে, এটি CPPFLAGS এ যুক্ত করুন সিএলআই CPPFLAGS

ক্রিয়া: এফটিডি পতাকা যুক্ত করুন

আপনার পছন্দসই পাঠ্য সম্পাদকটিতে examples/apps/cli/Makefile.am মেকফিল.এম খুলুন এবং নীচে ot_cli_ftd_CPPFLAGS বিভাগটি আপডেট করুন:

ot_cli_ftd_CPPFLAGS                                                    = \
    $(CPPFLAGS_COMMON)                                                   \
    -DOPENTHREAD_FTD=1                                                   \
    $(NULL)

উদাহরণ / Makefile-nrf52840

জিপিআইও ফাংশনটি অ্যাপ্লিকেশনটিতে সংজ্ঞায়িত হয়েছে তা নিশ্চিত করার জন্য এখন nrf52840 মেকফায়ালে কয়েকটি পতাকা যুক্ত করুন।

ক্রিয়া: nrf52840 মেকফাইলে পতাকা যুক্ত করুন

আপনার পছন্দের পাঠ্য সম্পাদকটিতে examples/Makefile-nrf52840 খুলুন, এবং include ... common-switches.mk লাইন include ... common-switches.mk পরে নিম্নলিখিত COMMONCFLAGS যুক্ত করুন:

...

include $(dir $(abspath $(lastword $(MAKEFILE_LIST))))/common-switches.mk

# Defined in third_party/NordicSemiconductor/nrfx/templates/nRF52840/nrfx_config.h
COMMONCFLAGS += -DGPIOTE_ENABLED=1
COMMONCFLAGS += -DGPIOTE_CONFIG_IRQ_PRIORITY=7
COMMONCFLAGS += -DGPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS=1

...

উদাহরণ / প্ল্যাটফর্ম / এনআরএফ 528xx / এনআরএফ 52840 / মেকফিল.এম

এখন nrf52840 Makefile.am ফাইল প্ল্যাটফর্মে নতুন gpio.c ফাইল যুক্ত করুন।

ক্রিয়া: nrf52840 প্ল্যাটফর্ম মেকফাইলে জিপিও উত্স যুক্ত করুন

আপনার পছন্দের পাঠ্য সম্পাদকটিতে examples/platforms/nrf528xx/nrf52840/Makefile.am খুলুন এবং PLATFORM_COMMON_SOURCES বিভাগের শেষে ফাইলটি $(NULL) ঠিক আগে যুক্ত করুন। লাইনের শেষে একটি ব্যাকস্ল্যাশ রাখতে ভুলবেন না!

...

PLATFORM_COMMON_SOURCES
...
src/gpio.c             \
$(NULL)

...

তৃতীয়_পক্ষ / নর্ডিকসেমিকন্ডাক্টর / মেকফিল.এম

সর্বশেষে, NordicSemiconductor তৃতীয় পক্ষের Makefile এ nrfx_gpiote.c ড্রাইভার ফাইল যুক্ত করুন, সুতরাং এটি নর্ডিক ড্রাইভারদের লাইব্রেরি বিল্ডের সাথে অন্তর্ভুক্ত করা হয়েছে।

ক্রিয়া: জিপিও ড্রাইভারটি nrf52840 প্ল্যাটফর্ম মেকফাইলে যুক্ত করুন

আপনার পছন্দের পাঠ্য সম্পাদকটিতে third_party/NordicSemiconductor/Makefile.am খুলুন এবং NORDICSEMI_COMMON_SOURCES $(NULL) স্টেটমেন্টের ঠিক আগে NORDICSEMI_COMMON_SOURCES বিভাগের শেষে ফাইল যুক্ত করুন। লাইনের শেষে একটি ব্যাকস্ল্যাশ রাখতে ভুলবেন না!

...

NORDICSEMI_COMMON_SOURCES
...
nrfx/drivers/src/nrfx_gpiote.c             \

$(NULL)

...

সমস্ত কোড আপডেট হয়ে গেলে, আপনি তিনটি নর্ডিক এনআরএফ 52840 ডেভ বোর্ডগুলিতে অ্যাপ্লিকেশনটি তৈরি এবং ফ্ল্যাশ করতে প্রস্তুত। প্রতিটি ডিভাইস একটি সম্পূর্ণ থ্রেড ডিভাইস (এফটিডি) হিসাবে কাজ করবে।

ওপেনথ্রেড তৈরি করুন

NRF52840 উদাহরণ প্ল্যাটফর্ম তৈরি করুন। যেহেতু পূর্ববর্তী পদক্ষেপে মেকফাইলগুলি পরিবর্তিত হয়েছিল, তাই আপনাকে বিল্ডিংয়ের আগে bootstrap স্ক্রিপ্টটি চালানো দরকার:

$ cd ~/openthread
$ ./bootstrap
$ make -f examples/Makefile-nrf52840

ওপেনথ্রেড এফটিডিটি সিএলআই বাইনারি দিয়ে ডিরেক্টরিতে নেভিগেট করুন এবং এআরএম এম্বেডড সরঞ্জামচেনের সাহায্যে এটিকে হেক্স ফর্ম্যাটে রূপান্তর করুন:

$ cd ~/openthread/output/nrf52840/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

বোর্ডগুলি ফ্ল্যাশ করুন

প্রতিটি এনআরএফ 5২৪৪০ বোর্ডে ot-cli-ftd.hex ফাইলটি ফ্ল্যাশ করুন।

NRF52840 বোর্ডে বাহ্যিক পাওয়ার পিনের পাশে মাইক্রো-ইউএসবি ডিবাগ বন্দরে USB কেবলটি সংযুক্ত করুন এবং তারপরে এটি আপনার লিনাক্স মেশিনে প্লাগ করুন। সঠিকভাবে সেট করুন, LED5 চালু আছে।

20a3b4b480356447.png

আগের মতো, এনআরএফ 52840 বোর্ডের ক্রমিক নম্বরটি নোট করুন:

c00d519ebec7e5f0.jpeg

বোর্ডের ক্রমিক নম্বরটি ব্যবহার করে, এনআরএফএক্স কমান্ড লাইন সরঞ্জামগুলির অবস্থানে নেভিগেট করুন এবং ওপেনথ্রেড সিএলআই এফটিডি হেক্স ফাইলটি nRF52840 বোর্ডে ফ্ল্যাশ করুন:

$ cd ~/nrfjprog
$ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \
       ~/openthread/output/nrf52840/bin/ot-cli-ftd.hex --reset

LED5 সংক্ষেপে ফ্ল্যাশিংয়ের সময় বন্ধ হয়ে যাবে। নিম্নলিখিত আউটপুট সাফল্যের উপর উত্পন্ন হয়:

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

অন্য দুটি বোর্ডের জন্য এই "বোর্ডগুলি ফ্ল্যাশ করুন" পদক্ষেপটি পুনরাবৃত্তি করুন। প্রতিটি বোর্ডকে একইভাবে লিনাক্স মেশিনের সাথে সংযুক্ত করা উচিত এবং বোর্ডের ক্রমিক সংখ্যা বাদে ফ্ল্যাশ করার কমান্ডটি একই। প্রতিটি বোর্ডের অনন্য সিরিয়াল নম্বরটি nrfjprog ফ্ল্যাশিং কমান্ডে ব্যবহার করা নিশ্চিত করুন

সফল হলে, প্রতিটি বোর্ডে LED1, LED2, বা LED3 জ্বালানো হবে। এমনকি আপনি জ্বলন্ত এলইডি স্যুইচটি 3 থেকে 2 (বা 2 থেকে 1) এর ফ্ল্যাশিংয়ের পরে (ডিভাইসের ভূমিকা পরিবর্তন বৈশিষ্ট্য) এর পরেও দেখতে পাবেন।

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

ডিভাইসের ভূমিকা সূচক

প্রতিটি বোর্ডের লিটল এলইডি থ্রেড নোডের বর্তমান ভূমিকা প্রতিফলিত করে:

  • নেতৃত্বে 1 = নেতা
  • LED2 = রাউটার
  • LED3 = শেষ ডিভাইস

ভূমিকা যেমন পরিবর্তিত হয় তেমনি আলোকিত এলইডিও হয়। প্রতিটি ডিভাইস শক্তিশালী হওয়ার 20 সেকেন্ডের মধ্যে আপনাকে বোর্ড বা দুটিতে এই পরিবর্তনগুলি ইতিমধ্যে দেখে নেওয়া উচিত ছিল।

ইউডিপি মাল্টিকাস্ট

বাটন 1 টি বোর্ডে চাপলে, একটি ইউডিপি বার্তা জাল-স্থানীয় মাল্টিকাস্ট ঠিকানায় প্রেরণ করা হয়, এতে থ্রেড নেটওয়ার্কের অন্যান্য সমস্ত নোড অন্তর্ভুক্ত রয়েছে। এই বার্তাটি পাওয়ার প্রতিক্রিয়া হিসাবে, অন্যান্য সমস্ত বোর্ডের LED4 টগল চালু বা বন্ধ থাকে । LED4 অন্য বোর্ডের জন্য অন্য ইউডিপি বার্তা না পাওয়া পর্যন্ত প্রতিটি বোর্ডের জন্য চালু বা বন্ধ থাকে।

203dd094acca1f97.png

9bbd96d9b1c63504.png

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

থ্রেডটি 32 টি রাউটার পর্যন্ত সমর্থন করতে পারে তবে রাউটারের সংখ্যা 16 এবং 23 এর মধ্যে রাখার চেষ্টা করে। যদি কোনও ডিইডি একটি শেষ ডিভাইস হিসাবে সংযুক্ত থাকে এবং রাউটারের সংখ্যা 16 এর নীচে থাকে তবে এটি স্বয়ংক্রিয়ভাবে নিজেকে রাউটারে উন্নীত করে। আপনি যে অ্যাপ্লিকেশনটিতে (20 সেকেন্ড) otThreadSetRouterSelectionJitter মান সেট করেছেন তার সংখ্যার মধ্যে এলোমেলোভাবে এই পরিবর্তন হওয়া উচিত।

প্রতিটি থ্রেড নেটওয়ার্কে একটি লিডারও থাকে যা একটি রাউটার যা একটি থ্রেড নেটওয়ার্কে রাউটারগুলির সেট পরিচালনার জন্য দায়ী। সমস্ত ডিভাইস চালু থাকলে, 20 সেকেন্ড পরে তাদের মধ্যে একটির লিডার হওয়া উচিত (LED1 চালু) এবং অন্য দুটি রাউটারের (LED2 চালু) হওয়া উচিত।

4e1e885861a66570.png

লিডার সরান

যদি থ্রেড নেটওয়ার্ক থেকে লিডারটি সরিয়ে ফেলা হয়, তবে নেটওয়ার্কের এখনও কোনও লিডার রয়েছে তা নিশ্চিত করার জন্য একটি ভিন্ন রাউটার নিজেকে একটি লিডার হিসাবে প্রচার করে।

পাওয়ার স্যুইচটি ব্যবহার করে লিডার বোর্ডটি (এলইডি 1 লিটযুক্ত একটি) বন্ধ করুন। প্রায় 20 সেকেন্ড অপেক্ষা করুন। বাকি দুটি বোর্ডের একটিতে, LED2 (রাউটার) বন্ধ হবে এবং LED1 (লিডার) চালু হবে। এই ডিভাইসটি এখন থ্রেড নেটওয়ার্কের শীর্ষস্থানীয়।

4c57c87adb40e0e3.png

আসল লিডার বোর্ডটি আবার চালু করুন। এটি স্বয়ংক্রিয়ভাবে থ্রেড নেটওয়ার্কটিতে একটি এন্ড ডিভাইস হিসাবে পুনরায় যোগদান করা উচিত (LED3 আলোকিত হয়)। 20 সেকেন্ডের মধ্যে (রাউটার সিলেকশন জিটার) এটি নিজের মধ্যে একটি রাউটারে উন্নীত হয় (LED2 প্রজ্জ্বলিত)।

5f40afca2dcc4b5b.png

বোর্ডগুলি পুনরায় সেট করুন

তিনটি বোর্ডই বন্ধ করুন, তারপরে আবার চালু করুন এবং এলইডি পর্যবেক্ষণ করুন। প্রথম বোর্ড যা চালিত হয়েছিল তা নেতৃত্বের ভূমিকায় শুরু করা উচিত (LED 1 আলোকিত হয়) - থ্রেড নেটওয়ার্কের প্রথম রাউটারটি স্বয়ংক্রিয়ভাবে লিডার হয়ে যায়।

অন্য দুটি বোর্ড প্রাথমিকভাবে এন্ড ডিভাইসগুলি (এলইডি 3 লিটযুক্ত) হিসাবে নেটওয়ার্কের সাথে সংযুক্ত হয় তবে তাদের 20 সেকেন্ডের মধ্যে রাউটারগুলিতে (এলইডি 2 লিটানো হয়) প্রচার করা উচিত।

নেটওয়ার্ক পার্টিশন

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

থ্রেডটি স্ব-নিরাময়যোগ্য, সুতরাং পার্টিশনগুলি শেষ পর্যন্ত এক নেতার সাথে একক পার্টিশনে মেশানো উচিত।

পূর্ববর্তী অনুশীলন থেকে চালিয়ে গেলে, কোনও ডিভাইসে LED4 জ্বালানো উচিত নয়।

যে কোনও বোর্ড চয়ন করুন এবং বোতাম 1 টিপুন। অ্যাপ্লিকেশন চলমান থ্রেড নেটওয়ার্কের অন্যান্য সমস্ত বোর্ডের LED4 এ তাদের স্থিতি টগল করা উচিত। যদি আগের অনুশীলন থেকে চালিয়ে যান তবে তাদের এখনই চালু থাকা উচিত।

f186a2618fdbe3fd.png

আবার একই বোর্ডের জন্য বোতাম 1 টিপুন। অন্যান্য সমস্ত বোর্ডের LED4 এ আবার টগল করা উচিত।

একটি ভিন্ন বোর্ডে বাটন 1 টিপুন এবং দেখুন যে কীভাবে LED4 অন্যান্য বোর্ডগুলিতে টগল করে। বর্তমানে যে বোর্ডগুলিতে LED4 চালু রয়েছে তার একটিতে বাটন 1 টিপুন। LED4 সেই বোর্ডের জন্য রয়েছে তবে অন্যগুলিতে টগল করে।

f5865ccb8ab7aa34.png

নেটওয়ার্ক পার্টিশন

যদি আপনার বোর্ডগুলি বিভক্ত হয়ে যায় এবং তাদের মধ্যে একাধিক নেতা থাকে, তবে মাল্টিকাস্ট বার্তার ফলাফল বোর্ডগুলির মধ্যে পৃথক হবে। পার্টিশনযুক্ত বোর্ডে বাটন 1 টি চাপলে (এবং এইভাবে পার্টিশনযুক্ত থ্রেড নেটওয়ার্কের একমাত্র সদস্য), অন্য বোর্ডগুলির LED4 প্রতিক্রিয়া হিসাবে আলোকিত হবে না। যদি এটি হয়, বোর্ডগুলি পুনরায় সেট করুন ally আদর্শভাবে তারা একটি একক থ্রেড নেটওয়ার্কে সংস্কার করবে এবং ইউডিপি মেসেজিং সঠিকভাবে কাজ করা উচিত।

আপনি এমন একটি অ্যাপ্লিকেশন তৈরি করেছেন যা ওপেনথ্রেড এপিআই ব্যবহার করে!

আপনি এখন জানেন:

  • নর্ডিক এনআরএফ 52840 ডেভ বোর্ডগুলিতে কীভাবে বোতাম এবং এলইডি প্রোগ্রাম করবেন
  • সাধারণ ওপেনথ্রেড এপিআই এবং otInstance ক্লাস কীভাবে ব্যবহার করবেন
  • ওপেনথ্রেড স্থিতি পরিবর্তনের উপর কীভাবে নজরদারি করা যায় এবং কীভাবে প্রতিক্রিয়া জানানো হয়
  • কোনও থ্রেড নেটওয়ার্কের সমস্ত ডিভাইসে কীভাবে ইউডিপি বার্তা প্রেরণ করা যায়
  • মেকফিলগুলি কীভাবে পরিবর্তন করবেন

পরবর্তী পদক্ষেপ

এই কোডল্যাব বন্ধ করে, নিম্নলিখিত অনুশীলন চেষ্টা করুন:

  • জাহাজের এলইডিগুলির পরিবর্তে জিপিআইও পিনগুলি ব্যবহার করতে জিপিআইও মডিউলটি সংশোধন করুন এবং রাউটারের ভূমিকার ভিত্তিতে রঙ পরিবর্তনকারী বাহ্যিক আরজিবি এলইডি সংযুক্ত করুন
  • একটি পৃথক উদাহরণ প্ল্যাটফর্মের জন্য জিপিআইও সমর্থন যুক্ত করুন
  • একটি বাটন প্রেস থেকে সমস্ত ডিভাইসগুলি পিন করার জন্য মাল্টিকাস্ট ব্যবহার করার পরিবর্তে, কোনও পৃথক ডিভাইস সনাক্ত করতে এবং পিং করতে রাউটার / লিডার এপিআই ব্যবহার করুন
  • ওপেনথ্রেড বর্ডার রাউটার ব্যবহার করে আপনার জাল নেটওয়ার্কটি ইন্টারনেটে সংযুক্ত করুন এবং থ্রেড নেটওয়ার্কের বাইরে থেকে এলইডি জ্বলতে মাল্টিকাস্ট করুন them

আরও পড়া

ওপেনথ্রেড রিসোর্সগুলির জন্য বিভিন্ন ওপেনথ্রেড.ইও এবং গিটহাব দেখুন , সহ:

তথ্যসূত্র: