From 1e5d359eafb689376caf1126185bbaf23a3864c6 Mon Sep 17 00:00:00 2001 From: yunhanw Date: Fri, 18 Aug 2023 18:38:28 -0700 Subject: [PATCH 1/3] update json/tlv for report --- .../pairing/PairOnNetworkLongImReadCommand.kt | 46 +++++++++++---- src/controller/java/AndroidCallbacks.cpp | 58 ++++++++++++------- .../devicecontroller/model/ClusterState.java | 6 +- 3 files changed, 76 insertions(+), 34 deletions(-) diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt index f432027c6cbdd0..8594f95c336728 100644 --- a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt @@ -5,9 +5,9 @@ import chip.devicecontroller.GetConnectedDeviceCallbackJni.GetConnectedDeviceCal import chip.devicecontroller.ReportCallback import chip.devicecontroller.model.ChipAttributePath import chip.devicecontroller.model.ChipEventPath +import chip.devicecontroller.model.ChipPathId import chip.devicecontroller.model.NodeState import com.matter.controller.commands.common.CredentialsIssuer -import java.util.Collections import java.util.logging.Level import java.util.logging.Logger @@ -36,7 +36,30 @@ class PairOnNetworkLongImReadCommand( } override fun onReport(nodeState: NodeState) { - logger.log(Level.INFO, "Read receve onReport") + logger.log(Level.INFO, nodeState.toString()) + + val attribute = + nodeState + .getEndpointState(0) + ?.getClusterState(CLUSTER_ID_BASIC) + ?.getAttributeState(ATTR_ID_LOCAL_CONFIG_DISABLED) + + if (!(attribute != null && attribute.getJson().toString().equals("""{"16:BOOL":false}"""))) { + setFailure("read attribute failure") + return + } + val event = + nodeState + .getEndpointState(0) + ?.getClusterState(CLUSTER_ID_BASIC) + ?.getEventState(EVENT_ID_START_UP) + if ( + !(event != null && event[0].getJson().toString().equals("""{"0:STRUCT":{"0:UINT":1}}""")) + ) { + setFailure("read event failure") + return + } + logger.log(Level.INFO, "Read receive onReport success") setSuccess() } } @@ -62,6 +85,15 @@ class PairOnNetworkLongImReadCommand( ) ) + val eventPathList = + listOf( + ChipEventPath.newInstance( + ChipPathId.forWildcard(), + ChipPathId.forWildcard(), + ChipPathId.forWildcard() + ) + ) + currentCommissioner() .pairDeviceWithAddress( getNodeId(), @@ -77,14 +109,7 @@ class PairOnNetworkLongImReadCommand( .getConnectedDevicePointer(getNodeId(), InternalGetConnectedDeviceCallback()) clear() currentCommissioner() - .readPath( - InternalReportCallback(), - devicePointer, - attributePathList, - Collections.emptyList(), - false, - 0 - ) + .readPath(InternalReportCallback(), devicePointer, attributePathList, eventPathList, false, 0) waitCompleteMs(getTimeoutMillis()) } @@ -94,5 +119,6 @@ class PairOnNetworkLongImReadCommand( private const val MATTER_PORT = 5540 private const val CLUSTER_ID_BASIC = 0x0028L private const val ATTR_ID_LOCAL_CONFIG_DISABLED = 16L + private const val EVENT_ID_START_UP = 0L } } diff --git a/src/controller/java/AndroidCallbacks.cpp b/src/controller/java/AndroidCallbacks.cpp index daa7f9ef8abcb0..916b5ceb6f15a6 100644 --- a/src/controller/java/AndroidCallbacks.cpp +++ b/src/controller/java/AndroidCallbacks.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -251,11 +250,6 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat return; } - TLV::TLVReader readerForJavaTLV; - TLV::TLVReader readerForJson; - readerForJavaTLV.Init(*apData); - readerForJson.Init(*apData); - jobject value = nullptr; #if USE_JAVA_TLV_ENCODE_DECODE TLV::TLVReader readerForJavaObject; @@ -273,25 +267,40 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat ReportError(attributePathObj, nullptr, CHIP_JNI_ERROR_EXCEPTION_THROWN)); #endif // Create TLV byte array to pass to Java layer + TLV::TLVReader readerForJavaTLV; + readerForJavaTLV.Init(*apData); size_t bufferLen = readerForJavaTLV.GetRemainingLength() + readerForJavaTLV.GetLengthRead(); std::unique_ptr buffer = std::unique_ptr(new uint8_t[bufferLen]); uint32_t size = 0; - // The TLVReader's read head is not pointing to the first element in the container, instead of the container itself, use - // a TLVWriter to get a TLV with a normalized TLV buffer (Wrapped with an anonymous tag, no extra "end of container" tag - // at the end.) + TLV::TLVWriter writer; writer.Init(buffer.get(), bufferLen); - err = writer.CopyElement(TLV::AnonymousTag(), readerForJavaTLV); + TLV::TLVType outer; + + err = writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outer); + VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(attributePathObj, nullptr, err)); + TLV::Tag tag; + err = ConvertTlvTag(aPath.mAttributeId, tag); + + VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(attributePathObj, nullptr, err)); + err = writer.CopyElement(tag, readerForJavaTLV); VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(attributePathObj, nullptr, err)); + err = writer.EndContainer(outer); + + VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(nullptr, attributePathObj, err)); size = writer.GetLengthWritten(); chip::ByteArray jniByteArray(env, reinterpret_cast(buffer.get()), size); + TLV::TLVReader readerForJson; + readerForJson.Init(buffer.get(), size); + err = readerForJson.Next(); + VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(nullptr, attributePathObj, err)); // Convert TLV to JSON - Json::Value json; + std::string json; err = TlvToJson(readerForJson, json); VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(attributePathObj, nullptr, err)); - UtfString jsonString(env, JsonToString(json).c_str()); + UtfString jsonString(env, json.c_str()); // Create AttributeState object jclass attributeStateCls; @@ -365,11 +374,6 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV return; } - TLV::TLVReader readerForJavaTLV; - TLV::TLVReader readerForJson; - readerForJavaTLV.Init(*apData); - readerForJson.Init(*apData); - jlong eventNumber = static_cast(aEventHeader.mEventNumber); jint priorityLevel = static_cast(aEventHeader.mPriorityLevel); jlong timestampValue = static_cast(aEventHeader.mTimestamp.mValue); @@ -406,6 +410,8 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV #endif // Create TLV byte array to pass to Java layer + TLV::TLVReader readerForJavaTLV; + readerForJavaTLV.Init(*apData); size_t bufferLen = readerForJavaTLV.GetRemainingLength() + readerForJavaTLV.GetLengthRead(); std::unique_ptr buffer = std::unique_ptr(new uint8_t[bufferLen]); uint32_t size = 0; @@ -414,17 +420,29 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV // at the end.) TLV::TLVWriter writer; writer.Init(buffer.get(), bufferLen); - err = writer.CopyElement(TLV::AnonymousTag(), readerForJavaTLV); + TLV::TLVType outer; + err = writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outer); + VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(nullptr, eventPathObj, err)); + TLV::Tag tag; + err = ConvertTlvTag(aEventHeader.mPath.mEventId, tag); + VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(nullptr, eventPathObj, err)); + err = writer.CopyElement(tag, readerForJavaTLV); + VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(nullptr, eventPathObj, err)); + err = writer.EndContainer(outer); VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(nullptr, eventPathObj, err)); size = writer.GetLengthWritten(); chip::ByteArray jniByteArray(env, reinterpret_cast(buffer.get()), size); // Convert TLV to JSON - Json::Value json; + std::string json; + TLV::TLVReader readerForJson; + readerForJson.Init(buffer.get(), size); + err = readerForJson.Next(); + VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(nullptr, eventPathObj, err)); err = TlvToJson(readerForJson, json); VerifyOrReturn(err == CHIP_NO_ERROR, ReportError(nullptr, eventPathObj, err)); - UtfString jsonString(env, JsonToString(json).c_str()); + UtfString jsonString(env, json.c_str()); // Create EventState object jclass eventStateCls; diff --git a/src/controller/java/src/chip/devicecontroller/model/ClusterState.java b/src/controller/java/src/chip/devicecontroller/model/ClusterState.java index 8507682968edc5..55a89882be17bc 100644 --- a/src/controller/java/src/chip/devicecontroller/model/ClusterState.java +++ b/src/controller/java/src/chip/devicecontroller/model/ClusterState.java @@ -79,8 +79,7 @@ public String toString() { builder.append("Attribute "); builder.append(attributeId); builder.append(": "); - builder.append( - attributeState.getValue() == null ? "null" : attributeState.getValue().toString()); + builder.append(attributeState.getJson().toString()); builder.append("\n"); }); events.forEach( @@ -90,8 +89,7 @@ public String toString() { builder.append("Event "); builder.append(eventId); builder.append(": "); - builder.append( - eventState.getValue() == null ? "null" : eventState.getValue().toString()); + builder.append(eventState.getJson().toString()); builder.append("\n"); }); }); From a415a8a84f370eea6d975a934cfc888c2da342bc Mon Sep 17 00:00:00 2001 From: yunhanw Date: Mon, 21 Aug 2023 09:09:15 -0700 Subject: [PATCH 2/3] address comments --- .../java/src/chip/devicecontroller/model/ClusterState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controller/java/src/chip/devicecontroller/model/ClusterState.java b/src/controller/java/src/chip/devicecontroller/model/ClusterState.java index 55a89882be17bc..66e554960a1811 100644 --- a/src/controller/java/src/chip/devicecontroller/model/ClusterState.java +++ b/src/controller/java/src/chip/devicecontroller/model/ClusterState.java @@ -79,7 +79,7 @@ public String toString() { builder.append("Attribute "); builder.append(attributeId); builder.append(": "); - builder.append(attributeState.getJson().toString()); + builder.append(attributeState.getJson() == null ? "null" : attributeState.getJson().toString()); builder.append("\n"); }); events.forEach( @@ -89,7 +89,7 @@ public String toString() { builder.append("Event "); builder.append(eventId); builder.append(": "); - builder.append(eventState.getJson().toString()); + builder.append(eventState.getJson() == null ? "null" : eventState.getJson().toString()); builder.append("\n"); }); }); From 2c828b6e94d04041bb12fdc685e59f8d89fb4f72 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 21 Aug 2023 16:10:24 +0000 Subject: [PATCH 3/3] Restyled by google-java-format --- .../java/src/chip/devicecontroller/model/ClusterState.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/controller/java/src/chip/devicecontroller/model/ClusterState.java b/src/controller/java/src/chip/devicecontroller/model/ClusterState.java index 66e554960a1811..cfcb2351064240 100644 --- a/src/controller/java/src/chip/devicecontroller/model/ClusterState.java +++ b/src/controller/java/src/chip/devicecontroller/model/ClusterState.java @@ -79,7 +79,8 @@ public String toString() { builder.append("Attribute "); builder.append(attributeId); builder.append(": "); - builder.append(attributeState.getJson() == null ? "null" : attributeState.getJson().toString()); + builder.append( + attributeState.getJson() == null ? "null" : attributeState.getJson().toString()); builder.append("\n"); }); events.forEach( @@ -89,7 +90,8 @@ public String toString() { builder.append("Event "); builder.append(eventId); builder.append(": "); - builder.append(eventState.getJson() == null ? "null" : eventState.getJson().toString()); + builder.append( + eventState.getJson() == null ? "null" : eventState.getJson().toString()); builder.append("\n"); }); });