#ifdef shell gcc -o ${0//.c/} $0 -lxbee exit } #endif /* libxbee - a C library to aid the use of Digi's Series 1 XBee modules running in API mode (AP=2). Copyright (C) 2009 Attie Grande (attie@attie.co.uk) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* this sample will scan the currently configured channel for all nodes, returning the values of a few useful settings */ #include #include #include #include #include #include #define MAXNODES 100 int main(int argc, char *argv[]) { int i; int saidfull = 0; int ATNT = 0x19; /* node discover timeout */ int ATNTc; /* counter */ int nodes = 0; char addrs[MAXNODES][8]; xbee_con *con; xbee_pkt *pkt, *rpkt; time_t ttime; char stime[32]; /* setup libxbee */ if (xbee_setup("/dev/ttyUSB0",57600) == -1) { return 1; } /* grab a local AT connection */ con = xbee_newcon('I',xbee_localAT); /* get the ND timeout */ xbee_senddata(con,"NT"); if ((rpkt = xbee_getpacketwait(con)) == NULL) { printf("XBee didnt return a result for NT\n"); return 1; } ATNT = rpkt->data[0]; free(rpkt); while (1) { /* send a ND - Node Discover request */ xbee_senddata(con,"ND"); /* only wait for a bit longer than the ND timeout */ ATNTc = ATNT + 10; /* loop until the end packet has been received or timeout reached */ while (ATNTc--) { /* get a packet */ pkt = xbee_getpacketwait(con); /* check a packet was returned, and that its one we are after... */ if (pkt && !memcmp(pkt->atCmd,"ND",2)) { /* is this the end packet? you can tell from the 0 datalen */ if (pkt->datalen == 0) { /* free the packet */ free(pkt); break; } else { /* check if we know this node already */ for (i = 0; i < nodes; i++) { /* the 64bit address will match one in the list */ if (!memcmp(&(pkt->data[2]),&(addrs[i]),8)) break; } ttime = time(NULL); strftime(stime,32,"%I:%M:%S %p",gmtime(&ttime)); /* is there space for another? */ if ((i == nodes) && (nodes == MAXNODES) && (!saidfull)) { printf("MAXNODES reached... Can't add more...\r"); /* flush so the change is seen! */ fflush(stdout); saidfull = 1; } else { /* is this a rewrite? */ if (i != nodes) { /* find the line to edit */ printf("%c[%dA",27,nodes-i); /* clear the line */ printf("%c[2K",27); } /* write out the info */ memcpy(&(addrs[nodes]),&(pkt->data[2]),8); printf("MY: 0x%02X%02X ",pkt->data[0],pkt->data[1]); printf("SH: 0x%02X%02X%02X%02X ",pkt->data[2],pkt->data[3],pkt->data[4],pkt->data[5]); printf("SL: 0x%02X%02X%02X%02X ",pkt->data[6],pkt->data[7],pkt->data[8],pkt->data[9]); printf("dB: -%2d ",pkt->data[10]); printf("NI: %-20s ",&(pkt->data[11])); printf("@: %s",stime); /* is this a rewrite? */ if (i != nodes) { /* go back the the bottom */ printf("%c[%dB\r",27,nodes-i); } else { /* new line is only wanted for new nodes */ printf("\n"); /* if not, then add 1 to the number of nodes! */ nodes++; } } /* flush so the change is seen! */ fflush(stdout); } /* free the packet */ free(pkt); } /* sleep for 100ms (same as NT steps) */ usleep(100000); } /* try again! */ usleep(100000); } return 0; }