int ICACHE_FLASH_ATTR http_relay_api_toggle(http_connection *c) { NODE_DBG("http_wifi_api_get_status"); //wait for whole body if(c->state <HTTPD_STATE_BODY_END) return HTTPD_CGI_MORE; int ret = json_count_token(c->body.data,c->body.len); jsonPair fields[1]={ { .key="relay", .value=NULL } }; if(json_parse(&fields[0],1,c->body.data,c->body.len)){ int relayNumber = atoi(fields[0].value); if(relayNumber<0 || relayNumber >=relay_count()){ http_response_BAD_REQUEST(c); NODE_DBG("Wrong relay"); return HTTPD_CGI_DONE; } unsigned status = relay_get_state(relayNumber); status = relay_toggle_state(relayNumber); //write headers http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE); http_response_OK(c); write_json_object_start(c); write_json_pair_int(c,"relay",relayNumber); write_json_list_separator(c); write_json_pair_int(c,"state",status); write_json_object_end(c); return HTTPD_CGI_DONE; } else{ http_response_BAD_REQUEST(c); return HTTPD_CGI_DONE; } http_response_BAD_REQUEST(c); return HTTPD_CGI_DONE; }
int ICACHE_FLASH_ATTR http_relay_api_toggle(http_connection *c) { NODE_DBG("http_wifi_api_get_status"); //wait for whole body if(c->state <HTTPD_STATE_BODY_END) return HTTPD_CGI_MORE; //parse json cJSON * root = cJSON_Parse(c->body.data); if(root==NULL) goto badrequest; cJSON * relay = cJSON_GetObjectItem(root,"relay"); if(relay==NULL) goto badrequest; int relayNumber = relay->valueint; cJSON_Delete(root); if(relayNumber<0 || relayNumber >=relay_count()){ http_response_BAD_REQUEST(c); NODE_DBG("Wrong relay"); return HTTPD_CGI_DONE; } else{ //valid relay unsigned status = relay_get_state(relayNumber); status = relay_toggle_state(relayNumber); //write headers http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE); http_response_OK(c); //create json root = cJSON_CreateObject(); cJSON_AddNumberToObject(root,"relay",relayNumber); cJSON_AddNumberToObject(root,"state",status); http_write_json(c,root); //delete json struct cJSON_Delete(root); return HTTPD_CGI_DONE; } badrequest: http_response_BAD_REQUEST(c); return HTTPD_CGI_DONE; }
static void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len) { char *topicBuf = (char*)os_zalloc(topic_len+1), *dataBuf = (char*)os_zalloc(data_len+1); MQTT_Client* client = (MQTT_Client*)args; os_memcpy(topicBuf, topic, topic_len); topicBuf[topic_len] = 0; os_memcpy(dataBuf, data, data_len); dataBuf[data_len] = 0; MQTT_DBG("Receive topic: %s, data: %s ", topicBuf, dataBuf); os_free(topicBuf); os_free(dataBuf); // set relay int i; for(i=0;i<relay_count();i++){ mqtt_relay *r = &relays[i]; //compare topic if(os_strncmp(topic,r->topic,strlen(r->topic))==0){ MQTT_DBG("Topic 1st part match"); //check set suffix if(os_strncmp(topic+strlen(r->topic),MQTT_RELAY_SET_SUFIX,strlen(MQTT_RELAY_SET_SUFIX))==0) { MQTT_DBG("Topic 2nd part match"); int state = data[0] - '0'; if(state==0 || state == 1) { MQTT_DBG("Setting relay #%d to %d via MQTT", i, state); relay_set_state(i,state); break; } } } } }
int ICACHE_FLASH_ATTR http_relay_api_status(http_connection *c) { NODE_DBG("http_wifi_api_get_status"); //wait for whole body if(c->state <HTTPD_STATE_BODY_END) return HTTPD_CGI_MORE; //write headers http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE); http_response_OK(c); write_json_object_start(c); write_json_key(c,"relays"); write_json_object_separator(c); write_json_array_start(c); int i; for(i=0;i<relay_count();i++){ if(i>0) write_json_list_separator(c); write_json_object_start(c); write_json_pair_int(c,"relay",i); write_json_list_separator(c); write_json_pair_int(c,"state",relay_get_state(i)); write_json_object_end(c); } write_json_array_end(c); write_json_object_end(c); return HTTPD_CGI_DONE; }
static void mqttConnectedCb(uint32_t *args) { MQTT_Client* client = (MQTT_Client*)args; MQTT_DBG("MQTT: Connected"); int i; for(i=0;i<relay_count();i++){ char * setTopic = (char *)os_zalloc(strlen(relays[i].topic)+strlen(MQTT_RELAY_SET_SUFIX)+1); os_strcpy(setTopic,relays[i].topic); os_strcat(setTopic,MQTT_RELAY_SET_SUFIX); MQTT_Subscribe(client, setTopic, 1); os_free(setTopic); mqtt_relay_change_cb(i,-1); //force 1st publish } }
void ICACHE_FLASH_ATTR mqtt_app_init(){ //set relays int i; for(i=0;i<relay_count();i++){ relays[i].id=i; os_strcpy(relays[i].topic,"relay/"); os_strcat(relays[i].topic,SERIAL_NUMBER"/"); os_strcati(relays[i].topic,i); } //register listeners relay_register_listener(mqtt_relay_change_cb); MQTT_InitConnection(&mqtt_client, MQTT_SERVER_IP, 1883, 0); MQTT_InitClient(&mqtt_client, SERIAL_NUMBER, NULL, NULL, 120, 1); MQTT_OnConnected(&mqtt_client, mqttConnectedCb); MQTT_OnDisconnected(&mqtt_client, mqttDisconnectedCb); MQTT_OnPublished(&mqtt_client, mqttPublishedCb); MQTT_OnData(&mqtt_client, mqttDataCb); //arm mqtt timer os_memset(&mqtt_timer,0,sizeof(os_timer_t)); os_timer_disarm(&mqtt_timer); os_timer_setfn(&mqtt_timer, (os_timer_func_t *)mqtt_app_timer_cb, NULL); os_timer_arm(&mqtt_timer, 2000, 1); //arm sensor read timer os_memset(&sensor_read_timer,0,sizeof(os_timer_t)); os_timer_disarm(&sensor_read_timer); os_timer_setfn(&sensor_read_timer, (os_timer_func_t *)sensor_read_timer_cb, NULL); os_timer_arm(&sensor_read_timer, 5000, 1); }
int ICACHE_FLASH_ATTR http_relay_api_status(http_connection *c) { NODE_DBG("http_wifi_api_get_status"); //wait for whole body if(c->state <HTTPD_STATE_BODY_END) return HTTPD_CGI_MORE; //write headers http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE); http_response_OK(c); cJSON *root, *relays, *fld; root = cJSON_CreateObject(); cJSON_AddItemToObject(root, "relays", relays = cJSON_CreateArray()); int i; for(i=0;i<relay_count();i++){ cJSON_AddItemToArray(relays,fld=cJSON_CreateObject()); cJSON_AddNumberToObject(fld,"relay",i); cJSON_AddNumberToObject(fld,"state",relay_get_state(i)); } http_write_json(c,root); //delete json struct cJSON_Delete(root); return HTTPD_CGI_DONE; }