|
|
|
@ -20,13 +20,13 @@ import lombok.Setter; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.eclipse.leshan.core.model.ObjectModel; |
|
|
|
import org.eclipse.leshan.core.model.ResourceModel; |
|
|
|
import org.eclipse.leshan.core.node.LwM2mObject; |
|
|
|
import org.eclipse.leshan.core.node.LwM2mObjectInstance; |
|
|
|
import org.eclipse.leshan.core.node.LwM2mMultipleResource; |
|
|
|
import org.eclipse.leshan.core.node.LwM2mPath; |
|
|
|
import org.eclipse.leshan.core.node.LwM2mResource; |
|
|
|
import org.eclipse.leshan.core.node.LwM2mSingleResource; |
|
|
|
import org.eclipse.leshan.core.node.codec.LwM2mValueConverter; |
|
|
|
import org.eclipse.leshan.core.request.ContentFormat; |
|
|
|
import org.eclipse.leshan.core.util.Hex; |
|
|
|
import org.eclipse.leshan.server.model.LwM2mModelProvider; |
|
|
|
import org.eclipse.leshan.server.registration.Registration; |
|
|
|
import org.thingsboard.server.common.data.Device; |
|
|
|
@ -43,6 +43,7 @@ import java.io.IOException; |
|
|
|
import java.io.ObjectInputStream; |
|
|
|
import java.io.Serializable; |
|
|
|
import java.util.Collection; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Optional; |
|
|
|
import java.util.Set; |
|
|
|
@ -52,6 +53,7 @@ import java.util.concurrent.locks.Lock; |
|
|
|
import java.util.concurrent.locks.ReentrantLock; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
import static org.eclipse.leshan.core.model.ResourceModel.Type.OPAQUE; |
|
|
|
import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_PATH; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LWM2M_OBJECT_VERSION_DEFAULT; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertObjectIdToVersionedId; |
|
|
|
@ -239,36 +241,71 @@ public class LwM2mClient implements Serializable { |
|
|
|
.getObjectModel(pathIds.getObjectId()) : null; |
|
|
|
} |
|
|
|
|
|
|
|
public String objectToString(LwM2mObject lwM2mObject) { |
|
|
|
public Optional<String> contentToString(Object content) { |
|
|
|
String value = null; |
|
|
|
LwM2mResource resource = null; |
|
|
|
String key = null; |
|
|
|
if (content instanceof HashMap && ((HashMap) content).size() == 1) { |
|
|
|
key = ((HashMap) content).keySet().toArray()[0].toString(); |
|
|
|
if (((HashMap) content).values().toArray()[0] != null) { |
|
|
|
if (((HashMap) content).values().toArray()[0] instanceof LwM2mResource) { |
|
|
|
resource = (LwM2mResource) ((HashMap) content).values().toArray()[0]; |
|
|
|
} |
|
|
|
} |
|
|
|
} else if (content instanceof LwM2mResource) { |
|
|
|
resource = (LwM2mResource) content; |
|
|
|
} |
|
|
|
if (resource != null && resource.getType() == OPAQUE) { |
|
|
|
value = this.resourceToString(resource, key); |
|
|
|
} |
|
|
|
value = value == null ? content.toString() : value; |
|
|
|
return Optional.of(String.format("%s", value)); |
|
|
|
} |
|
|
|
|
|
|
|
public String resourceToString(LwM2mResource resource, String key) { |
|
|
|
String value = null; |
|
|
|
StringBuilder builder = new StringBuilder(); |
|
|
|
builder.append("LwM2mObject [id=").append(lwM2mObject.getId()).append(", instances={"); |
|
|
|
lwM2mObject.getInstances().forEach((instId, inst) -> { |
|
|
|
builder.append(instId).append("=").append(this.instanceToString(inst)).append(", "); |
|
|
|
}); |
|
|
|
int startInd = builder.lastIndexOf(", "); |
|
|
|
if (startInd > 0) { |
|
|
|
builder.delete(startInd, startInd + 2); |
|
|
|
if (resource instanceof LwM2mSingleResource && ((byte[]) resource.getValue()).length > 0) { |
|
|
|
builder.append("LwM2mSingleResource"); |
|
|
|
if (key == null) { |
|
|
|
builder.append(" id=").append(String.valueOf(resource.getId())); |
|
|
|
} else { |
|
|
|
builder.append(" key=").append(key); |
|
|
|
} |
|
|
|
builder.append(" value=").append(opaqueToString((byte[]) resource.getValue())); |
|
|
|
builder.append(" type=").append(OPAQUE.toString()); |
|
|
|
value = builder.toString(); |
|
|
|
} else if (resource instanceof LwM2mMultipleResource) { |
|
|
|
builder.append("LwM2mMultipleResource"); |
|
|
|
if (key == null) { |
|
|
|
builder.append(" id=").append(String.valueOf(resource.getId())); |
|
|
|
} else { |
|
|
|
builder.append(" key=").append(key); |
|
|
|
} |
|
|
|
builder.append(" values={"); |
|
|
|
builder.append(multiInstanceOpaqueToString((LwM2mMultipleResource) resource)); |
|
|
|
builder.append("}"); |
|
|
|
builder.append(" type=").append(OPAQUE.toString()); |
|
|
|
value = builder.toString(); |
|
|
|
} |
|
|
|
builder.append("}]"); |
|
|
|
return builder.toString(); |
|
|
|
return value; |
|
|
|
} |
|
|
|
|
|
|
|
public String instanceToString(LwM2mObjectInstance objectInstance) { |
|
|
|
private String multiInstanceOpaqueToString(LwM2mMultipleResource resource) { |
|
|
|
StringBuilder builder = new StringBuilder(); |
|
|
|
builder.append("LwM2mObjectInstance [id=").append(objectInstance.getId()).append(", resources={"); |
|
|
|
objectInstance.getResources().forEach((resId, res) -> { |
|
|
|
builder.append(resId).append("=").append(this.resourceToString(res)).append(", "); |
|
|
|
resource.getInstances().values().stream().map(v -> { |
|
|
|
return builder.append(" id=").append(v.getId()).append(" value=").append(Hex.encodeHexString((byte[]) v.getValue())).append(", "); |
|
|
|
}); |
|
|
|
int startInd = builder.lastIndexOf(", "); |
|
|
|
if (startInd > 0) { |
|
|
|
builder.delete(startInd, startInd + 2); |
|
|
|
} |
|
|
|
builder.append("}]"); |
|
|
|
return builder.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
public String resourceToString(LwM2mResource lwM2mResource) { |
|
|
|
return lwM2mResource.isMultiInstances() ? lwM2mResource.getInstances().toString() : lwM2mResource.getValue().toString(); |
|
|
|
private String opaqueToString(byte[] value) { |
|
|
|
String opaque = Hex.encodeHexString(value); |
|
|
|
return opaque.length() > 1024 ? opaque.substring(0, 1024) : opaque; |
|
|
|
} |
|
|
|
|
|
|
|
public Collection<LwM2mResource> getNewResourceForInstance(String pathRezIdVer, Object params, LwM2mModelProvider modelProvider, |
|
|
|
@ -366,5 +403,9 @@ public class LwM2mClient implements Serializable { |
|
|
|
this.lock = new ReentrantLock(); |
|
|
|
} |
|
|
|
|
|
|
|
public boolean isComposite (LwM2mClientContext clientContext) { |
|
|
|
return LwM2mVersion.fromVersionStr(registration.getLwM2mVersion()).isComposite() & |
|
|
|
clientContext.getProfile(this.profileId).getClientLwM2mSettings().isComposite(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|