Nol.A SDK Library
24.11.0
For IoT System Software Development
|
Double-Sided Two-Way Ranging: TDoA 기반으로 거리를 측정할 수 있는 저전력 MAC 프로토콜 More...
#include <DSTWRanging.hpp>
Public Member Functions | |
DSTWRanging (PacketRadioChip &chip) | |
void | begin (uint16_t panId, const uint8_t *eui64, uint16_t shortId) |
void | onSendDone (void(*sendDoneHandler)(void *, IEEE802_15_4Frame *frame, int64_t tof), void *ctx) |
void | onSendDone (void(*sendDoneHandler)(IEEE802_15_4Mac &radio, IEEE802_15_4Frame *frame, int64_t tof)) |
void | onSendDone (void(*sendDoneHandler)(IEEE802_15_4Mac &radio, IEEE802_15_4Frame *frame)) |
void | onReceiveProbe (void(*func)(uint16_t panId, const uint8_t *eui64, uint16_t shortId)) |
void | onReceive (void(*func)(IEEE802_15_4Mac &radio, const IEEE802_15_4Frame *frame)) |
void | onReceive (void(*func)(IEEE802_15_4Mac &radio, const IEEE802_15_4Frame *frame, int64_t tof)) |
void | setProbePeriod (uint16_t msec) |
Probe 전송 주기를 설정합니다. | |
void | setListenTimeout (uint16_t msec) |
Probe를 기다릴 시간을 설정합니다. | |
void | setDataWaitTimeout (uint16_t msec) |
Probe 전송 후, data 수신까지 기다릴 시간을 설정합니다. | |
void | setAckWaitTimeout (uint16_t msec) |
Data를 보내고 Ack 수신까지 기다릴 시간을 설정합니다. | |
void | scan () |
void | stopScanning () |
bool | isScanning () |
void | requestToF (bool) |
uint16_t | getPanID () |
virtual bool | acceptsProbeForBroadcast (IEEE802_15_4Address &src, const uint8_t *userMessage, uint8_t userMessageLength) |
void | setProbePayload (const uint8_t *payload, uint8_t len) |
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... | |
Protected Member Functions | |
bool | checkTxFrame (IEEE802_15_4Frame *frame) |
void | handleRxFrame (IEEE802_15_4Frame *frame) |
void | notifySendDone (RadioPacket *frame) |
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 | 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... | |
Additional Inherited Members | |
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 inherited from IEEE802_15_4Mac | |
bool | useForceNoAckRequest = false |
전송할 프레임에 대해 강제로 Ack를 요청하지 않게 합니다. More... | |
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 Attributes inherited from PacketRadio | |
Queue< RadioPacket * > | txFifo |
Queue< RadioPacket * > | rxFifo |
Queue< RadioPacket * > | txDoneFifo |
void(* | callbackSendDone )(PacketRadio &, RadioPacket *) |
void(* | callbackReceive )(PacketRadio &, const RadioPacket *) |
PacketRadioEventListener * | eventListener |
Double-Sided Two-Way Ranging: TDoA 기반으로 거리를 측정할 수 있는 저전력 MAC 프로토콜
LPPMac 을 기반으로 하되 The implementation of two-way ranging with the DW1000 (Version 2.3, APS013)를 참고하여 구현하였습니다.
DW1000 같은 timestamp 기능이 있는 PacketRadioChip 에서 사용이 가능합니다만 현재는 DW1000에서만 테스트 되었습니다.
메시지는 Probe, Data, Ack, Ack-ToF 등 총 4가지 입니다.
Probe는 장치가 자신의 존재를 알리기 위한 메시지로 Probe Period 주기로 broadcast 합니다. Probe period 시간은 setProbePeriod() 으로 설정 가능합니다.
Source는 메시지 전송 또는 거리 측정이 필요할 때 일어나서 send() 를 호출하면 Listen 시간동안 Probe를 찾습니다. Listen 시간은 setListenTimeout() 으로 설정 가능합니다.
자신이 보낼 주소의 probe를 받은 경우 data를 전송합니다. 이 때 source에서는 tProbeReceived 값을 기억해둡니다.
Destination은 매 probe 전송시마다 Data Wait 시간을 대기하여 data를 기다립니다. Data wait 시간은 setDataWaitTimeout() 으로 설정 가능합니다. 이 시간 내에 data가 수신되면 tDataReceived 시간과 tAckSent 시간을 Ack에 담아 응답합니다.
Data를 보낸 source는 Ack Wait 시간동안 Ack를 기다립니다. Ack Wait 시간은 setAckWaitTimeout() 으로 설정 가능합니다. Ack를 수신하면 다음 공식으로 Time of Flight를 계산합니다.