物聯網開發之阿里雲MQTT通訊協議

因公司項目需要,最近接入了阿里 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);
    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章