Android TLS套接字连接无法以编程方式添加热点

如何解决Android TLS套接字连接无法以编程方式添加热点

我目前正在实现两个应用程序:一个通过TLS套接字连接与另一个服务器应用程序通信的客户端应用程序。服务器电话(Android 7.1)需要使用密码创建热点(可以在Android热点设置中进行设置)。如果我通过“ Android系统Wi-Fi面板”将客户端电话(Android 10)连接到热点,则此连接工作正常(在Wi-Fi上点按,选择热点,输入密码→已连接)。我的Socket连接可以建立-客户端和服务器可以通信。

客户电话报告说,此热点内没有可用的互联网,这是可以的,因为我不想访问其互联网连接。

但是现在,我想使用以下代码通过WifiManager和自己创建的WifiConfiguration直接连接到它,无需进入Android设置:

    public static boolean saveAndConnectToWpaConfig(Context context,String ssidParam,String passphrase)
{
    String ssidFormated = "\"" + ssidParam + "\"";
    WifiConfiguration wifiConfiguration = new WifiConfiguration();
    wifiConfiguration.SSID = ssidFormated;
    wifiConfiguration.preSharedKey = "\"" + passphrase + "\"";
    wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

    try {
        WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        int networkId;
        if (wifiManager != null) {
            for (WifiConfiguration wifi :wifiManager.getConfiguredNetworks()) {
                if(wifi.SSID.equals(ssidFormated)) {
                    wifiManager.removeNetwork(wifi.networkId);
                    break;
                }
            }
            networkId = wifiManager.addNetwork(wifiConfiguration);

            if (networkId != -1)
            {
                wifiManager.disconnect();
                if(wifiManager.enableNetwork(networkId,true)) {
                    wifiManager.saveConfiguration();
                    return true;
                }
            }
        }
    } catch (Exception e) {
        Logs.log(Logs.LogTypes.exception,"Can't connect to SSID: " + ssidParam,e);
    }

    return false;
}

一方面,此代码有效。我可以连接到热点,Android表示还可以。另一方面,尝试创建我的套接字连接现在导致createSocket()方法中的超时意外:

socket = SSLUtility.getSocketFactory().createSocket(ip,port);

例外:

java.net.ConnectException: failed to connect to /192.168.43.1 (port 42223) from /:: (port 36660): connect failed: ETIMEDOUT (Connection timed out)
        at libcore.io.IoBridge.connect(IoBridge.java:143)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
        at java.net.Socket.connect(Socket.java:621)

(SSLUtility构建了一个套接字工厂,但我认为在这种情况下这并不重要,因为当我通过“ Android系统Wifi面板”连接到Wifi时此代码已经可以使用了)

我检查了两个连接的配置文件:

通过“ Android系统Wifi面板”的工作热点连接:

ID: 99 SSID: "My_Hotsport_1234" PROVIDER-NAME: null BSSID: null FQDN: null PRIO: 16 HIDDEN: false PMF: false
 NetworkSelectionStatus NETWORK_SELECTION_ENABLED
 hasEverConnected: true
 numAssociation 1

update millis:1601964892066
creation millis:1601964892066
 trusted
 macRandomizationSetting: 1
 mRandomizedMacAddress: 02:00:00:00:00:00
 KeyMgmt: WPA_PSK Protocols: WPA RSN
 AuthAlgorithms: OPEN
 PairwiseCiphers: TKIP CCMP
 GroupCiphers: WEP40 WEP104 TKIP CCMP
 GroupMgmtCiphers:
 SuiteBCiphers:
 PSK/SAE: *
Enterprise config:
eap NULL
phase2 "auth=NULL"
IP config:
IP assignment: DHCP
Proxy settings: NONE
 cuid=1000 cname=android.uid.system:1000 luid=1000 lname=android.uid.system:1000 lcuid=1000 userApproved=USER_UNSPECIFIED noInternetAccessExpected=true 
recentFailure: Association Rejection code: 0
samsungSpecificFlags:
semAutoWifiScore: 0
isVendorAp : false
recoverableRSSI: -200
inRecoverArea: false
disabledTime: 0
notInRangeTime: 0
validatedInternetAccess: false
skipInternetCheck: -1
notAskAgainCheck: false
nextTargetRssi: 0
isCaptivePortal: false
isAuthenticated: false
loginUrl: null
autoReconnect: 1
isRecommended: false
isHomeProviderNetwork: false
 WapiCertIndex: 0
 WapiPskType: 0
isWeChatAp : false
semMhsUserName : 
entryRssi24GHz : -78
entryRssi5GHz : -75

以编程方式创建的热点连接:

ID: 100 SSID: "My_Hotsport_1234" PROVIDER-NAME: null BSSID: null FQDN: null PRIO: 17 HIDDEN: false PMF: false
 NetworkSelectionStatus NETWORK_SELECTION_ENABLED
 hasEverConnected: true
 numAssociation 1
 numNoInternetAccessReports 1
update millis:1601965132465
creation millis:1601965132465
 trusted
 macRandomizationSetting: 1
 mRandomizedMacAddress: 02:00:00:00:00:00
 KeyMgmt: WPA_PSK WPA_EAP Protocols: WPA RSN
 AuthAlgorithms: OPEN
 PairwiseCiphers: TKIP CCMP
 GroupCiphers: WEP40 WEP104 TKIP CCMP
 GroupMgmtCiphers:
 SuiteBCiphers:
 PSK/SAE: *
Enterprise config:
eap NULL
phase2 "auth=NULL"
IP config:
IP assignment: DHCP
Proxy settings: NONE
 cuid=10463 cname=com.myCompany.myAppName luid=10463 lname=com.myCompany.myAppName lcuid=10463 userApproved=USER_UNSPECIFIED noInternetAccessExpected=false 
recentFailure: Association Rejection code: 0
samsungSpecificFlags:
semAutoWifiScore: 0
isVendorAp : false
recoverableRSSI: -200
inRecoverArea: false
disabledTime: 0
notInRangeTime: 0
validatedInternetAccess: false
skipInternetCheck: -1
notAskAgainCheck: false
nextTargetRssi: 0
isCaptivePortal: false
isAuthenticated: false
loginUrl: null
autoReconnect: 1
isRecommended: false
isHomeProviderNetwork: false
 WapiCertIndex: 0
 WapiPskType: 0
isWeChatAp : false
semMhsUserName : 
entryRssi24GHz : -78
entryRssi5GHz : -75

两个区别是:

  • 有一个numNoInternetAccessReports标志,该标志不在自行创建的配置中
  • 第一个用户是Android系统(通过系统设置),第二个用户是我的应用程序(自行创建的配置)

现在我的问题

  • 是否甚至可以创建到Android系统添加的Hotspot的TLS套接字连接?
  • 还是应该起作用,我需要在配置文件中手动设置“ no internet”标志?
  • 我是否想念配置中的其他内容?我尝试设置不同的算法和密钥管理,但没有成功。
  • 如何记录创建套接字的SSL输出?在“正常” Java应用程序中,我可以添加JVM标志-Djavax.net.debug=all来获取输出,在Android中这怎么可能?

我认识到将打开一个Android对话框,当我在“ Android设置”中连接到该热点时,通知该热点没有互联网连接。使用我自己创建的配置,它将不会显示。

解决方法

最后我明白了。问题确实出在那行:

cuid=10463 cname=com.myCompany.myAppName luid=10463 lname=com.myCompany.myAppName lcuid=10463 userApproved=USER_UNSPECIFIED noInternetAccessExpected=false 

但这与添加热点的用户(我的应用程序或Android系统)无关,是noInternetAccessExpected字段。不幸的是,手动连接热点不会触发“不再询问”对话框(仅在我的情况下?),该对话框表明该热点内没有可用于设置此字段的互联网。我通过从adb shell ping服务器来发现它。在关闭对话框之前,没有销钉返回,在关闭对话框之后,它仍然起作用。

但是您不能在配置文件中设置该字段,因为它没有getter / setter->闻起来像反射是必须的:

    String ssidFormated = "\"" + ssidParam + "\"";
    WifiConfiguration wifiConfiguration = new WifiConfiguration();
    wifiConfiguration.SSID = ssidFormated;
    wifiConfiguration.preSharedKey = "\"" + passphrase + "\"";
    wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    
    try {
        Field fieldname = WifiConfiguration.class.getField("noInternetAccessExpected");
        if(fieldname != null) {
            fieldname.set(wifiConfiguration,true);
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }

还有voir la-这就是窍门。我认为通常该对话框会弹出,但就我而言,它没有...

希望这可以帮助某人!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-