2016-11-04 4 views
1

최종 대학 프로젝트를 위해 프로젝트를 수행하고 있습니다. MQTT 프로토콜을 사용하여 내 나무 딸기 파이와 comunicates 안드로이드 애플 리케이션을하고 싶습니다. mosquitto 브로커를 사용하고 있지만 Eclipse Paho를 사용하여 Java MQTT 클라이언트를 사용하는 브로커에 메시지를 게시 할 때 내 애플리케이션에서 동일한 메시지를 5 번 게시하고 폴트가 내 문제인지 여부를 알지 못합니다. 메시지를 게시하는 클래스 또는 안드로이드의 클래스 on_create() 클래스입니다.Eclipse Paho를 사용하여 Java MQTT 클라이언트를 사용하여 하나의 메시지 만 공개하는 방법

내 코드는 다음과 같다 :

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()); 
    } 
} 

}

첫째,이 후, 클래스가 내가 JSON에 필요한 메시지를 게시 게시하고 주제에 가입하는 MQTT 클래스를 생성 체재.

다음 클래스에서는 알림을 표시하는 데 사용합니다. 마지막으로, onCreate() 및 onClick 클래스에서 버튼을 선언하고 edittext ... 그리고 메시지를 게시 할 조건을 지정합니다. 보다 구체적으로, 버튼을 누르면 JSON 형식의 주제로 메시지를 게시합니다.

앱이 제대로 실행됩니다. 그러나 질문은 : 중개인에게 하나의 메시지 만 게시 할 수있는 방법은 무엇입니까?

다음 그림에서 버튼을 누르면 메시지 게시 방법을 볼 수 있습니다. 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);