#android #mqtt #android-wifi #paho #wifip2p
#Android #mqtt #android-wifi #пахо #wifip2p
Вопрос:
Привет, разработчики, в моем приложении я выполняю две операции: одна — подключить определенный Wi-Fi, программно указав SSID и пароль, а другая — взаимодействовать с MQTT. Обе операции работают нормально по отдельности, но при первом программном подключении к WIFI и после этого, если я пытаюсь подключить MQTT, он выдает исключение.
MqttException (0) - java.net.SocketException: socket failed: ENONET (Machine is not on the network)
1608792187.259 31589-31589/com.asiczen.azlock W/System.err: at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
1608792187.259 31589-31589/com.asiczen.azlock W/System.err: at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:690)
1608792187.259 31589-31589/com.asiczen.azlock W/System.err: at java.lang.Thread.run(Thread.java:919)
И вот мое подключение к Wi-Fi.
private void connectToBrideAboveQ(String networkSSID, String networkPass){
WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid(networkSSID);
builder.setWpa2Passphrase(networkPass);
WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
networkRequestBuilder.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
networkRequestBuilder.setNetworkSpecifier(wifiNetworkSpecifier);
NetworkRequest networkRequest = networkRequestBuilder.build();
cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
networkCallback = new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
Toast.makeText(MainActivity.this, "Connected", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onAvailable: " network);
cm.bindProcessToNetwork(network);
}
};
cm.requestNetwork(networkRequest, networkCallback);
}
И вот код подключения mqtt
mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setCleanSession(true);
mqttClient = new MqttAndroidClient(this, url, id);
mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
doConnectTask = true;
Log.d(TAG, "MQTT connectionLost: ");
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
mqttClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
Log.d(TAG, "MQTT CONNECTED: ");
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
doConnectTask = true;
//setNewMqttClient();
throwable.printStackTrace();
Log.d(TAG, "MQTT FAILER onFailure: ");
}
});
Заранее спасибо
Комментарии:
1. В чем здесь вопрос? Я не вижу в коде, где вы используете обратный вызов, предоставленный
ConnectivityManager.NetworkCallback()
для ожидания запуска соединения MQTT.2. Почему вы отправляете сообщения с 2 учетных записей?
Ответ №1:
Наконец, я решаю эту проблему перед подключением к MQTT, просто вызывая cm.bindProcessToNetwork(null); это решает мою проблему.