问题描述
您好,我的应用程序中的开发人员执行两项操作,一项是以编程方式提供SSID 和密码 来连接特定的wifi,另一项是与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)
这是我的 Wifi 连接。
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: ");
}
});
提前致谢
解决方法
最后我在连接到 MQTT 之前解决了这个问题,只需调用 cm.bindProcessToNetwork(null); 这解决了我的问题。