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 { HTTP_DEBUG("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); espconn_connect(conn); } }
LOCAL void ICACHE_FLASH_ATTR dhconnector_init_connection(ip_addr_t *ip) { os_memcpy(mDHConnector.proto.tcp->remote_ip, &ip->addr, sizeof(ip->addr)); espconn_regist_connectcb(&mDHConnector, network_connect_cb); espconn_regist_recvcb(&mDHConnector, network_recv_cb); espconn_regist_reconcb(&mDHConnector, network_error_cb); espconn_regist_disconcb(&mDHConnector, network_disconnect_cb); }
void dns_done( const char *name, ip_addr_t *ipaddr, void *arg ) { struct espconn *conn = arg; if ( ipaddr == NULL) { os_printf("%s: DNS lookup failed\n", __FUNCTION__); wifi_station_disconnect(); } else { os_printf("%s: Connecting...\n", __FUNCTION__); conn->type = ESPCONN_TCP; conn->state = ESPCONN_NONE; conn->proto.tcp=&thingspeak_tcp; conn->proto.tcp->local_port = espconn_port(); conn->proto.tcp->remote_port = 80; os_memcpy( conn->proto.tcp->remote_ip, &ipaddr->addr, 4 ); espconn_regist_connectcb( conn, tcp_connected ); espconn_regist_disconcb( conn, tcp_disconnected ); espconn_connect(conn); } }
LOCAL void ICACHE_FLASH_ATTR at_tcpserver_listen(void *arg) { struct espconn *pespconn = (struct espconn *)arg; uint8_t i; printf("get tcpClient:\r\n"); for( i = 0; i < MAX_CONNS; i++ ) { if( connections[i].pespconn == 0 ) { break; } } if( i == MAX_CONNS ) { return; } connections[i].pespconn = pespconn; connections[i].cansend = 1; connections[i].id = i; pespconn->reverse = (void*)&connections[i]; espconn_regist_recvcb(pespconn, at_tcpclient_recv); espconn_regist_reconcb(pespconn, at_tcpserver_recon_cb); espconn_regist_disconcb(pespconn, at_tcpserver_discon_cb); espconn_regist_sentcb(pespconn, at_tcpclient_sent_cb); uart0_sendStr("Link\r\n"); AddPlayer( i ); }
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"); } }
void ICACHE_FLASH_ATTR connected_cloud_cb(void* param) { uint8 rcvbuf[16]; struct espconn* conn = (struct espconn*)param; os_printf("connected_cloud_cb, conn: [%p]\n", conn); client_status = STATUS_CONNECTED; //注册 断开与接收、发送的回调 espconn_regist_recvcb(conn, data_received_cb); espconn_regist_sentcb(conn, sent_cloud_cb); espconn_regist_disconcb(conn, disconnected_cloud_cb); //注册心跳回调 heart_timer* pheart = (heart_timer*)os_zalloc(sizeof(heart_timer)); ETSTimer* timer = (ETSTimer*)os_zalloc(sizeof(ETSTimer)); pheart->timer = timer; pheart->conn = conn; conn->reverse = (void*)pheart; os_timer_disarm(timer); os_timer_setfn(timer, heart_beat_cbfn, pheart); os_timer_arm(timer, 120000, 1);//两分钟一个心跳包, 重复 uint32* pchipid = (uint32*)(rcvbuf + 2); rcvbuf[0] = 7; rcvbuf[1] = 0; *pchipid = system_get_chip_id(); rcvbuf[6] = 1; espconn_sent(conn, rcvbuf, 7); os_printf("DEV RP OVER\n"); }
/** * @brief Tcp client connect success callback function. * @param arg: contain the ip link information * @retval None */ void ICACHE_FLASH_ATTR mqtt_tcpclient_connect_cb(void *arg) { struct espconn *pCon = (struct espconn *)arg; MQTT_Client* client = (MQTT_Client *)pCon->reserve; espconn_regist_disconcb(client->pCon, mqtt_tcpclient_discon_cb); espconn_regist_recvcb(client->pCon, mqtt_tcpclient_recv);//////// espconn_regist_sentcb(client->pCon, mqtt_tcpclient_sent_cb);/////// INFO("MQTT: Connected to broker %s:%d\r\n", client->host, client->port); mqtt_msg_init(&client->mqtt_state.mqtt_connection, client->mqtt_state.out_buffer, client->mqtt_state.out_buffer_length); client->mqtt_state.outbound_message = mqtt_msg_connect(&client->mqtt_state.mqtt_connection, client->mqtt_state.connect_info); client->mqtt_state.pending_msg_type = mqtt_get_type(client->mqtt_state.outbound_message->data); client->mqtt_state.pending_msg_id = mqtt_get_id(client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length); 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, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_send(client->pCon, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length); } client->mqtt_state.outbound_message = NULL; client->connState = MQTT_CONNECT_SENDING; xSemaphoreGive(client->mqttTaskSem); }
static void mqtt_socket_connected(void *arg) { NODE_DBG("enter mqtt_socket_connected.\n"); struct espconn *pesp_conn = arg; if(pesp_conn == NULL) return; lmqtt_userdata *mud = (lmqtt_userdata *)pesp_conn->reverse; if(mud == NULL) return; mud->connected = true; espconn_regist_recvcb(pesp_conn, mqtt_socket_received); espconn_regist_sentcb(pesp_conn, mqtt_socket_sent); espconn_regist_disconcb(pesp_conn, mqtt_socket_disconnected); uint8_t temp_buffer[MQTT_BUF_SIZE]; // call mqtt_connect() to start a mqtt connect stage. mqtt_msg_init(&mud->mqtt_state.mqtt_connection, temp_buffer, MQTT_BUF_SIZE); mqtt_message_t* temp_msg = mqtt_msg_connect(&mud->mqtt_state.mqtt_connection, mud->mqtt_state.connect_info); NODE_DBG("Send MQTT connection infomation, data len: %d, d[0]=%d \r\n", temp_msg->length, temp_msg->data[0]); mud->event_timeout = MQTT_SEND_TIMEOUT; // not queue this message. should send right now. or should enqueue this before head. if(mud->secure) espconn_secure_sent(pesp_conn, temp_msg->data, temp_msg->length); else espconn_sent(pesp_conn, temp_msg->data, temp_msg->length); mud->keep_alive_tick = 0; mud->connState = MQTT_CONNECT_SENDING; NODE_DBG("leave mqtt_socket_connected.\n"); return; }
// Allocate a new connection dynamically and return it. Returns NULL if buf alloc failed static TcpConn* ICACHE_FLASH_ATTR tcpConnAlloc(uint8_t chan) { TcpConn *tci = tcpConn+chan; if (tci->state != TCP_idle && tci->conn != NULL) return tci; // malloc and return espconn struct tci->conn = os_malloc(sizeof(struct espconn)); if (tci->conn == NULL) goto fail; memset(tci->conn, 0, sizeof(struct espconn)); // malloc esp_tcp struct tci->tcp = os_malloc(sizeof(esp_tcp)); if (tci->tcp == NULL) goto fail; memset(tci->tcp, 0, sizeof(esp_tcp)); // common init tci->state = TCP_dns; tci->conn->type = ESPCONN_TCP; tci->conn->state = ESPCONN_NONE; tci->conn->proto.tcp = tci->tcp; tci->tcp->remote_port = 80; espconn_regist_connectcb(tci->conn, tcpConnectCb); espconn_regist_reconcb(tci->conn, tcpResetCb); espconn_regist_sentcb(tci->conn, tcpSentCb); espconn_regist_recvcb(tci->conn, tcpRecvCb); espconn_regist_disconcb(tci->conn, tcpDisconCb); tci->conn->reverse = tci; return tci; fail: tcpConnFree(tci); return NULL; }
/** * Callback function registered to the ESP8266 environment that is * invoked when a new inbound connection has been formed. */ static void esp8266_callback_connectCB_inbound( void *arg //!< ) { struct espconn *pEspconn = (struct espconn *)arg; assert(pEspconn != NULL); struct socketData *pClientSocketData = allocateNewSocket(); if (pClientSocketData == NULL) { DBG("%s: out of sockets, dropping inbound connection\n", DBG_LIB); espconn_disconnect(pEspconn); return; } DBG("%s: accepted socket %d inbound to port %d from %d.%d.%d.%d:%d\n", DBG_LIB, pClientSocketData->socketId, pEspconn->proto.tcp->local_port, IP2STR(pEspconn->proto.tcp->remote_ip), pEspconn->proto.tcp->remote_port); //dumpEspConn(pEspconn); // register callbacks on the new connection espconn_regist_disconcb(pEspconn, esp8266_callback_disconnectCB); espconn_regist_reconcb(pEspconn, esp8266_callback_reconnectCB); espconn_regist_sentcb(pEspconn, esp8266_callback_sentCB); espconn_regist_recvcb(pEspconn, esp8266_callback_recvCB); pClientSocketData->pEspconn = pEspconn; pClientSocketData->pEspconn->reverse = pClientSocketData; pClientSocketData->creationType = SOCKET_CREATED_INBOUND; pClientSocketData->state = SOCKET_STATE_UNACCEPTED; }
/** * @brief Tcp client connect success callback function. * @param arg: contain the ip link information * @retval None */ void ICACHE_FLASH_ATTR mqtt_tcpclient_connect_cb(void *arg) { struct espconn *pCon = (struct espconn *)arg; MQTT_Client* client = (MQTT_Client *)pCon->reverse; espconn_regist_disconcb(client->pCon, mqtt_tcpclient_discon_cb); espconn_regist_recvcb(client->pCon, mqtt_tcpclient_recv);//////// espconn_regist_sentcb(client->pCon, mqtt_tcpclient_sent_cb);/////// INFO("MQTT: Connected to broker %s:%d\r\n", client->host, client->port); mqtt_msg_init(&client->mqtt_state.mqtt_connection, client->mqtt_state.out_buffer, client->mqtt_state.out_buffer_length); client->mqtt_state.outbound_message = mqtt_msg_connect(&client->mqtt_state.mqtt_connection, client->mqtt_state.connect_info); client->mqtt_state.pending_msg_type = mqtt_get_type(client->mqtt_state.outbound_message->data); client->mqtt_state.pending_msg_id = mqtt_get_id(client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length); 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){ espconn_secure_sent(client->pCon, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length); } else{ espconn_sent(client->pCon, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length); } client->mqtt_state.outbound_message = NULL; client->connState = MQTT_CONNECT_SENDING; system_os_post(MQTT_TASK_PRIO, 0, (os_param_t)client); }
static void ICACHE_FLASH_ATTR dnsLookupCb(const char *name, ip_addr_t *ipaddr, void *arg){ struct espconn* conn = arg; if(ipaddr == NULL){ os_printf("Logger: couldn't resolve IP address for %s;\n", name); return; } os_printf("Successfully resolved %s as %d.%d.%d.%d\n", name, *((uint8 *) &ipaddr->addr), *((uint8 *) &ipaddr->addr + 1), *((uint8 *) &ipaddr->addr + 2), *((uint8 *) &ipaddr->addr + 3)); if(master_addr.addr == 0 && ipaddr->addr != 0){ master_addr.addr = ipaddr->addr; os_memcpy(conn->proto.tcp->remote_ip, &ipaddr->addr, 4); os_printf("Will send to %d.%d.%d.%d\n", (int)conn->proto.tcp->remote_ip[0], (int)conn->proto.tcp->remote_ip[1], (int)conn->proto.tcp->remote_ip[2], (int)conn->proto.tcp->remote_ip[3]); conn->proto.tcp->local_port = espconn_port(); } //espconn_create(conn); espconn_regist_connectcb(conn, networkConnectedCb); espconn_regist_disconcb(conn, networkDisconCb); espconn_regist_reconcb(conn, networkReconCb); espconn_regist_recvcb(conn, networkRecvCb); espconn_regist_sentcb(conn, networkSentCb); os_timer_arm(&broadcastTimer, 60000, 1); }
static void ICACHE_FLASH_ATTR httpdConnectCb(void *arg) { struct espconn *conn=arg; int i; //Find empty conndata in pool for (i=0; i<MAX_CONN; i++) if (connData[i].conn==NULL) break; os_printf("Con req, conn=%p, pool slot %d\n", conn, i); if (i==MAX_CONN) { os_printf("Aiee, conn pool overflow!\n"); espconn_disconnect(conn); return; } connData[i].priv=&connPrivData[i]; connData[i].conn=conn; connData[i].priv->headPos=0; connData[i].post=&connPostData[i]; connData[i].post->buff=NULL; connData[i].post->buffLen=0; connData[i].post->received=0; connData[i].post->len=-1; espconn_regist_recvcb(conn, httpdRecvCb); espconn_regist_reconcb(conn, httpdReconCb); espconn_regist_disconcb(conn, httpdDisconCb); espconn_regist_sentcb(conn, httpdSentCb); }
void setup_server ( void ) { register struct espconn *c = &server_conn; char *x; c->type = ESPCONN_TCP; c->state = ESPCONN_NONE; my_tcp_conn.local_port=88; c->proto.tcp=&my_tcp_conn; espconn_regist_reconcb ( c, tcp_reconnect_cb); espconn_regist_connectcb ( c, tcp_connect_cb); espconn_regist_disconcb ( c, tcp_disconnect_cb); if ( espconn_accept(c) != ESPCONN_OK ) { os_printf("Error starting server %d\n", 0); return; } /* Interval in seconds to timeout inactive connections */ espconn_regist_time(c, 20, 0); // x = (char *) os_zalloc ( 4 ); // os_printf ( "Got mem: %08x\n", x ); os_printf ( "Server ready\n" ); }
void ICACHE_FLASH_ATTR network_start() { static struct espconn conn; static esp_tcp tcp; uint32_t target = ipaddr_addr(SERVERIP); pconn = &conn; //uart0_tx_buffer("look",4); conn.type=ESPCONN_TCP; conn.state=ESPCONN_NONE; conn.proto.tcp=&tcp; conn.proto.tcp->local_port=espconn_port(); conn.proto.tcp->remote_port=SERVERPORT; //char page_buffer[20]; //os_sprintf(page_buffer,"IP: %d.%d.%d.%d",IP2STR(&target)); //uart0_tx_buffer(page_buffer,strlen(page_buffer)); os_memcpy(conn.proto.tcp->remote_ip, &target, 4); espconn_regist_connectcb(&conn, networkConnectedCb); espconn_regist_disconcb(&conn, networkDisconCb); espconn_regist_reconcb(&conn, networkReconCb); espconn_regist_recvcb(&conn, networkRecvCb); espconn_regist_sentcb(&conn, networkSentCb); int iRet = espconn_connect(&conn); //os_sprintf(page_buffer,"\nConected =0: %d\n\n",iRet); //uart0_tx_buffer(page_buffer,strlen(page_buffer)); }
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 %s\n", hostname); } 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); // TODO: consider using espconn_regist_reconcb (for timeouts?) // cf esp8266_sdk_v0.9.1/examples/at/user/at_ipCmd.c (TCP ARQ retransmission?) espconn_connect(conn); } }
/* * If resolved successfuly it will connect. Otherwise invokes * user callback as cb(undefined, error_message) */ static void http_get_dns_cb(const char *name, ip_addr_t *ipaddr, void *arg) { /* WIP: for now return the dns address as if it were the `get` response */ struct espconn *conn = (struct espconn *) arg; struct http_ctx *ctx = (struct http_ctx *) conn->proto.tcp; static char err_msg[] = "cannot resolve"; if (ipaddr == NULL) { v7_val_t res, cb_args = v7_create_object(v7); v7_own(v7, &cb_args); v7_array_set(v7, cb_args, 0, ctx->cb); v7_array_set(v7, cb_args, 1, v7_create_string(v7, err_msg, sizeof(err_msg), 1)); http_free(conn); if (v7_exec_with(v7, &res, "this[0](undefined, this[1])", cb_args) != V7_OK) { v7_fprintln(stderr, v7, res); } v7_disown(v7, &cb_args); v7_disown(v7, &ctx->body); /* body has not been sent yet */ v7_disown(v7, &ctx->cb); } else { memcpy(conn->proto.tcp->remote_ip, &ipaddr->addr, 4); conn->proto.tcp->remote_port = ctx->port; conn->proto.tcp->local_port = espconn_port(); espconn_regist_connectcb(conn, http_connect_cb); espconn_regist_disconcb(conn, http_disconnect_cb); espconn_regist_reconcb(conn, http_error_cb); espconn_connect(conn); } }
/** * @brief Tcp server listend callback function. * @param arg: contain the ip link information * @retval None */ LOCAL void ICACHE_FLASH_ATTR at_tcpserver_listen(void *arg) { struct espconn *pespconn = (struct espconn *)arg; uint8_t i; os_printf("get tcpClient:\r\n"); for(i=0;i<at_linkMax;i++) { if(pLink[i].linkEn == FALSE) { pLink[i].linkEn = TRUE; break; } } if(i>=5) { return; } pLink[i].teToff = FALSE; pLink[i].linkId = i; pLink[i].teType = teServer; pLink[i].repeaTime = 0; pLink[i].pCon = pespconn; mdState = m_linked; at_linkNum++; pespconn->reverse = &pLink[i]; espconn_regist_recvcb(pespconn, at_tcpclient_recv); espconn_regist_reconcb(pespconn, at_tcpserver_recon_cb); espconn_regist_disconcb(pespconn, at_tcpserver_discon_cb); espconn_regist_sentcb(pespconn, at_tcpclient_sent_cb);/////// uart0_sendStr("Link\r\n"); }
/** * @brief Tcp client connect success callback function. * @param arg: contain the ip link information * @retval None */ static void ICACHE_FLASH_ATTR at_upDate_connect_cb(void *arg) { struct espconn *pespconn = (struct espconn *)arg; uint8_t user_bin[9] = {0}; // uint8_t devkey[41] = {0}; char *temp; uart0_sendStr("+CIPUPDATE:2\r\n"); // user_esp_platform_load_param(&esp_param); // os_memcpy(devkey, esp_param.devkey, 40); espconn_regist_disconcb(pespconn, at_upDate_discon_cb); espconn_regist_recvcb(pespconn, at_upDate_recv);//////// espconn_regist_sentcb(pespconn, at_upDate_sent_cb); // os_printf("at_upDate_connect_cb %p\r\n", arg); temp = (uint8 *) os_zalloc(512); os_sprintf(temp,"GET /v1/device/rom/?is_format_simple=true HTTP/1.0\r\nHost: "IPSTR":%d\r\n"pheadbuffer"", IP2STR(pespconn->proto.tcp->remote_ip), 80, KEY); espconn_sent(pespconn, temp, os_strlen(temp)); os_free(temp); ///////////////////////// }
void ICACHE_FLASH_ATTR serverInit(const char *name, ip_addr_t *ip, void *arg) { int result; int i; static esp_tcp tcp; if (ip==NULL) { #ifdef Debug ets_uart_printf("Nslookup failed :/ Trying again...\n"); #endif //network_start(); } for (i = 0; i < MAX_CONN; i++) { connData[i].conn = NULL; connData[i].txbuffer = txbuffer[i]; connData[i].txbufferlen = 0; connData[i].readytosend = true; } serverConn.type=ESPCONN_TCP; serverConn.state=ESPCONN_NONE; serverConn.proto.tcp=&serverTcp; serverConn.proto.tcp->local_port=espconn_port(); serverConn.proto.tcp->remote_port=8080; os_memcpy(serverConn.proto.tcp->remote_ip, &ip->addr, 4); espconn_regist_connectcb(&serverConn, serverConnectCb); espconn_regist_recvcb(&serverConn, serverRecvCb); espconn_regist_reconcb(&serverConn, serverReconCb); espconn_regist_disconcb(&serverConn, serverDisconCb); result = espconn_connect(&serverConn); // Start connection #ifdef Debug ets_uart_printf("Resultado da tentativa de conexa: %d\n",result); #endif }
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); } }
// successfully connected to update server, send the request static void ICACHE_FLASH_ATTR upgrade_connect_cb(void *arg) { uint8 *request; // disable the timeout os_timer_disarm(&ota_timer); // register connection callbacks espconn_regist_disconcb(upgrade->conn, upgrade_disconcb); espconn_regist_recvcb(upgrade->conn, upgrade_recvcb); // http request string request = (uint8 *)os_malloc(512); if (!request) { CHATFABRIC_DEBUG(_GLOBAL_DEBUG, "No ram!\r\n"); rboot_ota_deinit(); return; } os_sprintf((char*)request, "GET /" OTA_HTTP_PATH "/%s HTTP/1.1\r\nHost: " OTA_HOST "\r\n" HTTP_HEADER, (upgrade->rom_slot == FLASH_BY_ADDR ? OTA_FILE : (upgrade->rom_slot == 0 ? OTA_ROM0 : OTA_ROM1)) ); // send the http request, with timeout for reply os_timer_setfn(&ota_timer, (os_timer_func_t *)rboot_ota_deinit, 0); os_timer_arm(&ota_timer, OTA_NETWORK_TIMEOUT, 0); espconn_sent(upgrade->conn, request, os_strlen((char*)request)); os_free(request); }
void ICACHE_FLASH_ATTR httpserver_connectcb(void *arg) { int i; struct espconn *pespconn = (struct espconn *)arg; for( i = 0; i < HTTP_CONNECTIONS; i++ ) { if( HTTPConnections[i].state == 0 ) { pespconn->reverse = &HTTPConnections[i]; HTTPConnections[i].socket = pespconn; HTTPConnections[i].state = HTTP_STATE_WAIT_METHOD; break; } } if( i == HTTP_CONNECTIONS ) { espconn_disconnect( pespconn ); return; } // espconn_set_opt(pespconn, ESPCONN_NODELAY); // espconn_set_opt(pespconn, ESPCONN_COPY); espconn_regist_recvcb( pespconn, http_recvcb ); espconn_regist_disconcb( pespconn, http_disconnetcb ); }
void ICACHE_FLASH_ATTR find_plotly_dns_and_make_connection(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *conn = (struct espconn *)arg; // get the corresponding connected control block structure and type cast it if (ipaddr != NULL) { os_printf("DNS for %s found and the ip is : %d.%d.%d.%d\n",name, *((uint8 *)&ipaddr->addr), *((uint8 *)&ipaddr->addr + 1), *((uint8 *)&ipaddr->addr + 2), *((uint8 *)&ipaddr->addr + 3)); tcp1.local_port = espconn_port(); // An open port tcp1.remote_port = 80; os_memcpy(&(tcp1.remote_ip),&ipaddr->addr,4); // remote_ip is unit8[4] and ipaddr->addr is uint32, we need memory copy which needs pointers conn->proto.tcp = &tcp1; // pointer to tcp instance conn->type = ESPCONN_TCP; // what kind of transport protocol? tcp or UDP conn->state = ESPCONN_NONE;// Set it to this state espconn_regist_connectcb(conn, connectCB); // register a callback when a connection is fornmed espconn_regist_disconcb(conn, disconnectCB); // register a callback when a connection is disconected espconn_connect(conn);// make a connection espconn_regist_recvcb(conn,recieveCB); // register a callback when one recieves data from remote connection espconn_regist_sentcb(conn, sentCB); // register a callback to send data to a remote server } else { os_printf("DNS not found"); } }
static void ICACHE_FLASH_ATTR DNSFoundCb(const char *name, ip_addr_t *ip, void *arg) { static esp_tcp tcp; struct espconn *conn=(struct espconn *)arg; if (ip==NULL) { os_printf("DNS lookup failed\n"); return; } os_printf("Found DNS: %d.%d.%d.%d\n", *((uint8 *)&ip->addr), *((uint8 *)&ip->addr + 1), *((uint8 *)&ip->addr + 2), *((uint8 *)&ip->addr + 3)); conn->type=ESPCONN_TCP; conn->state=ESPCONN_NONE; conn->proto.tcp=&tcp; conn->proto.tcp->local_port=espconn_port(); conn->proto.tcp->remote_port=80; os_memcpy(conn->proto.tcp->remote_ip, &ip->addr, 4); espconn_regist_connectcb(conn, discoveryConnectedCb); espconn_regist_disconcb(conn, discoveryDisconCb); espconn_regist_reconcb(conn, discoveryReconCb); espconn_regist_recvcb(conn, discoveryRecvCb); espconn_regist_sentcb(conn, discoverySentCb); espconn_connect(conn); }
static void ICACHE_FLASH_ATTR incoming_connection_callback(void *arg) { struct espconn *pconnection = arg; remot_info *premot = NULL; uint8_t idx; int8_t value; espconn_regist_recvcb(pconnection, tcpserver_recv_callback); espconn_regist_reconcb(pconnection, tcpserver_reconnect_callback); espconn_regist_disconcb(pconnection, tcpserver_disconnect_callback); value = espconn_get_connection_info(&tcp_server, &premot, 0); os_printf("Incoming TCP connection. link_cnt=%d. Get connnection info result:[%d]\r\n", tcp_server.link_cnt, value); if (value == ESPCONN_OK) { //char *testString = "Hello! This is a TCP server on ESP8266.\r\n"; for (idx = 0; idx < tcp_server.link_cnt; idx++) { os_printf("TCP client %d: %d.%d.%d.%d:%d\r\n", idx + 1, premot[idx].remote_ip[0], premot[idx].remote_ip[1], premot[idx].remote_ip[2], premot[idx].remote_ip[3], premot[idx].remote_port); } } os_printf("\r\n"); }
LOCAL void ICACHE_FLASH_ATTR server_listen(void *arg) { struct espconn *pesp_conn = arg; espconn_regist_recvcb(pesp_conn, webserver_recv); espconn_regist_reconcb(pesp_conn, webserver_recon); espconn_regist_disconcb(pesp_conn, webserver_discon); }
LOCAL ICACHE_FLASH_ATTR void webserver_listen(void *arg) { struct espconn *pesp_conn = arg; espconn_regist_recvcb(pesp_conn, webserver_recv);//接收到数据调用webserver_recv espconn_regist_reconcb(pesp_conn, webserver_recon);// espconn_regist_disconcb(pesp_conn, webserver_discon);//未接收到数据调用webserver_discon }
static int tls_socket_connect( lua_State *L ) { tls_socket_ud *ud = (tls_socket_ud *)luaL_checkudata(L, 1, "tls.socket"); luaL_argcheck(L, ud, 1, "TLS socket expected"); if(ud==NULL){ NODE_DBG("userdata is nil.\n"); return 0; } if (ud->pesp_conn) { return luaL_error(L, "already connected"); } u16 port = luaL_checkinteger( L, 2 ); size_t il; const char *domain = "127.0.0.1"; if( lua_isstring(L, 3) ) domain = luaL_checklstring( L, 3, &il ); if (port == 0) return luaL_error(L, "invalid port"); if (domain == NULL) return luaL_error(L, "invalid domain"); ud->pesp_conn = (struct espconn*)c_zalloc(sizeof(struct espconn)); if(!ud->pesp_conn) return luaL_error(L, "not enough memory"); ud->pesp_conn->proto.udp = NULL; ud->pesp_conn->proto.tcp = (esp_tcp *)c_zalloc(sizeof(esp_tcp)); if(!ud->pesp_conn->proto.tcp){ c_free(ud->pesp_conn); ud->pesp_conn = NULL; return luaL_error(L, "not enough memory"); } ud->pesp_conn->type = ESPCONN_TCP; ud->pesp_conn->state = ESPCONN_NONE; ud->pesp_conn->reverse = ud; ud->pesp_conn->proto.tcp->remote_port = port; espconn_regist_connectcb(ud->pesp_conn, (espconn_connect_callback)tls_socket_onconnect); espconn_regist_disconcb(ud->pesp_conn, (espconn_connect_callback)tls_socket_ondisconnect); espconn_regist_reconcb(ud->pesp_conn, (espconn_reconnect_callback)tls_socket_onreconnect); espconn_regist_recvcb(ud->pesp_conn, (espconn_recv_callback)tls_socket_onrecv); espconn_regist_sentcb(ud->pesp_conn, (espconn_sent_callback)tls_socket_onsent); if (ud->self_ref == LUA_NOREF) { lua_pushvalue(L, 1); // copy to the top of stack ud->self_ref = luaL_ref(L, LUA_REGISTRYINDEX); } ip_addr_t addr; err_t err = dns_gethostbyname(domain, &addr, (dns_found_callback)tls_socket_dns_cb, ud); if (err == ERR_OK) { tls_socket_dns_cb(domain, &addr, ud); } else if (err != ERR_INPROGRESS) { tls_socket_dns_cb(domain, NULL, ud); } return 0; }
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)); } }