Android で MQTT 接続を設定する

メクネシ・ハミダ

Android で MQTT を使用するのはまったく初めてです。このコードを試しています。

public class MQTTActivity extends AppCompatActivity {
private HistoryAdapter mAdapter;
MqttAndroidClient mqttAndroidClient;

final String serverUri = "tcp://iot.eclipse.org:1883";

String clientId = "ExampleAndroidClient";
final String subscriptionTopic = "exampleAndroidTopic";
final String publishTopic = "exampleAndroidPublishTopic";
final String publishMessage = "Hello World!";


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


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            publishMessage();
        }
    });


    RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.history_recycler_view);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new HistoryAdapter(new ArrayList<String>());
    mRecyclerView.setAdapter(mAdapter);

    clientId = clientId + System.currentTimeMillis();

    mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), serverUri, clientId);
    mqttAndroidClient.setCallback(new MqttCallbackExtended() {
        @Override
        public void connectComplete(boolean reconnect, String serverURI) {

            if (reconnect) {
                addToHistory("Reconnected to : " + serverURI);
                // Because Clean Session is true, we need to re-subscribe
                subscribeToTopic();
            } else {
                addToHistory("Connected to: " + serverURI);
            }
        }

        @Override
        public void connectionLost(Throwable cause) {
            addToHistory("The Connection was lost.");
        }

        @Override
        public void messageArrived(String topic, MqttMessage message) throws Exception {
            addToHistory("Incoming message: " + new String(message.getPayload()));
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken token) {

        }
    });

    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
    mqttConnectOptions.setAutomaticReconnect(true);
    mqttConnectOptions.setCleanSession(false);







    try {
        //addToHistory("Connecting to " + serverUri);
        mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
                disconnectedBufferOptions.setBufferEnabled(true);
                disconnectedBufferOptions.setBufferSize(100);
                disconnectedBufferOptions.setPersistBuffer(false);
                disconnectedBufferOptions.setDeleteOldestMessages(false);
                mqttAndroidClient.setBufferOpts(disconnectedBufferOptions);
                subscribeToTopic();
            }

            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                addToHistory("Failed to connect to: " + serverUri);
            }
        });


    } catch (MqttException ex){
        ex.printStackTrace();
    }

}

private void addToHistory(String mainText){
    System.out.println("LOG: " + mainText);
    mAdapter.add(mainText);
    Snackbar.make(findViewById(android.R.id.content), mainText, Snackbar.LENGTH_LONG)
            .setAction("Action", null).show();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement

    return super.onOptionsItemSelected(item);
}

public void subscribeToTopic(){
    try {
        mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                addToHistory("Subscribed!");
            }

            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                addToHistory("Failed to subscribe");
            }
        });

        // THIS DOES NOT WORK!
        mqttAndroidClient.subscribe(subscriptionTopic, 0, new IMqttMessageListener() {
            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                // message Arrived!
                System.out.println("Message: " + topic + " : " + new String(message.getPayload()));
            }
        });

    } catch (MqttException ex){
        System.err.println("Exception whilst subscribing");
        ex.printStackTrace();
    }
}

public void publishMessage(){

    try {
        MqttMessage message = new MqttMessage();
        message.setPayload(publishMessage.getBytes());
        mqttAndroidClient.publish(publishTopic, message);
        addToHistory("Message Published");
        if(!mqttAndroidClient.isConnected()){
            addToHistory(mqttAndroidClient.getBufferedMessageCount() + " messages in buffer.");
        }
    } catch (MqttException e) {
        System.err.println("Error Publishing: " + e.getMessage());
        e.printStackTrace();
    }
}}

この例外が発生しています:

FATAL EXCEPTION: main
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x8000010 (has extras) } in org.eclipse.paho.android.service.MqttService$NetworkConnectionIntentReceiver@41c79f18
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:810)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5455)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:966)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:733)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.SecurityException: Neither user 10083 nor current process has android.permission.WAKE_LOCK.
at android.os.Parcel.readException(Parcel.java:1428)
at android.os.Parcel.readException(Parcel.java:1382)
at android.os.IPowerManager$Stub$Proxy.acquireWakeLock(IPowerManager.java:301)
at android.os.PowerManager$WakeLock.acquireLocked(PowerManager.java:746)
at android.os.PowerManager$WakeLock.acquire(PowerManager.java:715)
at org.eclipse.paho.android.service.MqttService$NetworkConnectionIntentReceiver.onReceive(MqttService.java:821)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:800)
at android.os.Handler.handleCallback(Handler.java:800) 
at android.os.Handler.dispatchMessage(Handler.java:100) 
at android.os.Looper.loop(Looper.java:194) 
at android.app.ActivityThread.main(ActivityThread.java:5455) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:966) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:733) 
at dalvik.system.NativeStart.main(Native Method) 

ネットワークとインターネット接続の権限はすでに追加しています。マニフェストに mqtt サービスを追加しました。

コードのどこが間違っているのかわかりません。

ハードルブ

問題は、スタック トレースからの次の行です。

Caused by: java.lang.SecurityException: Neither user 10083 nor current process has android.permission.WAKE_LOCK.

WAKE_LOCKマニフェストとネットワーク アクセスでをリクエストする必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MQTTブリッジに接続するためのプロキシを設定するにはどうすればよいですか?

分類Dev

自己署名証明書を使用してAndroid(pahoクライアント)のMqttサーバーに接続するにはどうすればよいですか?

分類Dev

Javascriptを介してGoogleIOTCore MQTT Bridgeに接続することは可能ですか?

分類Dev

JavascriptでMQTTを使用してAzureIotHubに接続します

分類Dev

MQTTを介したAWSIoT AndroidアプリケーションはMqttException(0)をスローします-java.io.IOException:すでに接続されています

分類Dev

Android用Retrofitライブラリで接続タイムアウトを設定するにはどうすればよいですか?

分類Dev

PerlモジュールNet :: MQTT :: Simple(MQTTインターフェース)でClientIDを設定する方法は?

分類Dev

JavaでのMQTTのTLS / SSL接続

分類Dev

AndroidとMQTTをブローカーに接続するのに問題があります

分類Dev

OkHttpで接続タイムアウトを設定する方法

分類Dev

SQLAlchemyで接続タイムアウトを設定する方法

分類Dev

gorm v2でSQL接続構成を設定する方法

分類Dev

VBAでODBC接続文字列を設定する

分類Dev

EntityFramework接続でCONTEXT_INFOを設定する方法

分類Dev

EF Core3.0接続文字列を手動で設定する

分類Dev

EntityFrameworkで接続文字列を設定する方法

分類Dev

SSH経由で安全な接続を設定する

分類Dev

EntityFramework接続文字列でConvertZeroDatetimeを設定する方法

分類Dev

TightVNC Viewer で接続設定を保存する方法は?

分類Dev

MQTTを使用してwssに接続するにはどうすればよいですか?

分類Dev

Android(Eclipse)でstartxmlを設定する方法

分類Dev

AndroidでAGPS設定を表示する

分類Dev

MQTT / TCP接続のみを受け入れる実際のデバイスをAzureIoTハブに接続するにはどうすればよいですか?

分類Dev

MQTT / TCP接続のみを受け入れる実際のデバイスをAzureIoTハブに接続するにはどうすればよいですか?

分類Dev

mqtt接続で変更が行われます

分類Dev

MQTT PahoPythonの信頼できる再接続

分類Dev

Node.jsを使用してMQTT経由でGoogleCloudIoTに接続する際の問題

分類Dev

Android StudioでMQTTブローカーをモックすることは可能ですか?

分類Dev

SwitchPreference設定でAndroid設定アイコンを変更する

Related 関連記事

  1. 1

    MQTTブリッジに接続するためのプロキシを設定するにはどうすればよいですか?

  2. 2

    自己署名証明書を使用してAndroid(pahoクライアント)のMqttサーバーに接続するにはどうすればよいですか?

  3. 3

    Javascriptを介してGoogleIOTCore MQTT Bridgeに接続することは可能ですか?

  4. 4

    JavascriptでMQTTを使用してAzureIotHubに接続します

  5. 5

    MQTTを介したAWSIoT AndroidアプリケーションはMqttException(0)をスローします-java.io.IOException:すでに接続されています

  6. 6

    Android用Retrofitライブラリで接続タイムアウトを設定するにはどうすればよいですか?

  7. 7

    PerlモジュールNet :: MQTT :: Simple(MQTTインターフェース)でClientIDを設定する方法は?

  8. 8

    JavaでのMQTTのTLS / SSL接続

  9. 9

    AndroidとMQTTをブローカーに接続するのに問題があります

  10. 10

    OkHttpで接続タイムアウトを設定する方法

  11. 11

    SQLAlchemyで接続タイムアウトを設定する方法

  12. 12

    gorm v2でSQL接続構成を設定する方法

  13. 13

    VBAでODBC接続文字列を設定する

  14. 14

    EntityFramework接続でCONTEXT_INFOを設定する方法

  15. 15

    EF Core3.0接続文字列を手動で設定する

  16. 16

    EntityFrameworkで接続文字列を設定する方法

  17. 17

    SSH経由で安全な接続を設定する

  18. 18

    EntityFramework接続文字列でConvertZeroDatetimeを設定する方法

  19. 19

    TightVNC Viewer で接続設定を保存する方法は?

  20. 20

    MQTTを使用してwssに接続するにはどうすればよいですか?

  21. 21

    Android(Eclipse)でstartxmlを設定する方法

  22. 22

    AndroidでAGPS設定を表示する

  23. 23

    MQTT / TCP接続のみを受け入れる実際のデバイスをAzureIoTハブに接続するにはどうすればよいですか?

  24. 24

    MQTT / TCP接続のみを受け入れる実際のデバイスをAzureIoTハブに接続するにはどうすればよいですか?

  25. 25

    mqtt接続で変更が行われます

  26. 26

    MQTT PahoPythonの信頼できる再接続

  27. 27

    Node.jsを使用してMQTT経由でGoogleCloudIoTに接続する際の問題

  28. 28

    Android StudioでMQTTブローカーをモックすることは可能ですか?

  29. 29

    SwitchPreference設定でAndroid設定アイコンを変更する

ホットタグ

アーカイブ