ex
Fork of mbed-os-example-mbed5-blinky by
Diff: dcs-sdk-java-master/app/src/main/java/com/baidu/duer/dcs/framework/DcsClient.java
- Revision:
- 45:2aa9f933c8d2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dcs-sdk-java-master/app/src/main/java/com/baidu/duer/dcs/framework/DcsClient.java Tue Jul 18 16:34:48 2017 +0800
@@ -0,0 +1,207 @@
+/*
+ * 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();
+ }
+}
\ No newline at end of file
