【APP设计】一种WiFi定位系统的设计与实现(2/3)


前言

本博客将详细介绍WiFi定位系统开发环境和各个模块的设计。主要介绍了WiFi定位系统的设计与实现过程,包括开发环境的选择、用户登录与注册功能模块的开发、数据采集模块的实现、数据存储模块的构建、可视化处理模块的设计、定位算法模块的编写和WiFi热点共享模块的开发。本博客还展示了部分功能的界面效果和代码片段,并对定位算法的结果和精度进行了分析和评价。


一、开发环境

所设计的WiFi定位系统的开发环境包括以下几个方面:

操作系统:用于开发WiFi定位系统的操作系统是Android,它是一个广泛使用的基于Linux内核的移动操作系统。安卓提供了丰富的应用编程接口(API)和开发工具,用于创建可在各种设备上运行的应用程序,如智能手机、平板电脑、智能手表等。

开发工具:用于WiFi定位系统的开发工具包括Android Studio、Navicat、宝塔Linux面板和MySQL Workbench。Android Studio是一个用于Android应用开发的集成开发环境(IDE),它提供的功能包括代码编辑、调试、测试和部署。Navicat是一款强大而易用的数据库管理和设计工具,可以帮助你连接、管理和操作多种数据库系统,支持通过SSH通道和HTTP通道连接到数据库,保证了数据的安全性。宝塔Linux面板是一款简单好用的服务器运维管理面板,可以帮助你快速创建和管理web项目,安装和配置各种软件如MySQL数据库,监控服务器资源,提升服务器安全等。MySQL Workbench是一个设计和管理MySQL数据库的图形化工具,用于存储和处理从WiFi定位系统收集的数据。

测试设备:用于WiFi定位系统的测试设备包括几个具有WiFi和GPS功能的Android设备,本设计使用华为nova5Pro和小米4。这些设备用于收集WiFi热点信息、GPS定位信息以及室内环境的其他信息,还被用来测试WiFi定位系统的性能和准确性,通过比较基于WiFi的位置估计。

数据库:用于WiFi定位系统的数据库是MySQL,这是一个流行的开源关系型数据库管理系统(RDBMS)。MySQL支持各种数据类型,如数字、字符串、日期等,并提供各种函数和操作符来处理数据。MySQL还支持交易、并发控制、索引和查询优化,这些对于确保WiFi定位系统的效率和可靠性非常重要。

定位算法:用于WiFi定位系统的算法是基于WiFi指纹,这是一种使用来自不同接入点(AP)的WiFi信号的接收信号强度(RSS)来估计设备位置的技术。WiFi指纹识别包括两个阶段:离线阶段和在线阶段。在离线阶段,通过收集来自室内环境中已知位置的不同接入点的RSS值,创建一个WiFi指纹数据库。在在线阶段,设备测量附近接入点的RSSI值,并将其与WiFi指纹数据库进行比较,以找到最佳匹配并估计其位置。

二、用户登录与注册功能模块

用户登录与注册功能模块是WiFi定位系统的基础功能模块,它负责用户的身份认证和信息管理,为其他功能模块提供用户数据支持。本文设计的WiFi定位系统采用了基于手机号码的用户登录与注册方式,即用户通过输入手机号码和密码来完成登录或注册操作。该模块包括用户登录界面设计和用户注册界面设计两个子模块。

2.1用户登录界面设计

该界面采用Android开发中的layout功能,使用XML语言编写布局文件,使用Java语言编写逻辑代码。该界面的布局如图所示。
在这里插入图片描述

该界面主要包括以下控件:页面布局一个ImageView控件,用于显示WiFi定位系统的LOGO;两个EditText控件,分别用于输入用户名和密码;一个Button控件,用于提交登录信息;一个TextView控件,用于跳转到用户注册界面。
该界面的逻辑代码主要实现以下功能:
检查手机号和密码是否为空,如果为空,则提示用户输入。检查手机号和密码是否正确,如果正确,则跳转到主界面;如果错误,则提示用户重新输入;监听TextView控件的点击事件,如果点击,则跳转到用户注册界面。

2.2用户注册界面设计

用户注册界面是WiFi定位系统的辅助功能模块,用于实现新用户的信息录入和账号创建。该界面采用Android Studio开发工具进行设计,使用XML语言编写布局文件,使用Java语言编写逻辑代码。该界面的布局如图所示。
在这里插入图片描述

