티스토리 뷰

 이전까지 MQTT가 무엇인지(MQTT를 이용한 채팅서비스 만들기(1)) 그리고 채팅 화면을 위해서 커스텀 ListView를 만들고 Adapter와 연결 시켰습니다.(MQTT를 이용한 채팅서비스 만들기(2)) 이제 마지막으로 MQTT 서버를 만들고 Client를 사용하여 통신을 해보겠습니다. MQTT 통신을 위해서 여러 Broker가 존재합니다. 그중 Eclipse 재단에서 만든 Mosquitto를 사용하겠습니다. 우선 Broker를 어디다가 설치할 지 결정해야 합니다. 물론 서버가 있다면 그곳에 설치하면 되지만 없는경우 윈도우와 맥에도 설치가 가능합니다.

https://mosquitto.org/download/

위의 주소를 통해 각 OS별 설치를 진행할 수 있습니다. 리눅스 계열 서버를 사용하실 경우 다음과 같이 설치하시면 됩니다.


1
apt-get install mosquitto
cs


 설치를 마치면 이제 준비는 끝났습니다. 안드로이드에서 MQTT Client를 사용해 보겠습니다. MQTT Client 사용을 위해 Gradle에 다음과 같이 추가를 하였습니다.


1
compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'
cs


 우선 MQTT Broker와 연결을 하여야 통신을 할 수 있으므로 연결을 해줍니다.


1
2
3
4
private MqttClient mqttClient;
 
mqttClient = new MqttClient("tcp://주소 또는 아이피 :1883", MqttClient.generateClientId(),null);
mqttClient.connect();
cs


 MqttClient를 선언해준 후, 생성자의 매개 변수로 다음과 같이 넣어줍니다. 이 때, 도메인이 있으시면 주소를 없으시면 Broker를 사용하고 있는 컴퓨터의 IP주소를 적어넣어주시면 됩니다. 그리고 MQTT의 기본 포트는 1883이므로 따로 수정한 것이 없다면 1883 그대로 사용하면됩니다. 그 다음 mqttClient.connect()를 통해 Broker와 연결 요청을 하여 연결을 하였습니다. 벌써 연결이 끝났습니다... 이제 MQTT Client를 통해 Publish를 해보겠습니다.


1
mqttClient.publish("topic"new MqttMessage("".getBytes()));
cs


 위와같이 놀랄만큼 아주 간단합니다!! publish 메소드의 매개 변수로 <사용할 토픽 이름>과 보낼 메시지를 넣어줍니다. 메시지는 Byte로 된 메시지를 MqttMessage 를 통해 만들어줍니다. 보내기는 이것으로 끝입니다. 아주 간단합니다. 이제 Publisher가 보낸 메시지를 받는 Subscriber 역할을 만들어보겠습니다. 수신자도 아주 간단합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 mqttClient.subscribe(topic);
 mqttClient.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable cause) {
                L.d(TAG,"Mqtt ReConnect");
                try{connectMatt();}catch (Exception e){}
            }
 
            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
 
            }
 
            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
 
            }
        });
cs


 앞서 만들어둔 mqttClient에 subscribe 메소드를 통해 Publisher가 발행할 때 사용한 Topic을 적어주시면 됩니다. 이제 이 Subscriber는 해당 Topic으로 발행된 메세지를 Broker를 통해서 받을 것입니다. 이 때, 언제 메시지가 올지 모르므로 CallBack 객체를 등록해주어 messageArrived를 통해 메세지를 받았을 때 어떻게 할지를 처리해주시면 됩니다. 이번 프로젝트의 경우 채팅으로 이용하므로 다음과 같은 내용을 넣어주었습니다.


1
2
3
4
5
6
7
8
JSONObject obj = new JSONObject(new String(message.getPayload(), "UTF-8"));
chatAdapter.add(new ChatItem(obj.getString("id"), obj.getString("content")));
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        chatAdapter.notifyDataSetChanged();
    }
});
cs


 도착한 메시지를 getPayload() 메소드를 통해 byte 배열로 바꿔준 후 String으로 변환 시켜주었고, 채팅의 Id와 Content를 json 형식으로 보내주고 있으므로 JSONObject로 해당 문자열을 받았습니다. 그 후 앞서만든 adapter의 add 메소드를 통해 JSON에서 빼낸 id와 content를 추가해주었고 adapter에게 내용물이 바뀌었다는 것을 알려주어야하므로 notifyDataSetChanged() 메소드를 호출하였습니다. 이때, CallBack 은 Ui Thread가 아닌 다른 Thread이므로 runOnUiThread를 통해서 ListView를 갱신시키고있습니다.


 글을 쓸 수 있는 환경이 제대로 나오지 않아 두서없이 글을 마무리 한 것 같습니다. 궁금하신 점이 있으시면 댓글 남겨주시면 답변드리겠습니다.


해당 코드 깃허브 저장소 입니다.

https://github.com/hellojdh/AndroidMqttChat

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday