Skip to content

Commit 6be1c6d

Browse files
authored
Java: DENM v1.1.3 refactoring and new DENM v2.2.0 (#502)
- DENM v2.2.0 support has been added - DENM v1.1.3 has been refactored completely for compatibility, so that both versions can be handled in parallel
2 parents 75d2291 + 43f6978 commit 6be1c6d

86 files changed

Lines changed: 4617 additions & 2774 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,20 @@ But also schemas of custom messages for V2X:
9292
_Note: none of the provided implementation is able to use different versions of a schema,
9393
they are using the following versions:
9494

95-
| Schema | Rust | Python | Java | Swift |
96-
|:-----------------:|:-----------------------------------------------------------------------------------:|:---------------------------------------------------------:|:-----------------------------------------------------------------------------------:|:-------------------------------------------:|
97-
| **Bootstrap** | | | | |
98-
| **CAM** | [2.2.0](schema/cam/cam_schema_2-2-0.json) [1.1.3](schema/cam/cam_schema_1-1-3.json) | [1.1.3](schema/cam/cam_schema_1-1-3.json) | [2.3.0](schema/cam/cam_schema_2-3-0.json) [1.1.3](schema/cam/cam_schema_1-1-3.json) | [1.1.3](schema/cam/cam_schema_1-1-3.json) |
99-
| **CPM** | [2.1.0](schema/cpm/cpm_schema_2-1-0.json) | [2.1.1](schema/cpm/cpm_schema_2-1-1.json) | [2.1.1](schema/cpm/cpm_schema_2-1-1.json) [1.2.1](schema/cpm/cpm_schema_1-2-1.json) | |
100-
| **DENM** | [2.2.0](schema/denm/denm_schema_2-2-0.json) | [1.1.3](schema/denm/denm_schema_1-1-3.json) | [1.1.3](schema/denm/denm_schema_1-1-3.json) | [1.1.3](schema/denm/denm_schema_1-1-3.json) |
101-
| **Information** | [2.1.0](schema/information/information_schema_2-1-0.json) | [1.2.0](schema/information/information_schema_1-2-0.json) | | |
102-
| **MAPEM** | | | | |
103-
| **Neighbourhood** | | | | |
104-
| **Region** | | | | |
105-
| **SPATEM** | | | | |
106-
| **SREM** | | | | |
107-
| **SSEM** | | | | |
108-
| **Status** | | [1.2.0](schema/status/status_schema_1-2-0.json) | | |
95+
| Schema | Rust | Python | Java | Swift |
96+
|:-----------------:|:-----------------------------------------------------------------------------------:|:---------------------------------------------------------:|:---------------------------------------------------------------------------------------:|:-------------------------------------------:|
97+
| **Bootstrap** | | | | |
98+
| **CAM** | [2.2.0](schema/cam/cam_schema_2-2-0.json) [1.1.3](schema/cam/cam_schema_1-1-3.json) | [1.1.3](schema/cam/cam_schema_1-1-3.json) | [2.3.0](schema/cam/cam_schema_2-3-0.json) [1.1.3](schema/cam/cam_schema_1-1-3.json) | [1.1.3](schema/cam/cam_schema_1-1-3.json) |
99+
| **CPM** | [2.1.0](schema/cpm/cpm_schema_2-1-0.json) | [2.1.1](schema/cpm/cpm_schema_2-1-1.json) | [2.1.1](schema/cpm/cpm_schema_2-1-1.json) [1.2.1](schema/cpm/cpm_schema_1-2-1.json) | |
100+
| **DENM** | [2.2.0](schema/denm/denm_schema_2-2-0.json) | [1.1.3](schema/denm/denm_schema_1-1-3.json) | [2.2.0](schema/denm/denm_schema_2-2-0.json) [1.1.3](schema/denm/denm_schema_1-1-3.json) | [1.1.3](schema/denm/denm_schema_1-1-3.json) |
101+
| **Information** | [2.1.0](schema/information/information_schema_2-1-0.json) | [1.2.0](schema/information/information_schema_1-2-0.json) | | |
102+
| **MAPEM** | | | | |
103+
| **Neighbourhood** | | | | |
104+
| **Region** | | | | |
105+
| **SPATEM** | | | | |
106+
| **SREM** | | | | |
107+
| **SSEM** | | | | |
108+
| **Status** | | [1.2.0](schema/status/status_schema_1-2-0.json) | | |
109109

110110
Languages
111111
---------
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.orange;
2+
3+
import com.orange.iot3mobility.TrueTime;
4+
import com.orange.iot3mobility.messages.EtsiConverter;
5+
import com.orange.iot3mobility.messages.StationType;
6+
import com.orange.iot3mobility.messages.denm.DenmHelper;
7+
import com.orange.iot3mobility.messages.denm.v113.model.DenmEnvelope113;
8+
import com.orange.iot3mobility.messages.denm.v113.model.DenmMessage113;
9+
import com.orange.iot3mobility.messages.denm.v113.model.Origin;
10+
import com.orange.iot3mobility.messages.denm.v113.model.managementcontainer.ActionId;
11+
import com.orange.iot3mobility.messages.denm.v113.model.managementcontainer.ManagementContainer;
12+
import com.orange.iot3mobility.messages.denm.v113.model.managementcontainer.ReferencePosition;
13+
import com.orange.iot3mobility.messages.denm.v113.model.situationcontainer.EventType;
14+
import com.orange.iot3mobility.messages.denm.v113.model.situationcontainer.SituationContainer;
15+
import com.orange.iot3mobility.quadkey.LatLng;
16+
import com.orange.iot3mobility.roadobjects.HazardType;
17+
18+
public class DenmV113Factory {
19+
private static final int PROTOCOL_VERSION = 2;
20+
private static final long STATION_ID = 123456L;
21+
private static final int LIFETIME = 10;
22+
private static final int INFO_QUALITY = 7;
23+
24+
private DenmV113Factory() {
25+
// Factory class
26+
}
27+
28+
static DenmEnvelope113 createTestDenmEnvelope(
29+
String sourceUuid,
30+
HazardType hazardType,
31+
LatLng position,
32+
StationType stationType) {
33+
return DenmEnvelope113.builder()
34+
.origin(Origin.self.name())
35+
.sourceUuid(sourceUuid)
36+
.timestamp(TrueTime.getAccurateTime())
37+
.message(DenmMessage113.builder()
38+
.protocolVersion(PROTOCOL_VERSION)
39+
.stationId(STATION_ID)
40+
.managementContainer(ManagementContainer.builder()
41+
.actionId(new ActionId(
42+
STATION_ID,
43+
DenmHelper.getNextSequenceNumber()))
44+
.detectionTime(TrueTime.getAccurateETSITime())
45+
.referenceTime(TrueTime.getAccurateETSITime())
46+
.eventPosition(new ReferencePosition(
47+
EtsiConverter.latitudeEtsi(position.getLatitude()),
48+
EtsiConverter.longitudeEtsi(position.getLongitude()),
49+
0
50+
))
51+
.validityDuration(LIFETIME)
52+
.stationType(stationType.value)
53+
.build())
54+
.situationContainer(SituationContainer.builder()
55+
.informationQuality(INFO_QUALITY)
56+
.eventType(new EventType(
57+
hazardType.getCause(),
58+
hazardType.getSubcause()))
59+
.build())
60+
.build())
61+
.build();
62+
}
63+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.orange;
2+
3+
import com.orange.iot3mobility.TrueTime;
4+
import com.orange.iot3mobility.messages.EtsiConverter;
5+
import com.orange.iot3mobility.messages.StationType;
6+
import com.orange.iot3mobility.messages.denm.DenmHelper;
7+
import com.orange.iot3mobility.messages.denm.v220.model.DenmEnvelope220;
8+
import com.orange.iot3mobility.messages.denm.v220.model.DenmMessage220;
9+
import com.orange.iot3mobility.messages.denm.v220.model.defs.Altitude;
10+
import com.orange.iot3mobility.messages.denm.v220.model.defs.PositionConfidenceEllipse;
11+
import com.orange.iot3mobility.messages.denm.v220.model.managementcontainer.ActionId;
12+
import com.orange.iot3mobility.messages.denm.v220.model.managementcontainer.ManagementContainer;
13+
import com.orange.iot3mobility.messages.denm.v220.model.managementcontainer.ReferencePosition;
14+
import com.orange.iot3mobility.messages.denm.v220.model.situationcontainer.CauseCode;
15+
import com.orange.iot3mobility.messages.denm.v220.model.situationcontainer.SituationContainer;
16+
import com.orange.iot3mobility.quadkey.LatLng;
17+
import com.orange.iot3mobility.roadobjects.HazardType;
18+
19+
public class DenmV220Factory {
20+
private static final int PROTOCOL_VERSION = 2;
21+
private static final long STATION_ID = 123456L;
22+
private static final int LIFETIME = 10;
23+
private static final int INFO_QUALITY = 7;
24+
25+
private DenmV220Factory() {
26+
// Factory class
27+
}
28+
29+
static DenmEnvelope220 createTestDenmEnvelope(
30+
String sourceUuid,
31+
HazardType hazardType,
32+
LatLng position,
33+
StationType stationType) {
34+
return DenmEnvelope220.builder()
35+
.sourceUuid(sourceUuid)
36+
.timestamp(TrueTime.getAccurateTime())
37+
.message(DenmMessage220.builder()
38+
.protocolVersion(PROTOCOL_VERSION)
39+
.stationId(STATION_ID)
40+
.managementContainer(ManagementContainer.builder()
41+
.actionId(new ActionId(
42+
STATION_ID,
43+
DenmHelper.getNextSequenceNumber()))
44+
.detectionTime(TrueTime.getAccurateETSITime())
45+
.referenceTime(TrueTime.getAccurateETSITime())
46+
.eventPosition(ReferencePosition.builder()
47+
.latitude(EtsiConverter.latitudeEtsi(position.getLatitude()))
48+
.longitude(EtsiConverter.longitudeEtsi(position.getLongitude()))
49+
.positionConfidenceEllipse(new PositionConfidenceEllipse(
50+
4095, 4095, 3601))
51+
.altitude(new Altitude(
52+
0, 15))
53+
.build())
54+
.validityDuration(LIFETIME)
55+
.stationType(stationType.value)
56+
.build())
57+
.situationContainer(SituationContainer.builder()
58+
.informationQuality(INFO_QUALITY)
59+
.eventType(new CauseCode(
60+
hazardType.getCause(),
61+
hazardType.getSubcause()))
62+
.build())
63+
.build())
64+
.build();
65+
}
66+
}

java/iot3/examples/src/main/java/com/orange/Iot3MobilityBootstrapExample.java

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.orange.iot3mobility.IoT3Mobility;
77
import com.orange.iot3mobility.IoT3MobilityCallback;
88
import com.orange.iot3mobility.Utils;
9+
import com.orange.iot3mobility.messages.StationType;
910
import com.orange.iot3mobility.messages.cam.core.CamCodec;
1011
import com.orange.iot3mobility.messages.cam.core.CamVersion;
1112
import com.orange.iot3mobility.messages.cam.v113.model.CamEnvelope113;
@@ -14,9 +15,11 @@
1415
import com.orange.iot3mobility.messages.cpm.core.CpmVersion;
1516
import com.orange.iot3mobility.messages.cpm.v121.model.CpmEnvelope121;
1617
import com.orange.iot3mobility.messages.cpm.v211.model.CpmEnvelope211;
18+
import com.orange.iot3mobility.messages.denm.core.DenmCodec;
19+
import com.orange.iot3mobility.messages.denm.core.DenmVersion;
20+
import com.orange.iot3mobility.messages.denm.v113.model.DenmEnvelope113;
21+
import com.orange.iot3mobility.messages.denm.v220.model.DenmEnvelope220;
1722
import com.orange.iot3mobility.roadobjects.HazardType;
18-
import com.orange.iot3mobility.its.StationType;
19-
import com.orange.iot3mobility.its.json.denm.DENM;
2023
import com.orange.iot3mobility.managers.IoT3RoadHazardCallback;
2124
import com.orange.iot3mobility.managers.IoT3RoadSensorCallback;
2225
import com.orange.iot3mobility.managers.IoT3RoadUserCallback;
@@ -26,7 +29,6 @@
2629
import com.orange.iot3mobility.roadobjects.RoadUser;
2730
import com.orange.iot3mobility.roadobjects.SensorObject;
2831

29-
import java.io.IOException;
3032
import java.net.URI;
3133
import java.util.concurrent.Executors;
3234
import java.util.concurrent.ScheduledExecutorService;
@@ -112,8 +114,14 @@ public void roadHazardExpired(RoadHazard roadHazard) {
112114
}
113115

114116
@Override
115-
public void denmArrived(DENM denm) {
116-
System.out.println("DENM received: " + denm.getJsonDENM());
117+
public void denmArrived(DenmCodec.DenmFrame<?> denmFrame) {
118+
if(denmFrame.version().equals(DenmVersion.V1_1_3)) {
119+
DenmEnvelope113 denmEnvelope113 = (DenmEnvelope113) denmFrame.envelope();
120+
System.out.println("Raw DENM v1.1.3: " + denmEnvelope113);
121+
} else if(denmFrame.version().equals(DenmVersion.V2_2_0)) {
122+
DenmEnvelope220 denmEnvelope220 = (DenmEnvelope220) denmFrame.envelope();
123+
System.out.println("Raw DENM v2.2.0: " + denmEnvelope220);
124+
}
117125
}
118126
});
119127

@@ -221,22 +229,42 @@ private static void setRegionOfInterest(LatLng roiPosition) {
221229
private static synchronized void startSendingMessages() {
222230
ScheduledExecutorService messageScheduler = Executors.newScheduledThreadPool(1);
223231
messageScheduler.scheduleWithFixedDelay(() -> sendTestCam(CamVersion.V1_1_3), 1, 1, TimeUnit.SECONDS);
224-
messageScheduler.scheduleWithFixedDelay(Iot3MobilityBootstrapExample::sendTestDenm, 1, 10, TimeUnit.SECONDS);
232+
messageScheduler.scheduleWithFixedDelay(() -> sendTestDenm(DenmVersion.V1_1_3), 1, 5, TimeUnit.SECONDS);
225233
messageScheduler.scheduleWithFixedDelay(() -> sendTestCpm(CpmVersion.V1_2_1), 1, 1, TimeUnit.SECONDS);
226234
}
227235

228236
private static void sendTestCam(CamVersion camVersion) {
229237
LatLng position = new LatLng(48.625218, 2.243448); // center point of UTAC TEQMO
230238
try {
231239
ioT3Mobility.sendPosition(StationType.PASSENGER_CAR, position, 0, 0, 0, 0, 0, camVersion);
232-
} catch (IOException e) {
240+
} catch (Exception e) {
233241
System.out.println("CAM ERROR: " + e);
234242
}
235243
}
236244

237-
private static void sendTestDenm() {
245+
private static void sendTestDenm(DenmVersion denmVersion) {
238246
LatLng position = new LatLng(48.626059, 2.247904); // planar area of UTAC TEQMO
239-
ioT3Mobility.sendHazard(HazardType.ACCIDENT_NO_SUBCAUSE, position, 10, 7, StationType.PASSENGER_CAR);
247+
HazardType hazardType = HazardType.ACCIDENT_NO_SUBCAUSE;
248+
StationType stationType = StationType.PASSENGER_CAR;
249+
try {
250+
if(denmVersion == DenmVersion.V1_1_3) {
251+
DenmEnvelope113 denmEnvelope113 = DenmV113Factory.createTestDenmEnvelope(
252+
EXAMPLE_UUID,
253+
hazardType,
254+
position,
255+
stationType);
256+
ioT3Mobility.sendDenm(denmEnvelope113);
257+
} else if(denmVersion == DenmVersion.V2_2_0) {
258+
DenmEnvelope220 denmEnvelope220 = DenmV220Factory.createTestDenmEnvelope(
259+
EXAMPLE_UUID,
260+
hazardType,
261+
position,
262+
stationType);
263+
ioT3Mobility.sendDenm(denmEnvelope220);
264+
}
265+
} catch (Exception e) {
266+
System.out.println("DENM ERROR: " + e);
267+
}
240268
}
241269

242270
private static void sendTestCpm(CpmVersion cpmVersion) {

0 commit comments

Comments
 (0)