| 
    Nol.A SDK Library
    25.8.1
    
   For IoT System Software Development 
   | 
 
Low-Power Probing: 비동기 (asynchronous) 방식의 저전력 MAC 프로토콜 More...
#include <LPPMac.hpp>
  
Public Member Functions | |
| void | begin (PacketRadioChip &chip, uint16_t panId, uint16_t nodeId, const uint8_t *eui64) | 
| 프로토콜을 초기화합니다.  More... | |
| void | stop () | 
| LPP 동작을 중단합니다.  More... | |
| void | resume () | 
| stop()으로 중단된 LPP 동작을 재개합니다.  | |
| bool | isRunning () | 
| LPP가 현재 주기적인 프로빙 중인지 확인합니다.  | |
| uint32_t | getProbePeriod () | 
| ProbePeriod 를 가져옵니다.  | |
| error_t | setProbePeriod (uint32_t msec) | 
ProbePeriod 를 msec 밀리초로 설정합니다.  | |
| uint32_t | getListenTimeout () | 
| ListenTimeout 시간을 가져옵니다.  | |
| error_t | setListenTimeout (uint32_t msec) | 
ListenTimeout 시간을 msec 밀리초로 설정합니다.  | |
| uint16_t | getTxTimeout () | 
| TxTimeout 시간을 가져옵니다.  | |
| error_t | setTxTimeout (uint16_t msec) | 
TxTimeout 시간을 msec 밀리초로 설정합니다.  | |
| uint16_t | getRxWaitTimeout () | 
| RxWaitTimeout 시간을 가져옵니다.  | |
| error_t | setRxWaitTimeout (uint16_t msec) | 
RxWaitTimeout 시간을 msec 밀리초로 설정합니다.  | |
| uint16_t | getRxTimeout () | 
| RxTimeout 시간을 가져옵니다.  | |
| error_t | setRxTimeout (uint16_t msec) | 
RxTimeout 시간을 msec 밀리초로 설정합니다.  | |
| uint16_t | getCcaDuration () | 
| CcaDuration 시간을 가져옵니다.  | |
| error_t | setCcaDuration (uint16_t msec) | 
CcaDuration 시간을 msec 밀리초로 설정합니다.  | |
| bool | isRadioAlwaysOn () | 
| Idle 상태에서도 항상 무선을 사용하는지 확인합니다.  | |
| void | setRadioAlwaysOn (bool alwaysOn) | 
| Idle 상태에서도 무선을 사용하도록 설정합니다.  More... | |
| bool | isSITFirstUsed () | 
| Sender-Initiated-Transmission 를 우선 사용하는지 확인합니다.  | |
| void | setUseSITFirst (bool use) | 
| 프레임을 전송하기 위해 listen을 시작하기 전에 Sender-Initiated-Transmission를 수행합니다.  More... | |
| error_t | setRetries (uint8_t num) | 
| 재전송 횟수를 num 회로 설정합니다.  | |
| void | setPanId (uint16_t panId) | 
| PAN ID를 설정합니다.  More... | |
| void | enableReceiveInterPANFrame (bool enable) | 
| 타 PAN으로부터의 프레임 수신을 허용합니다.  More... | |
| void | onReceiveProbe (void(*func)(uint16_t panId, const uint8_t *eui64, uint16_t shortId, int16_t rssi, const uint8_t *payload, uint8_t payloadLen, uint32_t channel)) | 
| Probe 수신시 콜백함수를 지정합니다.  More... | |
| void | setProbePayload (const uint8_t *payload, uint8_t len) | 
| Probe 메시지에 추가로 보낼 페이로드 데이터를 설정합니다.  More... | |
| void | setProbePayload (const char *payload, uint8_t len) | 
| void | setDefaultChannel (uint32_t channel) | 
| 기본 채널을 변경합니다.  More... | |
  Public Member Functions inherited from IEEE802_15_4Mac | |
| error_t | send (IEEE802_15_4Frame *frame) | 
frame 을 전송합니다.  More... | |
| error_t | cancelSend (IEEE802_15_4Frame *frame) | 
frame 전송을 취소합니다.  More... | |
| virtual void | onSendDone (void(*sendDoneHandler)(IEEE802_15_4Mac &, IEEE802_15_4Frame *)) | 
| 전송이 완료될 때 호출될 함수를 지정합니다.  More... | |
| void | onReceive (void(*receiveHandler)(IEEE802_15_4Mac &, const IEEE802_15_4Frame *)) | 
| 수신이 완료될 때 호출될 함수를 지정합니다.  More... | |
Static Public Member Functions | |
| static error_t | ExtractProbe (IEEE802_15_4Frame &probe, IEEE802_15_4Address &srcShort, IEEE802_15_4Address &srcLong, uint16_t *dataChannel, const uint8_t **userMessage, uint8_t *userMessageLength) | 
  Static Public Member Functions inherited from IEEE802_15_4Mac | |
| static int32_t | ConvertChToFreq2450MHz (uint16_t channelNumber) | 
| IEEE 802.15.4-2015 2450MHz 대역 채널번호-주파수 변환 함수  More... | |
| static int32_t | ConvertChToFreq917MHzSUN_FSK1 (uint16_t channelNumber) | 
| IEEE 802.15.4-2015 917~923.5 MHz 대역 SUN FSK operating mode #1 채널번호-주파수 변환 함수  More... | |
Public Attributes | |
| bool | use_802_15_4e_2012_Syntax = false | 
  Public Attributes inherited from IEEE802_15_4Mac | |
| bool | useForceNoAckRequest = false | 
| 전송할 프레임에 대해 강제로 Ack를 요청하지 않게 합니다.  More... | |
Additional Inherited Members | |
  Static Public Attributes inherited from IEEE802_15_4Mac | |
| static uint16_t | HoppingSequenceList2450MHz [16] | 
| IEEE 802.15.4-2015 2450 MHz 대역을 위한 macHoppingSequenceList.  | |
| static uint16_t | HoppingSequenceList917MHzSUN_FSK1 [32] | 
| IEEE 802.15.4-2015 917~923.5 MHz 대역 SUN FSK operating mode #1 을 위한 macHoppingSequenceList.  | |
  Protected Types inherited from PacketRadio | |
| enum | { TX_FIFO_SIZE = 10 , RX_FIFO_SIZE = 10 , TX_DONE_FIFO_SIZE = 10 } | 
  Protected Member Functions inherited from IEEE802_15_4Mac | |
| bool | checkTxFrame (RadioPacket *frame) | 
| void | handleRxFrame (RadioPacket *frame) | 
| IEEE802_15_4Frame * | getNextTxFrame () | 
  Protected Member Functions inherited from PacketRadio | |
| virtual void | sendDone (RadioPacket *frame, RadioPacket::Result_t) | 
| virtual void | receive (RadioPacket *frame) | 
| RadioPacket * | getNextTxFrame () | 
| error_t | enqueueTxFrame (RadioPacket *frame) | 
| virtual void | notifySendDone (RadioPacket *frame) | 
| virtual void | notifyReceive (RadioPacket *frame) | 
| error_t | send (RadioPacket *frame) | 
frame 을 전송합니다.  More... | |
| error_t | cancelSend (RadioPacket *frame) | 
frame 전송을 취소합니다.  More... | |
| void | onSendDone (void(*sendDoneHandler)(PacketRadio &, RadioPacket *)) | 
| 전송이 완료될 때 호출될 함수를 지정합니다.  More... | |
| uint8_t | getNumPendingSendFrames () | 
| 전송 대기 중인 프레임 갯수를 구합니다.  More... | |
| void | onReceive (void(*receiveHandler)(PacketRadio &, const RadioPacket *)) | 
| 수신이 완료될 때 호출될 함수를 지정합니다.  More... | |
| void | setEventListener (PacketRadioEventListener &) | 
| 전송 완료 및 수신 이벤트에 대해 PacketRadioEventListener 를 구현한 클래스로 콜백합니다.  More... | |
  Protected Attributes inherited from PacketRadio | |
