ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

dcs-sdk-java-master/app/src/main/java/com/baidu/duer/dcs/framework/DcsClient.java

Committer:
TMBOY
Date:
2017-07-18
Revision:
45:2aa9f933c8d2

File content as of revision 45:2aa9f933c8d2:

/*
 * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.baidu.duer.dcs.framework;

import com.baidu.duer.dcs.framework.dispatcher.AudioData;
import com.baidu.duer.dcs.framework.dispatcher.MultipartParser;
import com.baidu.duer.dcs.framework.heartbeat.HeartBeat;
import com.baidu.duer.dcs.framework.message.DcsRequestBody;
import com.baidu.duer.dcs.framework.message.DcsResponseBody;
import com.baidu.duer.dcs.framework.message.DcsStreamRequestBody;
import com.baidu.duer.dcs.http.HttpConfig;
import com.baidu.duer.dcs.http.HttpRequestInterface;
import com.baidu.duer.dcs.http.OkHttpRequestImpl;
import com.baidu.duer.dcs.http.callback.ResponseCallback;
import com.baidu.duer.dcs.util.LogUtil;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Response;

/**
 * 和服务器端保持长连接、发送events和接收directives和维持心跳
 * <p>
 * Created by wuruisheng on 2017/6/1.
 */
public class DcsClient {
    public static final String TAG = DcsClient.class.getSimpleName();
    private final DcsResponseDispatcher dcsResponseDispatcher;
    private final HttpRequestInterface httpRequestImp;
    private final HeartBeat heartBeat;
    private IDcsClientListener dcsClientListener;

    public DcsClient(DcsResponseDispatcher dcsResponseDispatcher, IDcsClientListener dcsClientListener) {
        this.dcsResponseDispatcher = dcsResponseDispatcher;
        this.dcsClientListener = dcsClientListener;
        httpRequestImp = new OkHttpRequestImpl();
        heartBeat = new HeartBeat(httpRequestImp);
        heartBeat.setHeartbeatListener(new HeartBeat.IHeartbeatListener() {
            @Override
            public void onStartConnect() {
                startConnect();
            }
        });
    }

    public void release() {
        heartBeat.release();
        httpRequestImp.cancelRequest(HttpConfig.HTTP_DIRECTIVES_TAG);
        httpRequestImp.cancelRequest(HttpConfig.HTTP_EVENT_TAG);
    }

    /**
     * 建立连接
     */
    public void startConnect() {
        httpRequestImp.cancelRequest(HttpConfig.HTTP_DIRECTIVES_TAG);
        getDirectives(new IResponseListener() {
            @Override
            public void onSucceed(int statusCode) {
                LogUtil.d(TAG, "getDirectives onSucceed");
                fireOnConnected();
                heartBeat.startNormalPing();
            }

            @Override
            public void onFailed(String errorMessage) {
                LogUtil.d(TAG, "getDirectives onFailed");
                fireOnUnconnected();
                heartBeat.startExceptionalPing();
            }
        });
    }

    /**
     * 发送带流式请求
     *
     * @param requestBody       消息体
     * @param streamRequestBody stream式消息体
     * @param listener          回调
     */
    public void sendRequest(DcsRequestBody requestBody,
                            DcsStreamRequestBody streamRequestBody, final IResponseListener listener) {
        httpRequestImp.doPostEventMultipartAsync(requestBody,
                streamRequestBody, getResponseCallback(dcsResponseDispatcher, new IResponseListener() {
                    @Override
                    public void onSucceed(int statusCode) {
                        if (listener != null) {
                            listener.onSucceed(statusCode);
                        }
                    }

                    @Override
                    public void onFailed(String errorMessage) {
                        if (listener != null) {
                            listener.onFailed(errorMessage);
                        }

                        heartBeat.startImmediatePing();
                    }
                }));
    }

    /**
     * 发送普通请求
     *
     * @param requestBody 消息体
     * @param listener    回调
     */
    public void sendRequest(DcsRequestBody requestBody, IResponseListener listener) {
        httpRequestImp.doPostEventStringAsync(requestBody,
                getResponseCallback(dcsResponseDispatcher, listener));
    }

    private void getDirectives(IResponseListener listener) {
        httpRequestImp.cancelRequest(HttpConfig.HTTP_DIRECTIVES_TAG);
        httpRequestImp.doGetDirectivesAsync(null,
                getResponseCallback(dcsResponseDispatcher, listener));
    }

    private void fireOnConnected() {
        if (dcsClientListener != null) {
            dcsClientListener.onConnected();
        }
    }

    private void fireOnUnconnected() {
        if (dcsClientListener != null) {
            dcsClientListener.onUnconnected();
        }
    }

    private ResponseCallback getResponseCallback(final DcsResponseDispatcher dcsResponseDispatcher,
                                                 final IResponseListener responseListener) {
        ResponseCallback responseCallback = new ResponseCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                LogUtil.d(TAG, "onError,", e);
                if (responseListener != null) {
                    responseListener.onFailed(e.getMessage());
                }
            }

            @Override
            public void onResponse(Response response, int id) {
                super.onResponse(response, id);
                LogUtil.d(TAG, "onResponse OK ," + response.request().url());
                LogUtil.d(TAG, "onResponse code ," + response.code());
                if (responseListener != null) {
                    responseListener.onSucceed(response.code());
                }
            }

            @Override
            public Response parseNetworkResponse(Response response, int id) throws Exception {
                int statusCode = response.code();
                if (statusCode == 200) {
                    MultipartParser multipartParser = new MultipartParser(
                            new MultipartParser.IMultipartParserListener() {
                                @Override
                                public void onResponseBody(DcsResponseBody responseBody) {
                                    dcsResponseDispatcher.onResponseBody(responseBody);
                                }

                                @Override
                                public void onAudioData(AudioData audioData) {
                                    dcsResponseDispatcher.onAudioData(audioData);
                                }

                                @Override
                                public void onParseFailed(String unParseMessage) {
                                    dcsResponseDispatcher.onParseFailed(unParseMessage);
                                }
                            });

                    try {
                        multipartParser.parseResponse(response);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return response;
            }
        };

        return responseCallback;
    }

    public interface IDcsClientListener {
        void onConnected();

        void onUnconnected();
    }
}