int main(void) { void *d; struct xbee *xbee; struct xbee_con *con; struct xbee_conAddress address; struct xbee_conSettings settings; xbee_err ret; if ((ret = xbee_setup(&xbee, "xbee2", "/dev/ttyUSB1", 57600)) != XBEE_ENONE) { printf("ret: %d (%s)\n", ret, xbee_errorToStr(ret)); return ret; } memset(&address, 0, sizeof(address)); address.addr64_enabled = 1; address.addr64[0] = 0x00; address.addr64[1] = 0x00; address.addr64[2] = 0x00; address.addr64[3] = 0x00; address.addr64[4] = 0x00; address.addr64[5] = 0x00; address.addr64[6] = 0xFF; address.addr64[7] = 0xFF; if ((ret = xbee_conNew(xbee, &con, "Data", &address)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conNew() returned: %d (%s)", ret, xbee_errorToStr(ret)); return ret; } if ((ret = xbee_conCallbackSet(con, myCB, NULL)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conCallbackSet() returned: %d", ret); return ret; } /* getting an ACK for a broadcast message is kinda pointless... */ xbee_conSettings(con, NULL, &settings); settings.disableAck = 1; xbee_conSettings(con, &settings, NULL); for (;;) { xbee_conTx(con, NULL, "Hello...\r\n"); /* you probrably don't want to transmit much quicker than once per 2 seconds... read the datashee for more info */ sleep(2); } if ((ret = xbee_conEnd(con)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conEnd() returned: %d", ret); return ret; } xbee_shutdown(xbee); return 0; }
int main(void) { void *d; struct xbee *xbee; struct xbee_con *con; struct xbee_conAddress address; struct xbee_conSettings settings; xbee_err ret; if ((ret = xbee_setup(&xbee, "xbee1", "/dev/ttyUSB0", 57600)) != XBEE_ENONE) { printf("ret: %d (%s)\n", ret, xbee_errorToStr(ret)); return ret; } memset(&address, 0, sizeof(address)); address.addr64_enabled = 1; address.addr64[0] = 0x00; address.addr64[1] = 0x00; address.addr64[2] = 0x00; address.addr64[3] = 0x00; address.addr64[4] = 0x00; address.addr64[5] = 0x00; address.addr64[6] = 0xFF; address.addr64[7] = 0xFF; if ((ret = xbee_conNew(xbee, &con, "64-bit Data", &address)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conNew() returned: %d (%s)", ret, xbee_errorToStr(ret)); return ret; } xbee_conSettings(con, NULL, &settings); settings.catchAll = 1; xbee_conSettings(con, &settings, NULL); if ((ret = xbee_conCallbackSet(con, catchallCB, NULL)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conCallbackSet() returned: %d", ret); return ret; } printf("Ready!... waiting for 30 secs\n"); usleep(30000000); if ((ret = xbee_conEnd(con)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conEnd() returned: %d", ret); return ret; } xbee_shutdown(xbee); return 0; }
void config_load(FILE *f, struct xbee_con *con, int write) { char *buf; int bufLen; char *p, *q; int a, b; unsigned char val; xbee_err ret; struct xbee_pkt *pkt; unsigned char retVal; struct xbee_conSettings settings; if (xbee_conSettings(con, NULL, &settings) != XBEE_ENONE) return; settings.queueChanges = 1; if (xbee_conSettings(con, &settings, NULL) != XBEE_ENONE) return; buf = NULL; bufLen = 0; while (!feof(f)) { if (getline(&buf, &bufLen, f) == -1) { if (feof(f)) break; fprintf(stderr, "\ngetline(): unknown error...\n"); exit(1); } if (buf[0] == '#') continue; for (a = 0; achars[a]; a++) { if (achars[a] == buf[0]) break; } if (!achars[a]) goto skip; for (b = 0; bchars[b]; b++) { if (bchars[b] == buf[1]) break; } if (!bchars[b]) goto skip; p = &(buf[2]); q = strchr(p, '='); *q = '\0'; q++; while (*q != '\0' && *q != '\n') { while (*q == ' ') { q++; } if (sscanf(q, "0x%02hhX", &val) != 1) { fprintf(stderr, "\nInvalid parameters for %c%c\n", buf[0], buf[1]); exit(1); } q += 4; *p = val; if (p != &(buf[2]) || val != 0) p++; } if (p == &(buf[2])) p++; fprintf(stderr, "\r%c%c...", buf[0], buf[1]); fflush(stderr); if ((ret = xbee_conPurge(con)) != XBEE_ENONE) { fprintf(stderr, "\nxbee_conPurge(): %d - %s\n", ret, xbee_errorToStr(ret)); exit(1); } if ((ret = xbee_connTx(con, &retVal, buf, p - buf + 1)) != XBEE_ENONE && ret != XBEE_ETX) { fprintf(stderr, "\nxbee_conTx(): %d - %s\n", ret, xbee_errorToStr(ret)); exit(1); } if (retVal != 0) { fprintf(stderr, "\nError sending command: %c%c - %hhd\n", buf[0], buf[1], retVal); //exit(1); } continue; skip: fprintf(stderr, "\nSkipping invalid command: %c%c\n", buf[0], buf[1]); } if (buf) free(buf); if (xbee_conSettings(con, NULL, &settings) != XBEE_ENONE) return; settings.queueChanges = 0; if (xbee_conSettings(con, &settings, NULL) != XBEE_ENONE) return; xbee_conTx(con, NULL, "AC"); if (write) xbee_conTx(con, NULL, "WR"); }
/* Init xbee input */ int in_xbee_init(struct flb_config *config, void *data) { int ret; struct stat dev_st; struct xbee *xbee; struct xbee_conAddress address; struct flb_in_xbee_config *ctx; struct xbee_conSettings settings; (void) data; /* Prepare the configuration context */ ctx = calloc(1, sizeof(struct flb_in_xbee_config)); if (!ctx) { perror("calloc"); return -1; } if (!config->file) { flb_utils_error_c("XBee input plugin needs configuration file"); return -1; } xbee_config_read(ctx, config->file); /* initialize MessagePack buffers */ msgpack_sbuffer_init(&ctx->mp_sbuf); msgpack_packer_init(&ctx->mp_pck, &ctx->mp_sbuf, msgpack_sbuffer_write); flb_info("XBee device=%s, baudrate=%i", ctx->file, ctx->baudrate); ret = stat(ctx->file, &dev_st); if (ret < 0) { printf("Error: could not open %s device\n", ctx->file); free(ctx->file); exit(EXIT_FAILURE); } if (!S_ISCHR(dev_st.st_mode)) { printf("Error: invalid device %s \n", ctx->file); free(ctx->file); exit(EXIT_FAILURE); } if (access(ctx->file, R_OK | W_OK) == -1) { printf("Error: cannot open the device %s (permission denied ?)\n", ctx->file); free(ctx->file); exit(EXIT_FAILURE); } ctx->config = config; pthread_mutex_init(&ctx->mtx_mp, NULL); ctx->buffer_len = 0; /* Init library */ xbee_init(); ret = xbee_setup(&xbee, ctx->xbeeMode, ctx->file, ctx->baudrate); if (ret != XBEE_ENONE) { flb_utils_error_c("xbee_setup"); return ret; } /* 000000000000FFFF: broadcast address */ memset(&address, 0, sizeof(address)); address.addr64_enabled = 1; address.addr64[0] = 0x00; address.addr64[1] = 0x00; address.addr64[2] = 0x00; address.addr64[3] = 0x00; address.addr64[4] = 0x00; address.addr64[5] = 0x00; address.addr64[6] = 0xFF; address.addr64[7] = 0xFF; if (ctx->xbeeLogLevel >= 0) xbee_logLevelSet(xbee, ctx->xbeeLogLevel); /* Prepare a connection with the peer XBee */ if ((ret = xbee_conNew(xbee, &ctx->con_data, "Data", &address)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conNew() returned: %d (%s)", ret, xbee_errorToStr(ret)); return ret; } xbee_conSettings(ctx->con_data, NULL, &settings); settings.disableAck = ctx->xbeeDisableAck ? 1 : 0; settings.catchAll = ctx->xbeeCatchAll ? 1 : 0; xbee_conSettings(ctx->con_data, &settings, NULL); if ((ret = xbee_conDataSet(ctx->con_data, ctx, NULL)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conDataSet() returned: %d", ret); return ret; } if ((ret = xbee_conCallbackSet(ctx->con_data, in_xbee_cb, NULL)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conCallbackSet() returned: %d", ret); return ret; } if ((ret = xbee_conNew(xbee, &ctx->con_io, "I/O", &address)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conNew() returned: %d (%s)", ret, xbee_errorToStr(ret)); return ret; } xbee_conSettings(ctx->con_io, NULL, &settings); settings.disableAck = ctx->xbeeDisableAck ? 1 : 0; settings.catchAll = ctx->xbeeCatchAll ? 1 : 0; xbee_conSettings(ctx->con_io, &settings, NULL); if ((ret = xbee_conDataSet(ctx->con_io, ctx, NULL)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conDataSet() returned: %d", ret); return ret; } if ((ret = xbee_conCallbackSet(ctx->con_io, in_xbee_iosampling_cb, NULL)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conCallbackSet() returned: %d", ret); return ret; } /* Set the context */ ret = flb_input_set_context("xbee", ctx, config); if (ret == -1) { flb_utils_error_c("Could not set configuration for xbee input plugin"); } return 0; }