/* Init kmsg input */ int in_xbee_init(struct flb_config *config) { int ret; int opt_baudrate = 9600; char *tmp; char *opt_device = FLB_XBEE_DEFAULT_DEVICE; struct stat dev_st; struct xbee *xbee; struct xbee_con *con; struct xbee_conAddress address; struct flb_in_xbee_config *ctx; /* Check an optional baudrate */ tmp = getenv("FLB_XBEE_BAUDRATE"); if (tmp) { opt_baudrate = atoi(tmp); } /* Get the target device entry */ tmp = getenv("FLB_XBEE_DEVICE"); if (tmp) { opt_device = strdup(tmp); } flb_info("XBee device=%s, baudrate=%i", opt_device, opt_baudrate); ret = stat(opt_device, &dev_st); if (ret < 0) { printf("Error: could not open %s device\n", opt_device); exit(EXIT_FAILURE); } if (!S_ISCHR(dev_st.st_mode)) { printf("Error: invalid device %s \n", opt_device); exit(EXIT_FAILURE); } if (access(opt_device, R_OK | W_OK) == -1) { printf("Error: cannot open the device %s (permission denied ?)\n", opt_device); exit(EXIT_FAILURE); } /* Init library */ xbee_init(); ret = xbee_setup(&xbee, "xbeeZB", opt_device, opt_baudrate); if (ret != XBEE_ENONE) { flb_utils_error_c("xbee_setup"); return ret; } /* FIXME: just a built-in example */ memset(&address, 0, sizeof(address)); address.addr64_enabled = 1; address.addr64[0] = 0x00; address.addr64[1] = 0x13; address.addr64[2] = 0xA2; address.addr64[3] = 0x00; address.addr64[4] = 0x40; address.addr64[5] = 0xB7; address.addr64[6] = 0xB1; address.addr64[7] = 0xEB; /* Prepare a connection with the peer XBee */ 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; } /* Prepare the configuration context */ ctx = calloc(1, sizeof(struct flb_in_xbee_config)); if (!ctx) { perror("calloc"); return -1; } ctx->device = opt_device; ctx->baudrate = opt_baudrate; ctx->con = con; ctx->buffer_len = 0; if ((ret = xbee_conDataSet(con, ctx, NULL)) != XBEE_ENONE) { xbee_log(xbee, -1, "xbee_conDataSet() returned: %d", ret); return ret; } if ((ret = xbee_conCallbackSet(con, in_xbee_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"); } /* * Set our collector based on time. We will trigger a collection at certain * intervals. For now it works but it's not the ideal implementation. I am * talking with libxbee maintainer to check possible workarounds and use * proper events mechanism. */ ret = flb_input_set_collector_time("xbee", in_xbee_collect, IN_XBEE_COLLECT_SEC, IN_XBEE_COLLECT_NSEC, config); if (ret == -1) { flb_utils_error_c("Could not set collector for xbee input plugin"); } return 0; }
/* 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; }