Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
e5fad3c
java/iot3mobility: add new CAM 1.1.3 implementation based on Jackson
mathieu1fb Feb 10, 2026
2d88429
java/iot3mobility: add CAM 2.3.0 implementation based on Jackson
mathieu1fb Feb 10, 2026
6be7e70
java: add Jackson Core to THIRD-PARTY.md
mathieu1fb Mar 9, 2026
4b6a41f
java/iot3mobility: add CAM version handling helper classes
mathieu1fb Feb 10, 2026
85cd694
java/iot3mobility: add EtsiConverter class to help with ETSI units co…
mathieu1fb Feb 16, 2026
5890705
java/iot3mobility: add CamHelper class to wrap the CamCodec and expos…
mathieu1fb Feb 16, 2026
51113a4
java/iot3mobility: add sendCam(...) variants for the new v1.1.3 and v…
mathieu1fb Feb 16, 2026
4f0e7b2
java/iot3mobility: implement sendPosition() with the new CAM v1.1.3
mathieu1fb Feb 17, 2026
e0830b1
java/iot3mobility: update CAM processing to handle both the new v1.1.…
mathieu1fb Mar 2, 2026
3205742
java/iot3examples: update roadUserCallback in Iot3Mobility examples
mathieu1fb Mar 2, 2026
4ae1803
java/iot3mobility: delete legacy CAM implementation
mathieu1fb Mar 2, 2026
aca3f96
java/iot3mobility: add default known values to CAM v2.3.0 builder
mathieu1fb Mar 2, 2026
359f069
java/iot3mobility: add MessageFormat enum to CAM v2.3.0
mathieu1fb Mar 2, 2026
2396593
java/iot3mobility: cleanup of CamReader classes
mathieu1fb Mar 3, 2026
0a5deec
java/iot3mobility: fix EtsiConverter's generationDeltaTime method
mathieu1fb Mar 3, 2026
546241e
java/iot3mobility: add Exception throw to sendPosition method
mathieu1fb Mar 3, 2026
740d2c3
java/iot3examples: add Exception handling to sendPosition(...) methods
mathieu1fb Mar 3, 2026
607bae2
java/iot3mobility: add some Javadoc to CAM v1.1.3 builders
mathieu1fb Mar 3, 2026
f5669d1
java/iot3mobility: polish CAM v2.3.0 Javadoc
mathieu1fb Mar 3, 2026
1fe702f
java/iot3mobility: add Origin enum to CAM v1.1.3
mathieu1fb Mar 3, 2026
0b9f181
java/iot3mobility: add StationType enum at the root of the message pa…
mathieu1fb Mar 3, 2026
3a24a01
java/iot3mobility: add full Javadoc to CAM v1.1.3 and delete SpecialV…
mathieu1fb Mar 3, 2026
2cc2df2
java/iot3mobility: add full Javadoc for CAM v2.3.0
mathieu1fb Mar 3, 2026
35d5116
java/iot3mobility: remove SpecialVehicleContainer in CamReader113 and…
mathieu1fb Mar 5, 2026
c4f27b9
java/iot3mobility: remove erroneous check of acceleration control in …
mathieu1fb Mar 5, 2026
984b22c
java/iot3mobility: add CamVersion option to IoT3Mobility sendPosition…
mathieu1fb Mar 5, 2026
4328031
java/iot3examples: adapt Mobility example classes with CamVersion option
mathieu1fb Mar 5, 2026
ec45de5
java/iot3mobility: add copyright to all CAM v1.1.3 and v2.3.0 classes
mathieu1fb Mar 9, 2026
ae5edec
java/iot3mobility: remove max value check on CAM v2.3.0 timestamp
mathieu1fb Mar 9, 2026
d094451
java/iot3mobility: rename message package into messages
mathieu1fb Mar 10, 2026
e2bf447
java: add CAM v2.3.0 to the README listing of messages handled by the…
mathieu1fb Mar 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,20 +92,20 @@ But also schemas of custom messages for V2X:
_Note: none of the provided implementation is able to use different versions of a schema,
they are using the following versions:

| Schema | Rust | Python | Java | Swift |
|:-----------------:|:-----------------------------------------------------------------------------------:|:---------------------------------------------------------:|:-------------------------------------------:|:-------------------------------------------:|
| **Bootstrap** | | | | |
| **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) | [1.1.3](schema/cam/cam_schema_1-1-3.json) | [1.1.3](schema/cam/cam_schema_1-1-3.json) |
| **CPM** | [2.1.0](schema/cpm/cpm_schema_2-1-0.json) | [2.1.1](schema/cpm/cpm_schema_2-1-1.json) | [1.2.1](schema/cpm/cpm_schema_1-2-1.json) | |
| **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) |
| **Information** | [2.1.0](schema/information/information_schema_2-1-0.json) | [1.2.0](schema/information/information_schema_1-2-0.json) | | |
| **MAPEM** | | | | |
| **Neighbourhood** | | | | |
| **Region** | | | | |
| **SPATEM** | | | | |
| **SREM** | | | | |
| **SSEM** | | | | |
| **Status** | | [1.2.0](schema/status/status_schema_1-2-0.json) | | |
| Schema | Rust | Python | Java | Swift |
|:-----------------:|:-----------------------------------------------------------------------------------:|:---------------------------------------------------------:|:-----------------------------------------------------------------------------------:|:-------------------------------------------:|
| **Bootstrap** | | | | |
| **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) |
| **CPM** | [2.1.0](schema/cpm/cpm_schema_2-1-0.json) | [2.1.1](schema/cpm/cpm_schema_2-1-1.json) | [1.2.1](schema/cpm/cpm_schema_1-2-1.json) | |
| **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) |
| **Information** | [2.1.0](schema/information/information_schema_2-1-0.json) | [1.2.0](schema/information/information_schema_1-2-0.json) | | |
| **MAPEM** | | | | |
| **Neighbourhood** | | | | |
| **Region** | | | | |
| **SPATEM** | | | | |
| **SREM** | | | | |
| **SSEM** | | | | |
| **Status** | | [1.2.0](schema/status/status_schema_1-2-0.json) | | |

