android - Paho MQTT service for publishing

android, paho

Solution

The `NullPointerException` is because `connect()` calls an asynchronous method and you need to implement an `ActionListener`. In case of success you could send messages.

Log.i(LOGTAG, "MQTT Start");

MemoryPersistence memPer = new MemoryPersistence();

final MqttAndroidClient client = new MqttAndroidClient(
    context, "tcp://192.168.0.13:1883", username, memPer);

try {
    client.connect(null, new IMqttActionListener() {

        @Override
        public void onSuccess(IMqttToken mqttToken) {
            Log.i(LOGTAG, "Client connected");
            Log.i(LOGTAG, "Topics="+mqttToken.getTopics());

            MqttMessage message = new MqttMessage("Hello, I am Android Mqtt Client.".getBytes());
            message.setQos(2);
            message.setRetained(false);

            try {
                client.publish("messages", message);
                Log.i(LOGTAG, "Message published");

                client.disconnect();
                Log.i(LOGTAG, "client disconnected");

            } catch (MqttPersistenceException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            } catch (MqttException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(IMqttToken arg0, Throwable arg1) {
            // TODO Auto-generated method stub
            Log.i(LOGTAG, "Client connection failed: "+arg1.getMessage());

        }
    });
}

Problem

I am new to Android and services. My aim is to be able to set-up subscriptions and do publications on topic strings. The topic strings and client ID are set-up after parsing input of text fields. I am using the Paho MQTT service (downloaded the source and built the JAR). The following causes a Null Pointer Exception at `c.publish()`. The `logcat` shows the exception at the `IMqttDeliveryToken publish(String topic, MqttMessage message, Object userContext, IMqttActionListener callback)` method in `MqttAndroidClient` where a delivery token is being taken. ``` public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Set locale; l = getResources().getConfiguration().locale; } @Override protected void onResume() { super.onResume(); addButtonListener(); } private void addButtonListener() { Button submitButton = (Button) findViewById(R.id.buttonSubmit); submitButton.setOnClickListener(new OnClickListener() { // ... // validation code for fields in layout // ... // Finally, this. MemoryPersistence mPer = new MemoryPersistence(); String clientId = UUID.randomUUID().toString(); String brokerUrl = "tcp://m2m.eclipse.org:1883"; MqttAndroidClient c = new MqttAndroidClient(getApplicationContext(), brokerUrl, clientId, mPer); try { c.connect(); String topic = "transfers/topic"; String msg = "topic payload" MqttMessage m = new MqttMessage(); m.setPayload(msg.getBytes()); m.setQos(2); m.setRetained(false); c.publish(topic, m); } catch (MqttException e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show(); } ``` Can you please tell me how to use the service to publish and subscribe ? I did browse through the sample project (from Paho Android). The LWT and publish seems to be merged as the layout for LWT (`activity_publish.xml`) seems to be used for publication as well.

Original source