背景:在做跟浪潮合作的一个上传机器人日志的功能模块,使用socket.io进行的开发,后台接口对应好几个功能,比如首先获取日志列表,再根据日志列表选择想要上传的具体日志。
那么问题来了:
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... arg0) {
// TODO Auto-generated method stub
Log.e("wy", "服务器连接成功" + arg0);
signIn();
}
}).on("robot", new Emitter.Listener() {
@Override
public void call(Object... args) {
***data*** = args[0];
Log.e("wy", "Socket返回数据:" + data);
JSONObject jasonObject = JSON.parseObject(data.toString());
Log.e("wy", "jasonObject数据:" + jasonObject);
Log.e("wy", "ActionType数据:" + jasonObject.get("ActionType"));
if (jasonObject.get("ActionType").equals("RequestLogList")) {
Log.e("wy", "上传日志列表:" + data.toString());
mRequestLogListEntity = JSON.parseObject(data.toString(), RequestLogListEntity.class);
ResponseLogList();
} else if (jasonObject.get("ActionType").equals("RequestLogUpload")) {
Log.e("wy", "上传指定日志:" + data.toString());
mRequestLogUploadEntity = JSON.parseObject(data.toString(), RequestLogUploadEntity.class);
mRequestLogUploadName=mRequestLogUploadEntity.getValueList().getLogName();
两个接口都是通过data进行的传输,两个data对应的实体并不一样,这样由于不能与具体的实体对应上就会报错
解决:原意是自己的知识盲点!!由于接口设计的外层ActionType字段是可以通用的,可以把jsonString转化为Json,只解析外层,再根据ActionType字段进行具体的业务对应
全代码
package com.example.hp.laochao;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.nkzawa.emitter.Emitter;
import com.github.nkzawa.socketio.client.IO;
import com.github.nkzawa.socketio.client.Socket;
import com.inspur.robot.model.AppVersionInfoBean;
import com.inspur.robot.model.ValueListBean;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import java.io.File;
import java.net.URISyntaxException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.xutils.x;
public class MainActivity extends Activity {
String meid = "86970302550751";
// 浪潮socket之SingIn
Socket socket;
AppVersionInfoBean appVersionInfoBean = new AppVersionInfoBean();
ValueListBean valueListBean = new ValueListBean();
SignInEntity signInEntity = new SignInEntity();
ActionTypeEntity mActionTypeEntity;
RequestLogListEntity mRequestLogListEntity;
RequestLogUploadEntity mRequestLogUploadEntity;
String mRequestLogUploadName;
ResponseLogListEntity mResponseLogListEntity = new ResponseLogListEntity();
RequestStartTraceEntity mRequestStartTraceEntity = new RequestStartTraceEntity();
RequestStopTraceEntity mRequestStopTraceEntity = new RequestStopTraceEntity();
ValueListEntity mValueListEntity = new ValueListEntity();
ResponseLogUploadEntity mResponseLogUploadEntity = new ResponseLogUploadEntity();
ResponseLogUpValueListEntity mResponseLogUpValueListEntity = new ResponseLogUpValueListEntity();
ResponseStartTraceEntity mResponseStartTraceEntity = new ResponseStartTraceEntity();
ResponseStopTraceEntity mResponseStopTraceEntity = new ResponseStopTraceEntity();
ResponseStartTraceListEntity mResponseStartTraceListEntity = new ResponseStartTraceListEntity();
ResponseStopTraceListEntity mResponseStopTraceListEntity = new ResponseStopTraceListEntity();
List<String> mArrayList = new ArrayList<>();
UploadLogSuccessEntity mUploadLogSuccessEntity;
Object data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_signin: {
Toast.makeText(getApplicationContext(), "签到", Toast.LENGTH_SHORT).show();
try {
IO.Options options = new IO.Options();
// options.timeout =60;
options.forceNew = true;
options.reconnection = false;
socket = IO.socket("http://117.xx.XX.xx:xxxx", options);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// socket.emit("robot", JSON.toJSONString(signInEntity));
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... arg0) {
// TODO Auto-generated method stub
Log.e("wy", "服务器连接成功" + arg0);
signIn();
}
}).on("robot", new Emitter.Listener() {
@Override
public void call(Object... args) {
data = args[0];
Log.e("wy", "Socket返回数据:" + data);
JSONObject jasonObject = JSON.parseObject(data.toString());
Log.e("wy", "jasonObject数据:" + jasonObject);
Log.e("wy", "ActionType数据:" + jasonObject.get("ActionType"));
if (jasonObject.get("ActionType").equals("RequestLogList")) {
Log.e("wy", "上传日志列表:" + data.toString());
mRequestLogListEntity = JSON.parseObject(data.toString(), RequestLogListEntity.class);
ResponseLogList();
} else if (jasonObject.get("ActionType").equals("RequestLogUpload")) {
Log.e("wy", "上传指定日志:" + data.toString());
mRequestLogUploadEntity = JSON.parseObject(data.toString(), RequestLogUploadEntity.class);
mRequestLogUploadName=mRequestLogUploadEntity.getValueList().getLogName();
UploadLogs();
} else if (jasonObject.get("ActionType").equals("RequestStartTrace")) {
Log.e("wy", "开启全量日志:" + data.toString());
mRequestStartTraceEntity = JSON.parseObject(data.toString(), RequestStartTraceEntity.class);
responseStartTrace();
} else if (jasonObject.get("ActionType").equals("RequestStopTrace")) {
Log.e("wy", "结束全量日志:" + data.toString());
mRequestStopTraceEntity = JSON.parseObject(data.toString(), RequestStopTraceEntity.class);
responseStopTrace();
}
}
}).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
Object data = args[0];
Log.e("wy", "socket连接断开args:" + args);
Log.e("wy", "socket连接断开data:" + data);
}
}).on(Socket.EVENT_CONNECT_TIMEOUT, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e("wy", "服务器连接超时");
}
}).on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e("wy", "服务器连接错误");
}
}).on(Socket.EVENT_ERROR, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e("wy", "事件 event 错误" + args[0]);
}
});
socket.connect();
break;
}
}
}
private void responseStopTrace() {
mResponseStopTraceListEntity.setResult(true);
mResponseStopTraceListEntity.setLocalTime(getTime());
mResponseStopTraceListEntity.setLogName("robot_86970302550751_20190730.txt");
mResponseStopTraceListEntity.setOtherInfo(null);
mResponseStopTraceEntity.setActionType("ResponseStopTrace");
mResponseStopTraceEntity.setRequestId(mRequestStopTraceEntity.getRequestId());
mResponseStopTraceEntity.setValueList(mResponseStopTraceListEntity);
String jsonString = JSON.toJSONString(mResponseStopTraceEntity);
Log.e("wy", "回复结束全量日志jsonString:" + jsonString);
socket.emit("robot", jsonString);
}
private void responseStartTrace() {
mResponseStartTraceListEntity.setLocalTime(getTime());
mResponseStartTraceListEntity.setResult(true);
mResponseStartTraceListEntity.setOtherInfo(null);
mResponseStartTraceEntity.setActionType("RequestStartTrace");
mResponseStartTraceEntity.setRequestId(mRequestStartTraceEntity.getRequestId());
mResponseStartTraceEntity.setValueList(mResponseStartTraceListEntity);
String jsonString = JSON.toJSONString(mResponseStartTraceEntity);
Log.e("wy", "回复开启全量日志jsonString:" + jsonString);
socket.emit("robot", jsonString);
;
}
public void UploadLogs() {
// TODO Auto-generated method stub
Log.e("wy", "mMeid: " + meid);
// String upUrl = "/storage/emulated/legacy/leotech/logs/robot_869703025507517_2019-06-20.log";//指定要上传的文件
// String upUrl = "/storage/emulated/legacy/leotech/logs/"
// + Logs.today_filename;//指定要上传的文件
// String upUrl = "/mnt/sdcard/leotech/logs/"
// + Logs.today_filename;//指定要上传的文件
String upUrl = "/mnt/sdcard/leotech/logs/"
+ mRequestLogUploadName;//指定要上传的文件
Log.e("wy", "upUrl: " + upUrl);
// final ProgressDialog dia = new ProgressDialog(this);
// dia.setMessage("上传中..");
// dia.show();
RequestParams params = new RequestParams("http://117.50.75.91:3005/api/file/upload");
params.addBodyParameter("robotId", meid);
params.addBodyParameter("file", new File(upUrl));
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
//加载成功回调,返回获取到的数据
Log.e("wy", "onSuccess: " + result);
//{"code":"0000","fileKey":"8f1237dd-815d-4262-8883-a00f29c4d2b1","msg":"文件上传成功"}
mUploadLogSuccessEntity = JSON.parseObject(result, UploadLogSuccessEntity.class);
ResponseLogUpload();
}
@Override
public void onFinished() {
// dia.dismiss();//加载完成
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Log.e("wy", "上传出错: " + ex);
}
});
}
private void ResponseLogUpload() {
mResponseLogUpValueListEntity.setLocalTime(getTime());
mResponseLogUpValueListEntity.setFileKey(mUploadLogSuccessEntity.getFileKey());
mResponseLogUpValueListEntity.setLogName(mRequestLogUploadEntity.getValueList().getLogName());
mResponseLogUpValueListEntity.setResult(true);
mResponseLogUpValueListEntity.setOtherInfo(null);
mResponseLogUploadEntity.setActionType("ResponseLogUpload");
mResponseLogUploadEntity.setRequestId(mRequestLogUploadEntity.getRequestId());
mResponseLogUploadEntity.setValueList(mResponseLogUpValueListEntity);
String jsonString = JSON.toJSONString(mResponseLogUploadEntity);
Log.e("wy", "上传日志jsonString:" + jsonString);
socket.emit("robot", jsonString);
}
public List<String> getFilesAllName(String path) {
File file=new File(path);
File[] files=file.listFiles();
if (files == null){Log.e("error","空目录");return null;}
List<String> s = new ArrayList<>();
for(int i =0;i<files.length;i++){
s.add(files[i].getName());
}
return s;
}
private void ResponseLogList() {
mArrayList=getFilesAllName("/mnt/sdcard/leotech/logs/");
Log.e("wy", "获取到本地日志列表第一个文件名字:" + mArrayList.get(0));
Log.e("wy", "获取到本地日志列表:" + mArrayList);
mValueListEntity.setLocalTime(getTime());
mValueListEntity.setLogList(mArrayList);
mResponseLogListEntity.setActionType("ResponseLogList");
mResponseLogListEntity.setRequestId(mRequestLogListEntity.getRequestId());
mResponseLogListEntity.setValueList(mValueListEntity);
String jsonString = JSON.toJSONString(mResponseLogListEntity);
Log.e("wy", "上传日志列表jsonString:" + jsonString);
socket.emit("robot", jsonString);
}
private void signIn() {
appVersionInfoBean.setMainVersion("1.0");
appVersionInfoBean.setSubVersion("0.9");
appVersionInfoBean.setLastUpdateTime("20190706080130");
valueListBean.setRobotId("86970302550751");
valueListBean.setRobotName("测试机器人wy1");
valueListBean.setMasterIP("192.168.0.188");
valueListBean.setSlaveIP("192.168.0.188");
valueListBean.setMasterMac("00:0a:f5:5a:b1:9c");
Log.e("wy", "获取当前时间:" + getTime());
valueListBean.setLocalTime(getTime());
valueListBean.setAppVersionInfo(appVersionInfoBean);
// valueListBean.setOtherInfo(null);
signInEntity.setActionType("SignIn");
signInEntity.setRequestId("1234567");
signInEntity.setSignatureValue("123kddfsdkfdskfjfsdfd");
signInEntity.setValueList(valueListBean);
String jsonString = JSON.toJSONString(signInEntity);
Object json = JSON.toJSON(signInEntity);
Log.i("wy", "jsonString:" + jsonString);
Log.i("wy", "json:" + json);
socket.emit("robot", jsonString);
// socket.disconnect();
}
private String getTime() {
Date date = new Date();
DateFormat format1 = new SimpleDateFormat("yyyyMMddHHmmss");
return format1.toString();
}
}