Skip to content

Commit 9d9e42e

Browse files
committed
feat(api): report primary SIM eUICC (EID) in the birth certificate
Adds a modem_eid metric to KuraBirthPayload and captures it from the active/primary SIM in the Kapua and Eclipse IoT cloud connectors, so the device birth certificate can be correlated with the SIM management platform.
1 parent 0c49aa7 commit 9d9e42e

8 files changed

Lines changed: 59 additions & 8 deletions

File tree

kura/org.eclipse.kura.api/bnd.bnd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Export-Package: \
6565
org.eclipse.kura.log;version="1.1.0",\
6666
org.eclipse.kura.log.listener;version="1.0.0",\
6767
org.eclipse.kura.marshalling;version="1.1.0",\
68-
org.eclipse.kura.message;version="1.5.0",\
68+
org.eclipse.kura.message;version="1.6.0",\
6969
org.eclipse.kura.message.store;version="1.0.0",\
7070
org.eclipse.kura.message.store.provider;version="1.0.0",\
7171
org.eclipse.kura.net;version="2.7.0",\

kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/message/KuraBirthPayload.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
/*******************************************************************************
2-
* Copyright (c) 2011, 2023 Eurotech and/or its affiliates and others
3-
*
2+
* Copyright (c) 2011, 2026 Eurotech and/or its affiliates and others
3+
*
44
* This program and the accompanying materials are made
55
* available under the terms of the Eclipse Public License 2.0
66
* which is available at https://www.eclipse.org/legal/epl-2.0/
7-
*
7+
*
88
* SPDX-License-Identifier: EPL-2.0
9-
*
9+
*
1010
* Contributors:
1111
* Eurotech
1212
******************************************************************************/
13+
// Content with portions generated by generative AI platform
1314
package org.eclipse.kura.message;
1415

