bool tcpServerClientReceive (TcpClient& client, char *data, int size) { debugf("Application DataCallback : %s, %d bytes \r\n",client.getRemoteIp().toString().c_str(),size ); debugf("Data : %s", data); client.sendString("sendString data\r\n", false); client.writeString("writeString data\r\n",0 ); if (strcmp(data,"close") == 0) { debugf("Closing client"); client.close(); }; return true; }
int WiFiCmdRobot::WiFiCmdRobot_main() { String stringRead; int conx = 0; unsigned long timeout = 5; // 5s unsigned long start = 0; int ret=SUCCESS; // not specifically needed, we could go right to AVAILABLECLIENT // but this is a nice way to print to the serial monitor that we are // actively listening. // Remember, this can have non-fatal falures, so check the status while (1) { if(tcpServer.isListening(&status)) { Serial.print("Listening on port: "); Serial.println(portServer, DEC); digitalWrite(Led_Yellow, HIGH); // turn on led yellow break; } else if(DNETcK::isStatusAnError(status)) { Serial.println("Error Listening"); tcpClient.close(); tcpServer.close(); return -1; } } // wait for a connection until timeout conx = 0; start = millis(); while ((millis() - start < timeout*1000) && (conx == 0)) { if((count = tcpServer.availableClients()) > 0) { Serial.print("Got "); Serial.print(count, DEC); Serial.println(" clients pending"); conx = 1; // probably unneeded, but just to make sure we have // tcpClient in the "just constructed" state tcpClient.close(); } } // accept the client if((conx == 1) && (tcpServer.acceptClient(&tcpClient))) { Serial.println("Got a Connection"); lcd.clear(); lcd.print("Got a Connection"); stringRead = ""; while (tcpClient.isConnected()) { if (tcpClient.available()) { char c = tcpClient.readByte(); if (c == '\n') { Serial.println (stringRead); if (stringRead.startsWith("GET")) { Serial.println("GET"); ret = Cmd (stringRead); if (ret == SUCCESS) { ret = ReplyOK (); } else { cmd_GO[0] = 0; //reset GO command ret = ReplyKO (); } break; } else if (stringRead.startsWith("\r")) { // empty line => end Serial.println("empty line => end"); break; } else { // no GET Serial.println("no GET => ignore"); } stringRead = ""; } else { stringRead += c; } } } // end while } else if((cmd_GO[0] == CMD_GO) && (cmd_GO[1] > t_GO+(uint16_t)timeout)) // GO ongoing { Serial.println("Continue command GO"); cmd_GO[1] = cmd_GO[1] - t_GO - (uint16_t)timeout; cmd[0] = cmd_GO[0]; cmd[1] = t_GO; cmd[2] = cmd_GO[2]; ret = CmdRobot (cmd, resp, &resp_len); Serial.print("Call CmdRobot, ret: "); Serial.print(ret); Serial.print(" / resp_len: "); Serial.println(resp_len); } else if(cmd_GO[0] == CMD_GO) // end GO { Serial.println("End command GO"); cmd_GO[0] = 0; //reset GO command cmd[0] = CMD_STOP; // Stop after GO cmd[1] = 0; cmd[2] = 0; ret = CmdRobot (cmd, resp, &resp_len); Serial.print("Call CmdRobot, ret: "); Serial.print(ret); Serial.print(" / resp_len: "); Serial.println(resp_len); } // Close tcpClient.close(); digitalWrite(Led_Yellow, LOW); // turn off led yellow Serial.println("Closing TcpClient"); return SUCCESS; }
/** * Работа канала связи с Сервером Роботов, запускать в loop. * При получении команды, вызывает handleInput. */ void rraptorRobotServerTasks() { DNETcK::STATUS networkStatus; int readSize; int writeSize; // Держим Tcp-стек в живом состоянии DNETcK::periodicTasks(); if(!DWIFIcK::isConnected(conectionId)) { // Не подключены к WiFi - выключим лампочку digitalWrite(WIFI_STATUS_PIN, LOW); // Подключимся к сети WiFi bool connectedToWifi = false; #ifdef DEBUG_SERIAL Serial.println("Connecting wifi..."); #endif // DEBUG_SERIAL conectionId = connectWifi(&networkStatus); if(conectionId != DWIFIcK::INVALID_CONNECTION_ID) { // На этом этапе подключение будет создано, даже если указанная // сеть Wifi недоступна или для нее задан неправильный пароль #ifdef DEBUG_SERIAL Serial.print("Connection created, connection id="); Serial.println(conectionId, DEC); Serial.print("Initializing IP stack..."); #endif // DEBUG_SERIAL // Получим IP и сетевые адреса по DHCP DNETcK::begin(); // К открытой сети может подключиться с первой попытки, к сети с паролем // может потребоваться несколько циклов (если пароль для сети неправильный, // то ошибка вылезет тоже на этом этапе). bool initializing = true; while(initializing) { #ifdef DEBUG_SERIAL Serial.print("."); #endif // DEBUG_SERIAL // Вызов isInitialized заблокируется до тех пор, пока стек не будет // инициализирован или не истечет время ожидания (по умолчанию 15 секунд). // Если сеть не подключится до истечения таймаута и при этом не произойдет // ошибка, isInitialized просто вернет FALSE без кода ошибки, при необходимости // можно вызвать его повторно до успеха или ошибки. if(DNETcK::isInitialized(&networkStatus)) { // Стек IP инициализирован connectedToWifi = true; initializing = false; } else if(DNETcK::isStatusAnError(networkStatus)) { // Стек IP не инициализирован из-за ошибки, // в этом месте больше не пробуем initializing = false; } } #ifdef DEBUG_SERIAL Serial.println(); #endif // DEBUG_SERIAL } if(connectedToWifi) { // Подключились к Wifi #ifdef DEBUG_SERIAL Serial.println("Connected to wifi"); printNetworkStatus(); #endif // DEBUG_SERIAL // включим лампочку digitalWrite(WIFI_STATUS_PIN, HIGH); } else { // Так и не получилось подключиться #ifdef DEBUG_SERIAL Serial.println("Retry after 4 seconds..."); Serial.print("Failed to connect wifi, status: "); //Serial.print(networkStatus, DEC); printDNETcKStatus(networkStatus); Serial.println(); #endif // DEBUG_SERIAL // Нужно корректно завершить весь стек IP и Wifi, чтобы // иметь возможность переподключиться на следующей итерации DNETcK::end(); DWIFIcK::disconnect(conectionId); conectionId = DWIFIcK::INVALID_CONNECTION_ID; // Немного подождем и попробуем переподключиться на следующей итерации #ifdef DEBUG_SERIAL Serial.println("Retry after 4 seconds..."); #endif // DEBUG_SERIAL delay(4000); } } else if(!tcpClient.isConnected()) { // Подключимся к Серверу Роботов bool connectedToServer = false; #ifdef DEBUG_SERIAL Serial.print("Connecting to Robot Server..."); #endif // DEBUG_SERIAL tcpClient.connect(robot_server_host, robot_server_port); // Сокет для подключения назначен, подождем, чем завершится процесс подключения bool connecting = true; while(connecting) { #ifdef DEBUG_SERIAL Serial.print("."); #endif // DEBUG_SERIAL if(tcpClient.isConnected(&networkStatus)) { // Подключились к сереверу connectedToServer = true; connecting = false; } else if(DNETcK::isStatusAnError(networkStatus)) { // Не смогли подключиться к серверу из-за ошибки, // в этом месте больше не пробуем connecting = false; } } Serial.println(); if(connectedToServer) { // Подключились к Серверу Роботов #ifdef DEBUG_SERIAL Serial.println("Connected to Robot Server"); printTcpClientStatus(&tcpClient); #endif // DEBUG_SERIAL } else { // Так и не получилось подключиться #ifdef DEBUG_SERIAL Serial.print("Failed to connect Robot Server, status: "); //Serial.print(networkStatus, DEC); printDNETcKStatus(networkStatus); Serial.println(); #endif // DEBUG_SERIAL // Вернем TCP-клиента в исходное состояние tcpClient.close(); // Немного подождем и попробуем переподключиться на следующей итерации #ifdef DEBUG_SERIAL Serial.println("Retry after 4 seconds..."); #endif // DEBUG_SERIAL delay(4000); } } else { // Подключены к серверу - читаем команды, отправляем ответы // есть чо почитать? if((readSize = tcpClient.available()) > 0) { readSize = readSize < sizeof(read_buffer) ? readSize : sizeof(read_buffer); readSize = tcpClient.readStream((byte*)read_buffer, readSize); #ifdef DEBUG_SERIAL // Считали порцию данных read_buffer[readSize] = 0; // строка должна оканчиваться нулем Serial.print("Read: "); Serial.println(read_buffer); #endif // DEBUG_SERIAL // и можно выполнить команду, ответ попадет в write_buffer writeSize = handleInput(read_buffer, readSize, write_buffer); write_size = writeSize; } if(write_size > 0) { #ifdef DEBUG_SERIAL Serial.print("Write: "); Serial.print(write_buffer); Serial.print(" (size="); Serial.print(write_size); Serial.println(")"); #endif // DEBUG_SERIAL tcpClient.writeStream((const byte*)write_buffer, write_size); write_size = 0; } } }