package com.sandu.ximon.admin.manager.iot.rrpc;
|
|
import com.alibaba.fastjson.JSON;
|
import com.aliyuncs.AcsRequest;
|
import com.aliyuncs.AcsResponse;
|
import com.aliyuncs.exceptions.ClientException;
|
import com.aliyuncs.iot.model.v20180120.*;
|
import com.sandu.common.execption.BusinessException;
|
import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame;
|
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
|
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
|
import com.sandu.ximon.admin.manager.iot.rrpc.dto.InvokeParam;
|
import com.sandu.ximon.admin.manager.iot.rrpc.dto.WrapResponseCommonFrame;
|
import com.sandu.ximon.admin.manager.iot.rrpc.topic.IBaseTopic;
|
import com.sandu.ximon.admin.manager.iot.rrpc.topic.ICustomizeTopic;
|
import com.sandu.ximon.admin.manager.iot.rrpc.util.FrameUtils;
|
import org.springframework.beans.BeanUtils;
|
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @author chenjiantian
|
* @date 2021/12/2 18:21
|
*/
|
public abstract class BaseInvokeSyncService implements IInvoke, IBaseTopic, ICustomizeTopic {
|
|
/**
|
* 发送rrpc 请求
|
*
|
* @param deviceName 设备名
|
* @param iRequestFrame 编码帧
|
* @param clz 内部帧响应实体类 如果不想自己解析 可带上
|
* @return 返回的解码帧实体类 同时把内部帧解码之后也携带上
|
*/
|
public <T extends BaseResponseInnerFrame<T>> WrapResponseCommonFrame<T> sendRRPC(String deviceName, IRequestFrame iRequestFrame, Class<T> clz){
|
CommonFrame commonFrame = sendRRPC(deviceName, iRequestFrame);
|
if (commonFrame == null) {
|
throw new BusinessException("rrpc请求失败");
|
}
|
WrapResponseCommonFrame<T> responseCommonFrame = new WrapResponseCommonFrame<>();
|
BeanUtils.copyProperties(commonFrame, responseCommonFrame);
|
try {
|
responseCommonFrame.setResponseInnerFrame(clz.newInstance().transformFrame(responseCommonFrame.getPayload()));
|
} catch (InstantiationException | IllegalAccessException e) {
|
throw new BusinessException(String.format("找不到%s的构造函数", clz.getName()));
|
}
|
return responseCommonFrame;
|
}
|
|
@Override
|
public CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame) {
|
InvokeParam param = new InvokeParam();
|
param.setOperate("1001");
|
param.setFrame(iRequestFrame.getEncodeFrame());
|
InvokeThingServiceResponse.Data data = invokeThing(deviceName, param);
|
if (data == null) {
|
return null;
|
}
|
String result = data.getResult();
|
result = result.replace("\\", "");
|
Map map = JSON.parseObject(result, Map.class);
|
result = (String) map.get("msg");
|
CommonFrame connectFrame = FrameUtils.transformMessageToFrame(result);
|
return connectFrame;
|
}
|
|
/**
|
* 基础通信同步调用
|
*
|
* @param request 请求封装
|
* @param <T> 返回类型
|
* @return 返回结果
|
*/
|
protected <T extends AcsResponse> T invokeSync(AcsRequest<T> request) {
|
// 获得服务调用响应
|
T response = null;
|
try {
|
response = getClient().getAcsResponse(request);
|
} catch (ClientException e) {
|
e.printStackTrace();
|
}
|
return response;
|
}
|
|
@Override
|
public RegisterDeviceResponse.Data registerDevice(String deviceName) {
|
RegisterDeviceRequest request = new RegisterDeviceRequest();
|
request.setDeviceName(deviceName);
|
request.setProductKey(getProductKey());
|
RegisterDeviceResponse response = invokeSync(request);
|
if (response != null && response.getSuccess()) {
|
return response.getData();
|
}
|
return null;
|
}
|
|
@Override
|
public boolean deleteDevice(String deviceName) {
|
DeleteDeviceRequest request = new DeleteDeviceRequest();
|
request.setDeviceName(deviceName);
|
request.setProductKey(getProductKey());
|
DeleteDeviceResponse response = invokeSync(request);
|
return response != null && response.getSuccess();
|
}
|
|
@Override
|
public QueryDeviceDetailResponse.Data queryDeviceDetail(String deviceName, String lotId) {
|
QueryDeviceDetailRequest request = new QueryDeviceDetailRequest();
|
request.setIotId(lotId);
|
request.setDeviceName(deviceName);
|
request.setProductKey(getProductKey());
|
QueryDeviceDetailResponse response = invokeSync(request);
|
if (response != null && response.getSuccess()) {
|
return response.getData();
|
}
|
return null;
|
}
|
|
@Override
|
public List<BatchQueryDeviceDetailResponse.DataItem> batchQueryDeviceDetail(List<String> deviceNames) {
|
BatchQueryDeviceDetailRequest request = new BatchQueryDeviceDetailRequest();
|
request.setDeviceNames(deviceNames);
|
request.setProductKey(getProductKey());
|
BatchQueryDeviceDetailResponse response = invokeSync(request);
|
if (response != null && response.getSuccess()) {
|
return response.getData();
|
}
|
return null;
|
}
|
|
|
@Override
|
public boolean saveDeviceProp(String deviceName, String props) {
|
throw new BusinessException("未实现");
|
// SaveDevicePropRequest request = new SaveDevicePropRequest();
|
// request.setDeviceName(deviceName);
|
// request.setProductKey(PRODUCT_KEY);
|
// request.setProps(JSON.);
|
}
|
|
@Override
|
public List<BatchGetDeviceStateResponse.DeviceStatus> batchGetDeviceState(List<String> deviceNames) {
|
BatchGetDeviceStateRequest request = new BatchGetDeviceStateRequest();
|
request.setDeviceNames(deviceNames);
|
request.setProductKey(getProductKey());
|
BatchGetDeviceStateResponse response = invokeSync(request);
|
if (response != null && response.getSuccess()) {
|
return response.getDeviceStatusList();
|
}
|
return null;
|
}
|
|
/**
|
* 调用自定义topic
|
* https://help.aliyun.com/document_detail/69584.htm?spm=a2c4g.11186623.0.0.25b33982bSQSom#reference-snk-mrz-wdb
|
*
|
* @param deviceName 设备名
|
* @param param 参数
|
* @return 设备返回的结果
|
*/
|
protected InvokeThingServiceResponse.Data invokeThing(String deviceName, InvokeParam param) {
|
// 填充服务调用的参数
|
InvokeThingServiceRequest request = new InvokeThingServiceRequest();
|
// 设备证书之productKey
|
request.setProductKey(getProductKey());
|
// 设备证书之deviceName
|
request.setDeviceName(deviceName);
|
// 要调用的服务标识符,取决于服务端定义 目前rrpc标识代表同步调用
|
request.setIdentifier("rrpc");
|
request.setArgs(JSON.toJSONString(param));
|
|
// 获得服务调用响应
|
InvokeThingServiceResponse response = null;
|
try {
|
response = getClient().getAcsResponse(request);
|
} catch (ClientException e) {
|
e.printStackTrace();
|
}
|
if (response == null) {
|
throw new BusinessException("调用rrpc失败");
|
}
|
if (!response.getSuccess()) {
|
throw new BusinessException("调用rrpc失败," + response.getErrorMessage());
|
}
|
// 服务调用成功,仅代表发送服务指令的成功,不代表执行服务本身是否成功
|
if (response.getSuccess()) {
|
// 仅同步服务有result
|
return response.getData();
|
}
|
return null;
|
}
|
}
|