/* FogCloud msg handle thread */ void user_cloud_msg_handle_thread(void* arg) { OSStatus err = kUnknownErr; fogcloud_msg_t *recv_msg = NULL; mico_fogcloud_msg_t mico_fog_msg; int retCode = MSG_PROP_UNPROCESSED; mico_Context_t *mico_context = (mico_Context_t *)arg; require_action(mico_context, exit, err=kParamErr); while(1){ mico_thread_msleep(100); // in case of while (1) err = MicoFogCloudMsgRecv(mico_context, &recv_msg, 0); if(kNoErr == err){ user_log("Msg recv: topic[%d]=[%.*s]\tdata[%d]=[%.*s]", recv_msg->topic_len, recv_msg->topic_len, recv_msg->data, recv_msg->data_len, recv_msg->data_len, recv_msg->data + recv_msg->topic_len); // msg structure format transfer mico_fog_msg.topic = (const char*)(recv_msg->data); mico_fog_msg.topic_len = recv_msg->topic_len; mico_fog_msg.data = recv_msg->data + recv_msg->topic_len; mico_fog_msg.data_len = recv_msg->data_len; err = mico_fogcloud_msg_dispatch(mico_context, service_table, &mico_fog_msg, &retCode); if(kNoErr != err){ user_log("ERROR: mico_cloudmsg_dispatch error, err=%d", err); } else{ } // NOTE: msg memory must be free after been used. if(NULL != recv_msg){ free(recv_msg); recv_msg = NULL; } } } exit: user_log("ERROR: user_cloud_msg_handle_thread exit with err=%d", err); return; }
/* Handle user message from cloud * Receive msg from cloud && do hardware operation */ void downstream_thread(void* arg) { user_log_trace(); OSStatus err = kUnknownErr; mico_Context_t *app_context = (mico_Context_t *)arg; fogcloud_msg_t *recv_msg = NULL; json_object *recv_json_object = NULL; require(app_context, exit); while(1) { mico_thread_sleep(1); if(!MicoFogCloudIsConnect(app_context)) { user_log("appStatus.fogcloudStatus.isCloudConnected = false"); //mico_thread_sleep(1); continue; } // recv_msg->data = <topic><data> err = MicoFogCloudMsgRecv(app_context, &recv_msg, 1000); user_log("err = %d", err); if(kNoErr == err){ user_log("Msg recv: topic[%d]=[%.*s]\tdata[%d]=[%.*s]", recv_msg->topic_len, recv_msg->topic_len, recv_msg->data, recv_msg->data_len, recv_msg->data_len, recv_msg->data + recv_msg->topic_len); recv_json_object = json_tokener_parse((const char*)recv_msg->data + recv_msg->topic_len); if(NULL != recv_json_object) { user_log("recv_json_object != NULL"); // parse json object char *key; struct json_object *val; struct lh_entry *entry; for(entry = json_object_get_object(recv_json_object)->head; \ (entry ? (key = (char*)entry->k, val = (struct json_object*)entry->v, entry) : 0); \ entry = entry->next) { if(!strcmp(key, "energy")){ SetEnergyValue(json_object_get_int(val)); } else if(!strcmp(key, "interval")) { SetIntervalValue(json_object_get_int(val)); } else if(!strcmp(key, "lights")) { SetLightsValue(json_object_get_int(val)); } else if(!strcmp(key, "remind")) { SetRemindValue(json_object_get_int(val)); } else if(!strcmp(key, "volume")) { SetVolumeValue(json_object_get_int(val)); } else if(!strcmp(key, "subscribe")) { subscribe = json_object_get_boolean(val); user_log("subscribe = %d", (int)subscribe); } else if(!strcmp(key, "track")) { //track = json_object_get_string(val); } else if(!strcmp(key, "url_path")) { //url_path = json_object_get_string(val); } } } // free memory of json object json_object_put(recv_json_object); recv_json_object = NULL; } // NOTE: must free msg memory after been used. if(NULL != recv_msg){ free(recv_msg); recv_msg = NULL; } } exit: if(kNoErr != err){ user_log("ERROR: downstream_thread_handle thread exit with err=%d", err); } mico_rtos_delete_thread(NULL); // delete current thread }