我正在开发一个包含聊天功能的应用程序,使用MqttAndroidClient,但我一直有初始化客户端的问题。
我的目标是运行一个单独的进程(使用:remote)来运行mqtt客户端,以订阅代理以从我的聊天服务器中获取消息。远程服务在主活动中创建,我已经使用AIDL设置了IPC。
我知道错误代码指出IPC存在错误,但我无法找到原因,因为我确定我已经正确设置了AIDL。
长话短说,这是我的服务代码:
我的目标是运行一个单独的进程(使用:remote)来运行mqtt客户端,以订阅代理以从我的聊天服务器中获取消息。远程服务在主活动中创建,我已经使用AIDL设置了IPC。
我知道错误代码指出IPC存在错误,但我无法找到原因,因为我确定我已经正确设置了AIDL。
长话短说,这是我的服务代码:
private static final String MQTT_BROKER = "________(blank on purpose)";
private String userId;
private String publishTopic;
private String subscribeTopic;
MqttAndroidClient client;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new Chat_AIDL.Stub() {
@Override
public String passString(String message) throws RemoteException {
return message;
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
userId = intent.getStringExtra("userId");
publishTopic = "chat/+/" + userId + "/";
subscribeTopic = "chat/#/" + userId + "/";
Log.d("publishTopic", publishTopic);
Log.d("subscribeTopic", subscribeTopic);
establishMqttConnection();
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
}
@Override
public void messageArrived(String topic, MqttMessage receivedMessage) throws Exception {
Intent in = new Intent();
String msg = new String(receivedMessage.getPayload(), "UTF-8");
in.putExtra("resultCode", Activity.RESULT_OK);
in.putExtra("chatMsg", msg);
Log.d("MQTT_RECEIVED", msg);
LocalBroadcastManager.getInstance(getBaseContext()).sendBroadcast(in);
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
});
Log.d("SERVICE_CHAT", "STICKY");
super.onStartCommand(intent, flags, startId);
return Service.START_STICKY;
}
private void establishMqttConnection() {
MemoryPersistence memPer = new MemoryPersistence();
client = new MqttAndroidClient(this, MQTT_BROKER, userId, memPer);
try {
client.connect(null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d("MQTT", "SUCCESS");
subscribeMessage();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d("MQTT", "FAILURE");
exception.printStackTrace();
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
private void subscribeMessage() {
try {
client.subscribe(subscribeTopic, 0, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
}
});
} catch (MqttSecurityException e) {
e.printStackTrace();
} catch (MqttException e) {
e.printStackTrace();
}
}