nRF5 SDK for Thread and Zigbee 환경에서  1:20 송수신 시나리오에 맞는 송수신 로직과 전력관리를 구현

nRF52840 DK (Development Kit)

  • 제품 설명: nRF52840 DK는 nRF52840 칩을 기반으로 Zigbee, BLE, 2.4GHz 무선 통신 등을 개발할 수 있는 공식 개발 키트입니다.
  • 기능: Zigbee 네트워크에서의 송신/수신/대기/슬립/딥 슬립 모드 제어를 위한 Nordic SDK를 지원하며, 특히 Zephyr RTOS와 통합하여 Zigbee 통신을 구현할 수 있습니다.
  • API 제어: Nordic의 Zigbee SDK는 송신/수신과 같은 기능을 포함하여 전력 소비를 줄이기 위한 여러 모드 제어 API를 제공합니다. zigbee_stack_init(), zb_set_sleep_mode(), zb_set_power_mode() 등의 함수가 있으며, 전력 관리와 관련된 API가 준비되어 있습니다.
  • 사용 가능한 운영 모드:
    • TX 모드 (송신 모드): 데이터를 송신할 때 전력을 사용.
    • RX 모드 (수신 모드): 수신 모드에서 지속적으로 수신을 대기.
    • Standby 모드 (대기 모드): 일부 모듈만 활성화된 상태로 빠르게 전환이 가능.
    • Sleep 모드: Zigbee를 포함한 무선 기능을 완전히 비활성화하고 낮은 전력 모드로 전환.
    • Deep Sleep 모드: 가장 낮은 전력 소비 모드로, 외부 인터럽트에 의해 다시 활성화.

nRF52840 Dongle

  • 제품 설명: nRF52840 Dongle은 저렴한 Zigbee 및 BLE 개발을 위한 USB 동글로, 작은 크기에도 불구하고 nRF52840 칩셋의 기능을 충분히 활용할 수 있습니다.
  • 기능: 전력 관리 기능을 포함한 Nordic Zigbee SDK와 통합 가능.
  • API 제어: 송신 및 수신 모드를 제어하는 Zigbee API와 슬립 및 대기 모드를 제어하는 전력 관리 API 제공.

Zigbee 1:20 송수신 구현을 위한 시나리오는 하나의 송신 노드가 20개의 수신 노드로 데이터를 브로드캐스트하거나 멀티캐스트하는 것을 의미합니다. 이를 구현하기 위해서는 송신과 수신 시 Zigbee 네트워크 통신을 설정하고, 전력 소비를 관리하기 위해 송신(TX), 수신(RX), 대기(Standby), 슬립(Sleep), 딥 슬립(Deep Sleep) 모드를 제어할 수 있어야 합니다.

nRF5 SDK for Thread and Zigbee에서는 이러한 작업을 수행할 수 있는 다양한 API가 제공되며, 아래와 같은 시나리오와 API 설정을 통해 1:20 Zigbee 통신을 구현할 수 있습니다.

1:20 송수신 시나리오 개요
송신 노드: 데이터를 Zigbee 네트워크에 브로드캐스트/멀티캐스트하며, 송신 이후 슬립 모드나 딥 슬립 모드로 전환해 전력 절감.
수신 노드: 송신 노드에서 데이터를 수신하며, 데이터를 수신하지 않을 때 슬립 모드 또는 딥 슬립 모드로 전환해 대기.
전력 모드: 각 노드에서 상황에 맞게 전력 모드를 관리해 최대한의 전력 효율성을 달성.
1. 송신 (TX) 모드 설정 및 구현
송신 노드는 데이터를 주기적으로 송신하고, 송신 후 슬립 모드로 전환합니다. zb_zcl_start_attr_reporting() API를 사용하여 데이터를 송신할 수 있습니다.

#include "zboss_api.h"
#include "zigbee_helpers.h"

#define ENDPOINT_ID     10
#define CLUSTER_ID      ZB_ZCL_CLUSTER_ID_ON_OFF
#define BROADCAST_ADDR  0xFFFF  // 브로드캐스트 주소

void send_data(zb_bufid_t bufid)
{
    zb_zcl_start_attr_reporting(ENDPOINT_ID, CLUSTER_ID);
    
    zb_uint8_t* data_ptr = ZB_BUF_GET_PARAM_PTR(bufid, zb_uint8_t);
    *data_ptr = MY_DATA;

    zb_ret_t ret = zb_zdo_send_data(bufid, BROADCAST_ADDR, CLUSTER_ID);
    if (ret == RET_OK)
    {
        printf("Data broadcast to 20 nodes\n");
    }
    else
    {
        printf("Data transmission failed\n");
    }
}

void zigbee_send_init(void)
{
    zb_bufid_t bufid = zb_buf_get_out();
    send_data(bufid);
    zb_buf_free(bufid);  // 버퍼 해제

    // 송신 후 슬립 모드로 전환
    zb_sleep_now(5000);  // 5초 동안 슬립 모드
}


주요 API 설명:
zb_zcl_start_attr_reporting(): 지정된 클러스터의 속성 보고를 시작하여 송신 모드를 활성화합니다.
zb_zdo_send_data(): Zigbee 네트워크로 데이터를 브로드캐스트로 전송합니다.
zb_sleep_now(): 송신 후 전력을 절약하기 위해 슬립 모드로 전환합니다.
2. 수신 (RX) 모드 설정 및 구현
수신 노드는 송신 노드에서 브로드캐스트된 데이터를 수신하며, 데이터를 수신하지 않을 때 슬립 모드로 전환됩니다. 수신 콜백 함수 zb_zcl_report_attr_cb()를 통해 데이터를 처리할 수 있습니다.

#include "zboss_api.h"
#include "zigbee_helpers.h"

static void receive_data_cb(zb_uint8_t param)
{
    zb_zcl_report_attr_cmd_t *attr_report = ZB_BUF_BEGIN(param);
    
    if (attr_report->cluster_id == ZB_ZCL_CLUSTER_ID_ON_OFF)
    {
        printf("Data received: %d\n", *attr_report->attr_data);
        // 데이터 처리 로직 구현
    }

    zb_buf_free(param);  // 버퍼 해제

    // 수신 후 대기 모드로 전환
    zb_sleep_now(3000);  // 3초 동안 슬립 모드
}

void zigbee_receive_init(void)
{
    zb_zcl_register_attr_report_cb(receive_data_cb);
}


주요 API 설명:
zb_zcl_report_attr_cb(): 송신된 데이터를 수신하고 처리하는 콜백 함수입니다. 수신된 데이터를 검사하고 필요한 동작을 수행합니다.
zb_zcl_register_attr_report_cb(): 데이터 수신 시 호출될 콜백 함수를 등록합니다.
zb_sleep_now(): 데이터 수신 후 슬립 모드로 전환하여 전력 소모를 줄입니다.
3. 대기 모드 설정
대기 모드는 데이터 송수신이 이루어지지 않는 상태에서 노드를 유지하는 모드입니다. 기본적으로 Zigbee 네트워크에서 활동이 없을 경우 대기 모드로 진입합니다.

void standby_mode(void)
{
    zb_ret_t ret = zigbee_stack_init();
    if (ret == RET_OK)
    {
        printf("Zigbee stack initialized, node in standby mode.\n");
    }
}


4. 슬립 모드 및 딥 슬립 모드 설정
슬립 모드는 전력 소비를 줄이기 위해 사용되며, 수신 대기 시간이 짧거나 활동이 없을 때 전환됩니다. 딥 슬립 모드는 더 긴 시간 동안 비활성화되며, 외부 인터럽트나 이벤트가 발생할 때만 활성화됩니다.

슬립 모드

void enter_sleep_mode(void)
{
    zb_sleep_now(10000);  // 10초 동안 슬립 모드
}
딥 슬립 모드
c
코드 복사
void enter_deep_sleep_mode(void)
{
    zb_go_to_deep_sleep(60000);  // 60초 동안 딥 슬립 모드
}


5. 1:20 송수신 시나리오 요약
송신 노드는 zb_zcl_start_attr_reporting() API를 통해 데이터를 브로드캐스트하고, 데이터 전송 후 슬립 모드로 전환하여 전력 소비를 줄입니다.
수신 노드는 zb_zcl_report_attr_cb() 콜백 함수를 통해 데이터를 수신하고 처리하며, 수신 후에는 슬립 모드 또는 대기 모드로 전환해 에너지를 절약합니다.
대기 및 슬립 모드는 zb_sleep_now()와 같은 전력 관리 API를 통해 적절하게 제어되며, 필요에 따라 딥 슬립 모드로 전환해 장시간의 저전력 상태를 유지할 수 있습니다.
이러한 전력 관리 및 송수신 제어는 nRF5 SDK for Thread and Zigbee에서 제공하는 API를 통해 쉽게 구현할 수 있으며, 전반적인 시스템 전력 효율성을 크게 향상시킬 수 있습니다.


수신 콜백 함수 zb_zcl_report_attr_cb()를 통해 어떻게 데이터를 수신하는지 세부 구현 예를 상세히 제시하라


zb_zcl_report_attr_cb()를 통해 데이터를 수신하는 과정은 Zigbee 클러스터의 속성(Attribute) 값이 변경되었을 때, 이를 보고하는 메시지를 수신하는 방식으로 이루어집니다. 수신된 데이터는 콜백 함수에서 처리되며, 이를 통해 노드는 해당 데이터를 파싱하고 적절한 동작을 수행할 수 있습니다.

아래는 zb_zcl_report_attr_cb()와 관련된 세부 구현 예시입니다. 이 코드는 nRF5 SDK for Thread and Zigbee에서 제공하는 콜백 기반 데이터 수신 구조를 설명합니다.

1. 콜백 함수 등록
먼저, 수신할 데이터를 처리할 콜백 함수를 등록합니다. 이를 위해 zb_zcl_register_attr_report_cb() 함수를 사용하여 지정된 콜백을 설정합니다.

void zigbee_receive_init(void)
{
    // 속성 보고를 처리할 콜백 함수 등록
    zb_zcl_register_attr_report_cb(receive_data_cb);
}
2. 콜백 함수 정의
이제 콜백 함수인 receive_data_cb()를 정의하여 실제로 데이터를 수신하고 처리하는 로직을 구현합니다.

static void receive_data_cb(zb_uint8_t param)
{
    // 버퍼에서 속성 보고 데이터를 가져옴
    zb_zcl_report_attr_cmd_t *attr_report = (zb_zcl_report_attr_cmd_t*)ZB_BUF_BEGIN(param);

    // 클러스터 ID가 온/오프 클러스터인지 확인
    if (attr_report->cluster_id == ZB_ZCL_CLUSTER_ID_ON_OFF)
    {
        zb_uint16_t attr_id = attr_report->attr_id;
        zb_uint8_t *attr_data = attr_report->attr_data;
        
        // 수신된 데이터를 로그에 출력
        printf("Attribute Report received:\n");
        printf("Cluster ID: 0x%04x\n", attr_report->cluster_id);
        printf("Attribute ID: 0x%04x\n", attr_id);
        printf("Attribute Data: %d\n", *attr_data);

        // 속성 값이 변경된 경우 처리 로직 추가 (예: LED on/off)
        if (*attr_data == ZB_TRUE)
        {
            printf("Turn on the LED\n");
            // LED on 처리 로직
        }
        else
        {
            printf("Turn off the LED\n");
            // LED off 처리 로직
        }
    }

    // 버퍼 해제
    zb_buf_free(param);  
}


3. 콜백 함수 세부 설명
zb_zcl_report_attr_cmd_t 구조체: 이 구조체는 수신된 속성 보고의 세부 내용을 담고 있으며, 클러스터 ID, 속성 ID, 그리고 실제 속성 데이터를 포함합니다.

cluster_id: 수신된 데이터가 어떤 클러스터(예: 온/오프 클러스터)에 속하는지 확인합니다.
attr_id: 수신된 데이터가 어떤 속성에 해당하는지 나타냅니다.
attr_data: 수신된 속성의 실제 데이터 값이 저장됩니다. 예를 들어, 온/오프 클러스터에서는 이 값이 0 (off) 또는 1 (on)입니다.
속성 값 검사: attr_data 값을 확인하여 수신된 데이터가 on/off인지 판단하고, 해당하는 동작(LED on/off)을 처리합니다.

zb_buf_free(): Zigbee 버퍼는 수신 데이터 처리 후 반드시 해제해야 하므로, zb_buf_free()로 해제합니다.

4. 전체 코드 흐름
전체적으로, zb_zcl_register_attr_report_cb()로 콜백 함수를 등록하고, 속성 보고(Attribute Reporting)가 발생했을 때 해당 콜백이 호출되어 데이터를 처리합니다.

void zigbee_receive_init(void)
{
    // 수신 콜백 함수 등록
    zb_zcl_register_attr_report_cb(receive_data_cb);
}

static void receive_data_cb(zb_uint8_t param)
{
    // 수신된 속성 데이터를 버퍼에서 가져옴
    zb_zcl_report_attr_cmd_t *attr_report = (zb_zcl_report_attr_cmd_t*)ZB_BUF_BEGIN(param);

    // 클러스터가 온/오프 클러스터인지 확인
    if (attr_report->cluster_id == ZB_ZCL_CLUSTER_ID_ON_OFF)
    {
        zb_uint16_t attr_id = attr_report->attr_id;
        zb_uint8_t *attr_data = attr_report->attr_data;

        // 수신된 데이터 출력
        printf("Attribute Report received:\n");
        printf("Cluster ID: 0x%04x\n", attr_report->cluster_id);
        printf("Attribute ID: 0x%04x\n", attr_id);
        printf("Attribute Data: %d\n", *attr_data);

        // 속성 값에 따라 LED 제어
        if (*attr_data == ZB_TRUE)
        {
            printf("Turn on the LED\n");
            // LED on 로직
        }
        else
        {
            printf("Turn off the LED\n");
            // LED off 로직
        }
    }

    // 버퍼 해제
    zb_buf_free(param);  
}


요약
콜백 함수 등록: zb_zcl_register_attr_report_cb() API로 속성 보고를 수신할 콜백 함수를 등록합니다.
데이터 처리: zb_zcl_report_attr_cmd_t 구조체를 통해 수신된 데이터를 확인하고 적절한 동작(예: LED on/off)을 수행합니다.
버퍼 관리: 수신된 데이터를 처리한 후에는 zb_buf_free()로 버퍼를 해제하여 메모리를 관리합니다.
이 예시는 nRF5 SDK for Thread and Zigbee 환경에서 Zigbee 네트워크의 데이터 수신 및 처리 과정을 설명하며, 이를 통해 1:20 송수신 시나리오에 맞는 수신 로직을 쉽게 구현할 수 있습니다.

 

딥네트워크 CEO / 장석원

HP :  010-3350 6509

이메일  :   sayhi7@daum.net

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts