diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index e414cec..f85c756 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ # foxBarcodeScannerClient +Клиент для работы со сканером штрих-кода через последовательный порт. Клиент получает данные со сканера и отправляет в очередь RabbitMQ, указанную при регистрации. Регистрация происходит через считывания специального штрих-кода. + +## Параметры конфигурации +* SCANNER_PORT - /dev/ttyACM0 +* RABBITMQ_HOST +* RABBITMQ_USER +* RABBITMQ_PASSWORD +* RABBITMQ_USE_SSL diff --git a/barcodeScanner.php b/barcodeScanner.php new file mode 100644 index 0000000..3391135 --- /dev/null +++ b/barcodeScanner.php @@ -0,0 +1,100 @@ +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,'/',$ssl_opts); + } else { + $connection = new AMQPStreamConnection($rabbitHost, $rabbitPort, $rabbitLogin, $rabbitPass); + } + 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"; + } + } +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..95fdcb4 --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require" : { + "php-amqplib/php-amqplib": ">=3.0" + } +}