Android MQTT 게시 및 구독

1. MQTT 소개
링크 1 (초보 튜 토리 얼):https://www.runoob.com/w3cnote/mqtt-intro.html
연결 2 (MQTT 중국어 망):http://mqtt.p2hp.com/
연결 3 (Android 개발 의 Mqtt 사용):https://blog.csdn.net/asjqkkkk/article/details/80714234
MQTT (Message Queuing Telemetry Transport, 메시지 큐 원 격 측정 전송 프로 토 콜).게시 / 구독 (publish / subscribe) 모드 를 기반 으로 한 '경량급' 통신 프로 토 콜TCP / IP 프로 토 콜 에 구 축 된 것 은 IBM 이 1999 년 에 발표 한 것 이다.
2. 절차 예시
  1 public class MqttManager {
  2 
  3     private static boolean initFirst = true;//        mqtt   
  4     private static String host = "tcp://47.106.172.221:8081";
  5     private static String userName; //mqtt   
  6     private static String passWord; //mqtt    
  7     private static MqttManager manager;
  8     private static MqttClient mqttClient;
  9     private static MqttConnectOptions options;
 10     private static String topic;//     
 11     private static String clientId; //   id
 12 
 13     private static Handler handler = new Handler() {
 14         @Override
 15         public void handleMessage(Message msg) {
 16             super.handleMessage(msg);
 17             if (msg.what == 1) {
 18                 KLog.d(msg.obj);
 19                 EventBus.getDefault()
 20                         .post(new MessageEventBean(AppConstants.MQTT_EVENT_TYPE, (String) msg.obj));
 21             } else if (msg.what == 2) {
 22                 KLog.d("    ");
 23                 try {
 24                     KLog.d("     :" + topic);
 25                     mqttClient.subscribe(topic, 0);
 26 
 27                 } catch (Exception e) {
 28                     e.printStackTrace();
 29                 }
 30             } else if (msg.what == 3) {
 31                 KLog.d("    ,      ");
 32             }
 33         }
 34     };
 35 
 36     private MqttManager() {
 37 
 38     }
 39     private static MqttCallback myMqttCallback = new MqttCallback(){
 40 
 41         @Override
 42         public void messageArrived(String topic, MqttMessage message){
 43             //subscribe             
 44             KLog.d("messageArrived topic:"+topic);
 45             Message msg = new Message();
 46             msg.what = 1;
 47             msg.obj = message.toString();
 48             handler.sendMessage(msg);
 49         }
 50         @Override
 51         public void connectionLost(Throwable cause) {
 52             KLog.d("connectionLost cause = "+cause);
 53             //
 54                 try{
 55                     KLog.d("mqtt  ");
 56                     manager.startReconnect();
 57                 }catch (Exception e){
 58                     KLog.d("Exception = "+ e);
 59                     e.printStackTrace();
 60                 }
 61         }
 62 
 63         @Override
 64         public void deliveryComplete(IMqttDeliveryToken token) {
 65             //publish       
 66             KLog.d("deliveryComplete");
 67         }
 68     };
 69     private ScheduledExecutorService scheduler;
 70 
 71     public static MqttManager getInstance() {
 72         if (manager == null) {
 73             manager = new MqttManager();
 74         }
 75         return manager;
 76     }
 77 
 78     public void initConnection() {
 79         if (initFirst){
 80             KLog.d("     initConnection");
 81             try {
 82                 clientId = Preferences.getUserAccount() + System.currentTimeMillis();//      (  mac  +    ms)
 83                 userName = Preferences.getUserAccount();//   
 84                 passWord = Preferences.getUserToken();//  
 85                 topic = userName;
 86                 //host    ;clientid   MQTT    ID,          ;MemoryPersistence  clientid     ,        
 87                 mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
 88                 //MQTT     
 89                 options = new MqttConnectOptions();
 90                 //      session,       false                ,     true                  
 91                 options.setCleanSession(true);
 92                 //
 93                 options.setAutomaticReconnect(true);
 94                 //        
 95                 options.setUserName(userName);
 96                 //       
 97                 options.setPassword(passWord.toCharArray());
 98                 //            
 99                 options.setConnectionTimeout(10);
100                 //                     1.5*(20)                      ,             
101                 options.setKeepAliveInterval(20);
102                 //setWill  ,                       。           
103 //            options.setWill(topic,"close".getBytes(),2,true);
104                 //    
105                 mqttClient.setCallback(myMqttCallback);
106                 KLog.d("clientId: "+clientId +", userName: "+userName+", passWord: "+passWord+", topic: "+topic);
107                 //       
108                 initFirst = false;
109                 //mqtt     
110                 manager.startReconnect();
111             } catch (Exception e) {
112                 KLog.d("initConnection Exception: " + e);
113                 e.printStackTrace();
114             }
115         }else {
116             KLog.d("       initConnection");
117             manager.startReconnect();
118         }
119     }
120 
121     public  void startReconnect() {
122 
123         if (NetworkUtils.isConnected()){
124 
125             if (!mqttClient.isConnected()) {
126                 //    
127                 connect();
128                 KLog.d("mqtt    ");
129             }else {
130                 KLog.d("mqttClient.isConnected");
131             }
132 //            scheduler = Executors.newSingleThreadScheduledExecutor();
133 //            scheduler.scheduleAtFixedRate(new Runnable() {
134 //                @Override
135 //                public void run() {
136 //
137 //                    if (!mqttClient.isConnected()) {
138 //                        connect();
139 //                        KLog.d("mqtt    ");
140 //                    }
141 //                }
142 //            }, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);
143         }else {
144             KLog.d("     ");
145 //            scheduler.shutdown();
146         }
147 
148     }
149 
150     public void sendMsg(String msg) {
151         KLog.d("sendMsg");
152         if (mqttClient != null && mqttClient.isConnected()) {
153             try {
154                 KLog.d("     :" + Preferences.getUserAccount());
155                 String topic = Preferences.getUserAccount();
156                 KLog.d(topic);
157                 byte[] msgBytes = msg.getBytes();
158                 KLog.d("0000");
159                 mqttClient.publish(topic, msgBytes, 0, false);
160                 KLog.d("11111111111111111");
161             } catch (MqttException e) {
162                 KLog.d(e);
163             }
164         }
165     }
166 
167     //       pubTopic = "owh" + Preferences.getUserAccount();
168     //    (               )
169     public void publish(String topicName, String payload) {
170         if (mqttClient != null && mqttClient.isConnected()) {
171             //          
172             MqttMessage message = new MqttMessage(payload.getBytes());
173             message.setPayload(payload.getBytes());
174             message.setQos(0);
175             try {
176                 KLog.d("1111");
177                 mqttClient.publish(topicName, message);
178                 KLog.d("2222");
179             } catch (MqttException e) {
180                 KLog.d("publish : " + e.toString());
181             }
182         }
183     }
184 
185     private void connect() {
186 
187         ThreadPoolManager.getInstance().execute(new Runnable() {
188             @Override
189             public void run() {
190                 try {
191                     mqttClient.connect(options);
192                     Message msg = Message.obtain();
193                     msg.what = 2;
194                     handler.sendMessage(msg);
195                 } catch (Exception e) {
196                     e.printStackTrace();
197                     Message msg = Message.obtain();
198                     msg.what = 3;
199                     handler.sendMessage(msg);
200                 }
201             }
202         });
203 
204 //        new Thread(new Runnable() {
205 //
206 //            @Override
207 //            public void run() {
208 //                try {
209 //                    mqttClient.connect(options);
210 //                    Message msg = new Message();
211 //                    msg.what = 2;
212 //                    handler.sendMessage(msg);
213 //                } catch (Exception e) {
214 //                    e.printStackTrace();
215 //                    Message msg = new Message();
216 //                    msg.what = 3;
217 //                    handler.sendMessage(msg);
218 //                }
219 //            }
220 //        }).start();
221     }
222 
223     //    
224     public static void mqttDisconnect(){
225         if(mqttClient !=null && mqttClient.isConnected()){
226             try{
227                 mqttClient.disconnect();
228             }catch (MqttException e){
229                 KLog.d("mqtt disconnect error");
230                 e.printStackTrace();
231             }
232         }
233     }
234 
235 }

 
주의사항
1. MQTT 의 클 라 이언 트 id (clientId) 는 유일 해 야 합 니 다.이 항목 에서 clientId = 이 컴퓨터 mac 주소 + 현재 시간 (ms).
2. 한 클 라 이언 트 의 MQTT 연결 은 한 대의 장치 가 여러 개의 클 라 이언 트 계 정 을 만 들 지 않도록 new 대상 만 연결 하 는 것 이 좋 습 니 다.
여러 게시 (/ 구독) 의 clientId 와 동시에 Mqtt 가 반복 적 으로 연결 되 는 현상 이 발생 하여 메 시 지 를 정상적으로 보 내 거나 받 을 수 없습니다.
여러 개의 게시 (/ 구독) 클 라 이언 트 Id 가 동시에 설치 되 지 않 으 면 여러 개의 Mqtt 계 정 이 동시에 온라인 으로 연결 되 어 불필요 한 서버 자원 을 점용 할 수 있 습 니 다.
3. 한 클 라 이언 트 의 게시 Topic 과 구독 Topic 은 같 지 않 습 니 다.

좋은 웹페이지 즐겨찾기