Nol.A SDK Library
24.7.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() 을 호출합니다.