channel(); scanner($channel, $port); } catch (Exception $e) { print "Exception ".$e->getMessage()."\n"; $channel->close(); $connection->close(); $s=rand(5, 15); print "Sleep $s seconds.."; sleep($s); print "Ok\n"; } } function rabbitConnect($rabbitHost, $rabbitPort, $rabbitLogin, $rabbitPass, $rabbitUseSSL=false) { if ($rabbitUseSSL) { $ssl_opts=[ // set some SSL/TLS specific options 'verify_peer' => true, 'verify_peer_name' => true, 'allow_self_signed' => false ]; $connection = new AMQPSSLConnection($rabbitHost, $rabbitPort, $rabbitLogin, $rabbitPass, $rabbitVirtualHost, $ssl_opts); } else { $connection = new AMQPStreamConnection($rabbitHost, $rabbitPort, $rabbitLogin, $rabbitPass, $rabbitVirtualHost); } return $connection; } function scanner($channel, $port) { global $routingTag; $fp = @fopen($port, "rb+"); if ($fp==null) { throw new Exception("Scanner failed. Is it connected?"); } else { print "Scanner connected\n"; if (!empty($routingTag)) { $msg = new AMQPMessage(json_encode(["type"=>"service","data"=>"scannerReady"])); $channel->basic_publish($msg, 'fox.barcode', $routingTag); } } while (1) { $buffer = fgets($fp, 4096); $rv=explode("\n", $buffer); if ($buffer === false) { if (!empty($routingTag)) { $msg = new AMQPMessage(json_encode(["type"=>"service","data"=>"scannerFailed"])); $channel->basic_publish($msg, 'fox.barcode', $routingTag); } throw new Exception("Stream read failed. Scanner disconnected?"); } if (preg_match('/^fxc([0-9a-f]{20})xf$/', $buffer, $ref)) { print "Pairing request. Routing tag: $ref[1]\n"; $routingTag=$ref[1]; $msg = new AMQPMessage(json_encode(["type"=>"service","data"=>"scannerRegistered"])); $channel->basic_publish($msg, 'fox.barcode', $routingTag); } else { print "Read: $rv[0]"; if (!empty($routingTag)) { $msg = new AMQPMessage(json_encode(["type"=>"code","data"=>$rv[0]])); $channel->basic_publish($msg, 'fox.barcode', $routingTag); print " [S]"; } else { print " [-]"; } print "\n"; } } }