该界面主要包括以下控件:三个EditText控件,分别用于输入手机号、昵称和密码;一个Button控件,用于提交注册信息;一个TextView控件,用于跳转到用户登录界面。
该界面的逻辑代码主要实现以下功能:
检查手机号、昵称和密码是否为空,如果为空,则提示用户输入。检查手机号是否已经存在,如果存在,则提示用户重新输入。将新用户的信息保存到数据库中,并提示用户注册成功。监听TextView控件的点击事件,如果点击,则跳转到用户登录界面。

三、数据采集模块

数据采集模块是本文设计的WiFi定位系统的重要组成部分,它负责在Android手机上实现WiFi热点信息、GPS定位信息等信息的采集和上传。

该模块包括多页面布局:
1)主界面如图所示。在layout文件夹中新建一个activity_main.xml文件创建布局,创建四个按钮:刷新、开启WiFi、关闭WiFi、扫二维码和添加网络分别实现相应功能。使用WifiItemView设计一个自定义视图,初始时设置为不可见。最后是一个ScrollView,设置了权重为1,以便在需要时可以滚动。内部包含一个垂直方向的LinearLayout作为滚动内容的容器。

在这里插入图片描述

2)已连接WiFi界面如图所示。页面包括一个显示设备名称的 TextView 和显示WiFi状态、信号强度、连接速度、安全性、MAC 地址、RSSI 、IP 地址共七个显示不同 Wi-Fi 属性的线性布局。最后还有一个底部工具栏,包含四个 TextView,分别用于取消、断开连接、显示二维码和取消保存。

在这里插入图片描述
3)已保存WiFi界面如图所示。页面布局包含一个TextView用于显示WiFi名称、状态信息和信号强度信息;包含了三个TextView,实现了取消、删除和连接等功能。

4)陌生WiFi界面如图所示。页面布局一个 TextView,用于显示WiFi名称;两个 TextView,用于显示信号强度和安全性;一个 TextView 和一个 EditText,用于输入密码;三个 LinearLayout 是底部的操作栏,包括一个“取消”按钮和一个“确定”按钮,两者之间还有一条竖直方向的黑色分割线。

在这里插入图片描述
在这里插入图片描述
页面创建完成后新建java文件,通过 Android 系统原生 API 调用startScan方法扫描周围的 WiFi 网络,并将扫描结果(IAppWifi 对象)传递给 OnWifiChangeListener 监听器。然后调用createWifiItemUI方法,根据扫描到的Wi-Fi网络列表创建对应的视图并显示在界面上。

updateListView方法用于更新Wi-Fi网络列表的视图。调用onTapWifi方法处理点击Wi-Fi网络条目的逻辑, 每个网络对应一个 WifiItemView 实例,并将其添加到 ScrollView 的显示区域中。当用户点击某个 WiFi 网络时,根据该网络的状态显示相应的对话框,包括 ConnectedWifiDialog、SaveWifiDialog 和 EnterPasswordDialog等类,用于显示WiFi的连接状态信息、信号强度、连接速度、安全性、MAC地址、RSSI、ip地址信息。当用户输入密码后,将加密方式和密码传递给 AppWifiManager,尝试连接该 WiFi 网络。当已经连接的 WiFi 网络发生变化时,通过 OnWifiConnectListener 监听器更新当前连接的 WiFi 网络的数据,并更新 mCurrentItem 控件中的内容。在连接当前正在使用的 WiFi 网络时,用户可以通过 code() 方法在 MainActivity 中启动 twocode Activity,将该网络的二维码显示给用户。

四、数据库模块

数据库模块是WiFi定位系统的重要组成部分,它负责存储和管理WiFi热点信息和位置指纹信息,为定位算法模块提供数据支持。本文使用关系型数据库来存储和管理WiFi热点信息、用户数据和定位结果等。在数据库模块的设计中,我们选择了广泛应用的MySQL作为数据库管理系统。MySQL具有良好的性能、可靠性和易用性,适用于大规模数据的存储和高效的数据访问。我们使用了MySQL的客户端-服务器架构,其中客户端是Android应用程序,服务器端是运行MySQL数据库的服务器。

使用阿里云服务器连接MySQL,阿里云服务器有许多优点,如可靠性和稳定性:服务器设备采用企业级硬件,通过冗余设计和故障转移技术,确保服务器的稳定运行和数据安全。安全性:阿里云服务器提供了多层次的安全保障机制,包括网络隔离、安全加固、DDoS防护、数据备份等功能,保护用户的数据和应用安全。阿里云还通过ISO 27001、ISO 22301等国际认证,确保数据中心和服务的安全性和合规性。获取服务器公网ip,白名单放行设备ip地址,连接宝塔Linux面板,在面板中新建MySQL数据库,使用Navicat软件连接MySQL数据库。

