Разработка системы по контролю въезда на территорию
Использую Unity3D, как платформу для разработки системы, в ней присутствуют сцены (формы), в которых происходит взаимодействие пользователя с системой. На данной платформе используются скрипты, написанные на языке C#, как для взаимодействия с пользователем так для взаимодействия с базой данных. Для работы с базой данных необходимо отправить запрос PHP файлу, для отправки и получения результата используется встроенный класс «WWW». Для того чтобы сформировать форму для отправки запроса, в Unity3D предусмотрен класс «WWWForm» [1].
При запуске программы открывается форма входа, изображенная на рисунке 7. При помощи POST запроса, отправляется форма form при нажатии кнопки «Войти», форма создается из полей логина и пароля:
WWWForm form = new WWWForm ();
form.AddField ("login", _login);
form.AddField ("password", _password);
WWW www = new WWW (ConnectScriptsPath, form);
yield return www;
Переменная ConnectScriptsPath содержит в себе ссылку на файл login.php предназначенный для авторизации пользователя в программе. Данный файл получает POST запрос и проверяет, существует ли переданная пара логина и пароля в базе данных:
$login = $_POST["login"];
$password = $_POST["password"];
$res = $mysqli->query("SELECT COUNT(*) FROM `users` WHERE `login` = '$login' AND `password` = '$password'");
echo $res->fetch_array()['COUNT(*)'];
После чего передается результат обратно скрипту C# в Unity3D, где происходит загрузка следующей формы, если ответ пришел положительный, иначе форма выведет сообщение о неверно введённых данных.
Рисунок 7 – форма входа в программу
После входа в программу можно выбрать функцию контроля потока или работу с базой данных. Работа с базой данных доступна только администраторам, простому рабочему это кнопка будет неактивна. Проверка на администратора, так же происходит отправкой запроса. Где файл getRight.php проверит пользователя по базе данных, используя полеченный логин и значения из столбца «admins»:
$admins = $mysqli->query("SELECT `admins` FROM `users` WHERE `login` = '$user'")-> fetch_array()['admins'];
Рисунок 8 – меню выбора
В постановки задачи было оговаривалось, что распознаваться будут только чистые номера, выбрав функцию контроля потока можно загрузить фото из галереи или получить номер с камеры. Отправка данных на сервер происходит по щелчку соответствующей кнопки. После щелчка, сформировывается необходимая форма и отправляется файлу set.php. В этом файле картинка загружается на сервер:
copy($_FILES['uploadfile']['tmp_name'], $uploadfile)
Добавляются данные в таблицу журнала въездов:
$res = $mysqli->query("INSERT INTO `EnterCars` (`images`, `Date`, `user`) VALUES ('$uploadfile', '$dateTime', '$user')");
И запускается программа распознавания, после чего номер добавляется в базу:
$numberCar = Exec($path);
$result = $mysqli->query("UPDATE `EnterCars` SET `numberCar`='$numberCar' WHERE `Date`='$dateTime'");
Затем номер отправляется на проверку, где он сравнивается с номерами из таблицы автомобилей, имеющих доступ на территорию, и результат записывается в соответствующий столбец:
$enterCar = $mysqli->query("SELECT COUNT(*) FROM `HaveAccess` WHERE `numberCar` = '$numberCar'");
if ($enterCar->fetch_array()['COUNT(*)'] == 1)
{
$mysqli->query("UPDATE `EnterCars` SET `Status`='Въезд разрешен' WHERE `Date`='$dateTime'"); $get = "1";
}
else
{
$mysqli->query("UPDATE `EnterCars` SET `Status`='Въезд запрещен' WHERE `Date`='$dateTime'"); $get = "2"; }
В итоге PHP файл передает скрипту C# результат своих действий [9].
Рисунок 9 – форма работы с транспортным потоком
Получив результат, скрипт расшифровывает его и выдает Unity3D указание по открытию одной из панелей с выводом соответствующего сообщения. Если скрипту придет: 1 – проезд разрешен, 2 – проезд запрещен, 3 – ошибка, файл не загружен, максимальный размер файла 100 МБ.
Рисунок 10 – сообщение «Проезд разрешен»
В ситуации, когда автомобильного номера нет в таблицы «Номера автомобилей, имеющих право доступа» выведется сообщение о том, что проезд запрещен. И пользователь сможет выбрать необходимое действие:
· Продолжить работу, закрыв панель, тем самым не открыв, предположим, шлагбаум;
public void onClickClosePanelError()
{
PanelError.SetActive (false);
}
· Пропустить автомобиль, открыв шлагбаум на территорию;
Но так как в журнале въездов уже стоит статус что «въезд запрещен», необходимо изменить ее, отправив соответствующий запрос. Для нахождения строки, в которой нужно изменить статус, помимо отправки имени пользователя отправляется еще, и дата со временем, которые отправлялись ранее в запросе, и до сих пор хранящиеся в переменной.
· Добавить данный номер автомобиля в таблицу автомобилей имеющих право доступа;
Данное действие так же вызовет необходимость изменить данные в журнале въездов. Поэтому в форме запроса, вместе с датой и временем, отправляется переменная, в которой указано, нужно ли вносить номер автомобиля в таблицу номеров, имеющих доступ.
$user = $_POST["user"];
$dateTime = $_POST["dateTime"];
$add = $_POST["AddOrNot"];
$get = "";
if($add == 1) {
if($numberCar = $mysqli->query("SELECT `numberCar` FROM `EnterCars` WHERE `Date` = '$dateTime'")->fetch_array()['numberCar'])
if($mysqli->query("INSERT INTO `HaveAccess` (`numberCar`, `user`) VALUES ('$numberCar', '$user')")) $get = "1";
echo $get; }
$mysqli->query("UPDATE `EnterCars` SET `Status`='Въезд разрешен' WHERE `Date`='$dateTime'");
Рисунок 11 – сообщение «Проезд разрешен»
Если же в меню выбрать «Работа с базой данных», то открывается окно позволяющие выбрать с какой из таблиц будет происходить работа. Выбор таблицы осуществляется нажатием соответствующей кнопки, после чего происходит загрузка нужной сцены (формы).
Во всей программе, за переходы между формами отвечает встроенная библиотека UnityEngine.SceneManagement, которая подключается в скрипте программы. Используя данную библиотеку, можно создать метод, отвечающий за загрузку определенной сцены и прикрепить его к кнопке.
private void onClickOpenTableEnterCars()
{
SceneManager.LoadScene ("TableEnterCars");
}
После прикрепления метода, при нажатии кнопки сработает код SceneManager.LoadScene ("TableEnterCars") и загружается форма, в данном случае с именем TableEnterCars.
Рисунок 12 – форма выбора таблицы базы данных
Некоторые таблицы отличаются по функционалу. В таблице «журнал въездов на территорию» возможно только удаление строк. В таблицах «номера автомобилей, имеющих право доступа», «пользователи» можно редактировать, добавлять и удалять информацию.
Рассмотрим подробнее отображение данных в таблице журналов въездов, в других таблицах загрузка данных происходит аналогично, но более упрощено.
При загрузке формы журнала въездов, автоматически отправляется простой запрос на сервер.
WWW www = new WWW (ScriptPathView);
yield return www;
Где ScriptPathView – это ссылка на файл EnterCarTableView.php, отвечающий за выборку и передачу данных.
$result = $mysqli->query("SELECT * FROM `EnterCars`");
while($row = $result->fetch_assoc())
{
$rows[] = $row;
}
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
Выборка данных осуществляется из таблицы «EnterCars», находящейся в базе данных. По результатам выборки формируется массив данных, а из этого массива уже создается JSONobject:
json_encode($rows, JSON_UNESCAPED_UNICODE);
Впоследствии в Unity3D передается уже JSONobject. А т.к. данные могут содержать и кириллицу и будут отображаться некорректно, то используем параметр JSON_UNESCAPED_UNICODE. Данный параметр позволяет не кодировать многобайтные символы Unicode (по умолчанию они кодируются как \uXXXX).
Когда скрипт в Unity3D получает JSON объект, то необходимо произвести его разбор. Создав JSONObject используя полученные данные:
var js = new JSONObject (www.text);
Выполняется проверка на то, содержит ли объект в себе данные, если нет, то выводится соответствующие сообщённые:
if (js.IsNull)
{
TextPanelMessage.text = "Таблица пуста";
PanelMessage.SetActive (true);
}
Если данные присутствуют, то JSON объект преобразуется в лист (js.list). После чего происходит перебор данных листа, где строки из этого листа преобразуем в словарь (item.ToDictionary ();) для удобства доступа к значениям.
Получив словарь можно добавить строки в таблицу Unity3D, для отображения пользователю, воспользовавшись заранее созданными шаблонами:
TextRowsPrefab [0].text = data ["id"].
В строке таблицы показанной пользователю, присутствует кнопка, при нажатии которой загружается изображение хранящиеся на сервере и относящиеся к данной строке данных. Для такой возможности каждой кнопки типа buttonURLзадается необходимые параметры.
foreach (var item in js.list) {
var data = item.ToDictionary ();
GameObject Row = (GameObject)Instantiate (RowsPrefab, Table);
buttonURL = Row.gameObject.GetComponentInChildren<ButtonURL> ();
TextRowsPrefab = Row.gameObject.GetComponentsInChildren<Text> ();
TextRowsPrefab [0].text = data ["id"];
TextRowsPrefab [1].text = data ["numberCar"];
TextRowsPrefab [2].text = data ["Date"];
TextRowsPrefab [3].text = data ["Status"];
TextRowsPrefab [4].text = data ["user"];
buttonURL.Path = PathServer + data ["images"];
buttonURL.img = img;
buttonURL.PanelImageView = PanelImageView;
buttonURL.PanelMessage = PanelMessage;
}
После выполнения данного кода, отображается таблица из базы данных на форме в Unity3D.
Аналогичным образом происходят все действия в других таблицах, вне зависимости от того вывод данных, удаление, добавление или редактирование. Всегда отправляется запрос к определенному PHP файлу, для выполнения какого-либо действия [2].
Рисунок 13 – таблица «журнал въездов на территорию»
Рисунок 14 – таблица «Номера автомобилей, имеющих право доступа»
Рисунок 15 – таблица «Пользователи»
ВЫВОД
Современные системы распознавания номеров не зря имеют высокий уровень защиты и являются закрытыми. Это предотвращает взлом и использование кода для обмана системы, который может спровоцировать проникновение на закрытую территорию или подмену номеров при выписке штрафов.
В работе была предпринята попытка создать систему, позволяющую контролировать транспортный поток посредством распознавания автомобильных номеров. Для разработки алгоритма распознавания текста на номере использовался Tesseract OCR. Он позволил увеличить процент распознавания в несколько раз. Во время разработки была создана система, способная распознать номера, при условии, что номер является чистым и изображение в программу загружает пользователь. Система так же позволяет работать с таблицами базы данных, в который храниться информация о пользователях, журнал въезда на территорию, список автомобилей, имеющих право въезда. Прототип может быть улучшен добавление нового алгоритма распознавания или модификацией текучего, добавление возможности распознавания из видеопотока, добавлением различных таблиц в базу данных и взаимодействия с ними.