From 4b3d1d23b355854208814beb7363d890b825620b Mon Sep 17 00:00:00 2001 From: 952936464 <101640475+952936464@users.noreply.github.com> Date: Wed, 16 Aug 2023 13:49:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=AE=9E=E4=BE=8B=E7=9A=84?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E7=B1=BB=E5=8F=8A=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/model/device/info/DeviceInstance.java | 94 +++++++ .../model/device/info/DeviceOperationLog.java | 38 +++ .../sdk/model/device/info/DeviceProperty.java | 73 +++++ .../device/request/DeviceInstanceRequset.java | 250 +++++++++++++++++- .../request/DeviceInstanceRequsetTest.java | 165 ++++++++++++ 5 files changed, 614 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/jetlinks/sdk/model/device/info/DeviceInstance.java create mode 100644 src/main/java/org/jetlinks/sdk/model/device/info/DeviceOperationLog.java create mode 100644 src/main/java/org/jetlinks/sdk/model/device/info/DeviceProperty.java create mode 100644 src/test/java/org/jetlinks/sdk/model/device/request/DeviceInstanceRequsetTest.java diff --git a/src/main/java/org/jetlinks/sdk/model/device/info/DeviceInstance.java b/src/main/java/org/jetlinks/sdk/model/device/info/DeviceInstance.java new file mode 100644 index 0000000..f5cb945 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/device/info/DeviceInstance.java @@ -0,0 +1,94 @@ +package org.jetlinks.sdk.model.device.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.EnumInfo; + +import java.util.List; +import java.util.Map; + +@Getter +@Setter +public class DeviceInstance { + + @Schema(description = "设备ID(只能由数字,字母,下划线和中划线组成)") + private String id; + + @Schema(description = "图片地址") + private String photoUrl; + + @Schema(description = "设备名称") + private String name; + + @Schema(description = "设备类型") + private EnumInfo deviceType; + + @Schema(description = "说明") + private String describe; + + @Schema(description = "产品ID") + private String productId; + + @Schema(description = "产品名称") + private String productName; + + @Schema(description = "配置信息") + private Map configuration; + + @Schema(description = "派生(独立)物模型") + private String deriveMetadata; + + @Schema( + description = "状态(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + , defaultValue = "notActive" + ) + private EnumInfo state; + + @Schema( + description = "创建者ID(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private String creatorId; + + @Schema( + description = "创建者名称(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private String creatorName; + + @Schema( + description = "创建时间(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private Long createTime; + @Schema(description = "激活时间" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private Long registryTime; + + @Schema(description = "父级设备ID") + private String parentId; + + @Schema(description = "设备特性") + private List > features; + + @Schema( + description = "修改时间" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private Long modifyTime; + + @Schema( + description = "修改人ID" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private String modifierId; + + @Schema( + description = "修改人名称" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private String modifierName; +} diff --git a/src/main/java/org/jetlinks/sdk/model/device/info/DeviceOperationLog.java b/src/main/java/org/jetlinks/sdk/model/device/info/DeviceOperationLog.java new file mode 100644 index 0000000..ce78842 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/device/info/DeviceOperationLog.java @@ -0,0 +1,38 @@ +package org.jetlinks.sdk.model.device.info; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.EnumInfo; + +@Setter +@Getter +public class DeviceOperationLog { + @Schema(description = "日志ID") + private String id; + + @Schema(description = "设备ID") + private String deviceId; + + @Schema(description = "产品ID") + private String productId; + + @Schema(description = "日志类型") + private EnumInfo type; + + @Schema(description = "创建时间") + private long createTime; + + @Schema(description = "日志内容") + private Object content; + + @Schema(description = "消息ID") + private String messageId; + + @Hidden + private String orgId; + + @Schema(description = "数据时间") + private long timestamp; +} diff --git a/src/main/java/org/jetlinks/sdk/model/device/info/DeviceProperty.java b/src/main/java/org/jetlinks/sdk/model/device/info/DeviceProperty.java new file mode 100644 index 0000000..00cd17a --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/device/info/DeviceProperty.java @@ -0,0 +1,73 @@ +package org.jetlinks.sdk.model.device.info; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.core.message.property.ReportPropertyMessage; +import org.jetlinks.core.metadata.types.GeoPoint; + +import java.util.Date; + + +@Getter +@Setter +public class DeviceProperty { + + @Schema(description = "ID") + private String id; + + @Schema(description = "设备ID") + private String deviceId; + + @Schema(description = "属性ID") + private String property; + + @Schema(description = "属性名") + private String propertyName; + + @Schema(description = "类型") + private String type; + + @Schema(description = "单位") + private String unit; + + @Hidden + private Object numberValue; + + @Hidden + private Object objectValue; + + @Hidden + private Date timeValue; + + @Hidden + private String stringValue; + + @Hidden + private GeoPoint geoValue; + + @Schema(description = "属性值") + private Object value; + + @Schema(description = "格式化值") + private Object formatValue; + + @Schema(description = "创建时间") + private long createTime; + + @Schema(description = "数据时间") + private long timestamp; + + @Schema(description = "格式化后的时间,在聚合查询时此字段有值") + private String formatTime; + + /** + * 设备状态值,如果是查询的数据库,此字段可能为{@link null} + * + * @see ReportPropertyMessage#getPropertyStates() + */ + @Schema(description = "状态值") + private String state; + +} diff --git a/src/main/java/org/jetlinks/sdk/model/device/request/DeviceInstanceRequset.java b/src/main/java/org/jetlinks/sdk/model/device/request/DeviceInstanceRequset.java index d5a6641..6cd80f1 100644 --- a/src/main/java/org/jetlinks/sdk/model/device/request/DeviceInstanceRequset.java +++ b/src/main/java/org/jetlinks/sdk/model/device/request/DeviceInstanceRequset.java @@ -1,22 +1,27 @@ package org.jetlinks.sdk.model.device.request; import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.model.EnumInfo; import org.jetlinks.sdk.model.PagerResult; import org.jetlinks.sdk.model.SimpleApiRequest; -import org.jetlinks.sdk.model.device.info.DeviceDetail; +import org.jetlinks.sdk.model.device.info.*; +; import org.springframework.core.ResolvableType; +import org.springframework.http.HttpMethod; import org.springframework.web.util.UriComponentsBuilder; import java.net.URI; /** * 设备实例相关请求构造 - * @author gyl + * @author gyl,wyj * @since 2.1 */ public class DeviceInstanceRequset { + + /** * 查询设备详情 * @param deviceId 设备id @@ -44,10 +49,243 @@ public static SimpleApiRequest> queryDeviceDetail(Quer .uri("/device-instance/detail/_query") .body(query) .responseType(ResolvableType - .forClassWithGenerics( - PagerResult.class, - DeviceDetail.class - )) + .forClassWithGenerics( + PagerResult.class, + DeviceDetail.class + )) + .build(); + } + + + + /** + * 查询设备指定属性列表 + * @param property 设备属性 + * @return + */ + public static SimpleApiRequest> queryDeviceProperty(String deviceId, String property, QueryParamEntity queryParam) { + URI uri = UriComponentsBuilder + .fromUriString("/device/instance/{deviceId}/property/{property}/_query") + .build(deviceId,property); + return SimpleApiRequest + .>builder() + .post() + .uri(uri.toString()) + .body(queryParam) + .responseType(ResolvableType + .forClassWithGenerics( + PagerResult.class, + DeviceProperty.class + )) + .build(); + } + + /** + * 新增设备 + * @param deviceInstance 设备实例 + * @return + */ + public static SimpleApiRequest addDeviceInstance(DeviceInstance deviceInstance){ + return SimpleApiRequest + .builder() + .post() + .uri("/device-instance") + .body(deviceInstance) + .responseType(ResolvableType + .forClass( + DeviceInstance.class + )) + .build(); + } + + /** + * 根据id删除设备 + * @param deviceId 设备id + * @return + */ + + public static SimpleApiRequest deleteDeviceInstance(String deviceId){ + URI uri = UriComponentsBuilder + .fromUriString("/device-instance/{id}") + .build(deviceId); + return SimpleApiRequest + .builder() + .method(HttpMethod.DELETE) + .uri(uri.toString()) + .responseType(ResolvableType + .forClass( + DeviceInstance.class + )) + .build(); + } + + /** + * 根据查询体查询设备 + * @param query 查询参数 + * @return + */ + public static SimpleApiRequest queryDeviceInstance(QueryParamEntity query){ + return SimpleApiRequest + .builder() + .post() + .uri("/device-instance/_query") + .body(query) + .responseType(ResolvableType + .forClassWithGenerics( + PagerResult.class, + DeviceInstance.class + )) + .build(); + } + + /** + * 根据id修改 + * @param deviceId 设备id + * @return + */ + public static SimpleApiRequest updateDeviceInstance(String deviceId, DeviceInstance deviceInstance){ + URI uri = UriComponentsBuilder + .fromUriString("/device/instance/{id}") + .build(deviceId); + + return SimpleApiRequest + .builder() + .method(HttpMethod.PUT) + .uri(uri.toString()) + .body(deviceInstance) + .responseType(ResolvableType + .forClass( + Boolean.class + )) + .build(); + } + + /** + * 获取指定id设备的在线状态 + * @param deviceId 设备id + * @return + */ + public static SimpleApiRequest queryDeviceState(String deviceId){ + URI uri = UriComponentsBuilder + .fromUriString("/device/instance/{id}/state") + .build(deviceId); + + return SimpleApiRequest + .builder() + .get() + .uri(uri.toString()) + .responseType(ResolvableType + .forClass( + EnumInfo.class + )) + .build(); + + } + + /** + * 查询设备日志数据 + * @param deviceId 设备id + * @param queryParamEntity 查询条件 + * @return + */ + + public static SimpleApiRequest queryDeviceOperationLog(String deviceId, QueryParamEntity queryParamEntity){ + URI uri = UriComponentsBuilder + .fromUriString("/device/instance/{deviceId}/logs") + .build(deviceId); + + return SimpleApiRequest + .builder() + .post() + .uri(uri.toString()) + .body(queryParamEntity) + .responseType(ResolvableType + .forClassWithGenerics( + PagerResult.class, + DeviceOperationLog.class + )) + .build(); + } + + /** + * 更新 + * @param deviceId + * @param deviceMetadata + * @return + */ + + public static SimpleApiRequest updateDeviceMetadata(String deviceId, String deviceMetadata){ + URI uri = UriComponentsBuilder + .fromUriString("/device/instance/{deviceId}/metadata") + .build(deviceId); + + return SimpleApiRequest + .builder() + .method(HttpMethod.PUT) + .uri(uri.toString()) + .body(deviceMetadata) + .responseType(ResolvableType + .forClass( + Object.class + )) + .build(); + } + + /** + * 重置物模型 + * @param deviceId 设备id + * @return + */ + public static SimpleApiRequest deleteMetadata(String deviceId){ + URI uri = UriComponentsBuilder + .fromUriString("/device/instance/{deviceId}/metadata") + .build(deviceId); + return SimpleApiRequest + .builder() + .method(HttpMethod.DELETE) + .uri(uri.toString()) + .responseType(ResolvableType + .forClass( + Object.class + )) + .build(); + } + + /** + * 获取支持的物模型格式 + * @return + */ + + public static SimpleApiRequest getDeviceMetadataCodecs(){ + return SimpleApiRequest + .builder() + .get() + .uri("/device/product/metadata/codecs") + .responseType(ResolvableType + .forClass( + Object.class + )) + .build(); + } + + /** + * 获取设备的影子 + * @param deviceId 设备id + * @return + */ + + public static SimpleApiRequest getDeviceShadow(String deviceId){ + URI uri = UriComponentsBuilder + .fromUriString("/device/instance/{deviceId}/shadow") + .build(deviceId); + return SimpleApiRequest + .builder() + .get() + .uri(uri.toString()) + .responseType(ResolvableType + .forClass( + String.class + )) .build(); } diff --git a/src/test/java/org/jetlinks/sdk/model/device/request/DeviceInstanceRequsetTest.java b/src/test/java/org/jetlinks/sdk/model/device/request/DeviceInstanceRequsetTest.java new file mode 100644 index 0000000..aa90e9e --- /dev/null +++ b/src/test/java/org/jetlinks/sdk/model/device/request/DeviceInstanceRequsetTest.java @@ -0,0 +1,165 @@ +package org.jetlinks.sdk.model.device.request; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.client.ApiClient; +import org.jetlinks.sdk.client.ClientConfig; +import org.jetlinks.sdk.client.WebApiClient; +import org.jetlinks.sdk.model.ApiResponse; +import org.jetlinks.sdk.model.EnumInfo; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.device.info.DeviceDetail; +import org.jetlinks.sdk.model.device.info.DeviceInstance; +import org.jetlinks.sdk.model.device.info.DeviceProperty; +import org.junit.jupiter.api.Test; + +public class DeviceInstanceRequsetTest { + ClientConfig clientConfig = new ClientConfig( + "http://192.168.33.46:8844", + "w23y8dADCwPkRGnB", + "dH7eNKTNmca33YstE88HdYRz8x7RZiFt" + ); + ApiClient client = new WebApiClient(clientConfig); + + @Test + public void getDeviceDetailTest(){ + String deviceId = "demo_id"; + ApiResponse response = client + .request(DeviceInstanceRequset.getDeviceDetailInfo(deviceId)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void queryDeviceDetailTest(){ + //统一构造Request使用示例 + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .where("productId", "demo_device") + .doPaging(0, 100); + ApiResponse> request = client.request(DeviceInstanceRequset.queryDeviceDetail(queryParamEntity)); + System.out.println(JSON.toJSONString(request, SerializerFeature.PrettyFormat)); + } + + @Test + public void queryDevicePropertyTest() { + String deviceId = "demo_id"; + String property = "demo_property"; + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .where("property", "demo_property") + .where("deviceId", "demo_id"); + ApiResponse> response = client + .request(DeviceInstanceRequset.queryDeviceProperty(deviceId, property, queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + + @Test + public void addDeviceInstanceTest(){ + DeviceInstance deviceInstance = new DeviceInstance(); + deviceInstance.setId("demo_id"); + deviceInstance.setName("demo_name"); + deviceInstance.setProductId("demo_productId"); + EnumInfo deviceType = new EnumInfo<>(); + deviceType.setValue("demo_deviceType"); + deviceInstance.setProductName("demo_productName"); + ApiResponse response = client + .request(DeviceInstanceRequset.addDeviceInstance(deviceInstance)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + + @Test + public void deleteDeviceInstanceTest(){ + String deviceId = "demo_deviceId"; + ApiResponse response = client. + request(DeviceInstanceRequset.deleteDeviceInstance(deviceId)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void queryDeviceInstanceTest(){ + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .where("id", "demo_id") + .doPaging(0,12); + ApiResponse response = client + .request(DeviceInstanceRequset.queryDeviceInstance(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + + @Test + public void updateDeviceInstanceTest(){ + DeviceInstance deviceInstance = new DeviceInstance(); + String deviceId = "demo_id"; + deviceInstance.setName("demo_name"); + deviceInstance.setProductName("demo_name"); + ApiResponse response = client + .request(DeviceInstanceRequset.updateDeviceInstance(deviceId, deviceInstance)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void queryDeviceStateTest(){ + String deviceId = "demo_id"; + ApiResponse response = client + .request(DeviceInstanceRequset.queryDeviceState(deviceId)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + + @Test + public void queryDeviceLogTest(){ + String deviceId = "demo_id"; + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .where("type", "offline") + .doPaging(0,12); + ApiResponse response = client + .request(DeviceInstanceRequset.queryDeviceOperationLog(deviceId, queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + // todo + @Test + public void updateDeviceMetadataTest(){ + String deviceId = "demo _id"; + String meta = "demo_meta"; + ApiResponse response = client + .request(DeviceInstanceRequset.updateDeviceMetadata(deviceId, meta)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void getDeviceMetadataCodecsTest(){ + ApiResponse response = client + .request(DeviceInstanceRequset.getDeviceMetadataCodecs()); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void deleteDeviceMetadataTest(){ + String deviceId = "1688426683861848064"; + ApiResponse response = client + .request(DeviceInstanceRequset.deleteMetadata(deviceId)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + + + @Test + public void getDeviceShadowTest(){ + String deviceId = "1688426683861848064"; + ApiResponse response = client + .request(DeviceInstanceRequset.getDeviceShadow(deviceId)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + +}