// 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); } }
LOCAL void ICACHE_FLASH_ATTR fota_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *pespconn = (struct espconn *)arg; if(ipaddr == NULL) { INFO("DNS: Found, but got no ip\n"); ((fota_client_t*)pespconn->reverse)->status = FOTA_IDLE; 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(ipaddr->addr != 0) { os_memcpy(pespconn->proto.tcp->remote_ip, &ipaddr->addr, 4); } // check for new version start_esp_connect(pespconn, FOTA_SECURE, get_version_connect_cb, get_version_disconnect_cb, get_version_recon_cb); }