Skip to content

ciigann/Client-Server_application_Hiking

Repository files navigation

Разработка клиент-серверного приложения «Шагомер»

Приложение «Шагомер» — это клиент-серверная система для отслеживания перемещения по GPS, разработанная в рамках проекта в университете. Система позволяет пользователям фиксировать маршруты, сохранять и редактировать любимые места, просматривать места других пользователей, а также автоматически рассчитывать пройденное расстояние, скорость и время. Серверное приложение реализовано на компьютере с использованием СУБД PostgreSQL и языка программирования Python, а клиентское — на Android-устройстве с использованием языков Java и HTML. Между клиентом и сервером реализованы два вида подключения: по локальной и глобальной сети.

Проектирование базы данных

База данных для приложения реализована с использованием системы управления базами данных. Сделаем графическую схему базы данных.

image

База данных для Клиент-серверного приложения состоит из 4 таблиц. Она была реализована на СУБД PostgreSQL с помощью SQL запросов (см. приложение A).

Первая таблица — «Пользователь». Таблица состоит из 5 атрибутов. В атрибут почта сохраняется почта от аккаунта пользователя. В атрибут пароль сохраняется пароль от аккаунта пользователя. В атрибут имя сохраняется имя пользователя. В атрибут отчество сохраняется отчество пользователя. В атрибут фамилия сохраняется фамилия пользователя. В качестве первичного ключа используется почта пользователя.

image

Вторая таблица — «История». Таблица содержит историю входов в аккаунт всех пользователей. Она состоит из 5 атрибутов. В атрибут время сохраняется, временя входа в аккаунт с точностью до секунд. В атрибут почта сохраняется почта из аккаунта пользователя. В атрибут имя сохраняется имя пользователя. В атрибут отчество сохраняется отчество пользователя. В атрибут фамилия сохраняется фамилия пользователя. Первичный ключ составной и состоит из времени и почты, почта является внешним ключом и связана с таблицей «Пользователь».

image

Третья таблица — «Координаты». Таблица содержит координаты пользователей. Она состоит из 3 атрибутов. В атрибут почта сохраняется почта пользователя, чьи координаты запомнила программа. В атрибут время сохраняется время, когда были получены координаты. В атрибут координаты указываются полученные координаты пользователя. Первичный ключ составной и состоит из времени и почты, почта является внешним ключом и связана с таблицей «Пользователь».

image

Четвертая таблица — «Место». В таблице хранятся данные о местах пользователей. Она состоит из 5 атрибутов. В атрибут название сохраняется название места пользователя. В атрибут описание сохраняется описание места пользователя. В атрибут координаты сохраняется координаты места пользователя. В атрибут почта, сохраняется почта пользователя, чье место было сохранено в базу данных. В атрибут приватность сохраняется булево значение, которое обозначает могут ли другие пользователи видеть информацию об этом месте. Первичный ключ составной и состоит из названия и почты, почта является внешним ключом и связана с таблицей «Пользователь», координаты являются альтернативным ключом.

image

Информационная модель проекта

Разработаем информационную модель для клиент-серверного приложения Hiking. Приложение способно получать данные о местоположениепользователя с телефона, считать скорость, расстояние и время. В приложении, используя сохранённые координаты, можно создавать места, редактировать места и просматривать места других пользователей.

Приложение состоит из клиентской и серверной части. Клиентскоеприложение отправляет запросы на сервер. Сервер обрабатывает полученный запрос от клиента и выполняет его, обращаясь к базе данных, затем сервер формирует ответ и отправляет его клиенту.

Приложение поддерживает два вида подключения к серверу: глобальное илокальное. При глобальном подключение сервер должен быть подключен к специально настроенному роутеру, клиент при этом может получить доступ к серверу из любой точки земли, где есть соединение с интернетом. При локальном подключение клиент подключается напрямую к серверу через интернет на клиентском устройстве, при таком соединение сервер и клиент должны находится рядом друг с другом, но зато серверу не нужен специально настроенный роутер. Составим эскиз информационной модели, чтобы показать связь между интерфейсом и базой данных.

image

Составим информационную модель для каждого из 4 окон в клиентском приложение. Описание состоит из словесного описания выполняемых клиентом действий, из запросов, которые принимает сервер — Received и из ответов, которые возвращает сервер — Echo. Первое окно — Аккаунт. Пользователь может выбрать тип подключения к серверу (локальное или глобальное) с помощью переключателя. Затем он может войти в аккаунт, указав почту и пароль, и нажав кнопку «ВОЙТИ В АККАУНТ». После этого сформируется запрос

«<get><email> + почта + <password> + пароль»

и отправится на сервер. При успешном входе в аккаунт сервер вернет два ответа. Первый ответ будет иметь формат:

«<get>True<email> + почта + <session_id> + уникальный идентификатор + <coordinates> + nкоордината + <time> + n-время + <coordinates_end>»

В этом ответе указаны почта пользователя и уникальный идентификатор, который присваивается авторизованным пользователям для дальнейшего использования вместо почты и пароля. Между флагами <coordinates> и <coordinates_end> перечисляются координаты пользователя. Каждая координата описывается широтой, долготой и временем, когда эта координата была получена, разные координаты mразделены между собой «;». Второй ответ будет иметь формат:

«<get><session_id> + уникальный идентификатор + <place> + n-название места + <coordinates> + n-координата + <description> + n-описание места + <privacy> n-приватное ли место ;<place_end><globalplaces> + n-почта пользователя +, + n-имя пользователя + « » + n-отчество + « » + n-фамилия; <name_end>»

В этом ответе указан уникальный идентификатор пользователя, а между флагами <place> и <place_end> перечислены места пользователя. Каждое место описывается с помощью названия, координат, описания и значения приватности, которое указывает, могут ли видеть это место другие пользователи. При неудачном входе в аккаунт сервер вернет ответ с указанной почтой пользователя:

«<get>False<email> + указанная почта»

Пользователь может создать новый аккаунт, нажав на кнопку «СОЗДАТЬ АККАУНТ». В этом случае сформируется запрос из указанных ранее почты, пароля, имени, отчества и фамилии пользователя:

«<create><email> + почта + <password> + пароль + <name> + имя + <surname> + фамилия + <patronymic> + отчество»

При успешном создании пользователя сервер вернет ответ «<create>True». Если пользователь с такими данными уже существует, сервер вернет ответ «<create>Error». Также авторизованный пользователь может удалить свой аккаунт. После нажатия на кнопку «УДАЛИТЬ АККАУНТ» на сервер отправится запрос:

«<delete><email> + почта + <password> + пароль»

, где указаны почта и пароль пользователя. При, верно, указанных данных сервер удалит аккаунт и вернет ответ «<delete>True», иначе «<delete>False».

image

Второе окно — Координаты. Пользователь может просматривать прокручивающуюся ленту с координатами. По достижении низа ленты формируется запрос на сервер:

«<more_coordinates> + номер десятки, который нужно загрузить + <sent_coordinates> + сдвиг + <session_id> + уникальный идентификатор пользователя»

, где указан номер десятки координат, которую нужно загрузить, сдвиг, показывающий, на сколько нужно сдвинуть отсчет десяток, и уникальный идентификатор пользователя. Если на сервере остались не подгруженные координаты клиента, сервер вернет ответ

«<more_coordinates>True + <session_id> + уникальный идентификатор пользователя + <coordinates> + n-координаты + <time> + n-время + ; + <coordinates_end>»

, где указан уникальный идентификатор пользователя. Между флагами <coordinates> и <coordinates_end> перечисляются координаты пользователя. Каждая координата описывается широтой, долготой и временем, когда эта координата была получена; разные координаты разделены между собой «;». Если все координаты загружены в ленту, сервер вернет ответ с уникальным идентификатором пользователя:

«<more_coordinates>False + <session_id> + уникальный идентификатор пользователя»

При нажатии на координаты откроется окно с картой, отображающей местоположение этой координаты. Из этого окна можно создать место, нажав на кнопку «СОХРАНИТЬ». Сформируется запрос и отправится на сервер:

«<place> + название + <session_id> + уникальный идентификатор пользователя + <coordinates> + координаты + <description> + описание + <privacy> + приватность»

, где указаны название места, уникальный идентификатор пользователя, координаты, описание и информация о том, могут ли видеть это место другие пользователи. При успешном сохранении нового места сервер вернет ответ:

«<place>True<session_id> + уникальный идентификатор пользователя», иначе «<place>False<session_id> + уникальный идентификатор пользователя»

, где указан уникальный идентификатор пользователя. При успешном сохранении места новое место добавляется в окно «Места». Также можно сохранить координаты, нажав на кнопку «ОТПРАВИТЬ КООРДИНАТЫ». Сформируется запрос:

«<location> + координата + <session_id> + уникальный идентификатор пользователя + <time> + время»

, с уникальным идентификатором пользователя, координатой и временем. При успешном сохранении координаты сервер вернет ответ с уникальным идентификатором пользователя:

«<location>True<session_id> + уникальный идентификатор пользователя», иначе «<location>False<session_id> + уникальный идентификатор пользователя»

При успешном сохранении координаты на сервере координаты будут добавлены в прокручивающуюся ленту к остальным координатам. При активации переключателя «Автоматически» каждые 10 секунд получается 5 координат. Каждая координата округляется до 4 знаков после запятой, находится средняя координата. Считается пройденное расстояние за 10 секунд, общее время отслеживания, общее пройденное расстояние и скорость

image

Третье окно — Места. Пользователь может просматривать прокручивающуюся ленту с местами. При достижении низа ленты формируется запрос на сервер:

«<more_places> + номер 10 мест, которые нужно подгрузить + <sent_places> + сдвиг + <session_id> + уникальный идентификатор пользователя»

, где указан номер семерок мест, которые нужно загрузить, сдвиг, показывающий, на сколько нужно сдвинуть отсчет семерок, и уникальный идентификатор пользователя. Если на сервере остались не подгруженные места клиента, сервер вернет ответ:

«<more_places>True<session_id> + уникальный идентификатор пользователя + <place> + n-название места + <coordinates> + nкоординаты + <description> + n-описание + <privacy> + n-приватность + ; + <place_end>»

, где указан уникальный идентификатор пользователя, а между флагами <place> и <place_end> расположены полученные места. Каждое место описывается с помощью названия, координат, описания и приватности, разные места разделены между собой «;». Если все места загружены в ленту, сервер вернет ответ с уникальным идентификатором пользователя:

«<more_places>False<session_id> + уникальный идентификатор пользователя»

При нажатии на место открывается окно с местоположением на карте этого места. В окне можно отредактировать место, внеся изменения в данные и нажав на кнопку «СОХРАНИТЬ». После этого сформируется и отправится запрос на сервер:

«<correction_place> + название + <session_id> + уникальный идентификатор пользователя + <coordinates> + координаты + <description> + описание + <privacy> + приватность»

, где указаны обновленные данные: название места, уникальный идентификатор пользователя, координаты, описание и информация о том, могут ли видеть это место другие пользователи. При успешном сохранении изменений сервер вернет ответ с уникальным идентификатором пользователя:

«<correction_place>True<session_id> + уникальный идентификатор пользователя»

, иначе

«<correction_place>False<session_id> + уникальный идентификатор пользователя»

Также можно удалить место, нажав кнопку«УДАЛИТЬ». После этого сформируется и отправится запрос на сервер:

«<delete_place> + название места + <session_id> + уникальный идентификатор пользователя»

, где указано название места и уникальный идентификатор пользователя. При успешном удалении места сервер вернет ответ с уникальным идентификатором пользователя:

«<delete_place>True<session_id> + уникальный идентификатор пользователя», иначе «<delete_place>False<session_id> + уникальный идентификатор пользователя»
image

Четвертое окно — Места пользователей. Пользователь может просматривать прокручивающуюся ленту с именами пользователей. При достижении низа ленты формируется запрос на сервер

«<more_globalplaces> + номер 9, которые нужно загрузить <session_id> + уникальный идентификатор пользователя»

, где указан номер 9 имен, которые нужно загрузить, сдвиг, показывающий, на сколько нужно сдвинуть отсчет 9, и уникальный идентификатор пользователя. Если на сервере остались не подгруженные имена пользователей, сервер вернет ответ:

«<more_globalplaces>True<session_id> + уникальный идентификатор пользователя + <globalplaces> + n-почта + , + n-имя + ; + <name_end>»

, где указан уникальный идентификатор пользователя и перечислены пользователи между флагами <globalplaces> и <name_end>. Каждый пользователь описан почтой и именем, разные пользователи разделены между собой точкой с запятой. В противном случае сервер вернет ответ с уникальным идентификатором пользователя:

«<more_globalplaces>False<session_id> + уникальный идентификатор пользователя»

При нажатии на имя отправляется запрос на сервер:

«<globalplaces_coordinates> + почта пользователя, на чье имя нажали + <session_id> + уникальный идентификатор пользователя»

, где указана почта пользователя, на чье имя нажали, и уникальный идентификатор самого пользователя. Если у данного пользователя есть глобальные места, сервер вернет ответ:

«<globalplaces_coordinates>True + <session_id> + уникальный идентификатор пользователя + <email> + почта + <places> + n-название + <coordinates> + n-координаты + <description> n-описание + ; + <places_end>»

, где указан уникальный идентификатор данного пользователя и почта выбранного пользователя. Между флагами <places> и <places_end> перечислены места пользователя. Каждое место описывается с помощью названия, координат и описания. Разные места разделяются между собой «;». В противном случае сервер вернет ответ:

«<globalplaces_coordinates>False + <session_id> + уникальный идентификатор пользователя + <email> + nпочта»

, где указана почта выбранного человека и уникальный идентификатор данного пользователя. Если у пользователя нашлись глобальные места, откроется новое окно с лентой прокрутки, в которую эти места будут загружены. При достижении низа ленты на сервер отправляется запрос:

«<more_globalplaces_coordinates> + номер 10 + <session_id> + уникальныйидентификатор пользователя + <email> + почта пользователя»

, где указан номер 10 мест, которые нужно загрузить, сдвиг, показывающий, на сколько нужно сдвинуть отсчет 10, уникальный идентификатор самого пользователя и почта пользователя, чьи места нужно загрузить. Если на сервере остались не подгруженные глобальные места пользователя, сервер вернет ответ:

«<more_globalplaces_coordinates>True<session_id> + уникальный идентификатор пользователя + <places> + название места + <coordinates> + координаты + <description> + описание + ; + <places_end>»

, где указан уникальный идентификатор пользователя, между флагами <places> и <places_end> находятся полученные места. Каждое место описано с помощью названия, координат и описания. Разные места разделены между собой «;». Если новых мест не нашлось, сервер вернет ответ с уникальным идентификатором пользователя:

«<more_globalplaces_coordinates> False<session_id> + уникальный идентификатор пользователя»

При нажатии на название места откроется окно с названием, описанием, координатами места и картой, на которой отмечено его местоположение

image

Описание интерфейса программного приложения

Серверное приложение реализовано на языке Python в приложение PyСharm, имеет консольный интерфейс (см. приложение B). Программа выводит в командную строку полученные запросы от клиента и отправленные ответы клиенту. Также есть возможность из консоли посмотреть историю входа в аккаунт, запустив графическое окно с выводом в него истории входов в аккаунт пользователей. Приложение клиента реализовано в приложение Android Studio с помощью языков Java и HTML (см. приложение C, D). Оно состоит из 4 главных окон и 4 вспомогательных. В вспомогательные окна можно попасть из главных.

image

Тестирование

Запустив клиентское приложение, мы попадем в окно координаты. Нажав на три полоски, можно вызвать боковую панель, в которой находятся все основные окна.

image

Войдем в окно Аккаунт для авторизации. Выберем тип подключения, введем почту и пароль, нажмем кнопку «ВОЙТИ В АККАУНТ». При неверном вводе пароля или логина программа подсветит ошибку красным цветом при удачном входе в аккаунт — зеленым

image

Серверное приложение вход в аккаунт:

image

Серверное приложение загрузка данных пользователя:

image

При нажатии на кнопку «СОЗДАТЬ АККАУНТ» появится поле для ввода имени, фамилии, отчества и поле для повторного ввода пароля. При повторном нажатие на кнопку создастся аккаунт

image

Серверное приложение создать аккаунт:

image

После авторизации можно попробовать удалить аккаунт, нажмем на кнопку «УДАЛИТЬ АККАУНТ». Аккаунт успешно удален.

image

После авторизации данные пользователя автоматически подгружаются в мобильное приложение. Перейдем в окно Координаты, в окне мы видим прокручивающуюся ленту с нашими сохранёнными координатами, по достижению низа ленты координаты будут подгружаться автоматически. Мы можем нажать на кнопку «СОЗДАТЬ КООРДИНАТЫ» для сохранения координаты, сохранённая координата добавится в ленту прокрутки с другими координатами, а также сохранится на сервере. При включении переключателя «Автоматически», координаты будут получаться автоматически раз 10 секунд, также будет считаться пройденное расстояние, скорость и время отслеживания.

image

Серверное приложение подгрузка координат:

image

Мобильное приложение сохранение координат в прокручивающейся ленте:

image

Серверное приложение сохранение координаты:

image

При нажатии на координату открывается окно с гугл картой, на которой отмечено местоположение этой точки. Нажмем кнопку «СОХРАНИТЬ МЕСТО» чтобы создать новое место.

image

