{"id":150,"date":"2015-06-29T02:41:56","date_gmt":"2015-06-28T18:41:56","guid":{"rendered":"http:\/\/www.lixiaodong.com\/?p=150"},"modified":"2025-03-06T11:04:57","modified_gmt":"2025-03-06T03:04:57","slug":"android%e4%bd%bf%e7%94%a8paho%e8%bf%9b%e8%a1%8cmqtt%e5%8d%8f%e8%ae%ae%e6%b6%88%e6%81%af%e6%8e%a8%e9%80%81demo","status":"publish","type":"post","link":"https:\/\/www.lixiaodong.com\/?p=150","title":{"rendered":"android\u4f7f\u7528paho\u8fdb\u884cMQTT\u534f\u8bae\u6d88\u606f\u63a8\u9001Demo"},"content":{"rendered":"<p>[code lang=&#8221;java&#8221;]<\/p>\n<p>package com.example.myapplication;<\/p>\n<p>import android.support.v7.app.ActionBarActivity;<br \/>\nimport android.os.Bundle;<br \/>\nimport android.view.Menu;<br \/>\nimport android.view.MenuItem;<br \/>\nimport android.view.View;<br \/>\nimport android.widget.EditText;<br \/>\nimport android.widget.Toast;<\/p>\n<p>import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;<br \/>\nimport org.eclipse.paho.client.mqttv3.MqttCallback;<br \/>\nimport org.eclipse.paho.client.mqttv3.MqttClient;<br \/>\nimport org.eclipse.paho.client.mqttv3.MqttConnectOptions;<br \/>\nimport org.eclipse.paho.client.mqttv3.MqttMessage;<br \/>\nimport org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;<\/p>\n<p>public class MainActivity extends ActionBarActivity  implements MqttCallback{<\/p>\n<p>    private MqttClient mqttClient;<\/p>\n<p>    @Override<br \/>\n    protected void onCreate(Bundle savedInstanceState) {<br \/>\n        super.onCreate(savedInstanceState);<br \/>\n        setContentView(R.layout.activity_main);<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public boolean onCreateOptionsMenu(Menu menu) {<br \/>\n        \/\/ Inflate the menu; this adds items to the action bar if it is present.<br \/>\n        getMenuInflater().inflate(R.menu.menu_main, menu);<br \/>\n        return true;<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public boolean onOptionsItemSelected(MenuItem item) {<br \/>\n        \/\/ Handle action bar item clicks here. The action bar will<br \/>\n        \/\/ automatically handle clicks on the Home\/Up button, so long<br \/>\n        \/\/ as you specify a parent activity in AndroidManifest.xml.<br \/>\n        int id = item.getItemId();<\/p>\n<p>        \/\/noinspection SimplifiableIfStatement<br \/>\n        if (id == R.id.action_settings) {<br \/>\n            return true;<br \/>\n        }<\/p>\n<p>        return super.onOptionsItemSelected(item);<br \/>\n    }<\/p>\n<p>    public void clickButton(View button){<br \/>\n        switch (button.getId()){<br \/>\n            case R.id.register:<br \/>\n                new Thread(new Runnable() {<br \/>\n                    @Override<br \/>\n                    public void run() {<br \/>\n                        int qos             = 2;<br \/>\n                        String broker       = &quot;tcp:\/\/iot.eclipse.org:1883&quot;;<br \/>\n                        EditText editTextID = (EditText)findViewById(R.id.id);<br \/>\n                        String clientId     =  editTextID.getText().toString();<br \/>\n                        MemoryPersistence persistence = new MemoryPersistence();<br \/>\n                        try{<br \/>\n                            mqttClient = new MqttClient(broker, clientId, persistence);<br \/>\n                            MqttConnectOptions connOpts = new MqttConnectOptions();<br \/>\n                            connOpts.setCleanSession(true);<br \/>\n                            mqttClient.connect(connOpts);<br \/>\n                            mqttClient.subscribe(clientId);<br \/>\n                            mqttClient.setCallback(MainActivity.this);<br \/>\n                            runOnUiThread(new Runnable() {<br \/>\n                                public void run() {<br \/>\n                                    Toast.makeText(getApplicationContext(), mqttClient.isConnected() ? &quot;\u8fde\u63a5\u6210\u529f&quot; : &quot;\u8fde\u63a5\u5931\u8d25&quot;, Toast.LENGTH_LONG).show();<br \/>\n                                }<br \/>\n                            });<br \/>\n                        }<br \/>\n                        catch (Exception e){<br \/>\n                            e.printStackTrace();<br \/>\n                        }<\/p>\n<p>                    }<br \/>\n                }).start();<br \/>\n                break;<br \/>\n            case R.id.send:<br \/>\n                EditText editTextTargetID =(EditText)findViewById(R.id.targetID);<br \/>\n                final String targetID = editTextTargetID.getText().toString();<br \/>\n                String content = ((EditText)findViewById(R.id.content)).getText().toString();<br \/>\n                final MqttMessage message = new MqttMessage(content.getBytes());<br \/>\n                if(mqttClient==null || !mqttClient.isConnected()){<br \/>\n                    Toast.makeText(getApplicationContext(),&quot;MQTT\u672a\u8fde\u63a5&quot;,Toast.LENGTH_LONG).show();<br \/>\n                    return;<br \/>\n                }<br \/>\n                new Thread(new Runnable() {<br \/>\n                    @Override<br \/>\n                    public void run() {<br \/>\n                        try{<br \/>\n                            mqttClient.publish(targetID, message);<br \/>\n                        }<br \/>\n                        catch (Exception e){<br \/>\n                            e.printStackTrace();<br \/>\n                        }<br \/>\n                    }<br \/>\n                }).start();<br \/>\n                break;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public void connectionLost(final Throwable cause) {<br \/>\n        this.runOnUiThread(new Runnable() {<br \/>\n            public void run() {<br \/>\n                Toast.makeText(getApplicationContext(), &quot;\u5931\u53bb\u8fde\u63a5\uff1a&quot; + cause.getMessage(), Toast.LENGTH_LONG).show();<br \/>\n            }<br \/>\n        });<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public void messageArrived(String topic, MqttMessage message)<br \/>\n            throws Exception {<br \/>\n        final String msg = new String(message.getPayload());<br \/>\n        this.runOnUiThread(new Runnable() {<br \/>\n            public void run() {<br \/>\n                Toast.makeText(getApplicationContext(), &quot;\u6536\u5230:&quot;+msg, Toast.LENGTH_LONG).show();<br \/>\n            }<br \/>\n        });<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public void deliveryComplete(IMqttDeliveryToken token) {<br \/>\n        try {<br \/>\n            final String msg = new String(token.getMessage().getPayload());<br \/>\n            this.runOnUiThread(new Runnable() {<br \/>\n                public void run() {<br \/>\n                    Toast.makeText(getApplicationContext(), &quot;\u53d1\u9001\u5b8c\u6bd5:&quot; + msg, Toast.LENGTH_LONG).show();<br \/>\n                }<br \/>\n            });<br \/>\n        }<br \/>\n        catch (Exception e){<br \/>\n            e.printStackTrace();<br \/>\n        }<br \/>\n    }<\/p>\n<p>}<\/p>\n<p>[\/code]<\/p>\n<p>&nbsp;<\/p>\n<p>[code lang=&#8221;xml&#8221;]<\/p>\n<p>&lt;LinearLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;<br \/>\n    xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot; android:layout_width=&quot;match_parent&quot;<br \/>\n    android:layout_height=&quot;match_parent&quot; android:paddingLeft=&quot;@dimen\/activity_horizontal_margin&quot;<br \/>\n    android:paddingRight=&quot;@dimen\/activity_horizontal_margin&quot;<br \/>\n    android:paddingTop=&quot;@dimen\/activity_vertical_margin&quot;<br \/>\n    android:paddingBottom=&quot;@dimen\/activity_vertical_margin&quot;<br \/>\n    android:orientation=&quot;vertical&quot;<br \/>\n    tools:context=&quot;.MainActivity&quot;&gt;<\/p>\n<p>    &lt;LinearLayout<br \/>\n        android:layout_width=&quot;fill_parent&quot;<br \/>\n        android:layout_height=&quot;50dp&quot;<br \/>\n        android:orientation=&quot;horizontal&quot;&gt;<\/p>\n<p>        &lt;TextView<br \/>\n            android:layout_width=&quot;50dp&quot;<br \/>\n            android:layout_height=&quot;fill_parent&quot;<br \/>\n            android:gravity=&quot;center&quot;<br \/>\n            android:text=&quot;ID:&quot;\/&gt;<\/p>\n<p>        &lt;EditText<br \/>\n            android:id=&quot;@+id\/id&quot;<br \/>\n            android:layout_width=&quot;100dp&quot;<br \/>\n            android:layout_height=&quot;fill_parent&quot; \/&gt;<\/p>\n<p>        &lt;Button<br \/>\n            android:id=&quot;@+id\/register&quot;<br \/>\n            android:layout_width=&quot;wrap_content&quot;<br \/>\n            android:layout_height=&quot;fill_parent&quot;<br \/>\n            android:text=&quot;register&quot;<br \/>\n            android:layout_alignParentLeft=&quot;true&quot;<br \/>\n            android:layout_alignParentStart=&quot;true&quot;<br \/>\n            android:onClick=&quot;clickButton&quot; \/&gt;<\/p>\n<p>    &lt;\/LinearLayout&gt;<\/p>\n<p>    &lt;LinearLayout<br \/>\n        android:layout_width=&quot;fill_parent&quot;<br \/>\n        android:layout_height=&quot;50dp&quot;<br \/>\n        android:orientation=&quot;horizontal&quot;&gt;<br \/>\n        &lt;TextView<br \/>\n            android:layout_width=&quot;80dp&quot;<br \/>\n            android:layout_height=&quot;fill_parent&quot;<br \/>\n            android:gravity=&quot;center&quot;<br \/>\n            android:text=&quot;\u63a5\u6536\u65b9ID:&quot;\/&gt;<br \/>\n        &lt;EditText<br \/>\n            android:id=&quot;@+id\/targetID&quot;<br \/>\n            android:layout_width=&quot;50dp&quot;<br \/>\n            android:layout_height=&quot;fill_parent&quot; \/&gt;<br \/>\n        &lt;TextView<br \/>\n            android:layout_width=&quot;40dp&quot;<br \/>\n            android:layout_height=&quot;fill_parent&quot;<br \/>\n            android:gravity=&quot;center&quot;<br \/>\n            android:text=&quot;\u5185\u5bb9:&quot;\/&gt;<br \/>\n        &lt;EditText<br \/>\n            android:id=&quot;@+id\/content&quot;<br \/>\n            android:layout_width=&quot;100dp&quot;<br \/>\n            android:layout_height=&quot;fill_parent&quot; \/&gt;<br \/>\n        &lt;Button<br \/>\n            android:text=&quot;Send&quot;<br \/>\n            android:id=&quot;@+id\/send&quot;<br \/>\n            android:layout_width=&quot;wrap_content&quot;<br \/>\n            android:layout_height=&quot;fill_parent&quot;<br \/>\n            android:layout_below=&quot;@+id\/textView&quot;<br \/>\n            android:layout_alignParentLeft=&quot;true&quot;<br \/>\n            android:layout_alignParentStart=&quot;true&quot;<br \/>\n            android:onClick=&quot;clickButton&quot; \/&gt;<br \/>\n    &lt;\/LinearLayout&gt;<\/p>\n<p>&lt;\/LinearLayout&gt;<\/p>\n<p>[\/code]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[code lang=&#8221;java&#8221;] package com.example.myap [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[25,36,37],"class_list":["post-150","post","type-post","status-publish","format-standard","hentry","category-android","tag-android-2","tag-mqtt","tag-paho"],"_links":{"self":[{"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=\/wp\/v2\/posts\/150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=150"}],"version-history":[{"count":3,"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=\/wp\/v2\/posts\/150\/revisions"}],"predecessor-version":[{"id":153,"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=\/wp\/v2\/posts\/150\/revisions\/153"}],"wp:attachment":[{"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lixiaodong.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}