From b64d6ff04401ed85fce543b8e20c8c360fb284f5 Mon Sep 17 00:00:00 2001 From: Guo Wenxue <guowenxue@gmail.com> Date: Thu, 27 Jun 2019 13:25:23 +0800 Subject: [PATCH] Update mqttd hal code, can control relay now --- mqttd/main.c | 65 +++++++++++++++++++++----------- 1 files changed, 42 insertions(+), 23 deletions(-) diff --git a/mqttd/main.c b/mqttd/main.c index c66d8c7..aa88835 100644 --- a/mqttd/main.c +++ b/mqttd/main.c @@ -109,15 +109,13 @@ return -2; } -#if 0 if( hal_init() < 0 ) { log_err("Initialise hardware failure\n"); return -1; } log_nrml("HAL initialise ok\n"); -#endif - + install_proc_signal(); if( check_set_program_running(daemon) < 0 ) @@ -191,9 +189,7 @@ mqtt_ctx_t *ctx = (mqtt_ctx_t *)userdata; int rv = 0; char msg[128]; - float temp = 25.64; - float rh = 65.35; - char light[] = "on"; + float temp = 0.0; int retain = 0; if( result ) @@ -205,25 +201,15 @@ log_nrml("Publisher connect to broker server[%s:%d] successfully\n", ctx->host, ctx->port); memset(msg, 0, sizeof(msg)); - snprintf(msg, sizeof(msg), "{ \"temp\":\"%.2f\", \"R&H\":\"%.2f%%\" }", temp, rh); + if( ds18b20_get_temperature(&temp) < 0 ) + snprintf(msg, sizeof(msg), "{ \"id\":%s, \"temp\":\"error\" }", ctx->id); + else + 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 ) { log_err("Publisher broadcast message '%s' failure: %d\n", msg, rv); - } - else - { - log_nrml("Publisher broadcast message '%s' ok\n", msg); - } - - memset(msg, 0, sizeof(msg)); - snprintf(msg, sizeof(msg), "{ \"light\":\"%s\" }", light); - - rv = mosquitto_publish(mosq, NULL, ctx->pubTopic, strlen(msg)+1, msg, ctx->pubQos, retain); - if( rv ) - { - log_err("Publisher broadcast message failure: %d\n", rv); } else { @@ -300,6 +286,13 @@ log_warn("Subscriber disconnect to broker server[%s:%d], reason=%d\n", ctx->host, ctx->port, result); } +static inline void mqtt_turn_led(int which, char *cmd) +{ + if( strcasestr(cmd, "on") ) + turn_led(which, ON); + else if( strcasestr(cmd, "off") ) + turn_led(which, OFF); +} void proc_json_items(cJSON *root) { @@ -338,16 +331,19 @@ if( NULL != (led_item=cJSON_GetObjectItem(array , "red")) ) { log_nrml("turn red led '%s'\n", led_item->valuestring); + mqtt_turn_led(LED_R, led_item->valuestring); } if( NULL != (led_item=cJSON_GetObjectItem(array , "green")) ) { log_nrml("turn green led '%s'\n", led_item->valuestring); + mqtt_turn_led(LED_G, led_item->valuestring); } if( NULL != (led_item=cJSON_GetObjectItem(array , "blue")) ) { log_nrml("turn blue led '%s'\n", led_item->valuestring); + mqtt_turn_led(LED_B, led_item->valuestring); } } } @@ -362,10 +358,12 @@ if( strcasestr(value, "on") ) { log_nrml("Turn light on\n"); + turn_relay(ON); } else if( strcasestr(value, "off") ) { log_nrml("Turn light off\n"); + turn_relay(OFF); } } @@ -390,8 +388,11 @@ 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 ) @@ -400,7 +401,7 @@ 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 ) @@ -409,8 +410,26 @@ 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 ; } -- Gitblit v1.9.1