1.背景
本工程实践项目是一个基于蓝牙的定位APP,总共分为两个阶段。第一阶段以收集数据为主,通过手机收集当前位置蓝牙信标的RSSI和GPS数据,上传给服务器以训练模型;第二阶段,通过当前位置所接收到的蓝牙信标数据输入机器学习模型获得当前的位置信息。最后可以通过APP绘制用户路径或提供一定范围内的导航服务。
2.软件设计方案
2.1系统架构
本项目主要采用MVC架构。MVC指MVC模式的某种框架,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。MVC是一种模式,确切的说它不是一种设计模式,它是多种设计模式的组合,并不仅仅只是一个单独的一个模式。
View层,单独实现了组合模式
Model层和View层,实现了观察者模式
View层和Controller层,实现了策咯模式
2.2接口API
接口说明 | 添加蓝牙信标设备 |
接口地址 | /device/add |
请求方式 | post |
请求参数 | GPS,设备MAC地址,设备名称 |
响应数据 | 200成功 400失败 |
备注 | |
接口说明 | 登录 |
接口地址 | /user/login |
请求方式 | post |
请求参数 | 用户名,密码 |
响应数据 | 200成功 400失败 |
备注 | |
接口说明 | 上传蓝牙信标数据 |
接口地址 | /data/update |
请求方式 | post |
请求参数 | GPS,设备MAC地址,时间戳,用户Id,RSSI |
响应数据 | 200成功 400失败 |
备注 | |
接口说明 | 请求定位 |
接口地址 | /location |
请求方式 | post |
请求参数 | 蓝牙信标RSSI |
响应数据 | 200成功 当前GPS信息 400失败 |
备注 | |
2.3系统视图
2.3.1分解视图
2.3.2依赖视图
依赖视图展现了软件模块之间的依赖关系。比如一个软件模块A调用了另一个软件模块B,那么我们说软件模块A直接依赖软件模块B。如果一个软件模块依赖另一个软件模块产生的数据,那么这两个软件模块也具有一定的依赖关系。依赖视图在项目计划中有比较典型的应用。比如它能帮助我们找到没有依赖关系的软件模块或子系统,以便独立开发和测试,同时进一步根据依赖关系确定开发和测试软件模块的先后次序。依赖视图在项目的变更和维护中也很有价值,比如它能有效帮助我们理清一个软件模块的变更对其他软件模块带来影响范围。
依赖是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖。在代码上主要表现为局部变量、方法的参数或者对静态方法的调用。
2.3.3执行视图
执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行视图中的每一个执行实体,一般称为组件(Component),都是不同于其他组件的执行实体。如果有相同或相似的执行实体那么就把它们合并成一个。
2.3.4部署视图
部署图描述了一个系统运行时的硬件节点,在这些节点上运行的软件构件将在何处物理运行以及它们将如何彼此通信的静态视图。部署图包括两种基本模型元素:节点和节点间的连接。每个模型中,仅包含一个部署图。
下面是本项目的大致的部署视图:
2.3.5实现视图
3.数据库设计
用户表
字段名 | 类型 | 注释 |
user_id | int | 唯一标识 |
user_name | string | 用户名称 |
user_passwd | string | 用户密码 |
user_nickname | string | 用户昵称 |
信标设备表
字段名 | 类型 | 注释 |
uuid | string | 设备标识 |
mac | string | 信标设备mac地址 |
name | string | 设备名称 |
pt_power | int | 设备发射功率 |
flags | int | 设备模式 |
device_type | int | 设备类型 |
adevrtising_type | int | 广播类型 |
rssi | int | 信号强度 |
time_interval | int | 广播发送间隔 |
定位数据表
字段名 | 类型 | 注释 |
provider | string | 数据提供者 |
timestramp | timestramp | 获取定位的时间 |
accuracy | int | 获得的数据精度 |
longitude | double | 当前位置经度 |
latitude | double | 当前位置纬度 |
altitude | double | 当前位置海拔 |
speed | double | 速度 |
信号强度数据表
字段名 | 类型 | 注释 |
mac | string | 数据发送者mac地址 |
timestramp | timestramp | 收集数据的时间 |
rssi | int | 信号强度 |
rssi_1m | int | rssi@1md的信号强度 |
uuid | string | 数据发送者的uuid |
group | int | 数据所在组别 |
4.运行环境与技术选型
开发语言:Java、Python
客户端:Android
后端框架:SpringBoot
第三方库:OkHttpUtils、EventBus
开发工具:Intellij IDEA+Android Studio
数据库:MySQL
数据库缓存:Redis
运行环境:Linux平台+Docker容器
5.概念原型的核心工作机制
概念是人对能代表某种事物或发展过程的特点及意义所形成的思维结论,是一种虚拟的、理想化的软件产品形式,其大致等于用例 + 数据模型。
本系统的概念原型工作机制大致如下:
用户打开软件,可以通过采集数据的选项,打开蓝牙,网络,与位置信息,通过在一定范围内活动,来收集空间中所获得的信标设备所发出来的信号强度和mac地址,接着将数据保存到数据库中,并且上传到服务器,供机器学习模型训练。用户可以通过请求gps信息返回当前所在经度和纬度。当收集数据到达一定量后,即模型被建立后,用户可以直接使用软件的定位模型,将收集到的信号强度数据送入模型,得到在当前一片范围内自身所在的位置,并返回地图信息。