wifi局域网配网开发准备工作逻辑优化如题项目软件需要配网wifi每次现场安装都需要使用鼠标键盘进行配网的操作。影响安装效率在参考市面上的大多数类似设备后决定添加通过wifi热点进行局域网配网的功能。为实现该功能需要做一些准备工作准备工作权限① 配网的功能需要使用到定位和wifi权限。注意事项不同的安卓版本需要的权限不同博主是安卓14的版本14-17应该差不多安卓8等较低版本权限可能有所不同可以问AI定位权限只开放不启动就行!--网络基础权限--uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE/uses-permission android:nameandroid.permission.CHANGE_WIFI_STATE/uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE/uses-permission android:nameandroid.permission.INTERNET/!--WiFi扫描权限Android10--uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION/uses-permission android:nameandroid.permission.NEARBY_WIFI_DEVICESandroid:usesPermissionFlagsneverForLocation/②开关wifi需要系统级的权限要么联系厂家拿系统签名然后打包。要么找厂家要相关的jar/aar包通过该包调用相应的api。没有系统权限的app打包了也无法正常使用wifi相关的功能逻辑由于大部分代码都是AIdsgptclaude都用了写的因此只说明大致流程。下面是大概的功能描述Android IoT 设备设计的 WiFi 配网库实现了零键鼠配网通过 AP 热点 Web 配网页面完成 WiFi 配置无需键鼠/显示器AP 热点常驻AP 热点永久开启方便随时访问配网服务双模式支持WiFi 连接成功后自动尝试 APSTA 双模式Captive Portal手机连接热点后自动弹窗进入配网页面状态监控WiFi 断开自动恢复AP 热点保持运行获得权限后先判断设备是否已经连接wifi是则无需开启热点相关的服务否则通过开启局域网和热点服务让用户通过手机等设备连接相应的wifi然后找到wifi输入密码。即可完成配网的操作注意事项配网的前端服务需要固定好ip和端口号否则默认是动态的如果不看日志就不知道ip和端口号是哪个了优化当前放置在项目中运行暂时没有什么问题。实际遇到可以优化的就是关于wifi修改密码的问题如果用户直接通过键鼠的方式强行修改过系统的wifi密码并且是错误的此时项目中的就失效了。系统输入的wifi密码权限如果没有系统签名的话会被拒绝提示类似下图的信息导致无法正常修改密码。该问题当前还在联系厂家根本原因 Android 10 限制应用只能修改自己创建的WiFi配置。用户在系统设置中输入错误密码后配置由系统Settings创建我们的app无权删除、修改或通过 connect() API 连接。解决方案使用 su 命令绕过权限限制先忘记旧网络再连接。/** * 使用 wpa_cli 命令连接WiFicmd wifi的后备方案 */privatestaticbooleanconnectWithWpaCli(Stringssid,Stringpassword){try{ProcessprocessRuntime.getRuntime().exec(su);java.io.DataOutputStreamosnewjava.io.DataOutputStream(process.getOutputStream());// wpa_cli 命令序列os.writeBytes(wpa_cli add_network\n);// 等待add_network返回ID比较复杂直接用一个固定的流程// 先remove所有匹配SSID的网络再添加新的os.writeBytes(wpa_cli list_networks\n);if(passwordnull||password.isEmpty()){os.writeBytes(wpa_cli set_network 0 ssid \ssid\\n);os.writeBytes(wpa_cli set_network 0 key_mgmt NONE\n);}else{os.writeBytes(wpa_cli set_network 0 ssid \ssid\\n);os.writeBytes(wpa_cli set_network 0 psk \password\\n);}os.writeBytes(wpa_cli enable_network 0\n);os.writeBytes(wpa_cli select_network 0\n);os.writeBytes(wpa_cli save_config\n);os.writeBytes(exit\n);os.flush();os.close();java.io.BufferedReaderreadernewjava.io.BufferedReader(newjava.io.InputStreamReader(process.getInputStream()));Stringline;while((linereader.readLine())!null){Log.i(TAG,wpa_cli: line);}intresultprocess.waitFor();Log.i(TAG,wpa_cli 结果: result);returnresult0;}catch(Exceptione){Log.e(TAG,wpa_cli连接失败,e);returnfalse;}}