| Queue< RadioPacket * > | txFifo | 
| Queue< RadioPacket * > | rxFifo | 
| Queue< RadioPacket * > | txDoneFifo | 
| void(* | callbackSendDone )(PacketRadio &, RadioPacket *) | 
| void(* | callbackReceive )(PacketRadio &, const RadioPacket *) | 
| PacketRadioEventListener * | eventListener | 
Low-Power Probing: 비동기 (asynchronous) 방식의 저전력 MAC 프로토콜
노드는 주기적으로 Probe를 전송하여 주변의 이웃들에게 자신의 존재를 알립니다. 데이터를 송신할 노드는 무선 상태를 검사하다가 목적지 노드의 Probe를 수신한 순간 데이터를 전송합니다. 각 노드는 유휴상태일 때 주기적인 Probe 전송을 제외하면 대부분의 시간을 수면상태에서 대기하기 때문에, 간헐적인 데이터 전송만 요구되는 응용에 적합한 프로토콜입니다.
SX1276, CC1200 등 패킷 무선통신을 지원하는 송수신 칩과 함께 쓸 수 있습니다. LPP는 IEEE 802.15.4 표준은 아니지만 IEEE 802.15.4-2015의 RIT와 유사하며, 프레임 형식은 IEEE 802.15.4-2015를 따릅니다. 따라서 IEEE 802.15.4와 같이 노드의 주소는 8-byte EUI-64 와 2-byte short address 를 모두 지원합니다.
LPP를 지원하는 하드웨어는 다음과 같습니다.
| Board | Radio Chip | Example | 
|---|---|---|
| Atmel SAM R21 Xplained Pro | Internal AT86RF233 | Sender, Receiver | 
| PLNetworks PLM100 | SX1276 | Sender, Receiver | 
| ST Nucleo L152RE | SX1276MB1LAS | Sender, Receiver | 
LPP의 타이밍 관련 파라미터 중 RxWaitTimeout, RxTimeout, 및 TxTimeout 은 하드웨어에 의존적입니다. 아래는 하드웨어 및 전송방식 별 추천하는 값입니다.
| Chip | RxWaitTimeout | RxTimeout | TxTimeout | 
|---|---|---|---|
| CC1200 (FSK 50kbps) | 100 | 50 | |
| SX1276 (LoRa SF7, BW 125kHz) | 30 | 465 | 632 | 
| SX1276 (LoRa SF7, BW 250kHz) | 15 | 310 | 319 | 
| SX1276 (LoRa SF7, BW 500kHz) | 10 | 160 | 162 | 
| SX1276 (LoRa SF8, BW 125kHz) | 48 | 1075 | 1112 | 
| SX1276 (LoRa SF8, BW 250kHz) | 25 | 540 | 560 | 
| SX1276 (LoRa SF8, BW 500kHz) | 15 | 275 | 282 | 
| SX1276 (LoRa SF9, BW 125kHz) | 90 | 1880 | 1956 | 
| SX1276 (LoRa SF9, BW 250kHz) | 48 | 940 | 981 | 
| SX1276 (LoRa SF9, BW 500kHz) | 25 | 475 | 492 | 
| SX1276 (LoRa SF10, BW 125kHz) | 178 | 3415 | 3580 | 
| SX1276 (LoRa SF10, BW 250kHz) | 90 | 1710 | 1792 | 
| SX1276 (LoRa SF10, BW 500kHz) | 48 | 860 | 899 | 
| SX1276 (LoRa SF11, BW 125kHz) | 350 | 7480 | 7809 | 
| SX1276 (LoRa SF11, BW 250kHz) | 178 | 3745 | 3907 | 
| SX1276 (LoRa SF11, BW 500kHz) | 90 | 1875 | 1956 | 
| SX1276 (LoRa SF12, BW 125kHz) | 700 | 13380 | 14039 | 
| SX1276 (LoRa SF12, BW 250kHz) | 350 | 6695 | 7022 | 
| SX1276 (LoRa SF12, BW 500kHz) | 178 | 3350 | 3514 | 
LPP는 다음과 같이 전역변수 포인터로 선언하고, new LPPMac() 을 사용하여 생성합니다. 인스턴스의 begin() 을 호출하면 프로토콜이 시작됩니다.
다음 예제는 PLM100 에서의 LPP 초기화 방법입니다.
프레임을 전송하기 위해서는 다음과 같이 IEEE802_15_4Frame 에 목적지 주소 및 보낼 데이터를 채우고 send() 를 호출하여야 합니다. 전송이 완료된 후, onSendDone() 에 의해 설정된 콜백이 호출됩니다.
프레임을 수신하기 위해서는 onReceive() 로 콜백을 설정하면 됩니다. 수신시 해당 콜백이 호출되면 프레임을 읽으면 됩니다.
| void LPPMac::begin | ( | PacketRadioChip & | chip, | 
| uint16_t | panId, | ||
| uint16_t | nodeId, | ||
| const uint8_t * | eui64 | ||
| ) | 
프로토콜을 초기화합니다.
| chip | LPP를 사용할 칩 | 
| panId | IEEE 802.15.4-호환 PAN ID | 
| nodeId | IEEE 802.15.4-호환 short address | 
| eui64 | IEEE 802.15.4-호환 EUI-64 | 
| void LPPMac::enableReceiveInterPANFrame | ( | bool | enable | ) | 
타 PAN으로부터의 프레임 수신을 허용합니다.
| enable | 허용여부 | 
| void LPPMac::onReceiveProbe | ( | void(*)(uint16_t panId, const uint8_t *eui64, uint16_t shortId, int16_t rssi, const uint8_t *payload, uint8_t payloadLen, uint32_t channel) | func | ) | 
Probe 수신시 콜백함수를 지정합니다.
| func | 콜백함수의 포인터 | 
| void LPPMac::setDefaultChannel | ( | uint32_t | channel | ) | 
기본 채널을 변경합니다.
| channel | 사용할 채널 (단위: Hz) | 
| void LPPMac::setPanId | ( | uint16_t | panId | ) | 
PAN ID를 설정합니다.
| panId | IEEE 802.15.4-호환 PAN ID | 
| void LPPMac::setProbePayload | ( | const uint8_t * | payload, | 
| uint8_t | len | ||
| ) | 
Probe 메시지에 추가로 보낼 페이로드 데이터를 설정합니다.
| payload | 추가 페이로드 데이터 포인터 | 
| len | 추가 페이로드 길이. 31-byte 를 초과할 수 없으며, 초과하는 경우 31-byte 까지만 전송됩니다. | 
| void LPPMac::setRadioAlwaysOn | ( | bool | alwaysOn | ) | 
Idle 상태에서도 무선을 사용하도록 설정합니다.
| alwaysOn | true 이면 저전력 상태로 진입하지 않습니다. false 이면, 보통의 상태로 동작합니다. | 
| void LPPMac::setUseSITFirst | ( | bool | use | ) | 
프레임을 전송하기 위해 listen을 시작하기 전에 Sender-Initiated-Transmission를 수행합니다.
LPP의 Receiver-Initiated-Transmission에 따른 전송 지연을 완화하기 위한 옵션입니다. 상대방이 setRadioAlwaysOn(true) 인 경우 listen을 생략하고 바로 전송을 시도하기 때문에 지연이 최소화됩니다. 상대방이 setRadioAlwaysOn(false) 인 경우 SIT는 실패하고 listen을 계속합니다.
| void LPPMac::stop | ( | ) | 
LPP 동작을 중단합니다.
주기적인 probe는 전송되지 않고 무선 칩은 저전력 상태를 유지합니다. 다시 계속하려면 resume() 을 호출합니다.