void esp8266_module::wifi_esp8266_socket_close(unsigned int sid) { CSTRING cmd; if(get_socket_state(sid)) { cmd.format("+CIPCLOSE=%u", sid); if(wifi_send_cmd(cmd.c_str(), 45) & WIFI_CMD_STATE_OK) { if( (sid < WIFI_ESP8266_MAX_SOCKETS) && alloc_sockets[sid]) { pending_socket = alloc_sockets[sid]; for(int i=0; i< 500; i++) { wifi_sleep(10); if(pending_socket->sock_state == SOCKET_OPEN) { TRACE_WIFI("\r\nUnlinked %d", sid); break; } } pending_socket = NULL; } } } }
RES_CODE esp8266_module::wifi_sock_connect_url(CSocket* sock) { CSTRING cmd;; for(int try_cnt=0; sock && try_cnt <3; try_cnt++ ) { if(sock->sock_state & SOCKET_OPEN) { unsigned int sid = sock->sock_id; cmd.format("+CIPSTART=%u,\"%s\",\"%s\",%u", sid, (((sock_mode_t*)sock->mode.as_voidptr)->sock_type == IP_SOCKET_TCP)?"TCP":"UDP", sock->src.as_charptr, sock->dst.as_int); if (wifi_send_cmd(cmd.c_str(), 40) & WIFI_CMD_STATE_OK) { pending_socket = sock; for(int i=0; i<500; i++) { wifi_sleep(10); if(sock->sock_state == SOCKET_CONECTED) break; } pending_socket = NULL; received_size[sock->sock_id] = 0; if(sock->sock_state == SOCKET_CONECTED) { TRACE_WIFI("\r\nLink %d", sid); return RES_SIG_OK; } wifi_esp8266_socket_close(sid); } //Debug get_socket_state(sid); } else { wifi_net_error(NET_ERR_SOCK_CLOSED); return RES_SIG_ERROR; } } wifi_net_error(NET_ERR_SOCK_CONNECT); return RES_SIG_ERROR; }
RES_CODE esp8266_module::process_write(CSocket* sock) { unsigned size;//, newsize, id; // unsigned int start_size, write_size, sock_state; CSTRING cmd; unsigned char snd_pending; while(1) { size = sock->len; if(!size) { TRACELN1("WIFI: write OK"); return RES_SIG_OK; } if(size >1022) size = 1022; if(sock->sock_state != SOCKET_CONECTED) break; // Send command cmd.format("+CIPSEND=%u,%u", sock->sock_id, size); TRACELN("WIFI: WRITE %d?", size); cmd_state |= WIFI_CMD_STATE_HND; if(wifi_send_cmd(cmd.c_str(), 20) != WIFI_CMD_STATE_RETURNED) { wifi_net_error(NET_ERR_SOCK_WRITE); return RES_SIG_ERROR; } // Send data snd_pending = '>'; do { process_input(rcv_hnd.signal, cmd.c_str(), snd_pending); if ( cmd_state >= WIFI_CMD_STATE_HND ) { if ( cmd_state & WIFI_CMD_STATE_HND ) { unsigned int mytime; cmd_state &= ~WIFI_CMD_STATE_HND; snd_pending = 0; rcv_hnd.tsk_start_read(&received_ch, 1); mytime = CURRENT_TASK->time; tsk_sleep(55); // data sheet recomendation if( snd_hnd.tsk_write(sock->src.as_voidptr, size, WIFI_WRITE_TOT) != RES_OK) break; CURRENT_TASK->time = mytime; } else { if ( cmd_state >= WIFI_CMD_STATE_OK ) break; // command completed with OK, ERROR .. } } } while(tsk_resume_wait_signal(rcv_hnd.signal)); // wifi_on_blink_transfer(this, GPRS_TRANSFER_INDICATOR); //Check the result if(cmd_state & WIFI_CMD_STATE_OK) { TRACE1(" done!"); sock->src.as_byteptr += size; sock->len -= size; continue; } if (cmd_state & WIFI_CMD_STATE_CMES) { TRACE_ERROR("\r\nWIFI:%s write ERROR", sock->client.task->name); } break; } wifi_sleep(120); wifi_net_error(NET_ERR_SOCK_WRITE); return RES_SIG_ERROR; }
RES_CODE esp8266_module::wifi_drv_pwron(bool lowlevel) { RES_CODE res; WIFI_DRIVER_DATA * drv_data = drv_info->drv_data; bool changed = false; if(drv_data->wifi_flags_bad & WIFI_FLAG_SHUTDOWN) return wifi_error(NET_ERR_WIFI_SHUTDOWN); if( drv_data->wifi_flags_ok & WIFI_FLAG_ON) return RES_OK; TRACE1_WIFI_DEBUG("\r\nWIFI power"); drv_data->wifi_flags_ok = WIFI_STATE_OFF; do { res = wifi_echo_off(lowlevel, 0); if(lowlevel) return res; if(res != RES_OK) { res = wifi_echo_off(lowlevel, 1); if(res == RES_OK && !changed) { //try to switch baudrate CSTRING cmd; cmd.format("+CIOBAUD=%u", *(const uint32_t*)drv_info->iface_mode_stru[0]); if(wifi_send_cmd(cmd.c_str(), 2) & WIFI_CMD_STATE_OK) changed = true; } } else break; } while(changed); if(res == RES_OK) { // configure WiFi module wifi_send_cmd("+CWQAP", 3); // 1. Enable the module to act as “Station” res = wifi_send_cmd("+CWMODE=1", 5); if(WIFI_CMD_STATE_OK == res) { // 2.Enable multiple connections or not (1-multiple/ 0- Single // Note: This mode can only be changed after all connections are // disconnected. If server is started, reboot is required. res = wifi_send_cmd("+CIPMUX=1", 50); if(WIFI_CMD_STATE_OK == res) { //Reset (reset MT with resetting the SIM) drv_data->wifi_flags_ok = WIFI_FLAG_ON; drv_data->wifi_flags_bad &= ~WIFI_FLAG_ON; wifi_on_pwron(this); return NET_OK; } } } drv_data->wifi_error = NET_ERR_WIFI_ON; drv_data->wifi_flags_bad |= WIFI_FLAG_ON; return wifi_error(NET_ERR_WIFI); }
NET_CODE esp8266_module::wifi_esp8266_init_net(CSocket * sock) { NET_CODE res; CSTRING cmd; wifi_AP_t AP; uint32_t sig = 0; bool found; res = wifi_send_cmd("+CIFSR", 50); for(int i =0; i < 5; i++) { found = false; cmd_state |= WIFI_CMD_STATE_ROW_STOP; res = wifi_send_cmd("+CWLAP", 15); cmd_state &= ~WIFI_CMD_STATE_ROW_STOP; do { if(sig) { process_input(sig, "+CWLAP"); res = cmd_state; } if (res >= WIFI_CMD_STATE_OK) break; if(res & WIFI_CMD_STATE_RETURNED) { cmd_state = res & ~WIFI_CMD_STATE_RETURNED; if(!found) { res = wifi_on_get_AP(this, sock, &AP); if(res == RES_OK) found = true; } row_start = 0; row_end = 0; } sig = tsk_resume_wait_signal(rcv_hnd.signal); } while(sig); if(cmd_state & WIFI_CMD_STATE_OK) { if(!found) res = NET_ERR_WIFI_NET_NAME; else res = NET_OK; break; } } if (res != NET_OK) return wifi_error(res); // If the wifi is already connected to a network different than the one // requested - return NET_IDLE - unavailable if (NET_OK == wifi_get_network_name(cmd)) { if (0 != strcmp(cmd.c_str(), AP.name.c_str())) { return NET_IDLE; } } cmd.format("+CWJAP=\"%s\",\"%s\"", AP.name.c_str(), AP.pass.c_str()); for(int i=0; i < 3; i++) { res = wifi_send_cmd(cmd.c_str(), 50); if (WIFI_CMD_STATE_OK == res) { res = wifi_send_cmd("+CIFSR", 50); if (WIFI_CMD_STATE_ROK == res) { connected_network_name = AP.name; return NET_OK; } break; } } return NET_ERR_WIFI_REGISTER; if (WIFI_CMD_STATE_OK == res) { res = wifi_send_cmd("+CIFSR", 50); if (WIFI_CMD_STATE_ROK == res) { connected_network_name = AP.name; wifi_send_cmd("+CIPSTART=\"TCP\",\"www.tmos-arm.com\",80", 50); //wifi_send_cmd("+CIPSTART=\"TCP\",\"192.168.147.100\",6112", 50); cmd.clear(); cmd.append("+CIPSEND="); cmd.appendf("%d", strlen(message) + 1); wifi_send_cmd(cmd.c_str(), 200); // make sure the handle is working if it is open while(rcv_hnd.res < FLG_BUSY) { process_input(0, NULL); } wifi_sleep(20); //(the recommended value is at least 20 ms) // make sure no URC is coming and the buf is empty if( cmd_state & WIFI_CMD_STATE_STARTED) { if (tsk_wait_signal(rcv_hnd.signal, 8192)) { do { process_input(rcv_hnd.signal, NULL); } while ( (cmd_state & WIFI_CMD_STATE_STARTED) && tsk_resume_wait_signal(rcv_hnd.signal) ); } } //start clean cmd_state &= (WIFI_CMD_STATE_ROW_STOP | WIFI_CMD_STATE_HND); row_start = row_end = 0; snd_hnd.tsk_write(message, strlen(message) + 1, WIFI_WRITE_TOT); return NET_OK; } } return wifi_net_error(res); }