update mqttd, add ID match support
| | |
| | | |
| | | if( !conf_file ) |
| | | { |
| | | strncpy(ctx->id, "\"rpi3b001\"", sizeof(ctx->id)); |
| | | |
| | | /* logger settings */ |
| | | strncpy(ctx->logfile, DBG_LOG_FILE, sizeof(ctx->logfile)); |
| | |
| | | log_nrml("Logger system initialise ok\n"); |
| | | |
| | | |
| | | /*+------------------------------------------------------+ |
| | | *| parser production ID | |
| | | *+------------------------------------------------------+*/ |
| | | |
| | | if( !(str=iniparser_getstring(ini, "common:id", NULL)) ) |
| | | { |
| | | log_err("ERROR: Parser production ID failure\n"); |
| | | return -2; |
| | | } |
| | | /* cJSON parser ID will get "" */ |
| | | snprintf(ctx->id, sizeof(ctx->id), "\"%s\"", str); |
| | | log_nrml("Parser production ID [%s]\n", ctx->id); |
| | | |
| | | |
| | | /*+------------------------------------------------------+ |
| | | *| parser broker settings | |
| | |
| | | |
| | | typedef struct mqtt_ctx_s |
| | | { |
| | | char id[32]; /* production ID */ |
| | | |
| | | /* logger settings */ |
| | | char logfile[128]; /* logger record file */ |
| | | int loglevel; /* logger level */ |
| | |
| | | [common] |
| | | id="rpi3b001" |
| | | |
| | | [logger] |
| | | |
| | |
| | | |
| | | memset(msg, 0, sizeof(msg)); |
| | | if( ds18b20_get_temperature(&temp) < 0 ) |
| | | strncpy(msg, "{ \"temp\":\"error\" }", sizeof(msg)); |
| | | snprintf(msg, sizeof(msg), "{ \"id\":%s, \"temp\":\"error\" }", ctx->id); |
| | | else |
| | | snprintf(msg, sizeof(msg), "{ \"temp\":\"%.2f\" }", temp); |
| | | snprintf(msg, sizeof(msg), "{ \"id\":%s, \"temp\":\"%.2f\" }", ctx->id, temp); |
| | | |
| | | rv = mosquitto_publish(mosq, NULL, ctx->pubTopic, strlen(msg)+1, msg, ctx->pubQos, retain); |
| | | if( rv ) |
| | |
| | | |
| | | void sub_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) |
| | | { |
| | | cJSON *root = NULL; |
| | | char *out; |
| | | mqtt_ctx_t *ctx = (mqtt_ctx_t *)userdata; |
| | | |
| | | cJSON *root = NULL; |
| | | cJSON *item; |
| | | char *value; |
| | | |
| | | |
| | | if ( !message->payloadlen ) |
| | |
| | | return ; |
| | | } |
| | | |
| | | log_nrml("Subscriber receive message: '%s'\n", message->payload); |
| | | log_dbg("Subscriber receive message: '%s'\n", message->payload); |
| | | |
| | | root = cJSON_Parse(message->payload); |
| | | if( !root ) |
| | |
| | | return ; |
| | | } |
| | | |
| | | item = cJSON_GetObjectItem(root, "id"); |
| | | if( !item ) |
| | | { |
| | | log_err("cJSON_Parse get ID failure: %s\n", cJSON_GetErrorPtr()); |
| | | goto OUT; |
| | | } |
| | | |
| | | value = cJSON_PrintUnformatted(item); |
| | | if( strcasecmp(value, ctx->id) ) |
| | | { |
| | | free(value); |
| | | goto OUT; |
| | | } |
| | | |
| | | free(value); |
| | | log_nrml("Subscriber receive message: '%s'\n", message->payload); |
| | | |
| | | proc_json_items(root); |
| | | |
| | | OUT: |
| | | cJSON_Delete(root); /* must delete it, or it will result memory leak */ |
| | | return ; |
| | | } |