2016-11-04 48 views
1

我正在爲我的最終大學工作做一個項目。 我想做一個Android應用程序,使用MQTT協議與我的覆盆子pi溝通。 爲此,我使用了一個mosquitto broker,但是當我使用Eclipse Paho使用Java MQTT客戶端在代理中發佈消息時,我的應用程序發佈了相同的消息5次,並且我不知道錯誤是否屬於我的發佈消息的類,或者我的android類的on_create()類。如何僅使用Eclipse發佈使用Java MQTT客戶端的一條消息Paho

我的代碼如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
EditText distanceCondition; 
EditText timeCondition; 
EditText countCondition; 

String distance; 
String time; 
String count; 
String topic; 

int notificationID = 1; 
int functionality; 
int ok = 1; 

public void mqttconnect(final String topic, final String message){ 

    final MqttAndroidClient mqttAndroidClient = new MqttAndroidClient(this.getApplicationContext(), "tcp://192.168.1.36", "androidSampleClient"); 
    mqttAndroidClient.setCallback(new MqttCallback() {          //iot.eclipse.org:1883 
     @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())); 
      //displayNotification("DETECT MOVEMENT! visit LCESS app now."); 
      JSONObject inf = new JSONObject(Arrays.toString(message.getPayload())); 
      try { 
       if (inf.optString("Functionality").equals(6)) { 
        if (inf.optString("ok").equals(1)) { 
         displayNotification("DETECT MOVEMENT! visit LCESS app now."); 
        } 
       } 
       if (inf.optString("Functionality").equals(7)) { 
        if (inf.optString("ok").equals(1)) { 
         displayNotification("DETECT MOVEMENT IN" + inf.optString("Distance") + " CM! visit LCESS app now."); 
        } 
       } 
       if (inf.optString("Functionality").equals(8)) { 
        if (inf.optString("ok").equals(1)) { 
         displayNotification("DETECT MOVEMENT IN" + inf.optString("Time") + " HOURS! visit LCESS app now."); 
        } 
       } 
       if (inf.optString("Functionality").equals(9)) { 
        if (inf.optString("ok").equals(1)) { 
         displayNotification("DETECT MOVEMENT IN" + inf.optString("Distance") + " CM and in " + inf.optString("Time") + " HOURS! visit LCESS app now."); 
        } 
       } 
       if (inf.optString("Functionality").equals(10)) { 
        if (inf.optString("ok").equals(1)) { 
         displayNotification("DETECT " + inf.optString("Count") + " OBJECTS/PERSONS! visit LCESS app now."); 
        } 
       } 
      } 
      catch (Exception functionality){ 

      } 

     } 

     @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: "+ topic); 
        mqttAndroidClient.subscribe(topic, 0); 
        System.out.println("Subscribed to: "+ topic); 
        System.out.println("Publishing message.."); 
        mqttAndroidClient.publish(topic, new MqttMessage(message.getBytes())); 
       } catch (MqttException ex) { 
       } 
      } 

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

    } 


} 

