【发布时间】: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