From 0738d2f6c9e2aa1fa7989d0f28704e491ea2c7f2 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Wed, 26 Jun 2019 13:03:36 +0800 Subject: [PATCH] update mqttd main.c --- pj1_mqttd/main.c | 131 ++++++++++++++++++++++++++++++++----------- 1 files changed, 98 insertions(+), 33 deletions(-) diff --git a/pj1_mqttd/main.c b/pj1_mqttd/main.c index 4311727..1939839 100644 --- a/pj1_mqttd/main.c +++ b/pj1_mqttd/main.c @@ -189,12 +189,76 @@ } +int turn_camera(char *status) +{ + FILE *fp = NULL; + char buf[256]; + int pid; + int running; + char cmd[256]; + + + /* use lsusb command check Logic C920 camera exist or not */ + fp = popen("lsusb | grep -v grep | grep C920", "r"); + if( !fp ) + { + log_err("popen to check C920 failure: %s\n", strerror(errno)); + return -1; + } + + memset(buf, 0, sizeof(buf)); + fgets(buf, sizeof(buf), fp); + if( !strstr(buf, "C920") ) + { + log_err("Logic C920 camera not exist\n"); + return -2; + } + log_nrml("Logic C920 camera exist\n"); + + + fp=popen("ps aux | grep mjpg_streamer | grep -v grep | awk '{print $2}'", "r"); + if( !fp ) + { + log_err("popen to check mjpg_streamer failure: %s\n", strerror(errno)); + return -1; + } + + memset(buf, 0, sizeof(buf)); + fgets(buf, sizeof(buf), fp); + + pid = atoi(buf); + if( pid > 1 ) + { + log_nrml("mjpg_streamer already working as pid[%d] now\n", pid); + running = 1; + } + else + { + log_nrml("mjpg_streamer not running now\n"); + running = 0; + } + + if( running && strcasestr(status, "off") ) + { + log_warn("Stop mjpg_streamer working on C920 now\n"); + system("/bin/video stop"); + return 0; + } + + if( !running && strcasestr(status, "on") ) + { + log_nrml("Start mjpg_streamer working on C920 now\n"); + system("/bin/video start"); + } + + return 0; +} + void proc_json_items(cJSON *root) { int i; + cJSON *item; char *value; - cJSON *item; - cJSON *array; if( !root ) { @@ -202,43 +266,26 @@ return ; } - for( i=0; i<cJSON_GetArraySize(root); i++ ) + item = cJSON_GetObjectItem(root, "camera"); + if( !item ) { - item = cJSON_GetArrayItem(root, i); - if( !item ) - break; - - /* if item is cJSON_Object, then recursive call proc_json */ - if( cJSON_Object == item->type ) - { - proc_json_items(item); - } - else if( cJSON_Array == item->type ) - { - /* Logic C920 camera control */ - if( !strcasecmp(item->string, "camera") ) - { - array = cJSON_GetArrayItem(item, 0); - if( NULL != array ) - { - cJSON *led_item; - - if( NULL != (led_item=cJSON_GetObjectItem(array , "C920")) ) - { - log_nrml("turn Logic C920 camera '%s'\n", led_item->valuestring); - } - } - } - } + log_err("cJSON_Parse get camera failure: %s\n", cJSON_GetErrorPtr()); + return ; } + value = cJSON_PrintUnformatted(item); + + turn_camera(value); + + free(value); } 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 ) { @@ -246,7 +293,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 ) @@ -255,8 +302,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