UnknownHostException occur when intract with MQTT??
Opened this issue · 0 comments
imbichitra commented
Hi, I develop an app that perform MQTT operation and also interact with a Bridge(by connecting the bridge using wifi just like we connect some one's wifi).
1->When direct interact with MQTT all operation of mqtt work like connect,subscribe and publish the data and getting the data from MQTT.
2->When I interact with Bride and again trying to interacting with MQTT it throws Exception.
MqttException (0) - java.net.UnknownHostException: Unable to resolve host "iot.rkl.com": No address associated with hostname
1608604152.272 9629-9629/com.asiczen.azlock W/System.err: at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
1608604152.272 9629-9629/com.asiczen.azlock W/System.err: at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:690)
1608604152.275 9629-9629/com.asiczen.azlock W/System.err: at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:75)
1608604152.275 9629-9629/com.asiczen.azlock W/System.err: at org.eclipse.paho.client.mqttv3.internal.SSLNetworkModule.start(SSLNetworkModule.java:92)
1608604152.275 9629-9629/com.asiczen.azlock W/System.err: at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:676)
Here the service class that perform MQTT operation
public class MqttMessageService extends Service {
private static final String TAG = MqttMessageService.class.getSimpleName();
public static final String EXTRA_DATA = "android.nfc.extra.DATA";
public static final String MQTT_CONNECTED = "android.nfc.extra.MQTT_CONNECTED";
public static final String MQTT_DISCONNECTED = "android.nfc.extra.MQTT_DISCONNECTED";
public static final String MQTT_DATA_AVAILABLE = "android.nfc.extra.MQTT_DATA_AVAILABLE";
public static final String MQTT_DELEVIERY_COMPLETED = "android.nfc.extra.MQTT_DELEVIERY_COMPLETED";
public static final String MQTT_UNABLE_TO_PUBLISH = "android.nfc.extra.MQTT_UNABLE_TO_PUBLISH";
public static final String MQTT_UNABLE_TO_SUBSCRIBE = "android.nfc.extra.MQTT_UNABLE_TO_SUBSCRIBE";
public static final String MQTT_USUBSCRIBE = "android.nfc.extra.MQTT_USUBSCRIBE";
public static final String MQTT_UN_SCBSCRIBE = "android.nfc.extra.MQTT_UN_SCBSCRIBE";
private MqttAndroidClient mqttAndroidClient;
public void connectMQTT(){
Log.d(TAG, "MQTT CONNECTION STAR: ");
PahoMqttClient pahoMqttClient = new PahoMqttClient();
mqttAndroidClient = pahoMqttClient.getMqttClient(getApplicationContext(), Packet.PublishTopic.MQTT_BROKER_URL, AppContext.getClientId(this));
mqttAndroidClient.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean b, String s) {
Log.d(TAG, "connectComplete: ");
Log.d(TAG, "MQTT CONNECTED: ");
broadcastUpdate(MqttMessageService.MQTT_CONNECTED);
}
@Override
public void connectionLost(Throwable throwable) {
Log.d(TAG, "connectionLost: ");
Log.d(TAG, " MQTT CONNECTION LOST: ");
broadcastUpdate(MqttMessageService.MQTT_DISCONNECTED);
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) {
//setMessageNotification(s, new String(mqttMessage.getPayload()));
String msg = new String(mqttMessage.getPayload(), StandardCharsets.ISO_8859_1);
Log.d(TAG, "MQTT MESSAGE ARRIVED: "+msg);
byte[] b = mqttMessage.getPayload();
broadcastUpdate(b);
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
Log.d(TAG, "MQTT ONCREATE: ");
connectMQTT();
}
private final IBinder mBinder = new LocalService();
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "MQTT ONBIND: ");
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
// After using a given device, you should make sure that BluetoothGatt.close() is called
// such that resources are cleaned up properly. In this particular example, close() is
// invoked when the UI is disconnected from the Service.
//close();
Log.d(TAG, "MQTT ONUNBIND: ");
return super.onUnbind(intent);
}
public class LocalService extends Binder {
public MqttMessageService getService(){return MqttMessageService.this;}
}
public void subcribe(){
try {
//pahoMqttClient.subscribe(mqttAndroidClient, "BridgeId_SCAN_RESPONSE", 0);
IMqttToken token = mqttAndroidClient.subscribe(Utils.getSubscribeTopic(), 0);
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
Log.d(TAG, "MQTT SUBSCRIBED 0: ");
Log.d(TAG, "Subscribe Successfully " + "BridgeId_SCAN_RESPONSE");
broadcastUpdate(MqttMessageService.MQTT_USUBSCRIBE);
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
Log.e(TAG, "Subscribe Failed " + "BridgeId_SCAN_RESPONSE");
throwable.printStackTrace();
broadcastUpdate(MqttMessageService.MQTT_UNABLE_TO_SUBSCRIBE);
}
});
} catch (MqttException e) {
broadcastUpdate(MqttMessageService.MQTT_UNABLE_TO_SUBSCRIBE);
e.printStackTrace();
}catch (Exception e){
broadcastUpdate(MqttMessageService.MQTT_UNABLE_TO_SUBSCRIBE);
e.printStackTrace();
}
}
public void msubscribe(String topic){
try {
mqttAndroidClient.subscribe(topic, 0);
Log.d(TAG, "MQTT SUBSCRIBED 1: ");
} catch (MqttException e) {
e.printStackTrace();
}
}
public void publish(byte[] payload){
Log.d(TAG, "publish: ");
MqttMessage message = new MqttMessage(payload);
message.setId(320);
message.setRetained(false);
message.setQos(0);
try {
mqttAndroidClient.publish(Utils.getPublishTopic(), message);
Log.d(TAG, "MQTT DATA PUBLISHED: ");
} catch (MqttException e) {
e.printStackTrace();
broadcastUpdate(MqttMessageService.MQTT_UNABLE_TO_PUBLISH);
}catch (Exception e){
e.printStackTrace();
}
}
public void unSubscribe(){
IMqttToken token;
try {
token = mqttAndroidClient.unsubscribe(Utils.getSubscribeTopic());
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
Log.d(TAG, "UnSubscribe Successfully ");
Log.d(TAG, "MQTT UNSUBSCRIBED: ");
broadcastUpdate(MqttMessageService.MQTT_UN_SCBSCRIBE);
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
Log.e(TAG, "UnSubscribe Failed ");
broadcastUpdate(MqttMessageService.MQTT_UN_SCBSCRIBE);
}
});
} catch (MqttException e) {
broadcastUpdate(MqttMessageService.MQTT_UN_SCBSCRIBE);
e.printStackTrace();
}
}
public void disconnect() {
try {
IMqttToken mqttToken = mqttAndroidClient.disconnect();
mqttToken.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
Log.d(TAG, "MQTT DISCONNECTED: ");
Log.d(TAG, "Successfully disconnect");
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
Log.d(TAG, "Failed to disconnect " + throwable.toString());
}
});
} catch (Exception e){
e.printStackTrace();
}
}
private void broadcastUpdate(final String action) {
final Intent intent = new Intent(action);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
private void broadcastUpdate(byte[] data) {
final Intent intent = new Intent(MqttMessageService.MQTT_DATA_AVAILABLE);
intent.putExtra(EXTRA_DATA, data);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
Below Paho connection calss
public class PahoMqttClient {
public MqttAndroidClient getMqttClient(Context context, String brokerUrl, String clientId) {
mqttAndroidClient = new MqttAndroidClient(context, brokerUrl, clientId);
try {
MqttConnectOptions MQTT_CONNECTION_OPTIONS = getMqttConnectionOption();
if (brokerUrl.contains("ssl")) {
InputStream i= context.getResources().openRawResource(R.raw.client_ca);
InputStream i1= context.getResources().openRawResource(R.raw.client_crt);
InputStream inputStream = context.getResources().openRawResource(R.raw.client_key);
MQTT_CONNECTION_OPTIONS.setSocketFactory(createSSLSocketFactory(i,i1,inputStream));
}
IMqttToken token = mqttAndroidClient.connect(MQTT_CONNECTION_OPTIONS);
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
mqttAndroidClient.setBufferOpts(getDisconnectedBufferOptions());
Log.d(TAG, "MQTT CONNECTED:0 ");
Log.d(TAG, "Success");
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d(TAG, "MQTT CONNETION FAILED:0 ");
exception.printStackTrace();
Log.d(TAG, "Failure " + exception.toString());
}
});
} catch (MqttException e) {
e.printStackTrace();
}
return mqttAndroidClient;
}
}
Thanks in Advance