Page 1 of 1

【Android】双模配网 Wi-Fi 列表前置扫描

Posted: 2024年 Nov 26日 09:39
by os_base_zongwu

双模类的设备是目前主流的设备之后,因此,确保双模设备的正确配网是至关重要的。目前,我们涂鸦的双模设备,大部分的是支持 2.4Ghz 而不是 5G 的 Wi-Fi,然而在实际配网过程中,用户可能无法分辨哪些是 2.4Ghz 和 5Ghz,因此,可以通过让设备查询 Wi-Fi 列表的方式先查询到支持的 Wi-Fi 列表,选择之后再进行配网,这样能大大提高用户配网成功的概率和体验。

背景
设备无法联网的一个主要原因是它们无法连接到路由器。而设备连不上路由器的最常见原因,是设备不兼容当前路由器发出的WiFi。这种情况可能是因为路由器的待配网WiFi是2.4G的,也可能是因为路由器使用了较新的WiFi6或WiFi7标准,而设备无法适应这些新的WiFi技术。

如果能通过设备扫描当前环境下可以进行配网的WiFi,并且返回WiFi的信号,则可以规避一大部分以上问题。

优势
用户体验提升:通过扫描WiFi列表,设备可以展示周围可用的网络,用户无需手动输入SSID。这使得连接过程更加直观和简便,尤其对于不熟悉技术的用户来说。

减少错误连接:扫描WiFi可以确保用户选择的网络确实是当前环境中的有效网络,从而减少了手动输入SSID时可能出现的拼写错误或连接错误的可能性。

提高兼容性识别:设备在扫描后可以预先识别出哪些网络是不兼容的(例如,WiFi 5设备无法连接到仅支持WiFi 6的网络),从而避免用户尝试连接不支持的网络。

信号强度判断:通过扫描,设备可以提供每个网络的信号强度信息,帮助用户选择信号最强、最稳定的网络连接,以提高连接质量和稳定性。

支持网络选择:如果用户环境中有多个WiFi网络,扫描结果可以帮助用户在多个选项中选择最佳网络,比如一个信号更强或使用更少的网络。

安全性增强:通过显示加密类型,用户可以选择配备较强加密措施的安全WiFi,避免连接到不安全的网络。

具体实现如下:

  • 1. 拿到扫描的蓝牙对象

Code: Select all

LeScanSetting scanSetting = new LeScanSetting.Builder()
        .setTimeout(60000) // 扫描的超时时间:ms
        .addScanType(ScanType.SINGLE) // 若需要扫描蓝牙设备,则只需要添加 ScanType.SINGLE
        // .addScanType(ScanType.SIG_MESH) 可同时添加其他类型设备
        .build();
// 开始扫描
ThingHomeSdk.getBleOperator().startLeScan(scanSetting, new BleScanResponse() {
    @Override
    public void onResult(ScanDeviceBean bean) {
        // 拿到扫描的对象
    }
});
  • 2. 通过拿到的对象判断设备是否支持前置扫描

Code: Select all

// 判断是否支持前置扫描
boolean supportPreScanWifiList = SupportType.isCapabilityEnable(scanDeviceBean.getFlag(), SupportType.SUPPORT_PRE_WIFI_LIST);
  • 3. 查询 Wi-Fi 列表

Code: Select all

MultiModeQueryBuilder queryBuilder = new MultiModeQueryBuilder.Builder()
                .setHomeId(homeId)
                .setTimeout(timeout * 1000)
                .setScanDeviceBean(scandeviceBean)//scandeviceBean 扫描到的广播包,内部会根据 uuid 匹配到蓝牙设备去进行本地蓝牙连接
                .build();
ThingHomeSdk.getActivator().newMultiModeActivator().queryDeviceConfigState(queryBuilder, new IThingResultCallback<List<com.thingclips.smart.android.ble.api.WiFiInfo>>() {
        @Override
        public void onSuccess(List<com.thingclips.smart.android.ble.api.WiFiInfo>result) {
            //获取 Wi-Fi 列表成功
        }
        @Override
        public void onError(String errorCode, String errorMessage) {
            //获取失败
        }
    });

[/code]