static void tls_socket_dns_cb( const char* domain, const ip_addr_t *ip_addr, tls_socket_ud *ud ) { if (ud->self_ref == LUA_NOREF) return; ip_addr_t addr; if (ip_addr) addr = *ip_addr; else addr.addr = 0xFFFFFFFF; lua_State *L = lua_getstate(); if (ud->cb_dns_ref != LUA_NOREF) { lua_rawgeti(L, LUA_REGISTRYINDEX, ud->cb_dns_ref); lua_rawgeti(L, LUA_REGISTRYINDEX, ud->self_ref); if (addr.addr == 0xFFFFFFFF) { lua_pushnil(L); } else { char tmp[20]; c_sprintf(tmp, IPSTR, IP2STR(&addr.addr)); lua_pushstring(L, tmp); } lua_call(L, 2, 0); } if (addr.addr == 0xFFFFFFFF) { lua_gc(L, LUA_GCSTOP, 0); luaL_unref(L, LUA_REGISTRYINDEX, ud->self_ref); ud->self_ref = LUA_NOREF; lua_gc(L, LUA_GCRESTART, 0); } else { os_memcpy(ud->pesp_conn->proto.tcp->remote_ip, &addr.addr, 4); espconn_secure_connect(ud->pesp_conn); } }
/** * @brief DNS lookup for broker hostname completed, move to next phase */ static void ICACHE_FLASH_ATTR mqtt_dns_found(const char* name, ip_addr_t* ipaddr, void* arg) { struct espconn* pConn = (struct espconn *)arg; MQTT_Client* client = (MQTT_Client *)pConn->reverse; if (ipaddr == NULL) { os_printf("MQTT: DNS lookup failed\n"); client->timeoutTick = client->reconTimeout; if (client->reconTimeout < 128) client->reconTimeout <<= 1; client->connState = TCP_RECONNECT_REQ; // the timer will kick-off a reconnection return; } DBG_MQTT("MQTT: ip %d.%d.%d.%d\n", *((uint8 *)&ipaddr->addr), *((uint8 *)&ipaddr->addr + 1), *((uint8 *)&ipaddr->addr + 2), *((uint8 *)&ipaddr->addr + 3)); if (client->ip.addr == 0 && ipaddr->addr != 0) { os_memcpy(client->pCon->proto.tcp->remote_ip, &ipaddr->addr, 4); 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"); client->timeoutTick = client->reconTimeout; if (client->reconTimeout < 128) client->reconTimeout <<= 1; client->connState = TCP_RECONNECT_REQ; } else { DBG_MQTT("MQTT: connecting...\n"); } } }
static void socket_connect(struct espconn *pesp_conn) { if(pesp_conn == NULL) return; lnet_userdata *nud = (lnet_userdata *)pesp_conn->reverse; if(nud == NULL) return; if( pesp_conn->type == ESPCONN_TCP ) { #ifdef CLIENT_SSL_ENABLE if(nud->secure){ espconn_secure_connect(pesp_conn); } else #endif { espconn_connect(pesp_conn); } } else if (pesp_conn->type == ESPCONN_UDP) { espconn_create(pesp_conn); } NODE_DBG("socket_connect is called.\n"); }
LOCAL void ICACHE_FLASH_ATTR rest_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *pConn = (struct espconn *)arg; REST_CLIENT* client = (REST_CLIENT *)pConn->reverse; if(ipaddr == NULL) { INFO("REST DNS: Found, but got no ip, try to reconnect\r\n"); return; } INFO("REST DNS: found ip %d.%d.%d.%d\n", *((uint8 *) &ipaddr->addr), *((uint8 *) &ipaddr->addr + 1), *((uint8 *) &ipaddr->addr + 2), *((uint8 *) &ipaddr->addr + 3)); if(client->ip.addr == 0 && ipaddr->addr != 0) { os_memcpy(client->pCon->proto.tcp->remote_ip, &ipaddr->addr, 4); if(client->security){ espconn_secure_connect(client->pCon); } else { espconn_connect(client->pCon); } INFO("REST: connecting...\r\n"); } }
void ICACHE_FLASH_ATTR start_esp_connect(struct espconn *conn, uint8_t secure, void *connect_cb, void *disconnect_cb, void *reconn_cb) { espconn_regist_connectcb(conn, connect_cb); espconn_regist_disconcb(conn, disconnect_cb); espconn_regist_reconcb(conn, reconn_cb); // INFO("Dest ip: %d.%d.%d.%d:%d\n", // conn->proto.tcp->remote_ip[0], // conn->proto.tcp->remote_ip[1], // conn->proto.tcp->remote_ip[2], // conn->proto.tcp->remote_ip[3], // conn->proto.tcp->remote_port); if (secure) { os_printf("Secure connection\n"); espconn_secure_set_size(ESPCONN_CLIENT, 5120); // set SSL buffer size, if your SSL packet larger than 2048 bytes int8_t cv = espconn_secure_connect(conn); if (cv < 0) INFO("Secure connect fail: %d\n", cv); } else { if (espconn_connect(conn) != 0) INFO("Connect fail\n"); } }
LOCAL void ICACHE_FLASH_ATTR mqtt_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *pConn = (struct espconn *)arg; MQTT_Client* client = (MQTT_Client *)pConn->reverse; if(ipaddr == NULL) { //spam INFO("DNS: Found, but got no ip, try to reconnect\r\n"); client->connState = TCP_RECONNECT_REQ; return; } //spam INFO("DNS: found ip %d.%d.%d.%d\n", *((uint8 *) &ipaddr->addr), *((uint8 *) &ipaddr->addr + 1), *((uint8 *) &ipaddr->addr + 2), *((uint8 *) &ipaddr->addr + 3)); if(client->ip.addr == 0 && ipaddr->addr != 0) { os_memcpy(client->pCon->proto.tcp->remote_ip, &ipaddr->addr, 4); if(client->security){ espconn_secure_connect(client->pCon); } else { espconn_connect(client->pCon); } client->connState = TCP_CONNECTING; //spam INFO("TCP: connecting...\r\n"); } system_os_post(MQTT_TASK_PRIO, 0, (os_param_t)client); }
static void ICACHE_FLASH_ATTR rest_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *pConn = (struct espconn *)arg; RestClient* client = (RestClient *)pConn->reverse; if(ipaddr == NULL) { os_printf("REST DNS: Got no ip, try to reconnect\n"); return; } DBG("REST DNS: found ip %d.%d.%d.%d\n", *((uint8 *) &ipaddr->addr), *((uint8 *) &ipaddr->addr + 1), *((uint8 *) &ipaddr->addr + 2), *((uint8 *) &ipaddr->addr + 3)); if(client->ip.addr == 0 && ipaddr->addr != 0) { os_memcpy(client->pCon->proto.tcp->remote_ip, &ipaddr->addr, 4); #ifdef CLIENT_SSL_ENABLE if(client->security) { espconn_secure_connect(client->pCon); } else #endif espconn_connect(client->pCon); DBG("REST: connecting...\n"); } }
static void FUNCTION_ATTRIBUTE dns_callback(const char * hostname, ip_addr_t * addr, void * arg) { //request_args * req = (request_args *)arg; if (addr == NULL) { PRINTF("DNS failed %s\n", hostname); http_exit(DNS_FAIL); } else { PRINTF("DNS found %s " IPSTR "\n", hostname, IP2STR(addr)); conn = (struct espconn *)os_malloc(sizeof(struct espconn)); conn->type = ESPCONN_TCP; conn->state = ESPCONN_NONE; conn->proto.tcp = (esp_tcp *)os_malloc(sizeof(esp_tcp)); conn->proto.tcp->local_port = espconn_port(); conn->proto.tcp->remote_port = http_port; os_memcpy(conn->proto.tcp->remote_ip, addr, 4); espconn_regist_connectcb(conn, connect_callback); espconn_regist_disconcb(conn, disconnect_callback); espconn_regist_reconcb(conn, reconnect_callback); PRINTF("start connect http server\n"); // TODO: consider using espconn_regist_reconcb (for timeouts?) // cf esp8266_sdk_v0.9.1/examples/at/user/at_ipCmd.c (TCP ARQ retransmission?) espconn_secure_connect(conn); } }
void ICACHE_FLASH_ATTR esp8266_resolveCallback(const char* name, ip_addr_t* ip, void* arg) { struct espconn* conn = (struct espconn*)arg; NetConnection* netConn = (NetConnection*)conn->reverse; uart0_tx_buffer("get conn\r\n", 10); HTTPESP8266ConnectionData* driver = esp8266_getConnection(netConn); uart0_tx_buffer("check ip\r\n", 10); if(!ip) { // failed to lookup the hostname uart0_tx_buffer("bad ip\r\n", 8); esp8266_destroyConnection(netConn); netConn->readCallback(netConn->userData, NULL, 0, net_error); return; } char pageBuffer[20]; ets_sprintf(pageBuffer, "r: %d.%d.%d.%d\r\n", IP2STR(ip)); uart0_tx_buffer(pageBuffer, strlen(pageBuffer)); uart0_tx_buffer("set tcp callbacks\r\n", 19); espconn_regist_connectcb(conn, esp8266_connectCallback); espconn_regist_disconcb(conn, esp8266_disconnectCallback); espconn_regist_reconcb(conn, esp8266_reconnectCallback); uart0_tx_buffer("set callbacks\r\n", 15); espconn_regist_recvcb(conn, esp8266_recvCallback); espconn_regist_sentcb(conn, esp8266_sendCallback); uart0_tx_buffer("set ip\r\n", 8); ets_memcpy(&conn->proto.tcp->remote_ip, ip, 4); if(driver->secure) { uart0_tx_buffer("async sconnect\r\n", 16); conn->proto.tcp->remote_port = 443; ets_sprintf(pageBuffer, "port: %d\r\n", conn->proto.tcp->remote_port); uart0_tx_buffer(pageBuffer, strlen(pageBuffer)); sint8 r = espconn_secure_connect(conn); ets_sprintf(pageBuffer, "c_conn: %d\r\n", r); uart0_tx_buffer(pageBuffer, strlen(pageBuffer)); } else { uart0_tx_buffer("async connect\r\n", 15); conn->proto.tcp->remote_port = 80; ets_sprintf(pageBuffer, "port: %d\r\n", conn->proto.tcp->remote_port); uart0_tx_buffer(pageBuffer, strlen(pageBuffer)); sint8 r = espconn_connect(conn); ets_sprintf(pageBuffer, "c_conn: %d\r\n", r); uart0_tx_buffer(pageBuffer, strlen(pageBuffer)); } }
/** * @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; }
LOCAL void ICACHE_FLASH_ATTR mqtt_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *pConn = (struct espconn *)arg; MQTT_Client* client = (MQTT_Client *)pConn->reverse; DEBUG("mqtt_dns_found: enter"); #if 0 DEBUG("About to log IP address ..."); delay(2000); DEBUG("&ip_addr address %p", &ipaddr); delay(2000); DEBUG("ip_addr address %p", ipaddr); delay(2000); #endif if(ipaddr == NULL) { WARN("DNS: Found, but got no ip, try to reconnect"); client->connState = TCP_RECONNECT_REQ; return; } INFO("DNS: found ip %d.%d.%d.%d\n", *((uint8 *) &ipaddr->addr), *((uint8 *) &ipaddr->addr + 1), *((uint8 *) &ipaddr->addr + 2), *((uint8 *) &ipaddr->addr + 3)); if(client->ip.addr == 0 && ipaddr->addr != 0) { DEBUG("let's connect"); os_memcpy(client->pCon->proto.tcp->remote_ip, &ipaddr->addr, 4); if(client->security){ espconn_secure_connect(client->pCon); } else { //delay(1000); espconn_connect(client->pCon); } client->connState = TCP_CONNECTING; INFO("TCP: connecting..."); } DEBUG("os post"); system_os_post(MQTT_TASK_PRIO, 0, (os_param_t)client); DEBUG("dns found exit"); }
/** * @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; }
LOCAL void ICACHE_FLASH_ATTR mqtt_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *pConn = (struct espconn *)arg; MQTT_Client* client = (MQTT_Client *)pConn->reverse; if (ipaddr == NULL) { INFO("DNS: Found, but got no ip, try to reconnect\r\n"); client->connState = TCP_RECONNECT_REQ; return; } INFO("DNS: found ip %d.%d.%d.%d\n", *((uint8 *) &ipaddr->addr), *((uint8 *) &ipaddr->addr + 1), *((uint8 *) &ipaddr->addr + 2), *((uint8 *) &ipaddr->addr + 3)); if (client->ip.addr == 0 && ipaddr->addr != 0) { os_memcpy(client->pCon->proto.tcp->remote_ip, &ipaddr->addr, 4); if (client->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(client->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(client->pCon); } client->connState = TCP_CONNECTING; INFO("TCP: connecting...\r\n"); } system_os_post(MQTT_TASK_PRIO, 0, (os_param_t)client); }
/** * @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; }
static void socket_connect(struct espconn *pesp_conn) { NODE_DBG("enter socket_connect.\n"); if(pesp_conn == NULL) return; lmqtt_userdata *mud = (lmqtt_userdata *)pesp_conn->reverse; if(mud == NULL) return; mud->event_timeout = MQTT_CONNECT_TIMEOUT; mud->connState = MQTT_INIT; if(mud->secure) espconn_secure_connect(pesp_conn); else espconn_connect(pesp_conn); os_timer_arm(&mud->mqttTimer, 1000, 1); NODE_DBG("leave socket_connect.\n"); }
/** * @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; }
LOCAL void ICACHE_FLASH_ATTR mqtt_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *pConn = (struct espconn *)arg; MQTT_Client* client = (MQTT_Client *)pConn->reserve; if (ipaddr == NULL) { INFO("DNS: Found, but got no ip, try to reconnect\r\n"); client->connState = TCP_RECONNECT_REQ; return; } INFO("DNS: found ip %d.%d.%d.%d\n", *((uint8 *) &ipaddr->addr), *((uint8 *) &ipaddr->addr + 1), *((uint8 *) &ipaddr->addr + 2), *((uint8 *) &ipaddr->addr + 3)); if (client->ip.addr == 0 && ipaddr->addr != 0) { memcpy(client->pCon->proto.tcp->remote_ip, &ipaddr->addr, 4); if (client->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_connect(client->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(client->pCon); } client->connState = TCP_CONNECTING; INFO("TCP: connecting...\r\n"); } xSemaphoreGive(client->mqttTaskSem); }
/****************************************************************************** * FunctionName : upgrade_connection * Description : connect with a server * Parameters : bin -- server number * url -- the url whitch upgrade files saved * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR upgrade_connect(struct upgrade_server_info *server) { UPGRADE_DBG("upgrade_connect\n"); pbuf = server->url; espconn_regist_connectcb(upgrade_conn, upgrade_connect_cb); espconn_regist_recvcb(upgrade_conn, upgrade_download); system_upgrade_init(); system_upgrade_flag_set(UPGRADE_FLAG_START); #ifdef UPGRADE_SSL_ENABLE espconn_secure_connect(upgrade_conn); #else espconn_connect(upgrade_conn); #endif os_timer_disarm(&upgrade_10s); os_timer_setfn(&upgrade_10s, (os_timer_func_t *)upgrade_10s_cb, upgrade_conn); os_timer_arm(&upgrade_10s, 10000, 0); }
static void ICACHE_FLASH_ATTR dns_callback(const char * hostname, ip_addr_t * addr, void * arg) { request_args * req = (request_args *)arg; if (addr == NULL) { os_printf("DNS failed for %s\n", hostname); if (req->user_callback != NULL) { req->user_callback("", -1, ""); } os_free(req); } else { PRINTF("DNS found %s " IPSTR "\n", hostname, IP2STR(addr)); struct espconn * conn = (struct espconn *)os_malloc(sizeof(struct espconn)); conn->type = ESPCONN_TCP; conn->state = ESPCONN_NONE; conn->proto.tcp = (esp_tcp *)os_malloc(sizeof(esp_tcp)); conn->proto.tcp->local_port = espconn_port(); conn->proto.tcp->remote_port = req->port; conn->reverse = req; os_memcpy(conn->proto.tcp->remote_ip, addr, 4); espconn_regist_connectcb(conn, connect_callback); espconn_regist_disconcb(conn, disconnect_callback); espconn_regist_reconcb(conn, error_callback); if (req->secure) { espconn_secure_set_size(ESPCONN_CLIENT,5120); // set SSL buffer size espconn_secure_connect(conn); } else { espconn_connect(conn); } } }
void ICACHE_FLASH_ATTR MQTT_Task(os_event_t *e) { MQTT_Client* client = (MQTT_Client*)e->par; uint8_t dataBuffer[MQTT_BUF_SIZE]; uint16_t dataLen; if (e->par == 0) return; switch (client->connState) { case TCP_RECONNECT_REQ: break; case TCP_RECONNECT: mqtt_tcpclient_delete(client); MQTT_Connect(client); INFO("TCP: Reconnect to: %s:%d\r\n", client->host, client->port); client->connState = TCP_CONNECTING; break; case MQTT_DELETING: case TCP_DISCONNECTING: case TCP_RECONNECT_DISCONNECTING: if (client->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_connect(client->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_disconnect(client->pCon); } break; case TCP_DISCONNECTED: INFO("MQTT: Disconnected\r\n"); mqtt_tcpclient_delete(client); break; case MQTT_DELETED: INFO("MQTT: Deleted client\r\n"); mqtt_client_delete(client); break; case MQTT_KEEPALIVE_SEND: mqtt_send_keepalive(client); break; case MQTT_DATA: if (QUEUE_IsEmpty(&client->msgQueue) || client->sendTimeout != 0) { break; } if (QUEUE_Gets(&client->msgQueue, dataBuffer, &dataLen, MQTT_BUF_SIZE) == 0) { client->mqtt_state.pending_msg_type = mqtt_get_type(dataBuffer); client->mqtt_state.pending_msg_id = mqtt_get_id(dataBuffer, dataLen); client->sendTimeout = MQTT_SEND_TIMOUT; INFO("MQTT: Sending, type: %d, id: %04X\r\n", client->mqtt_state.pending_msg_type, client->mqtt_state.pending_msg_id); if (client->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_send(client->pCon, dataBuffer, dataLen); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_send(client->pCon, dataBuffer, dataLen); } client->mqtt_state.outbound_message = NULL; break; } break; } }
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; }