// is called periodically to check for next version LOCAL void ICACHE_FLASH_ATTR fota_ticktock(fota_client_t *fota_client) { // connection fota_client->conn = (struct espconn *)os_zalloc(sizeof(struct espconn)); fota_client->conn->reverse = (void*)fota_client; fota_client->conn->type = ESPCONN_TCP; fota_client->conn->state = ESPCONN_NONE; // new tcp connection fota_client->conn->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); fota_client->conn->proto.tcp->local_port = espconn_port(); fota_client->conn->proto.tcp->remote_port = fota_client->port; // if ip address is provided, go ahead if (UTILS_StrToIP(fota_client->host, &fota_client->conn->proto.tcp->remote_ip)) { INFO("FOTA client: Connect to ip %s:%d\r\n", fota_client->host, fota_client->port); // check for new version start_esp_connect(fota_client->conn, FOTA_SECURE, get_version_connect_cb, get_version_disconnect_cb); } // else, use dns query to get ip address else { INFO("FOTA client: Connect to domain %s:%d\r\n", fota_client->host, fota_client->port); espconn_gethostbyname(fota_client->conn, fota_client->host, (ip_addr_t *)(fota_client->conn->proto.tcp->remote_ip), fota_dns_found); } }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { //espconn_secure_set_size(0x01,6*1024); // try to modify memory size 6*1024 if ssl/tls handshake failed if (mqttClient->pCon) { // Clean up the old connection forcefully - using MQTT_Disconnect // does not actually release the old connection until the // disconnection callback is invoked. mqtt_tcpclient_delete(mqttClient); } mqttClient->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reverse = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; os_timer_disarm(&mqttClient->mqttTimer); os_timer_setfn(&mqttClient->mqttTimer, (os_timer_func_t *)mqtt_timer, mqttClient); os_timer_arm(&mqttClient->mqttTimer, 1000, 1); os_printf("your ESP SSL/TLS configuration is %d.[0:NO_TLS\t1:TLS_WITHOUT_AUTHENTICATION\t2ONE_WAY_ANTHENTICATION\t3TWO_WAY_ANTHENTICATION]\n",DEFAULT_SECURITY); if (UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); if (mqttClient->security) { #ifdef MQTT_SSL_ENABLE if(DEFAULT_SECURITY >= ONE_WAY_ANTHENTICATION ) { espconn_secure_ca_enable(ESPCONN_CLIENT,CA_CERT_FLASH_ADDRESS); } if(DEFAULT_SECURITY >= TWO_WAY_ANTHENTICATION) { espconn_secure_cert_req_enable(ESPCONN_CLIENT,CLIENT_CERT_FLASH_ADDRESS); } espconn_secure_connect(mqttClient->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(mqttClient->pCon); } } else { INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { if (mqttClient->pCon) { // Clean up the old connection forcefully - using MQTT_Disconnect // does not actually release the old connection until the // disconnection callback is invoked. mqtt_tcpclient_delete(mqttClient); } mqttClient->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reverse = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; os_timer_disarm(&mqttClient->mqttTimer); os_timer_setfn(&mqttClient->mqttTimer, (os_timer_func_t *)mqtt_timer, mqttClient); os_timer_arm(&mqttClient->mqttTimer, 1000, 1); if (UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { MQTT_INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); if (mqttClient->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_set_size(ESPCONN_CLIENT, MQTT_SSL_SIZE); espconn_secure_connect(mqttClient->pCon); #else MQTT_INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(mqttClient->pCon); } } else { MQTT_INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
/****************************************************************************** * FunctionName : initSyslog * Description : Initialize the syslog library * Parameters : syslog_host -- the syslog host (host:port) * host: IP-Addr | hostname * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR syslog_init(char *syslog_host) { if (!*syslog_host) { syslogState = SYSLOG_HALTED; return; } char host[32], *port = &host[0]; syslog_task = register_usr_task(syslog_udp_send_event); syslogHost.min_heap_size = flashConfig.syslog_minheap; syslogHost.port = 514; syslogState = SYSLOG_WAIT; os_strncpy(host, syslog_host, 32); while (*port && *port != ':') // find port delimiter port++; if (*port) { *port++ = '\0'; syslogHost.port = atoi(port); } wifi_set_broadcast_if(STATIONAP_MODE); // send UDP broadcast from both station and soft-AP interface syslog_espconn.type = ESPCONN_UDP; syslog_espconn.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp)); syslog_espconn.proto.udp->local_port = espconn_port(); // set a available port #ifdef SYSLOG_UDP_RECV espconn_regist_recvcb(&syslog_espconn, syslog_udp_recv_cb); // register a udp packet receiving callback #endif espconn_regist_sentcb(&syslog_espconn, syslog_udp_sent_cb); // register a udp packet sent callback espconn_create(&syslog_espconn); // create udp if (UTILS_StrToIP((const char *)host, (void*)&syslogHost.addr)) { syslogState = SYSLOG_SENDING; syslog_send_udp(); } else { static struct espconn espconn_ghbn; espconn_gethostbyname(&espconn_ghbn, host, &syslogHost.addr, syslog_gethostbyname_cb); // syslog_send_udp is called by syslog_gethostbyname_cb() } #ifdef SYSLOG_UDP_RECV DBG("syslog_init: host: %s, port: %d, lport: %d, recvcb: %p, sentcb: %p, state: %d\n", host, syslogHost.port, syslog_espconn.proto.udp->local_port, syslog_udp_recv_cb, syslog_udp_sent_cb, syslogState ); #else DBG("syslog_init: host: %s, port: %d, lport: %d, rsentcb: %p, state: %d\n", host, syslogHost.port, syslog_espconn.proto.udp->local_port, syslog_udp_sent_cb, syslogState ); #endif }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { // Do not connect if this client is already connected otherwise the // two espconn connections may interfere causing unexpected behaviour. if (mqttClient->pCon) { return; } mqttClient->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reverse = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; os_timer_disarm(&mqttClient->mqttTimer); os_timer_setfn(&mqttClient->mqttTimer, (os_timer_func_t *)mqtt_timer, mqttClient); os_timer_arm(&mqttClient->mqttTimer, 1000, 1); if (UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); if (mqttClient->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_connect(mqttClient->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(mqttClient->pCon); } } else { INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
void MQTT_Connect(MQTT_Client *mqttClient) { if(UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { //spam INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); if(mqttClient->security){ espconn_secure_connect(mqttClient->pCon); } else { espconn_connect(mqttClient->pCon); } } else { //spam INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { if (mqttClient->pCon) { // Clean up the old connection forcefully - using MQTT_Disconnect // does not actually release the old connection until the // disconnection callback is invoked. mqtt_tcpclient_delete(mqttClient); } mqttClient->pCon = (struct espconn *)calloc(1, sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)calloc(1, sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reserve = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; xTimerReset(mqttClient->mqttTimer, portMAX_DELAY); xTimerStart(mqttClient->mqttTimer, portMAX_DELAY); if (UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); if (mqttClient->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_connect(mqttClient->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(mqttClient->pCon); } } else { INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client* client) { //MQTT_Disconnect(client); client->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn)); client->pCon->type = ESPCONN_TCP; client->pCon->state = ESPCONN_NONE; client->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); client->pCon->proto.tcp->local_port = espconn_port(); client->pCon->proto.tcp->remote_port = client->port; client->pCon->reverse = client; espconn_regist_connectcb(client->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(client->pCon, mqtt_tcpclient_recon_cb); // start timer function to tick every second os_timer_disarm(&client->mqttTimer); os_timer_setfn(&client->mqttTimer, (os_timer_func_t *)mqtt_timer, client); os_timer_arm(&client->mqttTimer, 1000, 1); // initiate the TCP connection or DNS lookup os_printf("MQTT: Connect to %s:%d %p\n", client->host, client->port, client->pCon); if (UTILS_StrToIP((const char *)client->host, (void*)&client->pCon->proto.tcp->remote_ip)) { uint8_t err; if (client->security) err = espconn_secure_connect(client->pCon); else err = espconn_connect(client->pCon); if (err != 0) { os_printf("MQTT ERROR: Failed to connect\n"); os_free(client->pCon->proto.tcp); os_free(client->pCon); client->pCon = NULL; return; } } else { espconn_gethostbyname(client->pCon, (const char *)client->host, &client->ip, mqtt_dns_found); } client->connState = TCP_CONNECTING; client->timeoutTick = 20; // generous timeout to allow for DNS, etc client->sending = FALSE; }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { err_t error; MQTT_Disconnect(mqttClient); // Could probably get right of zalloc using static variable and then // checking we don't go into this when already using it. mqttClient->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reverse = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; os_timer_disarm(&mqttClient->mqttTimer); os_timer_setfn(&mqttClient->mqttTimer, (os_timer_func_t *)mqtt_timer, mqttClient); os_timer_arm(&mqttClient->mqttTimer, 1000, 1); if(UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { DEBUG("TCP: Connect to ip %s:%d", mqttClient->host, mqttClient->port); if(mqttClient->security){ espconn_secure_connect(mqttClient->pCon); } else { espconn_connect(mqttClient->pCon); } } else { DEBUG("TCP: Connect to domain %s:%d", mqttClient->host, mqttClient->port); error = espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); if (error == ESPCONN_ARG) ERROR("MQTT esp: Failed to lookup host"); } mqttClient->connState = TCP_CONNECTING; }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { MQTT_Disconnect(mqttClient); mqttClient->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reverse = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; os_timer_disarm(&mqttClient->mqttTimer); os_timer_setfn(&mqttClient->mqttTimer, (os_timer_func_t *)mqtt_timer, mqttClient); os_timer_arm(&mqttClient->mqttTimer, 1000, 1); if(UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); #ifdef MQTT_SECURE if(mqttClient->security){ espconn_secure_connect(mqttClient->pCon); } else #endif { espconn_connect(mqttClient->pCon); } } else { INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void FUNCTION_ATTRIBUTE MQTT_Connect(MQTT_Client *mqttClient) { MQTT_Disconnect(mqttClient); mqttClient->pCon = (struct pando_tcp_conn *)pd_malloc(sizeof(struct pando_tcp_conn)); pd_memset(mqttClient->pCon, 0, sizeof(struct pando_tcp_conn)); (mqttClient->pCon)->reverse = mqttClient; mqttClient->pCon->secure = mqttClient->security; net_tcp_register_connected_callback(mqttClient->pCon, mqtt_tcpclient_connect_cb); //no reconnection call back. TODO mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; mqttClient->connectTick = 0; mqttClient->heart_beat_flag = 1; mqttClient->mqttTimer.interval = 1000; mqttClient->mqttTimer.timer_no = 1; mqttClient->mqttTimer.repeated = 1; mqttClient->mqttTimer.arg = mqttClient; mqttClient->mqttTimer.timer_cb = mqtt_timer; pando_timer_init(&(mqttClient->mqttTimer)); pando_timer_stop(&(mqttClient->mqttTimer)); pando_timer_start(&(mqttClient->mqttTimer)); (mqttClient->pCon)->remote_port = mqttClient->port; if(UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->remote_ip)) { INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); net_tcp_connect(mqttClient->pCon, mqttClient->sendTimeout); } else { INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); //need a host name function. TODO //espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
void ICACHE_FLASH_ATTR REST_Request(CmdPacket *cmd) { CmdRequest req; cmdRequest(&req, cmd); DBG("REST: request"); if (cmd->argc != 2 && cmd->argc != 3) return; // Get client uint32_t clientNum = cmd->value; RestClient *client = restClient + (clientNum % MAX_REST); DBG(" #%ld", clientNum); // Get HTTP method uint16_t len = cmdArgLen(&req); if (len > 15) goto fail; char method[16]; cmdPopArg(&req, method, len); method[len] = 0; DBG(" method=%s", method); // Get HTTP path len = cmdArgLen(&req); if (len > 1023) goto fail; char path[1024]; cmdPopArg(&req, path, len); path[len] = 0; DBG(" path=%s", path); // Get HTTP body uint32_t realLen = 0; if (cmdGetArgc(&req) == 2) { realLen = 0; } else { realLen = cmdArgLen(&req); if (realLen > 2048) goto fail; } DBG(" bodyLen=%ld", realLen); // we need to allocate memory for the header plus the body. First we count the length of the // header (including some extra counted "%s" and then we add the body length. We allocate the // whole shebang and copy everything into it. // BTW, use http/1.0 to avoid responses with transfer-encoding: chunked char *headerFmt = "%s %s HTTP/1.0\r\n" "Host: %s\r\n" "%s" "Content-Length: %d\r\n" "Connection: close\r\n" "Content-Type: %s\r\n" "User-Agent: %s\r\n\r\n"; uint16_t headerLen = strlen(headerFmt) + strlen(method) + strlen(path) + strlen(client->host) + strlen(client->header) + strlen(client->content_type) + strlen(client->user_agent); DBG(" hdrLen=%d", headerLen); if (client->data) os_free(client->data); client->data = (char*)os_zalloc(headerLen + realLen); if (client->data == NULL) goto fail; DBG(" totLen=%ld data=%p", headerLen + realLen, client->data); client->data_len = os_sprintf((char*)client->data, headerFmt, method, path, client->host, client->header, realLen, client->content_type, client->user_agent); DBG(" hdrLen=%d", client->data_len); if (realLen > 0) { cmdPopArg(&req, client->data + client->data_len, realLen); client->data_len += realLen; } DBG("\n"); //DBG("REST request: %s", (char*)client->data); //DBG("REST: pCon state=%d\n", client->pCon->state); client->pCon->state = ESPCONN_NONE; espconn_regist_connectcb(client->pCon, tcpclient_connect_cb); espconn_regist_reconcb(client->pCon, tcpclient_recon_cb); if(UTILS_StrToIP((char *)client->host, &client->pCon->proto.tcp->remote_ip)) { DBG("REST: Connect to ip %s:%ld\n",client->host, client->port); //if(client->security){ // espconn_secure_connect(client->pCon); //} //else { espconn_connect(client->pCon); //} } else { DBG("REST: Connect to host %s:%ld\n", client->host, client->port); espconn_gethostbyname(client->pCon, (char *)client->host, &client->ip, rest_dns_found); } return; fail: DBG("\n"); }
uint32_t ICACHE_FLASH_ATTR REST_Request(PACKET_CMD *cmd) { REQUEST req; REST_CLIENT *client; uint16_t len, realLen = 0; uint32_t client_ptr; uint8_t *method, *path, *body = NULL; CMD_Request(&req, cmd); if(CMD_GetArgc(&req) <3) return 0; /* Get client*/ CMD_PopArgs(&req, (uint8_t*)&client_ptr); client = (REST_CLIENT*)client_ptr; //method len = CMD_ArgLen(&req); method = (uint8_t*)os_zalloc(len + 1); CMD_PopArgs(&req, method); method[len] = 0; //path len = CMD_ArgLen(&req); path = (uint8_t*)os_zalloc(len + 1); CMD_PopArgs(&req, path); path[len] = 0; //body if(CMD_GetArgc(&req) == 3){ realLen = 0; len = 0; } else { CMD_PopArgs(&req, (uint8_t*)&realLen); len = CMD_ArgLen(&req); body = (uint8_t*)os_zalloc(len + 1); CMD_PopArgs(&req, body); body[len] = 0; } client->pCon->state = ESPCONN_NONE; INFO("REQ: method: %s, path: %s\r\n", method, path); client->data_len = os_sprintf(client->data, "%s %s HTTP/1.1\r\n" "Host: %s\r\n" "%s" "Content-Length: %d\r\n" "Connection: close\r\n" "Content-Type: %s\r\n" "User-Agent: %s\r\n\r\n", method, path, client->host, client->header, realLen, client->content_type, client->user_agent); if(realLen > 0){ os_memcpy(client->data + client->data_len, body, realLen); client->data_len += realLen; os_sprintf(client->data + client->data_len, "\r\n\r\n"); client->data_len += 4; } client->pCon->state = ESPCONN_NONE; espconn_regist_connectcb(client->pCon, tcpclient_connect_cb); espconn_regist_reconcb(client->pCon, tcpclient_recon_cb); if(UTILS_StrToIP(client->host, &client->pCon->proto.tcp->remote_ip)) { INFO("REST: Connect to ip %s:%d\r\n",client->host, client->port); if(client->security){ espconn_secure_connect(client->pCon); } else { espconn_connect(client->pCon); } } else { INFO("REST: Connect to domain %s:%d\r\n", client->host, client->port); espconn_gethostbyname(client->pCon, client->host, &client->ip, rest_dns_found); } os_free(method); os_free(path); if(body) os_free(body); return 1; }
/****************************************************************************** * FunctionName : initSyslog * Description : Initialize the syslog library * Parameters : syslog_host -- the syslog host (host:port) * host: IP-Addr | hostname * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR syslog_init(char *syslog_host) { DBG("[%uµs] %s\n", WDEV_NOW(), __FUNCTION__); if (!*syslog_host) { syslog_set_status(SYSLOG_HALTED); return; } if (syslog_host == NULL) { // disable and unregister syslog handler syslog_set_status(SYSLOG_HALTED); if (syslog_espconn != NULL) { if (syslog_espconn->proto.udp) { // there's no counterpart to espconn_create... os_free(syslog_espconn->proto.udp); } os_free(syslog_espconn); } syslog_espconn = NULL; // clean up syslog queue syslog_entry_t *pse = syslogQueue; while (pse != NULL) { syslog_entry_t *next = pse->next; os_free(pse); pse = next; } syslogQueue = NULL; return; } char host[32], *port = &host[0]; os_strncpy(host, syslog_host, 32); while (*port && *port != ':') // find port delimiter port++; if (*port) { *port++ = '\0'; syslogHost.port = atoi(port); } if (syslogHost.port == 0) syslogHost.port = 514; // allocate structures, init syslog_handler if (syslog_espconn == NULL) syslog_espconn = (espconn *)os_zalloc(sizeof(espconn)); if (syslog_espconn->proto.udp == NULL) syslog_espconn->proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp)); syslog_espconn->type = ESPCONN_UDP; syslog_espconn->proto.udp->local_port = espconn_port(); // set a available port #ifdef SYSLOG_UDP_RECV espconn_regist_recvcb(syslog_espconn, syslog_udp_recv_cb); // register a udp packet receiving callback #endif espconn_regist_sentcb(syslog_espconn, syslog_udp_sent_cb); // register a udp packet sent callback syslog_task = register_usr_task(syslog_udp_send_event); syslogHost.min_heap_size = flashConfig.syslog_minheap; // the wifi_set_broadcast_if must be handled global in connection handler... // wifi_set_broadcast_if(STATIONAP_MODE); // send UDP broadcast from both station and soft-AP interface espconn_create(syslog_espconn); // create udp if (UTILS_StrToIP((const char *)host, (void*)&syslogHost.addr)) { syslog_set_status(SYSLOG_READY); } else { // we use our own espconn structure to avoid side effects... if (syslog_dnsconn == NULL) syslog_dnsconn = (espconn *)os_zalloc(sizeof(espconn)); if (syslog_dnsconn->proto.udp == NULL) syslog_dnsconn->proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp)); syslog_set_status(SYSLOG_DNSWAIT); espconn_gethostbyname(syslog_dnsconn, host, &syslogHost.addr, syslog_gethostbyname_cb); } }