Languages
---------
Expand Down
3 changes: 3 additions & 0 deletions THIRD-PARTY.md
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,9 @@
#### Square OkHttp
- [Source code](https://github.com/square/okhttp)

#### Jackson Core
- [Source code](https://github.com/FasterXML/jackson-core)

## Swift

### License Apache 2.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@
import com.orange.iot3mobility.TrueTime;
import com.orange.iot3mobility.Utils;
import com.orange.iot3mobility.its.EtsiUtils;
import com.orange.iot3mobility.messages.cam.core.CamCodec;
import com.orange.iot3mobility.messages.cam.core.CamVersion;
import com.orange.iot3mobility.messages.cam.v113.model.CamEnvelope113;
import com.orange.iot3mobility.messages.cam.v230.model.CamEnvelope230;
import com.orange.iot3mobility.roadobjects.HazardType;
import com.orange.iot3mobility.its.StationType;
import com.orange.iot3mobility.its.json.JsonValue;
import com.orange.iot3mobility.its.json.Position;
import com.orange.iot3mobility.its.json.PositionConfidence;
import com.orange.iot3mobility.its.json.PositionConfidenceEllipse;
import com.orange.iot3mobility.its.json.cam.CAM;
import com.orange.iot3mobility.its.json.cpm.*;
import com.orange.iot3mobility.its.json.denm.DENM;
import com.orange.iot3mobility.managers.IoT3RoadHazardCallback;
Expand All @@ -26,6 +29,7 @@
import com.orange.iot3mobility.roadobjects.RoadUser;
import com.orange.iot3mobility.roadobjects.SensorObject;

import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.concurrent.Executors;
Expand Down Expand Up @@ -125,12 +129,6 @@ public void newRoadUser(RoadUser roadUser) {
System.out.println("New Road User: " + roadUser.getUuid());
LatLng position = roadUser.getPosition();
System.out.println("Road User position: " + position);
// the CAM on which this object is based can still be accessed
CAM originalCam = roadUser.getCam();
double latitude = originalCam.getBasicContainer().getPosition().getLatitudeDegree();
double longitude = originalCam.getBasicContainer().getPosition().getLongitudeDegree();
LatLng camPosition = new LatLng(latitude, longitude);
System.out.println("CAM position: " + camPosition);
}

@Override
Expand All @@ -146,9 +144,15 @@ public void roadUserExpired(RoadUser roadUser) {
}

@Override
public void camArrived(CAM cam) {
public void camArrived(CamCodec.CamFrame<?> camFrame) {
// if you want to directly process the raw CAM messages
System.out.println("CAM received: " + cam.getJsonCAM());
if(camFrame.version().equals(CamVersion.V1_1_3)) {
CamEnvelope113 camEnvelope113 = (CamEnvelope113) camFrame.envelope();
System.out.println("Raw CAM v1.1.3: " + camEnvelope113);
} else if(camFrame.version().equals(CamVersion.V2_3_0)) {
CamEnvelope230 camEnvelope230 = (CamEnvelope230) camFrame.envelope();
System.out.println("Raw CAM v2.3.0: " + camEnvelope230);
}
}
});

Expand Down Expand Up @@ -221,7 +225,11 @@ private static synchronized void startSendingMessages() {

private static void sendTestCam() {
LatLng position = new LatLng(48.625218, 2.243448); // center point of UTAC TEQMO
ioT3Mobility.sendPosition(StationType.PASSENGER_CAR, position, 0, 0, 0, 0, 0);
try {
ioT3Mobility.sendPosition(StationType.PASSENGER_CAR, position, 0, 0, 0, 0, 0, CamVersion.V1_1_3);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private static void sendTestDenm() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@
import com.orange.iot3mobility.TrueTime;
import com.orange.iot3mobility.Utils;
import com.orange.iot3mobility.its.EtsiUtils;
import com.orange.iot3mobility.messages.cam.core.CamCodec;
import com.orange.iot3mobility.messages.cam.core.CamVersion;
import com.orange.iot3mobility.messages.cam.v113.model.CamEnvelope113;
import com.orange.iot3mobility.messages.cam.v230.model.CamEnvelope230;
import com.orange.iot3mobility.roadobjects.HazardType;
import com.orange.iot3mobility.its.StationType;
import com.orange.iot3mobility.its.json.JsonValue;
import com.orange.iot3mobility.its.json.Position;
import com.orange.iot3mobility.its.json.PositionConfidence;
import com.orange.iot3mobility.its.json.PositionConfidenceEllipse;
import com.orange.iot3mobility.its.json.cam.CAM;
import com.orange.iot3mobility.its.json.cpm.*;
import com.orange.iot3mobility.its.json.denm.DENM;
import com.orange.iot3mobility.managers.IoT3RoadHazardCallback;
Expand All @@ -27,6 +30,7 @@
import com.orange.iot3mobility.roadobjects.SensorObject;
import com.orange.lwm2m.model.CustomLwm2mConnectivityStatisticsExample;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
Expand Down Expand Up @@ -138,12 +142,6 @@ public void newRoadUser(RoadUser roadUser) {
System.out.println("New Road User: " + roadUser.getUuid());
LatLng position = roadUser.getPosition();
System.out.println("Road User position: " + position);
// the CAM on which this object is based can still be accessed
CAM originalCam = roadUser.getCam();
double latitude = originalCam.getBasicContainer().getPosition().getLatitudeDegree();
double longitude = originalCam.getBasicContainer().getPosition().getLongitudeDegree();
LatLng camPosition = new LatLng(latitude, longitude);
System.out.println("CAM position: " + camPosition);
}

@Override
Expand All @@ -159,9 +157,15 @@ public void roadUserExpired(RoadUser roadUser) {
}

@Override
public void camArrived(CAM cam) {
public void camArrived(CamCodec.CamFrame<?> camFrame) {
// if you want to directly process the raw CAM messages
System.out.println("CAM received: " + cam.getJsonCAM());
if(camFrame.version().equals(CamVersion.V1_1_3)) {
CamEnvelope113 camEnvelope113 = (CamEnvelope113) camFrame.envelope();
System.out.println("Raw CAM v1.1.3: " + camEnvelope113);
} else if(camFrame.version().equals(CamVersion.V2_3_0)) {
CamEnvelope230 camEnvelope230 = (CamEnvelope230) camFrame.envelope();
System.out.println("Raw CAM v2.3.0: " + camEnvelope230);
}
}
});

Expand Down Expand Up @@ -235,7 +239,11 @@ private static synchronized void startSendingMessages() {

private static void sendTestCam() {
LatLng position = new LatLng(48.625218, 2.243448); // center point of UTAC TEQMO
ioT3Mobility.sendPosition(StationType.PASSENGER_CAR, position, 0, 0, 0, 0, 0);
try {
ioT3Mobility.sendPosition(StationType.PASSENGER_CAR, position, 0, 0, 0, 0, 0, CamVersion.V1_1_3);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private static void sendTestDenm() {
Expand Down
1 change: 1 addition & 0 deletions java/iot3/mobility/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ repositories {
dependencies {
// Internal dependencies, not exposed to consumers on their own compile classpath.
implementation 'org.json:json:20240303'
implementation 'com.fasterxml.jackson.core:jackson-core:2.21.1'
implementation 'commons-net:commons-net:3.9.0'
implementation project(':core')

Expand Down
Loading
Loading