MySQL作为一个标准的关系型数据库管理系统,具有使用简单、运行速度快、可靠性高的优点,在数据库的设计中得到广泛采用。下面重点介绍平台设计过程中所涉及的主要的几个表,包括用户表、WiFi共享信息表、用户位置信息表等,下面简介各表结构。
(1)用户信息如表所示,主要包括手机号、昵称、密码。
在这里插入图片描述
使用下面的SQL语句创建user表:

1.	DROP TABLE IF EXISTS `user`;
2.	CREATE TABLE `user`  (
3.	  `id` int(0) NOT NULL AUTO_INCREMENT,
4.	  `userAccount` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
5.	  `userPassword` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
6.	  `userName` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
7.	  PRIMARY KEY (`id`) USING BTREE
8.	) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

(2)WiFi共享信息如表所示,主要包括WiFi名称、MAC地址、WiFi密码。
在这里插入图片描述

1.	DROP TABLE IF EXISTS `share`;
2.	CREATE TABLE `share`  (
3.	  `id` int(0) NOT NULL AUTO_INCREMENT,
4.	  `WifiSsid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
5.	  `WifiMac` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
6.	  `WifiPassword` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
7.	  PRIMARY KEY (`id`) USING BTREE
8.	) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

(3)用户位置信息如表所示,该表主要包括的属性为定位地点、接入点名称、计算坐标X、计算坐标Y、信号强度。
在这里插入图片描述
使用下面的SQL语句创建position表:

1.	DROP TABLE IF EXISTS `position`;
2.	CREATE TABLE `position`  (
3.	  `id` int(0) NOT NULL AUTO_INCREMENT,
4.	  `Location` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
5.	  `Point_ssid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
6.	  `Calcu_x` double(10, 0) NOT NULL,
7.	  `Calcu_y` double(10, 0) NOT NULL,
8.	  `RSSI` int(0) NOT NULL,
9.	  PRIMARY KEY (`id`) USING BTREE
10.	) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

首先在宝塔Linux面板中创建MySQL数据库设置名称和密码,然后使用Navicat软件连接并设计MySQL数据库。然后根据数据库信息表,在Android中实现MySQL数据库的管理和操作,创建数据库操作子类,继承SQLiteOpenHelper父类,然后复写父类中的各个方法以实现自身需求,实现对数据库增、删、查、改的操作。使用到的数据库操作包括:insertIntoData添加数据、delete删除数据、querycol查询数据、updateData更新数据。

五、可视化处理模块

5.1 WiFi热点信息可视化

为了在地图上显示WiFi热点信息,本文设计的WiFi定位系统需要使用地图接口程序,实现地图选择、数据可视化等功能。本文采用百度地图API、SDK作为地图接口程序的开发工具,利用其提供的智能定位、地图、搜索等服务,实现高效、精准、稳定的地图功能。此模块功能还能当作定位地图使用,在室外没有WiFi情况下,开启GPS也可以实现实时定位。

新建xml布局文件使用 FrameLayout 布局控件,里面包含了一个百度地图的 MapView 和一个位置文本布局。位置文本布局包含三个横向排列的 LinearLayout 控件,用于展示纬度、经度和地址信息。图像如图所示。
在这里插入图片描述

页面创建完成后新建Java文件,在onCreate方法中,首先检查是否具有定位权限,如果没有则向用户请求该权限。然后初始化地图SDK,设置布局,获取地图控件,开启定位功能,请求位置更新。使用requestLocation方法,初始化定位相关的参数,并启动定位。initLocation方法用于初始化定位参数和地图显示相关的设置,包括定位模式、扫描时间间隔、是否需要地址信息等。在MyLocationListener类中,实现了百度地图的位置监听器,当接收到位置信息时更新显示的经纬度和地址,并调用navigateTo方法将地图移动到当前位置。使用百度地图API进行周边WiFi搜索的逻辑,包括创建PoiSearch对象,设置搜索结果监听器,执行搜索等操作。搜索结果会在监听器的回调方法中处理,包括更新WiFi列表和在地图上添加标记等操作。

5.2 定位结果可视化

为了显示WiFi定位的结果,本文设计的WiFi定位系统需要用户在手机上选择定位地点的平面图,设置平面图的长度和宽度进行定位。

