Android 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 은 같 지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.