public JSONObject sendJSONmessage() { 
    topic = "Mesurement"; 
    distance = distanceCondition.getText().toString(); 
    time = timeCondition.getText().toString(); 
    count = countCondition.getText().toString(); 

    JSONObject post_dict = new JSONObject(); 
    try { 
     post_dict.put("Topic", topic); 
     post_dict.put("ok" ,ok); 
     post_dict.put("Functionality", functionality); 
     post_dict.put("Distance", distance); 
     post_dict.put("Time", time); 
     post_dict.put("Count", count); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    if (post_dict.length() > 0) { 
     System.out.println(post_dict); 
    } 
    return post_dict; 
} 

protected void displayNotification(CharSequence contentText){ 
    Intent i = new Intent(this, NotificationActivity.class); 
    i.putExtra("notificationID", notificationID); 

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); 
    NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
    CharSequence ticker ="Notification in LCESS"; 
    CharSequence contentTitle = "LCESS"; 

    Notification noti = new NotificationCompat.Builder(this) 
      .setContentIntent(pendingIntent) 
      .setTicker(ticker) 
      .setContentTitle(contentTitle) 
      .setContentText(contentText) 
      .setSmallIcon(R.drawable.lcess) 
      .addAction(R.drawable.lcess, ticker, pendingIntent) 
      .setVibrate(new long[] {100, 250, 100, 500}) 
      .build(); 
    nm.notify(notificationID, noti); 
} 

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

    distanceCondition = (EditText) findViewById(R.id.edit_detectDistanceCondition); 
    timeCondition = (EditText) findViewById(R.id.edit_detectTimeCondition); 
    countCondition = (EditText) findViewById(R.id.edit_countDetects); 

    Button button_detectDistance = (Button) findViewById(R.id.button_detectDistance); 
    Button button_detectDistanceCondition = (Button) findViewById(R.id.button_detectDistanceCondition); 
    Button button_detectTimeCondition = (Button) findViewById(R.id.button_detectTimeCondition); 
    Button button_detectIfAllCondition = (Button) findViewById(R.id.button_detectIfAllCondition); 
    Button button_count = (Button) findViewById(R.id.button_count); 
    assert button_detectDistance != null; 
    /*button_detectDistance.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      functionality = 1; 
      mqttconnect("Device1/Detect", sendJSONmessage().toString()); 
     } 
    });*/ 
    button_detectDistance.setOnClickListener(this); 
    assert button_detectDistanceCondition != null; 
    button_detectDistanceCondition.setOnClickListener(this); 
    assert button_detectTimeCondition != null; 
    button_detectTimeCondition.setOnClickListener(this); 
    assert button_detectIfAllCondition != null; 
    button_detectIfAllCondition.setOnClickListener(this); 
    assert button_count != null; 
    button_count.setOnClickListener(this); 
} 

public void onClick(View v){ 
    if (R.id.button_detectDistance==v.getId()){ 
     functionality = 1; 
     mqttconnect("Mesurement", sendJSONmessage().toString()); 
    } 
    else if (R.id.button_detectDistanceCondition==v.getId()){ 
     functionality = 2; 
     mqttconnect(sendJSONmessage().optString(topic), sendJSONmessage().toString()); 
    } 
    else if (R.id.button_detectTimeCondition==v.getId()){ 
     functionality = 3; 
     mqttconnect(sendJSONmessage().optString(topic), sendJSONmessage().toString()); 
    } 
    else if (R.id.button_detectIfAllCondition==v.getId()){ 
     functionality = 4; 
     mqttconnect("Device1/Detect1", sendJSONmessage().toString()); 
    } 
    else if (R.id.button_count==v.getId()){ 
     functionality = 5; 
     mqttconnect("Device1/Detect1", sendJSONmessage().toString()); 
    } 
} 

}

首先,我創建了MQTT類來發布和訂閱的話題,之後,該類發佈,我需要在JSON消息格式。

下一課我用它來顯示通知。 最後,onCreate()和onClick類聲明瞭我的按鈕,edittext ...以及在哪裏放置條件來發布消息。 更有意思的是,當按下按鈕時,我用JSON格式發佈消息。

該應用程序運行良好。但問題是: 如何在經紀人中只發布一條消息?

在下圖中,您可以看到按下按鈕時如何發佈5條消息。 In red you can see the message published 5 or 6 times

回答

0

我解決了這個問題。 在這種情況下,我如何構建一個與代理連接的函數,每次單擊我發佈的一些按鈕並再次訂閱該主題。只有我必須一次訂閱。 解決方案是連接到破壞和訂閱主題,只有一次,因此我們實現相同的代碼,但在onCreate()方法。

0
String msg = "{\"uuid\":\"12345678\"}"; 
MqttMessage m = new MqttMessage(); 
m.setPayload(msg.getBytes()); 
m.setQos(2); 
m.setRetained(false); 
mqttAndroidClient.publish(topic, m); 
相關問題