业务逻辑
最近在开发uni-appwifi打卡的功能,在安卓端打算获取wifi列表的唯一标识mac地址,实现将公司的wifi信息添加到数据库里面,之后员工在打开wifi时,获取此wifi的mac地址是否是公司的wifi,如果是的话,就在打卡范围内,可以打卡,如果本机的mac地址不是公司的wifif的mac地址说明连接的不是公司wifi,不能打卡,属于外勤打卡。
实际过程中遇到的问题
在uni-app的api文档中有关于wifi的api,但是比较不规范,不是很好懂,于是复制了其中的第一段代码,发现输出了一些看不懂的状态,并没有输出wifi列表,于是继续往下走,复制了第二段代码,发现有输出了,但是只是输出的是ssid即wifi名字没有mac地址,看了用不成。 于是在插件市场里面找了,除了一个安卓wifi手机助手的插件免费其他的收费,于是果断下载这个案例,看看,一顿操作,页面出来了,点初始化按钮再点wifi列表,哈哈有东西了,wifi名字和mac地址有了那就可以实现业务逻辑了,但是我将wifi关掉之后再次打卡wifi发现获取不到wifi列表了,于是尝试了各种都是一样的,于是给插件作者五星好评,没想到作者加我qq了,于是将这些bug指给他,但是作者却告诉我他没试过其他手机,只是在他手机上面简单的试了试,觉得没啥问题,最后他告诉我让我调试一下安卓源码,一脸懵逼,作为一个前端小民工,不会安卓于是这个插件只能放弃。
最终的解决方案
最后没办法,老板要求实现这个功能,翻了很多资料还有博客,一无所获,最后我想了想,还是的从uni-app的文档入手,于是我想到了,只是输出ssid的那一段代码,他既然可以输出ssid就一定可以输出mac地址,于是顺着这个线索,最终在一篇博客里面找到了原生安卓的方法,getBSSID()这个函数就能得到mac地址,于是这个难题最终解决。
代码
loadWifiInfo(){
let MainActivity = plus.android.runtimeMainActivity();
// 上下文
let Context = plus.android.importClass('android.content.Context');
// 导入WIFI管理 和 WIFI 信息 的class
plus.android.importClass("android.net.wifi.WifiManager");
plus.android.importClass("android.net.wifi.WifiInfo");
plus.android.importClass("android.net.wifi.ScanResult");
plus.android.importClass("java.util.ArrayList");
// 获取 WIFI 管理实例
let wifiManager = MainActivity.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);//打开wifi,false为关闭
// 获取当前连接WIFI的信息
let info = wifiManager.getConnectionInfo()
//查看已经连接上的WIFI信息,在Android的SDK中为我们提供了一个叫做WifiInfo的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。WifiInfo中包含了当前连接中的相关信息。
//getBSSID() 获取BSSID属性
//getDetailedStateOf() 获取客户端的连通性
//getHiddenSSID() 获取SSID 是否被隐藏
//getIpAddress() 获取IP 地址
//getLinkSpeed() 获取连接的速度
//getMacAddress() 获取Mac 地址
//getRssi() 获取802.11n 网络的信号
//getSSID() 获取SSID
//getSupplicanState() 获取具体客户端状态的信息
// 获取当前 WIFI 连接的 SSID (WIFI 名称)
// let ssid = info.getSSID()
let mac = info.getBSSID()
if(this.attendanceInformationObj.clockManage.wifi.length>0){
let stateIndex = this.attendanceInformationObj.clockManage.wifi.findIndex(ites=>ites.mac===mac)
if(stateIndex!==-1){
this.clockState = true
}
}
},