Nol.A SDK Library  24.11.0
For IoT System Software Development
Public Member Functions | Protected Member Functions | List of all members
DSTWRanging Class Reference

Double-Sided Two-Way Ranging: TDoA 기반으로 거리를 측정할 수 있는 저전력 MAC 프로토콜 More...

#include <DSTWRanging.hpp>

Inheritance diagram for DSTWRanging:
IEEE802_15_4Mac PacketRadio

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_4FramegetNextTxFrame ()
 
- Protected Member Functions inherited from PacketRadio
virtual void sendDone (RadioPacket *frame, RadioPacket::Result_t)
 
virtual void receive (RadioPacket *frame)
 
RadioPacketgetNextTxFrame ()
 
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 *)
 
PacketRadioEventListenereventListener
 

Detailed Description

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를 계산합니다.

\[ R_a = t_{DataReceived} - t_{ProbeSent} \]

\[ R_b = t_{AckReceived} - t_{DataSent} \]

\[ D_a = t_{DataSent} - t_{ProbeReceived} \]

\[ D_b = t_{AckSent} - t_{DataReceived} \]

\[ ToF = \frac{R_a * R_b - D_a * D_b}{R_a + R_b + D_a + D_b} \]


The documentation for this class was generated from the following file: