wifi连接失败的reason

esp32学习:

在scan例程中,调试sta模式下连接失败的原因:

1、一开始以为连接失败的话,会在conenct接口esp_wifi_connect()的返回值里返回原因

      经过分析,这个接口一般返回的是0,及时是找不到ssid,或者密码错误

2、后来在event事件的SYSTEM_EVENT_STA_DISCONNECTED中发现,连接失败的原因在event时间成员里:

case SYSTEM_EVENT_STA_DISCONNECTED:
    ESP_LOGI(TAG, "SYSTEM_EVENT_STA_DISCONNECTED");
    ret = event->event_info.disconnected.reason;
    ESP_LOGI(TAG, "wqy-->ret = %d", ret);
    ESP_ERROR_CHECK(esp_wifi_connect());
break;

   ret值是我自己调试添加的,通过获取event->event_info.disconnected.reason的值可以获取连接失败的返回值;

   我让它连接不存在的ssid,返回值为201

 

返回值对应的原因:

REASON_UNSPECIFIED              = 1,
REASON_AUTH_EXPIRE              = 2,
REASON_AUTH_LEAVE               = 3,
REASON_ASSOC_EXPIRE             = 4,
REASON_ASSOC_TOOMANY            = 5,
REASON_NOT_AUTHED               = 6,
REASON_NOT_ASSOCED              = 7,
REASON_ASSOC_LEAVE              = 8,
REASON_ASSOC_NOT_AUTHED         = 9,
REASON_DISASSOC_PWRCAP_BAD      = 10,  /* 11h */
REASON_DISASSOC_SUPCHAN_BAD     = 11,  /* 11h */
REASON_IE_INVALID               = 13,  /* 11i */
REASON_MIC_FAILURE              = 14,  /* 11i */
REASON_4WAY_HANDSHAKE_TIMEOUT   = 15,  /* 11i */
REASON_GROUP_KEY_UPDATE_TIMEOUT = 16,  /* 11i */
REASON_IE_IN_4WAY_DIFFERS       = 17,  /* 11i */
REASON_GROUP_CIPHER_INVALID     = 18,  /* 11i */
REASON_PAIRWISE_CIPHER_INVALID  = 19,  /* 11i */
REASON_AKMP_INVALID             = 20,  /* 11i */
REASON_UNSUPP_RSN_IE_VERSION    = 21,  /* 11i */
REASON_INVALID_RSN_IE_CAP       = 22,  /* 11i */
REASON_802_1X_AUTH_FAILED       = 23,  /* 11i */
REASON_CIPHER_SUITE_REJECTED    = 24,  /* 11i */

REASON_BEACON_TIMEOUT         = 200,
REASON_NO_AP_FOUND              = 201,
REASON_AUTH_FAIL            = 202,
REASON_ASSOC_FAIL            = 203,
REASON_HANDSHAKE_TIMEOUT      = 204,

  在esp32里,现在的理解是,如果连接不存在的ssid,则会返回REASON_NO_AP_FOUND(201)

 如果密码错误并不能由某个返回值来具体确认;

 

 连接返回值说明的相关网址:

 https://bbs.espressif.com/viewtopic.php?f=7&t=4604

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很抱歉,作为AI语言模型,我没有能力编写代码。但是,我可以为您提供一些基本的思路和参考资料: 1. 首先需要在AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> ``` 2. 创建一个WifiP2pManager对象,并注册用于接收wifi-direct连接状态的广播接收器。 ``` WifiP2pManager mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); WifiP2pManager.Channel mChannel = mManager.initialize(this, getMainLooper(), null); BroadcastReceiver mReceiver = new WifiDirectBroadcastReceiver(mManager, mChannel, this); IntentFilter mIntentFilter = new IntentFilter(); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); registerReceiver(mReceiver, mIntentFilter); ``` 3. 发现可用的wifi-direct设备,并选择要连接的设备。 ``` mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { Toast.makeText(MainActivity.this, "发现设备成功!", Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int reasonCode) { Toast.makeText(MainActivity.this, "发现设备失败!", Toast.LENGTH_SHORT).show(); } }); mManager.requestPeers(mChannel, new WifiP2pManager.PeerListListener() { @Override public void onPeersAvailable(WifiP2pDeviceList peerList) { // 列出可用的设备列表 } }); WifiP2pDevice device = peerList.getDeviceList().get(0); WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = device.deviceAddress; mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { Toast.makeText(MainActivity.this, "连接成功!", Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int reason) { Toast.makeText(MainActivity.this, "连接失败!", Toast.LENGTH_SHORT).show(); } }); ``` 4. 在连接建立后,可以使用Socket进行通信。 ``` ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress(port)); Socket clientSocket = serverSocket.accept(); Socket socket = new Socket(); socket.connect(new InetSocketAddress(ip, port)); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); byte[] buffer = new byte[1024]; int len = inputStream.read(buffer); String message = new String(buffer, 0, len); outputStream.write("Hello, World!".getBytes()); ``` 以上是一个简单的wifi-direct连接的流程,具体实现还需要根据具体业务需求进行调整。同时,还可以参考以下官方文档: - [Wi-Fi P2P developer guide](https://developer.android.com/guide/topics/connectivity/wifip2p) - [Android Wi-Fi Direct Example](https://www.journaldev.com/10860/android-wifi-direct-example) - [WifiP2pManager](https://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值