bool XBeeMACLayer::receive(uip_lladdr_t* lladdr_src, uip_lladdr_t* lladdr_dest, uint8_t* data, uint16_t* length){ xbee.readPacket(); if (xbee.getResponse().isAvailable()) { // got something if (xbee.getResponse().getApiId() == RX_16_RESPONSE || xbee.getResponse().getApiId() == RX_64_RESPONSE) { // got a rx packet if (xbee.getResponse().getApiId() == RX_16_RESPONSE) { if (UIP_LLADDR_LEN == UIP_802154_SHORTADDR_LEN){ Rx16Response rx16 = Rx16Response(); xbee.getResponse().getRx16Response(rx16); memcpy(data, rx16.getData(), rx16.getDataLength()); *length = rx16.getDataLength(); //get the src and destination addresses if(rx16.getOption() == ZB_BROADCAST_PACKET){ //Then packet was a broadcast.. destination address is 0xFFFF, we use an all-zeroes address to represent broadcast lladdr_dest->addr[0] = 0; // Copy all-zeroes address to lladdr_dest lladdr_dest->addr[1] = 0; //lladdr_dest = NULL; }else{ //get dest address (it is my own) //lladdr_dest = &my_mac; lladdr_dest->addr[0] = my_mac.addr[0]; // Copy my_mac address to lladdr_dest lladdr_dest->addr[1] = my_mac.addr[1]; } lladdr_src->addr[0] = rxResp.getRemoteAddress16() >> 8; lladdr_src->addr[1] = rxResp.getRemoteAddress16() & 0x00FF; }else return false; } else { if (UIP_LLADDR_LEN == UIP_802154_LONGADDR_LEN){
void printResponseCb(ZBRxResponse& rx, uintptr_t data) { Print *p = (Print*)data; p->println(F("ZBRxResponse received:")); printField(p, F(" From: 0x"), rx.getRemoteAddress64()); printField(p, F(" From: 0x"), rx.getRemoteAddress16()); printField(p, F(" Receive options: 0x"), rx.getOption()); if (rx.getDataLength() > 8) p->print(" Payload:\r\n "); else p->print(" Payload: "); printHex(*p, rx.getFrameData() + rx.getDataOffset(), rx.getDataLength(), F(" "), F("\r\n "), 8); p->println(); }