Exemple #1
0
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;    
}
Exemple #3
0
/**
 * Работа канала связи с Сервером Роботов, запускать в 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;
        }
    }
}