1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| private function socketUdpConnection ( )
{
// func=2 est reservé aux accusés réception en connexion socket
// Si l'on reçoit une func=2 en GET/POST on sort, c'est une erreur de programmation
if ( $this->inputs['func'] == 2 )
{
$message = '[ERROR 2] .::Requette UDP by '.$_SERVER['REMOTE_ADDR'].'::. -> '.LANG_errorProg.' => '.$confirmation;
$this->logFile( 'error', '['.$this->getDate( time() ).'] '.$message );
exit;
}
// extration des champs pour les affecter a une variable
$func = $this->inputs['func'];
$to = $this->inputs['to'];
$val = $this->inputs['val'];
$valfloat = $this->inputs['valfloat'];
$date = $this->inputs['date'];
// Ip de l'aruino
$host = CONFIG_IP_ARDUINO;
// Port de l'arduino
$port = CONFIG_PORT_ARDUINO;
// Creer le Socket
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_nonblock($socket);
// Envois les données a l'arduino en connexion socket UDP
socket_sendto($socket, $func.','.$to.','.$val.','.$valfloat.','.$date, strlen($func.','.$to.','.$val.','.$valfloat.','.$date), 0, $host, $port);
// Gestion des accuses reception de l'arduino pour affichage sur le site web
$repTo = '';
$retConfirmation = '';
$time_start = time() ;
$timeout = 20; // 20 secs
// Confirmation UDP
$confirmation = 'func='.$func.'&to='.$to;
$this->counter = 0;
$ready = false;
// On fait une lecture UDP jusqu'au (timeout: 10s)
// Si l'on a pas reçu la confirmation udp, on renvois la requette et on relance une lecture UDP
// Si pas de reponde on recommance le cycle 4 fois (count:4)
while( $this->counter <= 3 && $ready === false )
{
// On incremente notre compteur pour commancer a 1
$this->counter++;
$time = time();
// On attend que la tempo soit terminé ou de recevoir la confirmation UDP
do
{
// Si la reception UDP retourne une erreur
socket_recvfrom($socket, $buffer, strlen($confirmation), 0, $host, $port);
}
while( ((time() - $time ) <= $timeout) && ( $buffer !== $confirmation) );
// Si la confirmation UDP n'a pas ete recu, c'est que l'on a atteint la tempo
if ($buffer !== $confirmation)
{
// On renvoit les données a l'arduino en connexion socket UDP
socket_sendto($socket, $func.','.$to.','.$val.','.$valfloat.','.$date, strlen($func.','.$to.','.$val.','.$valfloat.','.$date), 0, $host, $port);
}
else
{
$ready = true;
}
}
// Si la confirmation UDP n'a pas ete recu, c'est que l'on a atteint le nombre maxi de tentative (3)
if ($this->counter > 3)
{
$message = '[ERROR 3] .::Requette UDP by '.$_SERVER['REMOTE_ADDR'].'::. -> '.LANG_udpRequestFailed.$this->counter.' '.LANG_attempt;
$this->logFile( 'error', '['.$this->getDate( time() ).'] '.$message );
if ( $func == 1 )
echo 'false|'.LANG_replyUdpTimeOut.' au bout des '.$this->counter.' tentatives';
else
echo 'replyUDPerror|'.$confirmation;
socket_close($socket);
exit;
} |
Partager