因公司項目需要,最近接入了阿里 MQTT 協議,今天簡單寫一下如何簡單使用:
一、首先是認證,這裏的認證方式有動態註冊、ID2認證方式和三元組認證,我們使用的是三元組認證;
1、首先根據阿里雲官方文檔進行配置,這裏不詳細介紹了:
https://help.aliyun.com/document_detail/96607.html?spm=a2c4g.11186623.6.615.a6922b0aSxaZOK
2、獲取四個參數,分別是 productKey、deviceName、deviceSecret、productSecret ;
// SDK初始化 InitManager.init(this, productKey, deviceName, deviceSecret, productSecret, new IDemoCallback() { @Override public void onError(AError aError) { // 初始化失敗,初始化失敗之後需要用戶負責重新初始化 // 如一開始網絡不通導致初始化失敗,後續網絡回覆之後需要重新初始化 Log.e("","初始化失敗"); } @Override public void onInitDone(Object data) { Log.e("","初始化成功"); // isInitDone = true; } });
public interface IDemoCallback extends ILinkKitConnectListener{ }
二、認證成功後,通過 RRPC 進行訂閱
String testTopic = "/ext/rrpc/" + productKey + "/" + deviceName + "/user/get"; final MqttRrpcRegisterRequest registerRequest = new MqttRrpcRegisterRequest(); registerRequest.topic = testTopic; LinkKit.getInstance().subscribeRRPC(registerRequest, new IConnectRrpcListener() { @Override public void onSubscribeSuccess(ARequest aRequest) { Log.e("","訂閱成功"); // 訂閱成功 request = aRequest; } @Override public void onSubscribeFailed(ARequest aRequest, AError aError) { // 訂閱失敗 Log.e("","訂閱失敗"); } @Override public void onReceived(ARequest aRequest, IConnectRrpcHandle iConnectRrpcHandle) { // 收到雲端下行 Log.e("","收到下行數據"); // 這裏根據個人情況來設置 // 如果不一定是json格式,可以參考如下方式回覆 MqttPublishRequest rrpcResponse = new MqttPublishRequest(); if (aRequest instanceof MqttRrpcRequest) { rrpcResponse.topic = ((MqttRrpcRequest) aRequest).topic; } rrpcResponse.payloadObj ="{\"id\":\"123\", \"code\":\"200\"" + ",\"data\":{} }"; LinkKit.getInstance().publish(rrpcResponse, new IConnectSendListener() { @Override public void onResponse(ARequest aRequest, AResponse aResponse) { ALog.d("", "onResponse() called with: aRequest = [" + aRequest + "], aResponse = [" + aResponse + "]"); } @Override public void onFailure(ARequest aRequest, AError aError) { ALog.d("", "onFailure() called with: aRequest = [" + aRequest + "], aError = [" + aError + "]"); } }); } @Override public void onResponseSuccess(ARequest aRequest) { Log.e("","響應成功"); // RRPC 響應成功 } @Override public void onResponseFailed(ARequest aRequest, AError aError) { Log.e("","響應失敗"); // RRPC 響應失敗 } });
三、創建消息接收 Notify,並且在onResume()註冊,在onPause() 取消;
private IConnectNotifyListener notifyListener = new IConnectNotifyListener() { @Override public void onNotify(String s, String s1, AMessage aMessage) { Log.e("收到下行消息 topic=" ,s1); String downstreamData = new String((byte[]) aMessage.data); Log.e("downstreamData",downstreamData); } @Override public boolean shouldHandle(String s, String s1) { Log.e("",s1); return true; } @Override public void onConnectStateChange(String s, ConnectState connectState) { Log.e("",s); } };
@Override protected void onResume() { super.onResume(); LinkKit.getInstance().registerOnPushListener(notifyListener); }
@Override protected void onPause() { super.onPause(); LinkKit.getInstance().unRegisterOnPushListener(notifyListener); }