1516
import static org.eclipse.kura.message.KuraDeviceProfile.APPLICATION_FRAMEWORK_KEY;
@@ -78,6 +79,10 @@ public enum TamperStatus {
7879
private static final String MODEM_IMEI_KEY = "modem_imei";
7980
private static final String MODEM_IMSI_KEY = "modem_imsi";
8081
private static final String MODEM_ICCID_KEY = "modem_iccid";
82+
/**
83+
* @since 3.0
84+
*/
85+
private static final String MODEM_EID_KEY = "modem_eid";
8186
private static final String MODEM_RSSI_KEY = "modem_rssi";
8287
private static final String MODEM_FIRMWARE_VERSION = "modem_firmware_version";
8388
private static final String PAYLOAD_ENCODING_KEY = "payload_encoding";
@@ -230,6 +235,13 @@ public String getModemIccid() {
230235
return (String) getMetric(MODEM_ICCID_KEY);
231236
}
232237

238+
/**
239+
* @since 3.0
240+
*/
241+
public String getModemEid() {
242+
return (String) getMetric(MODEM_EID_KEY);
243+
}
244+
233245
public String getModemRssi() {
234246
return (String) getMetric(MODEM_RSSI_KEY);
235247
}
@@ -339,6 +351,7 @@ public static class KuraBirthPayloadBuilder {
339351
private String modemImei;
340352
private String modemIccid;
341353
private String modemImsi;
354+
private String modemEid;
342355
private String modemRssi;
343356
private String modemFirmwareVersion;
344357
private String payloadEncoding;
@@ -495,6 +508,14 @@ public KuraBirthPayloadBuilder withModemImsi(String modemImsi) {
495508
return this;
496509
}
497510

511+
/**
512+
* @since 3.0
513+
*/
514+
public KuraBirthPayloadBuilder withModemEid(String modemEid) {
515+
this.modemEid = modemEid;
516+
return this;
517+
}
518+
498519
public KuraBirthPayloadBuilder withModemRssi(String modemRssi) {
499520
this.modemRssi = modemRssi;
500521
return this;
@@ -586,6 +607,7 @@ public KuraBirthPayload build() {
586607
birthPayload.addMetric(MODEM_IMEI_KEY, this.modemImei);
587608
birthPayload.addMetric(MODEM_ICCID_KEY, this.modemIccid);
588609
birthPayload.addMetric(MODEM_IMSI_KEY, this.modemImsi);
610+
birthPayload.addMetric(MODEM_EID_KEY, this.modemEid);
589611
birthPayload.addMetric(MODEM_RSSI_KEY, this.modemRssi);
590612
birthPayload.addMetric(MODEM_FIRMWARE_VERSION, this.modemFirmwareVersion);
591613
birthPayload.addMetric(PAYLOAD_ENCODING_KEY, this.payloadEncoding);

kura/org.eclipse.kura.cloudconnection.eclipseiot.mqtt.provider/src/main/java/org/eclipse/kura/internal/cloudconnection/eclipseiot/mqtt/cloud/CloudConnectionManagerImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ public class CloudConnectionManagerImpl
155155
String imei;
156156
String iccid;
157157
String imsi;
158+
String eid;
158159
String rssi;
159160
String modemFwVer;
160161

@@ -912,6 +913,7 @@ private void readModemProfile() {
912913
this.imei = null;
913914
this.iccid = null;
914915
this.imsi = null;
916+
this.eid = null;
915917
this.rssi = null;
916918
this.modemFwVer = null;
917919
}
@@ -952,9 +954,11 @@ private void readModemInfos(List<ModemInterfaceStatus> modemStatuses) {
952954

953955
this.iccid = "NA";
954956
this.imsi = "NA";
957+
this.eid = "NA";
955958
activeSim.ifPresent(sim -> {
956959
this.iccid = sim.getIccid();
957960
this.imsi = sim.getImsi();
961+
this.eid = sim.getEid();
958962
});
959963
this.imei = modemStatus.getSerialNumber();
960964
this.rssi = String.valueOf(modemStatus.getSignalStrength());

kura/org.eclipse.kura.cloudconnection.eclipseiot.mqtt.provider/src/main/java/org/eclipse/kura/internal/cloudconnection/eclipseiot/mqtt/cloud/LifeCyclePayloadBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ public KuraBirthPayload buildBirthPayload() {
107107
birthPayloadBuilder.withModemImsi(this.cloudConnectionManagerImpl.imsi);
108108
}
109109

110+
if (this.cloudConnectionManagerImpl.eid != null && this.cloudConnectionManagerImpl.eid.length() > 0
111+
&& !this.cloudConnectionManagerImpl.eid.equals(ERROR)) {
112+
birthPayloadBuilder.withModemEid(this.cloudConnectionManagerImpl.eid);
113+
}
114+
110115
if (this.cloudConnectionManagerImpl.rssi != null && this.cloudConnectionManagerImpl.rssi.length() > 0) {
111116
birthPayloadBuilder.withModemRssi(this.cloudConnectionManagerImpl.rssi);
112117
}

kura/org.eclipse.kura.cloudconnection.kapua.mqtt.provider/src/main/java/org/eclipse/kura/core/cloud/CloudServiceImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ public class CloudServiceImpl
179179
String imei;
180180
String iccid;
181181
String imsi;
182+
String eid;
182183
String rssi;
183184
String modemFwVer;
184185

@@ -1249,6 +1250,7 @@ private void readModemProfile() {
12491250
this.imei = null;
12501251
this.iccid = null;
12511252
this.imsi = null;
1253+
this.eid = null;
12521254
this.rssi = null;
12531255
this.modemFwVer = null;
12541256
}
@@ -1289,9 +1291,11 @@ private void readModemInfos(List<ModemInterfaceStatus> modemStatuses) {
12891291

12901292
this.iccid = null;
12911293
this.imsi = null;
1294+
this.eid = null;
12921295
activeSim.ifPresent(sim -> {
12931296
this.iccid = sim.getIccid();
12941297
this.imsi = sim.getImsi();
1298+
this.eid = sim.getEid();
12951299
});
12961300
this.imei = modemStatus.getSerialNumber();
12971301
this.rssi = String.valueOf(modemStatus.getSignalStrength());

kura/org.eclipse.kura.cloudconnection.kapua.mqtt.provider/src/main/java/org/eclipse/kura/core/cloud/LifeCyclePayloadBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ public KuraBirthPayload buildBirthPayload() {
120120
birthPayloadBuilder.withModemImsi(this.cloudServiceImpl.imsi);
121121
}
122122

123+
if (this.cloudServiceImpl.eid != null && this.cloudServiceImpl.eid.length() > 0
124+
&& !this.cloudServiceImpl.eid.equals(ERROR)) {
125+
birthPayloadBuilder.withModemEid(this.cloudServiceImpl.eid);
126+
}
127+
123128
if (this.cloudServiceImpl.rssi != null && this.cloudServiceImpl.rssi.length() > 0) {
124129
birthPayloadBuilder.withModemRssi(this.cloudServiceImpl.rssi);
125130
}

test/org.eclipse.kura.cloudconnection.kapua.mqtt.provider.test/src/main/java/org/eclipse/kura/core/cloud/CloudServiceTest.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
* Contributors:
1111
* Eurotech
1212
******************************************************************************/
13+
// Content with portions generated by generative AI platform
1314
package org.eclipse.kura.core.cloud;
1415

1516
import static org.eclipse.kura.util.wire.test.WireTestUtil.createFactoryConfiguration;
@@ -81,12 +82,14 @@ public class CloudServiceTest {
8182
private static final String MODEM_ICCID = "modem_iccid";
8283
private static final String MODEM_IMSI = "modem_imsi";
8384
private static final String MODEM_IMEI = "modem_imei";
85+
private static final String MODEM_EID = "modem_eid";
8486
private static final String TAMPER_STATUS = "tamper_status";
8587
private static final String MODEM_FIRMWARE_VERSION = "modem_firmware_version";
8688
private static final String FOO_FW_VER1 = "fooFwVer1";
8789
private static final String FOO_ICCID1 = "fooIccid1";
8890
private static final String FOO_IMSI1 = "fooImsi1";
8991
private static final String FOO_IMEI1 = "fooImei1";
92+
private static final String FOO_EID1 = "fooEid1";
9093
private static final String MQTT_DATA_TRANSPORT_FACTORY_PID = "org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport";
9194
private static final String DEFAULT_CLOUD_SERVICE_PID = "org.eclipse.kura.cloud.CloudService";
9295
private static final String DEFAULT_MQTT_DATA_TRANSPORT_SERVICE_PID = "org.eclipse.kura.core.data.transport.mqtt.MqttDataTransport";
@@ -394,6 +397,7 @@ public void shouldPublishBirthMessageWithModemInfoWhenNetworkStatusServiceIsPres
394397
assertEquals(FOO_IMEI1, metrics.get(MODEM_IMEI).asString());
395398
assertEquals(FOO_IMSI1, metrics.get(MODEM_IMSI).asString());
396399
assertEquals(FOO_ICCID1, metrics.get(MODEM_ICCID).asString());
400+
assertEquals(FOO_EID1, metrics.get(MODEM_EID).asString());
397401
assertEquals("1", metrics.get(MODEM_RSSI).asString());
398402
assertEquals(FOO_FW_VER1, metrics.get(MODEM_FIRMWARE_VERSION).asString());
399403

@@ -409,6 +413,7 @@ public void shouldPublishBirthMessageWithConnectedModemInfoWhenMultipleModems()
409413
assertEquals("fooImei2", metrics.get(MODEM_IMEI).asString());
410414
assertEquals("fooImsi2", metrics.get(MODEM_IMSI).asString());
411415
assertEquals("fooIccid2", metrics.get(MODEM_ICCID).asString());
416+
assertEquals("fooEid2", metrics.get(MODEM_EID).asString());
412417
assertEquals("2", metrics.get(MODEM_RSSI).asString());
413418
assertEquals("fooFwVer2", metrics.get(MODEM_FIRMWARE_VERSION).asString());
414419

@@ -618,7 +623,8 @@ private void createNetworkStatusServiceMock() throws KuraException {
618623
ModemInterfaceStatusBuilder modemStatusBuilder = ModemInterfaceStatus.builder();
619624
modemStatusBuilder.withConnectionStatus(ModemConnectionStatus.CONNECTED).withSerialNumber(FOO_IMEI1)
620625
.withFirmwareVersion(FOO_FW_VER1).withSignalStrength(1);
621-
Sim sim = Sim.builder().withIccid(FOO_ICCID1).withImsi(FOO_IMSI1).withActive(true).withPrimary(true).build();
626+
Sim sim = Sim.builder().withIccid(FOO_ICCID1).withImsi(FOO_IMSI1).withEid(FOO_EID1).withActive(true)
627+
.withPrimary(true).build();
622628
modemStatusBuilder.withAvailableSims(Arrays.asList(new Sim[] { sim }));
623629
when(networkStatusService.getNetworkStatus("1-8")).thenReturn(Optional.of(modemStatusBuilder.build()));
624630

@@ -632,14 +638,16 @@ private void createNetworkStatusServiceMockWithMultipleModems() throws KuraExcep
632638
ModemInterfaceStatusBuilder firstModemStatusBuilder = ModemInterfaceStatus.builder();
633639
firstModemStatusBuilder.withConnectionStatus(ModemConnectionStatus.FAILED).withSerialNumber(FOO_IMEI1)
634640
.withFirmwareVersion(FOO_FW_VER1).withSignalStrength(1);
635-
Sim sim1 = Sim.builder().withIccid(FOO_ICCID1).withImsi(FOO_IMSI1).withActive(true).withPrimary(true).build();
641+
Sim sim1 = Sim.builder().withIccid(FOO_ICCID1).withImsi(FOO_IMSI1).withEid(FOO_EID1).withActive(true)
642+
.withPrimary(true).build();
636643
firstModemStatusBuilder.withAvailableSims(Arrays.asList(new Sim[] { sim1 }));
637644
when(networkStatusService.getNetworkStatus("1-8")).thenReturn(Optional.of(firstModemStatusBuilder.build()));
638645

639646
ModemInterfaceStatusBuilder secondModemStatusBuilder = ModemInterfaceStatus.builder();
640647
secondModemStatusBuilder.withConnectionStatus(ModemConnectionStatus.CONNECTED).withSerialNumber("fooImei2")
641648
.withFirmwareVersion("fooFwVer2").withSignalStrength(2);
642-
Sim sim2 = Sim.builder().withIccid("fooIccid2").withImsi("fooImsi2").withActive(true).withPrimary(true).build();
649+
Sim sim2 = Sim.builder().withIccid("fooIccid2").withImsi("fooImsi2").withEid("fooEid2").withActive(true)
650+
.withPrimary(true).build();
643651
secondModemStatusBuilder.withAvailableSims(Arrays.asList(new Sim[] { sim2 }));
644652
when(networkStatusService.getNetworkStatus("1-6")).thenReturn(Optional.of(secondModemStatusBuilder.build()));
645653

test/org.eclipse.kura.cloudconnection.kapua.mqtt.provider.test/src/main/java/org/eclipse/kura/core/message/KuraBirthPayloadTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
* Contributors:
1111
* Eurotech
1212
******************************************************************************/
13+
// Content with portions generated by generative AI platform
1314
package org.eclipse.kura.core.message;
1415

1516
import static org.junit.Assert.assertEquals;
@@ -168,6 +169,7 @@ void givenBuilderWithDefaultRequiredValues() {
168169
this.builder.withModemImei(DEFAULT_TEST_VALUE);
169170
this.builder.withModemIccid(DEFAULT_TEST_VALUE);
170171
this.builder.withModemImsi(DEFAULT_TEST_VALUE);
172+
this.builder.withModemEid(DEFAULT_TEST_VALUE);
171173
this.builder.withModemRssi(DEFAULT_TEST_VALUE);
172174
this.builder.withModemFirmwareVersion(DEFAULT_TEST_VALUE);
173175
// this.builder.withPosition(position);
@@ -243,6 +245,7 @@ void thenBirthPayloadContainsAllDefaultRequiredValues() {
243245
assertEquals(DEFAULT_TEST_VALUE, this.birthPayload.getModemImei());
244246
assertEquals(DEFAULT_TEST_VALUE, this.birthPayload.getModemIccid());
245247
assertEquals(DEFAULT_TEST_VALUE, this.birthPayload.getModemImsi());
248+
assertEquals(DEFAULT_TEST_VALUE, this.birthPayload.getModemEid());
246249
assertEquals(DEFAULT_TEST_VALUE, this.birthPayload.getModemRssi());
247250
assertEquals(DEFAULT_TEST_VALUE, this.birthPayload.getModemFirmwareVersion());
248251
// this.birthPayload.getPosition();

0 commit comments

Comments
 (0)