void ICACHE_FLASH_ATTR cmdMqttDataCb(MQTT_Client* client, const char* topic, uint32_t topic_len, const char* data, uint32_t data_len) { MqttCmdCb* cb = (MqttCmdCb*)client->user_data; DBG("MQTT: Data cb=%p topic=%s len=%u\n", (void*)cb->dataCb, topic, data_len); cmdResponseStart(CMD_RESP_CB, cb->dataCb, 2); cmdResponseBody(topic, topic_len); cmdResponseBody(data, data_len); cmdResponseEnd(); }
// Command handler for hostname command static void ICACHE_FLASH_ATTR cmdHostname(CmdPacket *cmd) { cmdResponseStart(CMD_RESP_V, 0, 0); cmdResponseBody((uint8_t*)&flashConfig.hostname, sizeof(&flashConfig.hostname)); cmdResponseEnd(); return; }
// Callback from wifi subsystem to notify us of status changes static void ICACHE_FLASH_ATTR cmdWifiCb(uint8_t wifiStatus) { if (wifiStatus != lastWifiStatus){ DBG("cmdWifiCb: wifiStatus=%d\n", wifiStatus); lastWifiStatus = wifiStatus; CmdCallback *wifiCb = cmdGetCbByName("wifiCb"); if ((uint32_t)wifiCb->callback != -1) { uint8_t status = wifiStatus == wifiGotIP ? 5 : 1; cmdResponseStart(CMD_RESP_CB, (uint32_t)wifiCb->callback, 1); cmdResponseBody((uint8_t*)&status, 1); cmdResponseEnd(); } } }
// Receive HTTP response - this hacky function assumes that the full response is received in // one go. Sigh... static void ICACHE_FLASH_ATTR tcpclient_recv(void *arg, char *pdata, unsigned short len) { struct espconn *pCon = (struct espconn*)arg; RestClient *client = (RestClient *)pCon->reverse; // parse status line int pi = 0; int16_t code = -1; char statusCode[4] = "\0\0\0\0"; int statusLen = 0; bool inStatus = false; while (pi < len) { if (pdata[pi] == '\n') { // end of status line if (code == -1) code = 502; // BAD GATEWAY break; } else if (pdata[pi] == ' ') { if (inStatus) code = atoi(statusCode); inStatus = !inStatus; } else if (inStatus) { if (statusLen < 3) statusCode[statusLen] = pdata[pi]; statusLen++; } pi++; } // parse header, all this does is look for the end of the header bool currentLineIsBlank = false; while (pi < len) { if (pdata[pi] == '\n') { if (currentLineIsBlank) { // body is starting pi++; break; } currentLineIsBlank = true; } else if (pdata[pi] != '\r') { currentLineIsBlank = false; } pi++; } //if (pi < len && pdata[pi] == '\r') pi++; // hacky! // collect body and send it int body_len = len-pi; DBG("REST: status=%d, body=%d\n", code, body_len); if (pi == len) { cmdResponseStart(CMD_RESP_CB, client->resp_cb, 1); cmdResponseBody(&code, sizeof(code)); cmdResponseEnd(); } else { cmdResponseStart(CMD_RESP_CB, client->resp_cb, 2); cmdResponseBody(&code, sizeof(code)); cmdResponseBody(pdata+pi, body_len>100?100:body_len); cmdResponseEnd(); #if 0 os_printf("REST: body="); for (int j=pi; j<len; j++) os_printf(" %02x", pdata[j]); os_printf("\n"); #endif } //if(client->security) // espconn_secure_disconnect(client->pCon); //else espconn_disconnect(client->pCon); }