В появившемся окне введем название и описание места и укажем могут ли видеть это место другие пользователи. Нажмем кнопку «СОХРАНИТЬ» чтобы сохранить место.

image

Серверное приложение сохранение места:

image

Перейдем в окно Место там находится наши сохранённые места, по достижению низа ленты с местами, места будут автоматически подгружаться.

image

Серверное приложение подгрузка мест:

image

При нажатии на название места будет открываться окно с подробной информацией о месте: название, описание, приватность. В этом окне мы можем отредактировать место и сохранить изменение, нажав кнопку «СОХРАНИТЬ» или удалить место, прокрутив окно вниз и нажав кнопку «УДАЛИТЬ».

image

Серверное приложение сохранение изменений:

image

Серверное приложение удалить место:

image

Откроем окно Места пользователей. Перед нами находится прокручивающаяся лента с именами пользователей, по достижению низа ленты с именами, имена будут подгружаться автоматически.

image

Серверное приложение подгрузка имен:

image

При нажатии на имя пользователя будет открываться новое окно с местами выбранного пользователя. При достижении низа ленты с местами, места будут подгружаться автоматически. При нажатии на крестик окно закроется.

image

Серверное приложение загрузка мест пользователя:

image

Серверное приложение подгрузка мест:

image

При нажатии на название места в ленте будет открываться новое окно с подробной информацией о месте: название, описание, координаты и местоположение места на Google карте. При нажатии на крестик окно закроется.

image

Проведем эксперимент: включим автоматическое измерение расстояния в моем приложении и в приложении Caynax Sports Tracker из Google Play, которое также разработано с помощью Android Studio, и сравним показания пройденного расстояния.

В разработанном приложении каждые 10 секунд получаются 5 координат, каждая из которых округляется до 4 знаков после запятой. Рассчитывается средняя координата, и если она отличается от предыдущей сохраненной координаты на 13 метров, то сохраняется в приложении и на сервере. Это сделано для того, чтобы избежать учета ложного расстояния, когда человек стоит или из-за получения неточных координат. Анализ других приложений показал, что получение ложного расстояния, когда человек стоит, или неточность измерения пройденного расстояния присущи всем приложениям, использующим только GPS для измерения пройденного расстояния человека. В приложениях, которые считают пройденное расстояние для машины, шаг между измерениями намного больше за то же время, что делает эту технологию тут более эффективной по сравнению с трекинговыми приложениями для ходьбы или бега.

На основе сохраненных координат приложение рассчитывает время отслеживания, пройденное расстояние и скорость. Сравнив полученное пройденное расстояние с помощью разработанного приложения и Caynax Sports Tracker, можно сделать вывод, что разработанное приложение относительно точно измеряет пройденное расстояние человека, а разницу в измерениях можно считать погрешностью.

image

Серверное приложение получение координа:

image

Посмотрим на карте полученные координаты с помощью моего приложения.

image image image image

ЗАКЛЮЧЕНИЕ

В ходе выполнения курсовой работы было реализовано клиент-серверное приложения с использованием системы управления базами данных PostgreSQL. В рамках работы были рассмотрены основные принципы работы СУБД, особенности клиент-серверной архитектуры, была изучена мобильная разработка и получены навыки в разработке серверного приложения.

В результате получился продукт, состоящий из клиентского и серверного приложения, имеющий 2 типа соединения между клиентским и серверным приложениями (локальное и глобальное), способный запоминать координаты по GPS с телефона, считать расстояние и скорость, сохранять понравившиеся места, просматривать места других пользователей.

Однако наша работа не лишена недостатков. Хотя расчет расстояния сопоставим с аналогичными приложениями, он требует доработки. Анализ других приложений показал, что получение ложного расстояния, когда человек стоит, или неточность измерения пройденного расстояния присущи всем приложениям, использующим только GPS для измерения пройденного расстояния человека. В приложениях, которые считают пройденное расстояние для машины, шаг между измерениями намного больше за то же время, что делает эту технологию более эффективной по сравнению с трекинговыми приложениями для ходьбы или бега. В приложениях для ходьбы или бега было бы эффективнее использовать помимо GPS датчики на самом телефоне, такие как акселерометр и гироскоп, а также заранее загруженные карты с уже известными расстояниями дорог.

Приложение A. Код SQL

Запрос для создания таблицы «Пользователь»:

image

Запрос для создания таблицы «История»:

image

Запрос для создания таблицы «Координаты»:

image

Запрос для создания таблицы «Место»:

image

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors