Skip to content

Commit

Permalink
Added support for gateways custom attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
cpoder committed Nov 10, 2024
1 parent ba710b9 commit a99b5bf
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 67 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package lora.ns.kerlink;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;

Expand Down Expand Up @@ -84,8 +85,8 @@ private void login() {
// HttpEntity<String>("", headers), new
// ParameterizedTypeReference<PaginatedDto<UserDto>>(){});
ResponseEntity<PaginatedDto<UserDto>> users = restTemplate.exchange(baseUrl + "/users", HttpMethod.GET,
new HttpEntity<String>("", headers), new ParameterizedTypeReference<PaginatedDto<UserDto>>() {
});
new HttpEntity<String>("", headers), new ParameterizedTypeReference<PaginatedDto<UserDto>>() {
});
if (users.getStatusCode() == HttpStatus.OK) {
for (UserDto user : users.getBody().getList()) {
logger.info("Testing user {}", user.getLogin());
Expand All @@ -108,13 +109,13 @@ public List<EndDevice> getDevices() {
headers.set("Authorization", jwt.getTokenType() + " " + jwt.getToken());
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<PaginatedDto<EndDeviceDto>> response = restTemplate.exchange(baseUrl + "/endDevices",
HttpMethod.GET, new HttpEntity<String>("", headers),
new ParameterizedTypeReference<PaginatedDto<EndDeviceDto>>() {
});
HttpMethod.GET, new HttpEntity<String>("", headers),
new ParameterizedTypeReference<PaginatedDto<EndDeviceDto>>() {
});
if (response.hasBody()) {
for (EndDeviceDto endDeviceDto : response.getBody().getList()) {
result.add(new EndDevice(endDeviceDto.getDevEui(), endDeviceDto.getName(),
endDeviceDto.getClassType()));
endDeviceDto.getClassType()));
}
}
return result;
Expand All @@ -126,10 +127,10 @@ public String sendDownlink(DownlinkData operation) {
login();
}
String request = String.format(
"{\n" + " \"endDevice\": {\n" + " \"devEui\": \"%s\"\n" + " },\n"
+ " \"fPort\": %d,\n" + " \"payload\": \"%s\",\n" + " \"confirmed\": false,\n"
+ " \"contentType\": \"HEXA\"\n" + "}",
operation.getDevEui(), operation.getFport(), operation.getPayload());
"{\n" + " \"endDevice\": {\n" + " \"devEui\": \"%s\"\n" + " },\n"
+ " \"fPort\": %d,\n" + " \"payload\": \"%s\",\n" + " \"confirmed\": false,\n"
+ " \"contentType\": \"HEXA\"\n" + "}",
operation.getDevEui(), operation.getFport(), operation.getPayload());
logger.info("Request: {}", request);
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", jwt.getTokenType() + " " + jwt.getToken());
Expand All @@ -140,7 +141,7 @@ public String sendDownlink(DownlinkData operation) {
RestTemplate restTemplate = new RestTemplate();
logger.info("Will send data to {}", baseUrl + "/dataDown");
String response = restTemplate.exchange(baseUrl + "/dataDown", HttpMethod.POST,
new HttpEntity<String>(request, headers), String.class).getHeaders().getLocation().getPath();
new HttpEntity<String>(request, headers), String.class).getHeaders().getLocation().getPath();
return response.substring(response.lastIndexOf('/') + 1);
}

Expand All @@ -154,7 +155,7 @@ public EndDevice getDevice(String devEui) {
RestTemplate restTemplate = new RestTemplate();
logger.info("Will get device info on URL: {}", baseUrl + "/endDevices/" + devEui);
EndDeviceDto endDeviceDto = restTemplate.exchange(baseUrl + "/endDevices/" + devEui, HttpMethod.GET,
new HttpEntity<String>("", headers), EndDeviceDto.class).getBody();
new HttpEntity<String>("", headers), EndDeviceDto.class).getBody();
return new EndDevice(devEui, endDeviceDto.getName(), endDeviceDto.getClassType());
}

Expand All @@ -176,7 +177,7 @@ public void provisionDevice(DeviceProvisioning deviceProvisioning) {
dto.setAppEui(deviceProvisioning.getAppEUI());
dto.setAppKey(deviceProvisioning.getAppKey());
restTemplate.exchange(baseUrl + "/endDevices/" + deviceProvisioning.getDevEUI(), HttpMethod.PUT,
new HttpEntity<EndDeviceDto>(dto, headers), String.class);
new HttpEntity<EndDeviceDto>(dto, headers), String.class);
}

@Override
Expand All @@ -198,10 +199,10 @@ public void configureRoutings(String url, String tenant, String login, String pa
headers.set("Authorization", jwt.getTokenType() + " " + jwt.getToken());
RestTemplate restTemplate = new RestTemplate();
PaginatedDto<PushConfigurationDto> pushConfigurationDtos = restTemplate
.exchange(baseUrl + "/pushConfigurations", HttpMethod.GET, new HttpEntity<String>("", headers),
new ParameterizedTypeReference<PaginatedDto<PushConfigurationDto>>() {
})
.getBody();
.exchange(baseUrl + "/pushConfigurations", HttpMethod.GET, new HttpEntity<String>("", headers),
new ParameterizedTypeReference<PaginatedDto<PushConfigurationDto>>() {
})
.getBody();
for (PushConfigurationDto pushConfigurationDto : pushConfigurationDtos.getList()) {
if (pushConfigurationDto.getName().equals(routingName)) {
currentPushConfigurationDto = pushConfigurationDto;
Expand Down Expand Up @@ -244,10 +245,10 @@ public void configureRoutings(String url, String tenant, String login, String pa
// }
if (currentPushConfigurationDto == null) {
currentPushConfigurationDto = new PushConfigurationDto(new CustomerDto(customerId), routingName,
PushConfigurationType.HTTP, PushConfigurationMSgDetailLevel.NETWORK,
new PushConfigurationHeaderDto[] {
new PushConfigurationHeaderDto("Content-Type", "application/json") },
"/downlink", "/uplink", url, tenant + "/" + login, password);
PushConfigurationType.HTTP, PushConfigurationMSgDetailLevel.NETWORK,
new PushConfigurationHeaderDto[] {
new PushConfigurationHeaderDto("Content-Type", "application/json") },
"/downlink", "/uplink", url, tenant + "/" + login, password);
logger.info("Will create a new push configuration: {}", currentPushConfigurationDto.toString());
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
List<MediaType> mediaTypes = new ArrayList<>();
Expand All @@ -264,7 +265,7 @@ public void configureRoutings(String url, String tenant, String login, String pa
}
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
ResponseEntity<String> response = restTemplate.exchange(baseUrl + "/pushConfigurations", HttpMethod.POST,
request, String.class);
request, String.class);
String[] tokens = response.getHeaders().getLocation().getPath().split("/");
configId = Integer.parseInt(tokens[tokens.length - 1]);
}
Expand All @@ -273,14 +274,14 @@ public void configureRoutings(String url, String tenant, String login, String pa
headers = new HttpHeaders();
headers.set("Authorization", jwt.getTokenType() + " " + jwt.getToken());
ClusterDto cluster = restTemplate.exchange(baseUrl + "/clusters/" + clusterId, HttpMethod.GET,
new HttpEntity<String>("", headers), ClusterDto.class).getBody();
new HttpEntity<String>("", headers), ClusterDto.class).getBody();
cluster.setPushConfiguration(currentPushConfigurationDto);
cluster.setGeolocEnabled(true);
cluster.setHexa(true);
cluster.setPushEnabled(true);
headers.setContentType(MediaType.APPLICATION_JSON);
ResponseEntity<String> response = restTemplate.exchange(baseUrl + "/clusters/" + clusterId,
HttpMethod.PATCH, new HttpEntity<ClusterDto>(cluster, headers), String.class);
HttpMethod.PATCH, new HttpEntity<ClusterDto>(cluster, headers), String.class);
}
}

Expand All @@ -294,7 +295,7 @@ public void removeRoutings() {
headers.set("Authorization", jwt.getTokenType() + " " + jwt.getToken());
RestTemplate restTemplate = new RestTemplate();
restTemplate.exchange(baseUrl + "/pushConfigurations/" + configId, HttpMethod.DELETE,
new HttpEntity<String>("", headers), String.class);
new HttpEntity<String>("", headers), String.class);
});
}

Expand All @@ -308,7 +309,7 @@ public void deprovisionDevice(String deveui) {
headers.set("Accept", "application/json,application/vnd.kerlink.iot-v1+json");
RestTemplate restTemplate = new RestTemplate();
restTemplate.exchange(baseUrl + "/endDevices/" + deveui, HttpMethod.DELETE, new HttpEntity<String>("", headers),
String.class);
String.class);
}

public List<ClusterDto> getClusters() {
Expand All @@ -320,10 +321,10 @@ public List<ClusterDto> getClusters() {
headers.set("Authorization", jwt.getTokenType() + " " + jwt.getToken());
RestTemplate restTemplate = new RestTemplate();
PaginatedDto<ClusterDto> clusterDtos = restTemplate
.exchange(baseUrl + "/clusters", HttpMethod.GET, new HttpEntity<String>("", headers),
new ParameterizedTypeReference<PaginatedDto<ClusterDto>>() {
})
.getBody();
.exchange(baseUrl + "/clusters", HttpMethod.GET, new HttpEntity<String>("", headers),
new ParameterizedTypeReference<PaginatedDto<ClusterDto>>() {
})
.getBody();
for (ClusterDto clusterDto : clusterDtos.getList()) {
result.add(clusterDto);
}
Expand All @@ -341,15 +342,15 @@ public List<Gateway> getGateways() {
headers.set("Authorization", jwt.getTokenType() + " " + jwt.getToken());
RestTemplate restTemplate = new RestTemplate();
PaginatedDto<GatewayDto> gatewaysDto = restTemplate
.exchange(baseUrl + "/gateways", HttpMethod.GET, new HttpEntity<String>("", headers),
new ParameterizedTypeReference<PaginatedDto<GatewayDto>>() {
})
.getBody();
.exchange(baseUrl + "/gateways", HttpMethod.GET, new HttpEntity<String>("", headers),
new ParameterizedTypeReference<PaginatedDto<GatewayDto>>() {
})
.getBody();
C8YData c8yData = new C8YData();
for (GatewayDto gatewayDto : gatewaysDto.getList()) {
result.add(new Gateway(gatewayDto.getEui(), gatewayDto.getEui(), gatewayDto.getName(),
gatewayDto.getLatitude(), gatewayDto.getLongitude(), gatewayDto.getDescription(),
ConnectionState.AVAILABLE, c8yData));
gatewayDto.getLatitude(), gatewayDto.getLongitude(), gatewayDto.getDescription(),
ConnectionState.AVAILABLE, c8yData, new HashMap<>()));
}
return result;
}
Expand Down
3 changes: 2 additions & 1 deletion java/lora-ns-ms/src/main/java/lora/ns/gateway/Gateway.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package lora.ns.gateway;

import java.math.BigDecimal;
import java.util.Map;

import c8y.ConnectionState;
import lora.codec.uplink.C8YData;
Expand All @@ -9,7 +10,6 @@
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@Builder
@AllArgsConstructor
Expand All @@ -23,4 +23,5 @@ public class Gateway {
private String type;
private ConnectionState status;
private C8YData data;
private Map<String, Object> properties;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package lora.ns.gateway;

import java.util.HashMap;
import java.util.List;
import java.util.Optional;

Expand Down Expand Up @@ -63,6 +64,7 @@ private MicroserviceCredentials createContextWithoutAppKey(MicroserviceCredentia
}

public void upsertGateways(LNSConnector connector) {
log.info("Upserting gateways in connector {}", connector.getName());
List<Gateway> gateways = connector.getGateways();
for (Gateway gateway : gateways) {
var gw = getGateway(gateway.getGwEUI());
Expand All @@ -72,6 +74,7 @@ public void upsertGateways(LNSConnector connector) {
} else {
mor.setId(gw.getId());
}
mor.setProperty("gatewayProperties", gateway.getProperties());
mor.setProperty("gatewayAvailability", gateway.getStatus());
if (gateway.getLat() != null && gateway.getLng() != null) {
loraContextService.log("Updating position of gateway {}: {}, {}", gateway.getName(), gateway.getLat(),
Expand Down Expand Up @@ -122,7 +125,7 @@ public ManagedObjectRepresentation createGateway(String lnsConnectorId, GatewayP
new Gateway(gatewayProvisioning.getGwEUI(), gatewayProvisioning.getSerial(),
gatewayProvisioning.getName(), gatewayProvisioning.getLat(),
gatewayProvisioning.getLng(), gatewayProvisioning.getType(),
gatewayProvisioning.getStatus(), null));
gatewayProvisioning.getStatus(), new C8YData(), new HashMap<>()));
}

public ManagedObjectRepresentation getGateway(String id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
Expand Down Expand Up @@ -59,20 +60,20 @@ public ObjeniousConnector(ManagedObjectRepresentation instance) {
}

private static final ObjectMapper objectMapper = new ObjectMapper().registerModule(new JodaModule())
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.configure(SerializationFeature.INDENT_OUTPUT, true).setSerializationInclusion(Include.NON_NULL);
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.configure(SerializationFeature.INDENT_OUTPUT, true).setSerializationInclusion(Include.NON_NULL);

@Override
protected void init() {
final ch.qos.logback.classic.Logger serviceLogger = (ch.qos.logback.classic.Logger) LoggerFactory
.getLogger("lora.ns.objenious");
.getLogger("lora.ns.objenious");
serviceLogger.setLevel(ch.qos.logback.classic.Level.DEBUG);
var feignBuilder = Feign.builder().decoder(new JacksonDecoder(objectMapper))
.encoder(new JacksonEncoder(objectMapper)).logger(new Slf4jLogger("lora.ns.objenious"))
.logLevel(Level.FULL)
.requestInterceptor(template -> template.headers(Map.of("apikey",
List.of(properties.getProperty("apikey")), "Content-Type",
List.of("application/json"), "Accept", List.of("application/json"))));
.encoder(new JacksonEncoder(objectMapper)).logger(new Slf4jLogger("lora.ns.objenious"))
.logLevel(Level.FULL)
.requestInterceptor(template -> template.headers(Map.of("apikey",
List.of(properties.getProperty("apikey")), "Content-Type",
List.of("application/json"), "Accept", List.of("application/json"))));

objeniousService = feignBuilder.target(ObjeniousService.class, "https://api.objenious.com/v1/");
}
Expand All @@ -81,7 +82,7 @@ protected void init() {
public List<EndDevice> getDevices() {
var devices = objeniousService.getDevices();
return devices.stream().map(device -> new EndDevice(device.getProperties().getDeveui(), device.getLabel(), ""))
.collect(Collectors.toList());
.collect(Collectors.toList());
}

public Profile getProfile(int id) {
Expand Down Expand Up @@ -119,18 +120,18 @@ public void provisionDevice(DeviceProvisioning deviceProvisioning) {
deviceCreate.setLng(deviceProvisioning.getLng());
deviceCreate.setGroupId(Integer.parseInt(properties.getProperty("groupId")));
deviceCreate.setProfileId(
Integer.valueOf(deviceProvisioning.getAdditionalProperties().getProperty("deviceProfile")));
Integer.valueOf(deviceProvisioning.getAdditionalProperties().getProperty("deviceProfile")));
objeniousService.createDevice(deviceCreate);
}

public void configureRouting(String url, String tenant, String login, String password, String name,
MessageTypeEnum messageType) {
MessageTypeEnum messageType) {
RoutingHttp routingHttp = new RoutingHttp();
routingHttp.setUrl(url);
routingHttp.setMethod(RoutingHttp.MethodEnum.POST);
Headers headers = new Headers();
headers.put("Authorization", "Basic "
+ Base64.getEncoder().encodeToString((tenant + "/" + login + ":" + password).getBytes()));
+ Base64.getEncoder().encodeToString((tenant + "/" + login + ":" + password).getBytes()));
routingHttp.setHeaders(headers);
ScenarioRoutingCreateUpdate scenarioRoutingCreateUpdate = new ScenarioRoutingCreateUpdate();
scenarioRoutingCreateUpdate.setHttp(routingHttp);
Expand Down Expand Up @@ -163,9 +164,9 @@ public void configureRoutings(String url, String tenant, String login, String pa
});

configureRouting(url + "/downlink", tenant, login, password, tenant + "-" + this.getId() + "-downlink",
MessageTypeEnum.DOWNLINK);
MessageTypeEnum.DOWNLINK);
configureRouting(url + "/uplink", tenant, login, password, tenant + "-" + this.getId() + "-uplink",
MessageTypeEnum.UPLINK);
MessageTypeEnum.UPLINK);
}

private void removeRouting(String id) {
Expand Down Expand Up @@ -204,21 +205,21 @@ public List<Gateway> getGateways() {
C8YData data = new C8YData();
ConnectionState state = ConnectionState.AVAILABLE;
switch (g.getStatus()) {
case ACTIVE:
state = ConnectionState.AVAILABLE;
break;
case ALERT:
state = ConnectionState.AVAILABLE;
break;
case INACTIVE:
state = ConnectionState.UNAVAILABLE;
break;
default:
break;
case ACTIVE:
state = ConnectionState.AVAILABLE;
break;
case ALERT:
state = ConnectionState.AVAILABLE;
break;
case INACTIVE:
state = ConnectionState.UNAVAILABLE;
break;
default:
break;
}
Gateway gateway = new Gateway(g.getGatewayId(), g.getSerialNumber(), g.getGatewayName(),
BigDecimal.valueOf(g.getLat()), BigDecimal.valueOf(g.getLng()), g.getGatewayType(),
state, data);
BigDecimal.valueOf(g.getLat()), BigDecimal.valueOf(g.getLng()), g.getGatewayType(),
state, data, new HashMap<>());
result.add(gateway);
});
} catch (FeignClientException e) {
Expand Down
Loading

0 comments on commit a99b5bf

Please sign in to comment.