Android Studio - MQTT 未连接

标签 android android-studio mqtt iot mosquitto

我刚刚开始学习在 Android Studio 中使用 MQTT 协议(protocol)。使用 mosquitto 代理,我可以在 pub/sub 窗口之间交换消息。但是当我通过 android studio 向代理发送消息时,应用程序构建成功但代理端没有显示任何内容,系统打印连接失败。相同的代码在 eclipse java 应用程序上运行良好,但在 android 上运行不正常,尽管已添加了所需的库和依赖项。

请帮忙,我在这个基本步骤中缺少什么,以便我可以继续学习。谢谢!

app-build.gradle

    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.2.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'

// have added following dependencies

    provided 'com.google.android.things:androidthings:0.2-devpreview'
    provided 'com.google.android.things:androidthings:0.1-devpreview'
    compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'

}

project-build.gradle

   repositories {
            jcenter()
            maven {
                url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
            }    
}

AndroidManifest.xml

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.zoha.mqttandroidiot">

    <!-- Permissions the Application Requires -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">


        <activity android:name=".HomeActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

            <!-- Launch activity automatically on boot -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.IOT_LAUNCHER"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>

        </activity>
<service android:name="org.eclipse.paho.android.service.MqttService"/>

    </application>

</manifest>

主页 Activity

  public class HomeActivity extends AppCompatActivity{

    MqttAndroidClient client;
   // private static final MemoryPersistence persistence = new MemoryPersistence();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final MqttAndroidClient mqttAndroidClient = new MqttAndroidClient(this.getApplicationContext(), "tcp://localhost:1883", "androidSampleClient");
        mqttAndroidClient.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable cause) {
                System.out.println("Connection was lost!");

            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                System.out.println("Message Arrived!: " + topic + ": " + new String(message.getPayload()));

            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                System.out.println("Delivery Complete!");
            }
        });

        try {
            mqttAndroidClient.connect(null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    System.out.println("Connection Success!");
                    try {
                        System.out.println("Subscribing to /test");
                        mqttAndroidClient.subscribe("/test", 0);
                        System.out.println("Subscribed to /test");
                        System.out.println("Publishing message..");
                        mqttAndroidClient.publish("/test", new MqttMessage("Hello world testing..!".getBytes()));
                    } catch (MqttException ex) {

                    }

                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    System.out.println("Connection Failure!");
                }
            });
        } catch (MqttException ex) {

        }


    }
    }

最佳答案

我只想添加评论,但我的代表太低...所以我将其作为答案发布。

您说您已使一切正常,但由于 IllegalArgumentException 而无法连接.我遇到了同样的问题,发现您还需要定义协议(protocol)。 所以而不是 "192.168.0.103:1883"尝试:

String serverURI = "tcp://192.168.0.103:1883"

根据我的阅读,您已经完成了其他必要的步骤,但为了给出完整的答案:

  1. 编辑AndroidManifest.xml包括:

    • <service android:name="org.eclipse.paho.android.service.MqttService" /> (来自 application 标签内)

    • <uses-permission android:name="android.permission.INTERNET" />

    • <uses-permission android:name="android.permission.WAKE_LOCK" />
    • <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    • <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  2. 编辑build.gradle包括(在 dependencies 部分):

    • compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'

    • compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

  3. 使用 MqttAndroidClient (不是 MqttClient )

  4. 将您的代码放在“onSuccess”回调中,以避免由于方法异步而导致的任何问题(如 THEPATEL 的回答所示):

    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
    mqttConnectOptions.setKeepAliveInterval(60);//seconds
    mqttConnectOptions.setCleanSession(true);
    mqttConnectOptions.setAutomaticReconnect(true);
    
    mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                //Treat success here (subscribe, publish etc)
            }
    
            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                //Treat failure here
            }
        });
    

关于Android Studio - MQTT 未连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43038597/

相关文章:

java - ListView 自定义适配器 OnClick 启动 URL 链接

java - 如何在 Android Studio 中设置全屏背景 gif

python - 套接字错误 : Errno 111 Connection Refused

Android Assets 没有值(value)阅读?

android - 三星 S3 中 onActivityResult(int requestCode, int resultCode, Intent data) 中的相机 Intent 数据为空

java - 无法将 java.lang.String 类型的值转换为 int?

android - 将 Twitter4j 状态转换为 JSON 对象

java - 如何从图库中选择多张照片?

mqtt - 在 MQTT 中,经纪人如何收到客户的遗嘱通知?

node.js - 在 TLS 中使用自签名证书如何使一个人受到中间人攻击?