Android 플랫폼 MQTT 는 간단 한 채 팅 방 을 사용 하고 실현 합 니 다.
Android 에서 MQTT 프로 토 콜 사용
의존 도 를 높이다
gradle 에 의존 도 를 추가 하여 해당 라 이브 러 리 를 도입 합 니 다.
dependencies {
...
compile 'commons-codec:commons-codec:1.5'
compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'
}
권한 선언
이 권한 들 은 위험 권한 이 아 닙 니 다. 실행 할 때 신청 하지 않 아 도 됩 니 다.
MQTT 지원 클래스
MqtAsyncClient 는 mqtt 지원 클래스 입 니 다. 생 성 할 때 서버 host, port 및 장치 표지 clientID 를 입력 해 야 합 니 다. (장치 마다 id 가 같 을 수 없습니다)
MqttAsyncClient mqttClient=new MqttAsyncClient("tcp://"+this.host+":"+this.port ,
"ClientID"+this.clientID, new MemoryPersistence());
이 어 서버 를 연결 하고 연결 상 태 를 감청 한다.
// , ui
mqttClient.connect(getOptions(), null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
//
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
//
}
});
getOptions () 방법 은 사용자 이름, 비밀번호 (일반 서버 에 설치 되 지 않 음) 와 같은 연결 정 보 를 설정 하 는 것 입 니 다.
/**
* Mqtt
*/
private MqttConnectOptions getOptions(){
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);//
if(this.userID!=null && this.userID.length()>0 && this.passWord!=null && this.passWord.length()>0){
options.setUserName(this.userID);//
options.setPassword(this.passWord.toCharArray());
}
options.setConnectionTimeout(10);//
options.setKeepAliveInterval(30);// , ping
return options;
}
마지막 으로 메시지 및 연결 을 감청 합 니 다.
// , ui
mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
//
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
//
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
//
}
});
MqtAsyncClient 를 가 져 오고 설정 하면 해당 방법 으로 Topic 수신 메시지 subscribe (String topicFilter, int qos) 를 구독 하여 Topic 메시지 publish (String topic, byte [] payload, int qos, boolean retained) 를 보 낼 수 있 습 니 다.
포장 하 다
편리 하 게 사용 하기 위해 서 관련 조작 을 밀봉 하 다.
/**
* Author:LvQingYang
* Date:2017/8/29
* Email:[email protected]
* Github:https://github.com/biloba123
* Info:MQTT
*/
public class MyMqtt {
private String TAG = "MyMqtt";
/**MQTT **/
private static String host = "****************";
private static String port = "*****";
private static String userID = "";
private static String passWord = "";
private static String clientID = UUID.randomUUID().toString();
/**MQTT **/
private boolean isConnect = false;
/**MQTT **/
private MqttAsyncClient mqttClient=null;
private MqttListener mMqttListener;
private Handler mHandler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
switch (message.arg1) {
case MqttTag.MQTT_STATE_CONNECTED:
if (BuildConfig.DEBUG) Log.d(TAG, "handleMessage: connected");
mMqttListener.onConnected();
break;
case MqttTag.MQTT_STATE_FAIL:
if (BuildConfig.DEBUG) Log.d(TAG, "handleMessage: fail");
mMqttListener.onFail();
break;
case MqttTag.MQTT_STATE_LOST:
if (BuildConfig.DEBUG) Log.d(TAG, "handleMessage: lost");
mMqttListener.onLost();
break;
case MqttTag.MQTT_STATE_RECEIVE:
if (BuildConfig.DEBUG) Log.d(TAG, "handleMessage: receive");
mMqttListener.onReceive((String) message.obj);
break;
case MqttTag.MQTT_STATE_SEND_SUCC:
if (BuildConfig.DEBUG) Log.d(TAG, "handleMessage: send");
mMqttListener.onSendSucc();
break;
}
return true;
}
});
/**
* , Mqtt
*/
private IMqttActionListener mIMqttActionListener=new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
isConnect=true;
Message msg=new Message();
msg.arg1=MqttTag.MQTT_STATE_CONNECTED;
mHandler.sendMessage(msg);
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
isConnect=false;
Message msg=new Message();
msg.arg1=MqttTag.MQTT_STATE_FAIL;
mHandler.sendMessage(msg);
}
};
/**
*
*/
private MqttCallback mMqttCallback=new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
isConnect=false;
Message msg=new Message();
msg.arg1=MqttTag.MQTT_STATE_LOST;
mHandler.sendMessage(msg);
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Message msg=new Message();
msg.arg1=MqttTag.MQTT_STATE_RECEIVE;
msg.obj=new String(message.getPayload());
mHandler.sendMessage(msg);
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Message msg=new Message();
msg.arg1=MqttTag.MQTT_STATE_SEND_SUCC;
mHandler.sendMessage(msg);
}
};
public MyMqtt(MqttListener lis){
mMqttListener=lis;
}
public static void setMqttSetting(String host, String port, String userID, String passWord, String clientID){
MyMqtt.host = host;
MyMqtt.port = port;
MyMqtt.userID = userID;
MyMqtt.passWord = passWord;
MyMqtt.clientID = clientID;
}
/**
* Mqtt
*/
public void connectMqtt(){
try {
mqttClient=new MqttAsyncClient("tcp://"+this.host+":"+this.port ,
"ClientID"+this.clientID, new MemoryPersistence());
mqttClient.connect(getOptions(), null, mIMqttActionListener);
mqttClient.setCallback(mMqttCallback);
} catch (MqttException e) {
e.printStackTrace();
}
}
/**
* Mqtt
*/
public void reStartMqtt(){
disConnectMqtt();
connectMqtt();
}
/**
* Mqtt
*/
public void disConnectMqtt(){
try {
mqttClient.disconnect();
mqttClient = null;
isConnect = false;
} catch (MqttException e) {
e.printStackTrace();
}
}
/**
* Mqtt
*/
public void pubMsg(String Topic, String Msg, int Qos){
if(!isConnect){
Log.d(TAG,"Mqtt ");
return;
}
try {
/** Topic,Msg,Qos,Retained**/
mqttClient.publish(Topic,Msg.getBytes(),Qos,false);
} catch (MqttException e) {
e.printStackTrace();
}
}
/**
* Mqtt
*/
public void pubMsg(String Topic, byte[] Msg, int Qos){
if(!isConnect){
Log.d(TAG,"Mqtt ");
return;
}
try {
/** Topic,Msg,Qos,Retained**/
mqttClient.publish(Topic,Msg,Qos,false);
} catch (MqttException e) {
e.printStackTrace();
}
}
/**
* Mqtt Topic
*/
public void subTopic(String Topic, int Qos){
if(!isConnect){
Log.d(TAG,"Mqtt ");
return;
}
try {
mqttClient.subscribe(Topic,Qos);
} catch (MqttException e) {
e.printStackTrace();
}
}
/**
* Mqtt
*/
private MqttConnectOptions getOptions(){
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);//
if(this.userID!=null&&this.userID.length()>0&&this.passWord!=null&&this.passWord.length()>0){
options.setUserName(this.userID);//
options.setPassword(this.passWord.toCharArray());
}
options.setConnectionTimeout(10);//
options.setKeepAliveInterval(30);// , ping
return options;
}
public boolean isConnect() {
return isConnect;
}
}
관련 표지 Mqttag
public class MqttTag {
public final static int MQTT_STATE_CONNECTED=1;
public final static int MQTT_STATE_LOST=2;
public final static int MQTT_STATE_FAIL=3;
public final static int MQTT_STATE_RECEIVE=4;
public final static int MQTT_STATE_SEND_SUCC=5;
}
인터페이스 MqttListener
interface MqttListener {
void onConnected();//
void onFail();//
void onLost();//
void onReceive(String message);//
void onSendSucc();//
}
관찰자 모드 를 활용 하여 Service 배경 감청 관련 상 태 를 만 듭 니 다. (규범 에 맞지 않 게 쓰 여 있 습 니 다.)
public class MqttService extends Service implements MqttListener {
private static MyMqtt mMyMqtt;
private static List mMqttListenerList=new ArrayList<>();
public static void start(Context context) {
Intent starter = new Intent(context, MqttService.class);
context.startService(starter);
}
public static void stop(Context context) {
Intent starter = new Intent(context, MqttService.class);
context.stopService(starter);
}
@Override
public void onCreate() {
super.onCreate();
if (mMyMqtt==null) {
mMyMqtt=new MyMqtt(this);
}
mMyMqtt.connectMqtt();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onDestroy() {
super.onDestroy();
mMyMqtt.disConnectMqtt();
mMyMqtt=null;
mMqttListenerList.clear();
}
public static MyMqtt getMyMqtt(){
return mMyMqtt;
}
public static void addMqttListener(MqttListener listener){
if (!mMqttListenerList.contains(listener)) {
mMqttListenerList.add(listener);
}
}
public static void removeMqttListener(MqttListener listener){
mMqttListenerList.remove(listener);
}
@Override
public void onConnected() {
for (MqttListener mqttListener : mMqttListenerList) {
mqttListener.onConnected();
}
}
@Override
public void onFail() {
new Thread(new Runnable() {
@Override
public void run() {
mMyMqtt.connectMqtt();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
for (MqttListener mqttListener : mMqttListenerList) {
mqttListener.onFail();
}
}
@Override
public void onLost() {
new Thread(new Runnable() {
@Override
public void run() {
mMyMqtt.connectMqtt();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
for (MqttListener mqttListener : mMqttListenerList) {
mqttListener.onLost();
}
}
@Override
public void onReceive(String message) {
for (MqttListener mqttListener : mMqttListenerList) {
mqttListener.onReceive(message);
}
}
@Override
public void onSendSucc() {
for (MqttListener mqttListener : mMqttListenerList) {
mqttListener.onSendSucc();
}
}
}
간단 한 채 팅 방.
소스 코드https://github.com/biloba123/ChatRoom 오픈 소스 창고 에는 또 다른 mqtt 예제 가 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.