首先在layout文件夹中新建xml布局文件,页面布局包含一个 Button,用于返回上一级界面;两个 TextView 和两个 EditText,以输入表示地图中位置的 x 和 y 坐标;两个 Button分别用于启动采集位置数据和获取平面图,点击获取平面图将调用手机相册选择平面图;最后定义了一个名为 “PinView” 的自定义视图,用于显示地图图像如图所示。

在这里插入图片描述

页面创建完成后新建java文件,继承AppCompatActivity 的活动,实现了 View.OnClickListener 接口。requestPermissionBeforeStart方法用于请求必要的权限。如果权限被授予,将初始化IndoorCollectManager 实例并启动收集服务,否则会显示相应的提示信息并关闭应用。
tryLoadOldMap方法尝试加载之前保存的地图数据,如果成功则加载地图并返回 true,否则返回 false。saveMapInfo方法保存地图信息,包括地图路径、宽度和高度。textWatcher是一个TextWatcher对象,用于监听输入框文本的变化。selectMapFromPhone方法从相册中选择地图图片,并通过调用 startActivityForResult方法启动相应的活动。onActivityResult方法处理选择地图图片的结果,如果成功选择了图片,则获取图片的宽度和高度,并保存地图信息并加载地图。loadMapImage方法加载地图图片,并初始化地图相关的操作。setGestureDetectorListener方法设置手势识别器的监听器,用于地图的手势操作。setTextWithoutTriggerListener 方法在不触发监听器的情况下设置文本框的值。

六、定位算法模块

定位算法模块是WiFi定位系统的核心模块,它负责根据前端采集模块上传的WiFi热点信息和数据库模块提供的指纹库信息,计算出用户设备的位置坐标。本文采用了基于位置指纹匹配的定位算法,即利用WiFi信号强度(RSSI)作为位置指纹,通过与指纹库中的数据进行匹配,找出最相似的位置作为定位结果,定位流程如图所示。
在这里插入图片描述

6.1 离线采集阶段

需要在室内环境中选取若干个参考点(Reference Point,RP),并用Android程序采集每个参考点处的AP的信号强度建立位置指纹数据库,每条参考点的信息包括参考点名称和坐标、各AP点(AP1,AP2,…,APm)的信号强度(RSSI)等,然后对采集到的数据进行预处理,以减少噪声和异常值的影响。最后将每个参考点的位置坐标和对应的WiFi热点信息组成一个指纹向量,并存储在数据库中,形成指纹库(Fingerprint Database)。该阶段包含以下三个流程:

1)定位地点选择界面如图所示。

页面布局包含一个EditText文本为“输入新建筑或地点名称”和一个Button(按钮)文本为“添加”。Button的enabled属性被设置为"false",当用户输入内容到EditText之后,Button就会变成可点击的状态。

在点击地点名称后跳转到参考点坐标设置界面如图所示。页面布局包含四个Button组件文本为“选择信号好且稳定的WiFi”、 “获取所选坐标周围WiFi信号强度并存储”、“获取平面图”和"数据上传服务器";四个EditText组件可以让用户输入坐标,其中两个限制用户只能输入数字和小数点;一个ListView列表的文本内容来自用户输入,它们将在应用程序中自动加载到列表中。

页面创建完成后新建java文件,定义了一个Buildings类,继承自Activity类,用来管理建筑物信息。在onCreate()方法中,初始化数据库帮助类DatabaseHelper对象和界面控件(按钮、编辑框、列表视图等),并设置它们的监听器。在onResume()方法中,重新获取建筑物信息,更新列表视图和编辑框的状态。实现了一个TextWatcher接口,在文本编辑框中输入建筑物名称时,实时检查该名称是否已经存在于建筑物列表中,如果存在,则禁用添加按钮,否则启用添加按钮。设置了ListView的OnItemClickListener监听器和SwipeDismissListViewTouchListener触摸监听器,用来响应单击建筑物列表项和侧滑删除建筑物的操作。在点击添加按钮或者弹出对话框时,调用switchToPositionsActivity()方法切换到Positions活动。实现了一个简单的建筑物管理功能,包括添加、删除和查看功能。

在这里插入图片描述

在这里插入图片描述

2)添加WiFi界面的设计与实现如图所示。

布局文件包含两个Button组件文本内容为"添加附近的WiFi"和"保存WiFi信息"分别实现相应功能;一个ListView 组件用来展示用户已经收集到的一组周边 Wifi 信号点的记录数据。点击"添加附近的WiFi"按钮后跳转页面。

页面创建完成后新建java文件,其中的onCreate 方法在 Activity 创建时调用并设置布局、按钮监听器、列表适配器和数据库帮助类等关键组件。其他方法包括更新可用 WiFi 列表和启动对话框以选择要添加的热点,同时提供一些后台操作,如第三方库的数据操作和扫描结果的获取。一个名为DialogSelectionClickHandler的内部类,用于处理多选对话框的选择事件,以及一个名为Router的内部类,用于表示特定的WiFi路由器。Button 点击事件触发getAndShowScanResults() 方法,该方法使用 WifiManager 获取附近的 WiFi 列表,并更新 dialog 中的选项。而 updateFriendlyWifis() 方法则将当前选中的 WiFi 添加到一个 ArrayList 集合中,以便在本地数据库或云端服务器上存储,从而可以稍后轻松访问。长时间触碰WiFi名称将调用setOnItemLongClickListener()方法删除已添加的WiFi。

在这里插入图片描述
在这里插入图片描述

3)定位采集界面如图所示。

页面创建完成后新建java文件,其中在 onCreate() 方法中,首先通过布局文件获取各个控件并初始化,接着根据用户所在的建筑物从数据库中获取该建筑物内的所有位置并展示在 List View 中;设置了两个 Text Watcher 监听器,分别用于监听 position_x 和 position_y 文本框中的值。当两个文本框中都有值时,获取按钮才可用;点击获取按钮会跳转到 Scan Activity;在扫描页面中,用户可以连接到该建筑物中的网络设备,并获取该位置的 Wi-Fi 信号强度;在onActivityResult()方法中,接受 Scan Activity 返回回来的PositionData数据,并在Mysql数据库中添加该位置的读数数据;onResume() 方法中重新加载本地数据库中所有位置,并更新 UI;实现了 SwipeDismissListViewTouchListener,可以滑动删除某个位置。
在这里插入图片描述

6.2 在线定位阶段

在在线定位阶段,当用户需要进行定位时,首先选择定位地点,然后Android程序会实时扫描周围的WiFi热点信息,首先对定位点的RSSI向量进行识别,识别完成后计算并排列定位点和参考点之间的矢量,筛选出K个欧氏距离最近的参考点,然后通过参考点RSSI与位置坐标一一对应的关系,找到参考点对应的位置坐标,利用定位算法计算定位点的估计坐标。

6.3 定位算法

本文在离线采集阶段使用K-means聚类算法,在线阶段使用K近邻法(KNN)、加权K近邻法(WKNN)和K-means(K均值)算法进行定位。

K-means聚类算法是一种基于划分的聚类方法,它的原理是通过迭代寻找K个簇的一种划分方案,使得每个样本到其所属簇的中心点的距离之和最小。K-means聚类算法的原理可以概括为以下几个步骤:
随机选择K个样本作为初始的簇中心点。
计算每个样本到K个簇中心点的距离,将每个样本分配到距离最近的簇中心点所在的簇。
更新每个簇的中心点,使其为该簇内所有样本的均值。
重复步骤2和步骤3,直到簇中心点不再发生变化或达到最大迭代次数。
最近邻法(NN)是一种简单的指纹匹配算法,它按下式计算测量所得RSSI矢量与数据库中各记录的RSSI矢量之间的欧式距离L_i,然后选择最小距离对应的记录的点的位置坐标作为结果输出,见公式。
在这里插入图片描述
式中(R_j )为待测点的RSSI矢量,(R_ij )为数据库中第(i)个参考点记录的RSSI矢量,(n)为AP数量,(m)为参考点数量。
K近邻法(KNN)与NN算法不同的是,它是找到与定位测量所得矢量最近邻的(K(K>2))个数据库矢量,再以这些矢量代表的位置坐标的平均值作为待定位终端的位置输出,见公式。

式中(P┴^ )为定位估计结果,(P_i )为第(i)个被选取的指纹信息所对应的坐标。
加权K近邻法(WKNN)与KNN算法的不同之处在于选取出最邻近的(K(K>2))个参考点后,给每个数据库矢量的坐标乘上了一个加权系数,加权方法很多,本文采取用欧氏距离的倒数加权,见公式。

在这里插入图片描述

6.4 定位结果与精度分析

实验环境选择某大学多间宿舍,实验场地长6米宽10米,共计77个网格参考点,各参考点之间间隔0.5米,使用定位算法模块中相关功能对该实验环境进行WiFi信号的扫描与收集,最终使用采集的60个网格参考点构建指纹数据库,考虑到WiFi信号自身的变化和受周围环境的影响,每个参考点采集10秒,最终取每个参考点的信号强度平均值以及对应参考点的坐标存入指纹库。再选取11个点(采集方法与参考点相同),作为定位阶段的测试点。

为保证算法定位结果的准确性,实验将按照运动状态进行定位,测试人沿着设定的实际路径运动,扫描定位点的信号强度,记录定位点的实际位置,并记录下采用K-means算法的计算路径,进行离线阶段的采集。在线阶段均采用本文提到的最近邻法(NN)、K近邻法(KNN)和加权K近邻法(WKNN)算法,最终得到不同的定位结果。

在这里插入图片描述

由表可知NN、KNN、WKNN算法定位精度逐渐降低,而定位精度在内部主要受数据预处理方法、定位方法和参数选取影响,在外部猜测主要受采集设备、人流量影响,数据采集密度和采集时长影响可能会产生偏差。

七、WiFi热点共享模块

7.1 扫码连WiFi

扫码连WiFi功能:应用程序会在运行时请求摄像头权限,并使用 BarcodeCallback 接口来处理条形码解码结果。当扫描到有效的条形码时,它将调用 connectToWifi 方法,该方法会扫描已保存的 Wi-Fi 网络列表,并尝试连接与条码中编码的 SSID 匹配的网络。连接成功后,相关的 UI 元素将相应地更新。scan 类继承了 AppCompatActivity 类,并实现了 SurfaceHolder.Callback 接口。在 onCreate 方法中,它可以找到布局文件中定义的 DecoratedBarcodeView、TextView、ImageView 等控件,并为其设置相应的监听器、适配器等属性或操作。同时,它还通过检查相应的权限是否被授予,启动了连续的条形码扫描功能,并展示出扫描效果线条。connectToWifi 方法则是连接 Wi-Fi 网络的关键操作,它通过获取当前设备已经保存的 Wi-Fi 配置信息,逐一匹配可能存在的目标 SSID,然后执行连接操作,成功连接后对相关 UI 进行更新。

7.2 上传服务器共享

在界面的WiFi列表中,可以点击每个WiFi右边显示的共享按钮来实现WiFi密码上传服务器共享,点击按钮后跳转页面,需要输入对应WiFi的密码来实现共享,点击确定后,程序会判断所输入的WiFi密码是否能够连接上WiFi,若能够连接则返回文本框“成功共享”,若密码输入错误则显示“共享失败,密码错误,请重新输入”。成功共享后,对应的WiFi名和密码将上传服务器,当其他设备使用此软件时,若在WiFi列表能够获取共享的WiFi,WiFi列表会将其他用户已共享的WiFi排在首列。

7.3 开启WiFi热点共享

在layout文件夹中新建一个dialog_add_wifi.xml文件创建布局如图所示,布局文件包含一个TextView控件,文字为“添加网络”;一个TextView和一个EditText组成,分别用于输入安全性、名称和密码。其中,EditText设置了一些限制条件,比如最大长度等;一个由两个TextView和一个分割线LinearLayout组成的按钮布局,用于取消或确定输入信息。

在这里插入图片描述
在完成页面布局之后,新建Kotlin文件,包含了一个名为 AddNetDialog(在文件中定义)的类。该类继承于 BaseDialog 类,并实现了一些回调方法和事件处理方法。在 onCreate 方法中,会对控件进行初始化,并设置了点击事件。具体地,当“安全性”一栏选择WPA/WPA2-Personal时,需要输入密码信息,因此将 EditText 控件显示出来;而当选择“无”时,则隐藏 EditText 控件。如此操作也影响了 needPas 变量的取值,用于后面的处理。initEvent 方法主要处理按钮的点击事件,当“取消”按钮被点击时,会回调 listener 的 onCancel 方法,并关闭当前弹窗。而当“确定”按钮被点击时,将获取输入的名称、密码信息以及加密方式等信息,并回调 listener 的 onOk 方法,最后关闭弹窗。该类中还包含了一个 AddWifiDialogListener 接口,有 onCancel 和 onOk 两个方法,用于供外部调用时实现相应的操作。


总结

本博客详细介绍了WiFi定位系统中各个模块的设计与实现过程,相关的SQL语句已给出,并展示了Android APP部分功能的界面效果和代码片段,并对定位算法的结果和精度进行了分析和评价。

下一篇博客将详细介绍定位算法是如何编写代码的并给出相关源码,需要可以关注我!!!

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值