【问题标题】:Android Wi-Fi Direct hotspot failureAndroid Wi-Fi Direct 热点故障
【发布时间】:2023-01-29 20:34:10
【问题描述】:

我是 Android 平台的新手,我想创建一个创建 wi-fi 热点的应用程序,以便我的微控制器 (esp32-c3) 可以连接到它。此外,该应用程序应仅包含一个 webview 并能够自动确定微控制器的 IP 地址,以便可以建立 Websocket 连接以接收传感器数据。

在设置 IDE 时遇到很多挫折之后,我终于设法构建了一个简单的应用程序并在我的手机上运行它。我的问题是,在创建组后,我总是遇到原因代码为 0 (WifiP2pManager.ERROR) 的失败,根据文档,这是一个内部错误。我已经在多部手机(Android 12 和 13)上进行了测试,结果相同。

我注意到有大麦示例可以涵盖该主题。我是否犯了一个错误,是否有可能找出详细的错误消息而不是只看到 htis 一般错误代码?

整个平台既困难又令人沮丧。有人可以帮我吗?肯定可以在我的手机上创建它,因为使用应用程序 PdaNet+ 我可以创建一个可用的 wi-fi 直接热点。

public class MainActivity extends AppCompatActivity implements WifiP2pManager.ChannelListener, WifiP2pManager.ActionListener {
    private final IntentFilter intentFilter = new IntentFilter();
    private TextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = this.findViewById(R.id.tv1);

        intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

        WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        WifiP2pManager.Channel channel = manager.initialize(this, getMainLooper(), this);
        manager.createGroup(channel, this);

        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                tv1.append("\n" + action);
                if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
                    int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
                    if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
                        tv1.append("\nWifi P2P is enabled");
                    } else {
                        tv1.append("\nWifi P2P is disabled");
                    }
                } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
                    tv1.append("\nCall WifiP2pManager.requestPeers() to get a list of current peers");
                } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
                    tv1.append("\nRespond to new connection or disconnections");
                } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
                    tv1.append("\nRespond to this device's wifi state changing");
                }
            }
        };
        registerReceiver(receiver, intentFilter);
    }

    @Override
    public void onSuccess() {
        tv1.append("\nGroup created successfully");
    }

    @Override
    public void onFailure(int reason) {
        tv1.append("\nFailed to create group (reason "+reason+")");
    }

    @Override
    public void onChannelDisconnected() {
        tv1.append("\nonChannelDisconnected");
    }
}

显现:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

【问题讨论】:

  • I want to create an app that creates a wi-fi hotspot 你为什么不让你的应用程序的用户打开他设备的热点?
  • and be able to automatically determinate the IP-adres of the microcontroller 好吧,如果需要的话,控制器将是服务器,而您的应用程序将是客户端。但是你没有告诉谁是服务器,谁是客户端。如果您的应用程序是服务器,微控制器应首先确定您的 Android 设备的 ip。
  • after creating a group,为什么要建群?什么样的团体?
  • 为什么要使用 wifi-direct?我认为 esp 对此一无所知。
  • @blackapps 我想使用 wifi-direct,因为我认为它比 BLE 更简单。我也不确定 BLE 是否适合我的应用程序,因为我想每秒发送 3 次传感器数据。 Wifi-direct 应该可以与我的 esp32-c3 一起使用,因为我设法使用 PdaNet+ 创建了一个热点并且能够连接到它。我想创建一个带有隐藏 ssid 和用户/密码的组,这样我就可以在我的 Arduino 代码中定义这个配置。电话应该是服务器。我想要这样做的全部原因是因为可用性。

标签: android wifi-direct hotspot wifip2p


【解决方案1】:

我终于解决了问题:原来位置权限被阻止了。授予访问权限后,可以创建热点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2021-08-04
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多