Merge pull request #98 from Shabirmean/IoTS-1.0.0-M1

Moved Device-Type DB Creation to feature-level and updated AdvancedAgent
Ruwan 9 years ago
commit 3279c250f8

5
.gitignore vendored

@ -24,4 +24,7 @@ target
hs_err_pid*
# Ignore generated capps
carbonapps
carbonapps
# Ignore generated device-type DBs
*.h2.db

@ -163,10 +163,10 @@
<version>${slf4j.version}</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.json.wso2</groupId>-->
<!--<artifactId>json</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>org.json.wso2</groupId>
<artifactId>json</artifactId>
</dependency>
<!--Dependency on Sidhdhi - required for PolicyMgt-->
<dependency>

@ -23,12 +23,12 @@ import org.apache.commons.logging.LogFactory;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportHandlerException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportUtils;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.http.HTTPTransportHandler;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentConstants;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentManager;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.exception.AgentCoreOperationException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportHandlerException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportUtils;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.http.HTTPTransportHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@ -80,13 +80,13 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
processIncomingMessage();
server.start();
registerThisDevice();
publishDeviceData(AgentManager.getInstance().getPushInterval());
publishDeviceData();
log.info("HTTP Server started at port: " + port);
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.warn("Unable to 'START' HTTP server. Will retry after " +
timeoutInterval / 1000 + " seconds.");
timeoutInterval / 1000 + " seconds.");
}
}
}
@ -111,7 +111,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
AgentManager agentManager = AgentManager.getInstance();
String pathContext = request.getPathInfo();
String separator = (File.separatorChar == '\\') ? ("\\\\") : (File.separator);
String separator = (File.separatorChar == '\\') ? ("\\\\") : (File.separator);
if (pathContext.toUpperCase().contains(
separator + AgentConstants.TEMPERATURE_CONTROL)) {
@ -130,7 +130,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
if (pathVariables.length != 3) {
httpServletResponse.getWriter().println(
"Invalid BULB-control received by the device. Need to be in " +
"'{host}:{port}/BULB/{ON|OFF}' format.");
"'{host}:{port}/BULB/{ON|OFF}' format.");
return;
}
@ -144,7 +144,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
AgentConstants.CONTROL_ON);
agentManager.changeAlarmStatus(status);
httpServletResponse.getWriter().println("Bulb is " + (status ?
AgentConstants.CONTROL_ON : AgentConstants.CONTROL_OFF));
AgentConstants.CONTROL_ON : AgentConstants.CONTROL_OFF));
}
} else {
httpServletResponse.getWriter().println(
@ -155,8 +155,9 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
}
@Override
public void publishDeviceData(int publishInterval) {
public void publishDeviceData() {
final AgentManager agentManager = AgentManager.getInstance();
int publishInterval = agentManager.getPushInterval();
final String deviceOwner = agentManager.getAgentConfigs().getDeviceOwner();
final String deviceID = agentManager.getAgentConfigs().getDeviceId();
boolean simulationMode = false;
@ -187,6 +188,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
}
}
private void executeDataPush(String pushDataPayload) {
AgentManager agentManager = AgentManager.getInstance();
int responseCode = -1;
@ -197,7 +199,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
httpConnection = TransportUtils.getHttpConnection(agentManager.getPushDataAPIEP());
httpConnection.setRequestMethod(AgentConstants.HTTP_POST);
httpConnection.setRequestProperty("Authorization", "Bearer " +
agentManager.getAgentConfigs().getAuthToken());
agentManager.getAgentConfigs().getAuthToken());
httpConnection.setRequestProperty("Content-Type",
AgentConstants.APPLICATION_JSON_TYPE);
@ -212,50 +214,50 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
httpConnection.disconnect();
log.info(AgentConstants.LOG_APPENDER + "Message - '" + pushDataPayload +
"' was published to server at: " + httpConnection.getURL());
"' was published to server at: " + httpConnection.getURL());
} catch (ProtocolException exception) {
String errorMsg =
"Protocol specific error occurred when trying to set method to " +
AgentConstants.HTTP_POST + " for:" + pushDataEndPointURL;
AgentConstants.HTTP_POST + " for:" + pushDataEndPointURL;
log.error(AgentConstants.LOG_APPENDER + errorMsg);
} catch (IOException exception) {
String errorMsg =
"An IO error occurred whilst trying to get the response code from: " +
pushDataEndPointURL + " for a " + AgentConstants.HTTP_POST +
" " + "method.";
pushDataEndPointURL + " for a " + AgentConstants.HTTP_POST +
" " + "method.";
log.error(AgentConstants.LOG_APPENDER + errorMsg);
} catch (TransportHandlerException exception) {
log.error(AgentConstants.LOG_APPENDER +
"Error encountered whilst trying to create HTTP-Connection " +
"to IoT-Server EP at: " +
pushDataEndPointURL);
"Error encountered whilst trying to create HTTP-Connection " +
"to IoT-Server EP at: " +
pushDataEndPointURL);
}
if (responseCode == HttpStatus.CONFLICT_409 ||
responseCode == HttpStatus.PRECONDITION_FAILED_412) {
responseCode == HttpStatus.PRECONDITION_FAILED_412) {
log.warn(AgentConstants.LOG_APPENDER +
"DeviceIP is being Re-Registered due to Push-Data failure " +
"with response code: " +
responseCode);
"DeviceIP is being Re-Registered due to Push-Data failure " +
"with response code: " +
responseCode);
registerThisDevice();
} else if (responseCode != HttpStatus.NO_CONTENT_204) {
if (log.isDebugEnabled()) {
log.error(AgentConstants.LOG_APPENDER + "Status Code: " + responseCode +
" encountered whilst trying to Push-Device-Data to IoT " +
"Server at: " +
agentManager.getPushDataAPIEP());
" encountered whilst trying to Push-Device-Data to IoT " +
"Server at: " +
agentManager.getPushDataAPIEP());
}
agentManager.updateAgentStatus(AgentConstants.SERVER_NOT_RESPONDING);
}
if (log.isDebugEnabled()) {
log.debug(AgentConstants.LOG_APPENDER + "Push-Data call with payload - " +
pushDataPayload + ", to IoT Server returned status " +
responseCode);
pushDataPayload + ", to IoT Server returned status " +
responseCode);
}
}
@ -271,15 +273,15 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.warn(AgentConstants.LOG_APPENDER +
"Unable to 'STOP' HTTP server at port: " + port);
"Unable to 'STOP' HTTP server at port: " + port);
}
try {
Thread.sleep(timeoutInterval);
} catch (InterruptedException e1) {
log.error(AgentConstants.LOG_APPENDER +
"HTTP-Termination: Thread Sleep Interrupt " +
"Exception");
"HTTP-Termination: Thread Sleep Interrupt " +
"Exception");
}
}
}
@ -296,6 +298,10 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
}
@Override
public void publishDeviceData(String... publishData) {
}
public void registerThisDevice() {
final AgentManager agentManager = AgentManager.getInstance();
@ -315,19 +321,19 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
break;
} else {
log.error(AgentConstants.LOG_APPENDER +
"Device Registration with IoT Server at:" + " " +
agentManager.getIpRegistrationEP() +
" failed with response - '" + responseCode + ":" +
HttpStatus.getMessage(responseCode) + "'");
"Device Registration with IoT Server at:" + " " +
agentManager.getIpRegistrationEP() +
" failed with response - '" + responseCode + ":" +
HttpStatus.getMessage(responseCode) + "'");
agentManager.updateAgentStatus(AgentConstants.RETRYING_TO_REGISTER);
}
} catch (AgentCoreOperationException exception) {
log.error(AgentConstants.LOG_APPENDER +
"Error encountered whilst trying to register the " +
"Device's IP at: " +
agentManager.getIpRegistrationEP() +
".\nCheck whether the network-interface provided is " +
"accurate");
"Error encountered whilst trying to register the " +
"Device's IP at: " +
agentManager.getIpRegistrationEP() +
".\nCheck whether the network-interface provided is " +
"accurate");
agentManager.updateAgentStatus(AgentConstants.REGISTRATION_FAILED);
}
@ -335,7 +341,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
Thread.sleep(timeoutInterval);
} catch (InterruptedException e1) {
log.error(AgentConstants.LOG_APPENDER +
"Device Registration: Thread Sleep Interrupt Exception");
"Device Registration: Thread Sleep Interrupt Exception");
}
}
}
@ -370,7 +376,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
if (deviceIPAddress == null) {
throw new AgentCoreOperationException(
"An IP address could not be retrieved for the selected network interface - '" +
networkInterface + ".");
networkInterface + ".");
}
agentManager.setDeviceIP(deviceIPAddress);
@ -379,11 +385,11 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
String deviceIPRegistrationEP = agentManager.getIpRegistrationEP();
String registerEndpointURLString =
deviceIPRegistrationEP + File.separator + deviceOwner + File.separator + deviceID +
File.separator + deviceIPAddress + File.separator + port;
File.separator + deviceIPAddress + File.separator + port;
if (log.isDebugEnabled()) {
log.debug(AgentConstants.LOG_APPENDER + "DeviceIP Registration EndPoint: " +
registerEndpointURLString);
registerEndpointURLString);
}
HttpURLConnection httpConnection;
@ -392,8 +398,8 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
} catch (TransportHandlerException e) {
String errorMsg =
"Protocol specific error occurred when trying to fetch an HTTPConnection to:" +
" " +
registerEndpointURLString;
" " +
registerEndpointURLString;
log.error(AgentConstants.LOG_APPENDER + errorMsg);
throw new AgentCoreOperationException();
}
@ -401,36 +407,36 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
try {
httpConnection.setRequestMethod(AgentConstants.HTTP_POST);
httpConnection.setRequestProperty("Authorization", "Bearer " +
agentManager.getAgentConfigs().getAuthToken());
agentManager.getAgentConfigs().getAuthToken());
httpConnection.setDoOutput(true);
responseCode = httpConnection.getResponseCode();
} catch (ProtocolException exception) {
String errorMsg = "Protocol specific error occurred when trying to set method to " +
AgentConstants.HTTP_POST + " for:" + registerEndpointURLString;
AgentConstants.HTTP_POST + " for:" + registerEndpointURLString;
log.error(AgentConstants.LOG_APPENDER + errorMsg);
throw new AgentCoreOperationException(errorMsg, exception);
} catch (IOException exception) {
String errorMsg = "An IO error occurred whilst trying to get the response code from:" +
" " +
registerEndpointURLString + " for a " + AgentConstants.HTTP_POST + " method.";
" " +
registerEndpointURLString + " for a " + AgentConstants.HTTP_POST + " method.";
log.error(AgentConstants.LOG_APPENDER + errorMsg);
throw new AgentCoreOperationException(errorMsg, exception);
}
log.info(AgentConstants.LOG_APPENDER + "DeviceIP - " + deviceIPAddress +
", registration with IoT Server at : " +
agentManager.getAgentConfigs().getHTTPS_ServerEndpoint() +
" returned status " +
responseCode);
", registration with IoT Server at : " +
agentManager.getAgentConfigs().getHTTPS_ServerEndpoint() +
" returned status " +
responseCode);
return responseCode;
}
/*------------------------------------------------------------------------------------------*/
/* Utility methods relevant to creating and sending HTTP requests to the Iot-Server */
/*------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------*/
/**
* This method is used to get the IP of the device in which the agent is run on.
@ -477,8 +483,8 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler {
} catch (SocketException | NullPointerException exception) {
String errorMsg =
"Error encountered whilst trying to get IP Addresses of the network interface: " +
networkInterfaceName +
".\nPlease check whether the name of the network interface used is correct";
networkInterfaceName +
".\nPlease check whether the name of the network interface used is correct";
log.error(AgentConstants.LOG_APPENDER + errorMsg);
throw new AgentCoreOperationException(errorMsg, exception);
}

@ -25,10 +25,11 @@ import org.apache.commons.logging.LogFactory;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentConstants;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentManager;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentUtilOperations;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.exception.AgentCoreOperationException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportHandlerException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.mqtt.MQTTTransportHandler;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentManager;
import java.io.File;
import java.io.FileOutputStream;
@ -52,6 +53,7 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
super(deviceOwner, deviceType, mqttBrokerEndPoint, subscribeTopic);
}
@SuppressWarnings("unused")
public FireAlarmMQTTCommunicator(String deviceOwner, String deviceType,
String mqttBrokerEndPoint, String subscribeTopic,
int intervalInMillis) {
@ -62,6 +64,8 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
return dataPushServiceHandler;
}
//TODO:: Terminate logs with a period
//TODO: Need to print exceptions
@Override
public void connect() {
final AgentManager agentManager = AgentManager.getInstance();
@ -70,21 +74,27 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
while (!isConnected()) {
try {
connectToQueue();
subscribeToQueue();
agentManager.updateAgentStatus("Connected to MQTT Queue");
publishDeviceData(agentManager.getPushInterval());
} catch (TransportHandlerException e) {
log.warn(AgentConstants.LOG_APPENDER + "Connection to MQTT Broker at: " + mqttBrokerEndPoint +
" failed.\n Will retry in " + timeoutInterval + " milli-seconds.");
}
try {
subscribeToQueue();
agentManager.updateAgentStatus("Subscribed to MQTT Queue");
publishDeviceData();
} catch (TransportHandlerException e) {
log.warn(AgentConstants.LOG_APPENDER +
"Connection/Subscription to MQTT Broker at: " +
log.warn(AgentConstants.LOG_APPENDER + "Subscription to MQTT Broker at: " +
mqttBrokerEndPoint + " failed");
agentManager.updateAgentStatus("Subscription to broker failed.");
}
try {
Thread.sleep(timeoutInterval);
} catch (InterruptedException ex) {
log.error(AgentConstants.LOG_APPENDER +
"MQTT-Subscriber: Thread Sleep Interrupt Exception");
}
try {
Thread.sleep(timeoutInterval);
} catch (InterruptedException ex) {
log.error(AgentConstants.LOG_APPENDER + "MQTT: Connect-Thread Sleep Interrupt Exception.");
}
}
}
@ -95,121 +105,130 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
connectorThread.start();
}
@Override
public void processIncomingMessage(MqttMessage message, String... messageParams) {
final AgentManager agentManager = AgentManager.getInstance();
log.info(AgentConstants.LOG_APPENDER + "Message " + message.toString() + " was received");
String serverName = agentManager.getAgentConfigs().getServerName();
String deviceOwner = agentManager.getAgentConfigs().getDeviceOwner();
String deviceID = agentManager.getAgentConfigs().getDeviceId();
String receivedMessage;
String replyMessage;
String securePayLoad;
String[] controlSignal = message.toString().split(":");
// log.info("########## Incoming Message : " + controlSignal[0]);
// message- "<SIGNAL_TYPE>:<SIGNAL_MODE>" format.(ex: "BULB:ON", "TEMPERATURE", "HUMIDITY")
if (isJSONValid(message.toString())) {
JsonObject jobj = new Gson().fromJson(message.toString(), JsonObject.class);
String type = jobj.get("type").toString();
if (type.equalsIgnoreCase("\"policy\"")) {
String content = jobj.get("content").toString();
updatePolicy(content);
}
} else {
switch (controlSignal[0].toUpperCase()) {
case AgentConstants.BULB_CONTROL:
boolean stateToSwitch = controlSignal[1].equals(AgentConstants.CONTROL_ON);
agentManager.changeAlarmStatus(stateToSwitch);
log.info(AgentConstants.LOG_APPENDER + "Bulb was switched to state: '" + controlSignal[1] + "'");
break;
case AgentConstants.TEMPERATURE_CONTROL:
int currentTemperature = agentManager.getTemperature();
String replyTemperature = "Current temperature was read as: '" + currentTemperature + "C'";
log.info(AgentConstants.LOG_APPENDER + replyTemperature);
String tempPublishTopic = String.format(
AgentConstants.MQTT_PUBLISH_TOPIC, deviceOwner, deviceID);
replyMessage = AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
try {
publishToQueue(tempPublishTopic, replyMessage);
} catch (TransportHandlerException e) {
log.error(AgentConstants.LOG_APPENDER +
"MQTT - Publishing, reply message to the MQTT Queue at: " +
agentManager.getAgentConfigs().getMqttBrokerEndpoint() + " failed");
}
break;
case AgentConstants.HUMIDITY_CONTROL:
int currentHumidity = agentManager.getHumidity();
try {
receivedMessage = AgentUtilOperations.extractMessageFromPayload(message.toString());
log.info(AgentConstants.LOG_APPENDER + "Message [" + receivedMessage + "] was received");
} catch (AgentCoreOperationException e) {
log.warn(AgentConstants.LOG_APPENDER + "Could not extract message from payload.", e);
return;
}
String replyHumidity = "Current humidity was read as: '" + currentHumidity + "%'";
log.info(AgentConstants.LOG_APPENDER + replyHumidity);
String humidPublishTopic = String.format(
AgentConstants.MQTT_PUBLISH_TOPIC, deviceOwner, deviceID);
replyMessage = AgentConstants.HUMIDITY_CONTROL + ":" + currentHumidity;
String[] controlSignal = receivedMessage.split(":");
// message- "<SIGNAL_TYPE>:<SIGNAL_MODE>" format.(ex: "BULB:ON", "TEMPERATURE", "HUMIDITY")
try {
publishToQueue(humidPublishTopic, replyMessage);
} catch (TransportHandlerException e) {
log.error(AgentConstants.LOG_APPENDER +
"MQTT - Publishing, reply message to the MQTT Queue at: " +
agentManager.getAgentConfigs().getMqttBrokerEndpoint() + " failed");
}
break;
try {
if (isJSONValid(receivedMessage)) {
JsonObject jobj = new Gson().fromJson(receivedMessage, JsonObject.class);
String type = jobj.get("type").toString();
default:
log.warn(AgentConstants.LOG_APPENDER + "'" + controlSignal[0] +
"' is invalid and not-supported for this device-type");
break;
if (type.equalsIgnoreCase("\"policy\"")) {
String content = jobj.get("content").toString();
updatePolicy(content);
}
} else {
switch (controlSignal[0].toUpperCase()) {
case AgentConstants.BULB_CONTROL:
boolean stateToSwitch = controlSignal[1].equals(AgentConstants.CONTROL_ON);
agentManager.changeAlarmStatus(stateToSwitch);
log.info(
AgentConstants.LOG_APPENDER + "Bulb was switched to state: '" + controlSignal[1] + "'");
break;
case AgentConstants.TEMPERATURE_CONTROL:
int currentTemperature = agentManager.getTemperature();
String replyTemperature = "Current temperature was read as: '" + currentTemperature + "C'";
log.info(AgentConstants.LOG_APPENDER + replyTemperature);
String tempPublishTopic = String.format(AgentConstants.MQTT_PUBLISH_TOPIC,
serverName, deviceOwner, deviceID);
replyMessage = AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
securePayLoad = AgentUtilOperations.prepareSecurePayLoad(replyMessage);
publishToQueue(tempPublishTopic, securePayLoad);
break;
case AgentConstants.HUMIDITY_CONTROL:
int currentHumidity = agentManager.getHumidity();
String replyHumidity = "Current humidity was read as: '" + currentHumidity + "%'";
log.info(AgentConstants.LOG_APPENDER + replyHumidity);
String humidPublishTopic = String.format(
AgentConstants.MQTT_PUBLISH_TOPIC, serverName, deviceOwner, deviceID);
replyMessage = AgentConstants.HUMIDITY_CONTROL + ":" + currentHumidity;
securePayLoad = AgentUtilOperations.prepareSecurePayLoad(replyMessage);
publishToQueue(humidPublishTopic, securePayLoad);
break;
default:
log.warn(AgentConstants.LOG_APPENDER + "'" + controlSignal[0] +
"' is invalid and not-supported for this device-type");
break;
}
}
} catch (AgentCoreOperationException e) {
log.warn(AgentConstants.LOG_APPENDER + "Preparing Secure payload failed", e);
} catch (TransportHandlerException e) {
log.error(AgentConstants.LOG_APPENDER +
"MQTT - Publishing, reply message to the MQTT Queue at: " +
agentManager.getAgentConfigs().getMqttBrokerEndpoint() + " failed");
}
}
}
@Override
public void publishDeviceData(int publishInterval) {
public void publishDeviceData() {
final AgentManager agentManager = AgentManager.getInstance();
int publishInterval = agentManager.getPushInterval();
Runnable pushDataRunnable = new Runnable() {
@Override
public void run() {
int currentTemperature = agentManager.getTemperature();
String payLoad =
"PUBLISHER:" + AgentConstants.TEMPERATURE_CONTROL + ":" +
currentTemperature;
String message = "PUBLISHER:" + AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
MqttMessage pushMessage = new MqttMessage();
pushMessage.setPayload(payLoad.getBytes(StandardCharsets.UTF_8));
pushMessage.setQos(DEFAULT_MQTT_QUALITY_OF_SERVICE);
pushMessage.setRetained(true);
try {
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
String topic = String.format(AgentConstants.MQTT_PUBLISH_TOPIC,
agentManager.getAgentConfigs().getDeviceOwner(),
agentManager.getAgentConfigs().getDeviceId());
MqttMessage pushMessage = new MqttMessage();
pushMessage.setPayload(payLoad.getBytes(StandardCharsets.UTF_8));
pushMessage.setQos(DEFAULT_MQTT_QUALITY_OF_SERVICE);
pushMessage.setRetained(false);
String topic = String.format(AgentConstants.MQTT_PUBLISH_TOPIC,
agentManager.getAgentConfigs().getServerName(),
agentManager.getAgentConfigs().getDeviceOwner(),
agentManager.getAgentConfigs().getDeviceId());
try {
publishToQueue(topic, pushMessage);
log.info(AgentConstants.LOG_APPENDER + "Message: '" + pushMessage +
"' published to MQTT Queue at [" +
agentManager.getAgentConfigs().getMqttBrokerEndpoint() +
"] under topic [" + topic + "]");
log.info(AgentConstants.LOG_APPENDER + "Message: '" + message + "' published to MQTT Queue at [" +
agentManager.getAgentConfigs().getMqttBrokerEndpoint() + "] under topic [" +
topic + "]");
} catch (TransportHandlerException e) {
log.warn(AgentConstants.LOG_APPENDER + "Data Publish attempt to topic - [" +
AgentConstants.MQTT_PUBLISH_TOPIC + "] failed for payload [" +
payLoad + "]");
AgentConstants.MQTT_PUBLISH_TOPIC + "] failed for payload [" + message + "]");
} catch (AgentCoreOperationException e) {
log.warn(AgentConstants.LOG_APPENDER + "Preparing Secure payload failed", e);
}
}
};
dataPushServiceHandler = service.scheduleAtFixedRate(pushDataRunnable, publishInterval,
publishInterval, TimeUnit.SECONDS);
dataPushServiceHandler = service.scheduleAtFixedRate(pushDataRunnable, publishInterval, publishInterval,
TimeUnit.SECONDS);
}
@ -218,8 +237,12 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
Runnable stopConnection = new Runnable() {
public void run() {
while (isConnected()) {
try {
if (dataPushServiceHandler != null) {
dataPushServiceHandler.cancel(true);
}
try {
closeConnection();
} catch (MqttException e) {
@ -250,6 +273,10 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
}
@Override
public void publishDeviceData(String... publishData) {
}
private boolean isJSONValid(String JSON_STRING) {
try {

@ -21,10 +21,12 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.communica
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jivesoftware.smack.packet.Message;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.xmpp.XMPPTransportHandler;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentConstants;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportHandlerException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentManager;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core.AgentUtilOperations;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.exception.AgentCoreOperationException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportHandlerException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.xmpp.XMPPTransportHandler;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@ -69,7 +71,7 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
resource = agentManager.getAgentConfigs().getDeviceOwner();
xmppDeviceJID = username + "@" + server;
xmppAdminJID = AgentConstants.XMPP_ADMIN_ACCOUNT_UNAME + "@" + server;
xmppAdminJID = agentManager.getAgentConfigs().getServerName() + "_" + AgentConstants.DEVICE_TYPE + "@" + server;
Runnable connect = new Runnable() {
@ -77,25 +79,24 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
if (!isConnected()) {
try {
connectToServer();
} catch (TransportHandlerException e) {
log.warn(AgentConstants.LOG_APPENDER + "Connection to XMPP server at: " + server + " failed");
}
try {
loginToServer(username, password, resource);
agentManager.updateAgentStatus("Connected to XMPP Server");
setMessageFilterAndListener(xmppAdminJID, xmppDeviceJID, true);
publishDeviceData(agentManager.getPushInterval());
publishDeviceData();
} catch (TransportHandlerException e) {
if (log.isDebugEnabled()) {
log.warn(AgentConstants.LOG_APPENDER +
"Connection/Login to XMPP server at: " + server +
" failed");
}
log.warn(AgentConstants.LOG_APPENDER + "Login to XMPP server at: " + server + " failed");
agentManager.updateAgentStatus("No XMPP Account for Device");
}
}
}
};
connectorServiceHandler = service.scheduleAtFixedRate(connect, 0, timeoutInterval,
TimeUnit.MILLISECONDS);
connectorServiceHandler = service.scheduleAtFixedRate(connect, 0, timeoutInterval, TimeUnit.MILLISECONDS);
}
/**
@ -110,81 +111,102 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
final AgentManager agentManager = AgentManager.getInstance();
String from = xmppMessage.getFrom();
String message = xmppMessage.getBody();
log.info(AgentConstants.LOG_APPENDER + "Received XMPP message [" + message + "] from " +
from);
String receivedMessage;
String replyMessage;
String[] controlSignal = message.split(":");
String securePayLoad;
try {
receivedMessage = AgentUtilOperations.extractMessageFromPayload(message);
log.info(AgentConstants.LOG_APPENDER + "Message [" + receivedMessage + "] was received");
} catch (AgentCoreOperationException e) {
log.warn(AgentConstants.LOG_APPENDER + "Could not extract message from payload.", e);
return;
}
String[] controlSignal = receivedMessage.split(":");
//message- "<SIGNAL_TYPE>:<SIGNAL_MODE>" format. (ex: "BULB:ON", "TEMPERATURE", "HUMIDITY")
try {
switch (controlSignal[0].toUpperCase()) {
case AgentConstants.BULB_CONTROL:
if (controlSignal.length != 2) {
replyMessage = "BULB controls need to be in the form - 'BULB:{ON|OFF}'";
log.warn(replyMessage);
securePayLoad = AgentUtilOperations.prepareSecurePayLoad(replyMessage);
sendXMPPMessage(xmppAdminJID, securePayLoad, "CONTROL-REPLY");
break;
}
switch (controlSignal[0].toUpperCase()) {
case AgentConstants.BULB_CONTROL:
if (controlSignal.length != 2) {
replyMessage = "BULB controls need to be in the form - 'BULB:{ON|OFF}'";
log.warn(replyMessage);
sendXMPPMessage(xmppAdminJID, replyMessage, "CONTROL-REPLY");
agentManager.changeAlarmStatus(controlSignal[1].equals(AgentConstants.CONTROL_ON));
log.info(AgentConstants.LOG_APPENDER + "Bulb was switched to state: '" + controlSignal[1] + "'");
break;
}
agentManager.changeAlarmStatus(controlSignal[1].equals(AgentConstants.CONTROL_ON));
log.info(AgentConstants.LOG_APPENDER + "Bulb was switched to state: '" +
controlSignal[1] + "'");
break;
case AgentConstants.TEMPERATURE_CONTROL:
int currentTemperature = agentManager.getTemperature();
case AgentConstants.TEMPERATURE_CONTROL:
int currentTemperature = agentManager.getTemperature();
String replyTemperature =
"The current temperature was read to be: '" + currentTemperature +
"C'";
log.info(AgentConstants.LOG_APPENDER + replyTemperature);
String replyTemperature =
"The current temperature was read to be: '" + currentTemperature +
"C'";
log.info(AgentConstants.LOG_APPENDER + replyTemperature);
replyMessage = AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
sendXMPPMessage(xmppAdminJID, replyMessage, "CONTROL-REPLY");
break;
replyMessage = AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
securePayLoad = AgentUtilOperations.prepareSecurePayLoad(replyMessage);
sendXMPPMessage(xmppAdminJID, securePayLoad, "CONTROL-REPLY");
break;
case AgentConstants.HUMIDITY_CONTROL:
int currentHumidity = agentManager.getHumidity();
case AgentConstants.HUMIDITY_CONTROL:
int currentHumidity = agentManager.getHumidity();
String replyHumidity =
"The current humidity was read to be: '" + currentHumidity + "%'";
log.info(AgentConstants.LOG_APPENDER + replyHumidity);
String replyHumidity = "The current humidity was read to be: '" + currentHumidity + "%'";
log.info(AgentConstants.LOG_APPENDER + replyHumidity);
replyMessage = AgentConstants.HUMIDITY_CONTROL + ":" + currentHumidity;
sendXMPPMessage(xmppAdminJID, replyMessage, "CONTROL-REPLY");
break;
replyMessage = AgentConstants.HUMIDITY_CONTROL + ":" + currentHumidity;
securePayLoad = AgentUtilOperations.prepareSecurePayLoad(replyMessage);
sendXMPPMessage(xmppAdminJID, securePayLoad, "CONTROL-REPLY");
break;
default:
replyMessage = "'" + controlSignal[0] +
"' is invalid and not-supported for this device-type";
log.warn(replyMessage);
sendXMPPMessage(xmppAdminJID, replyMessage, "CONTROL-ERROR");
break;
default:
replyMessage = "'" + controlSignal[0] + "' is invalid and not-supported for this device-type";
log.warn(replyMessage);
securePayLoad = AgentUtilOperations.prepareSecurePayLoad(replyMessage);
sendXMPPMessage(xmppAdminJID, securePayLoad, "CONTROL-ERROR");
break;
}
} catch (AgentCoreOperationException e) {
log.warn(AgentConstants.LOG_APPENDER + "Preparing Secure payload failed", e);
}
}
@Override
public void publishDeviceData(int publishInterval) {
public void publishDeviceData() {
final AgentManager agentManager = AgentManager.getInstance();
int publishInterval = agentManager.getPushInterval();
Runnable pushDataRunnable = new Runnable() {
@Override
public void run() {
int currentTemperature = agentManager.getTemperature();
String payLoad = AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
Message xmppMessage = new Message();
xmppMessage.setTo(xmppAdminJID);
xmppMessage.setSubject("PUBLISHER");
xmppMessage.setBody(payLoad);
xmppMessage.setType(Message.Type.chat);
sendXMPPMessage(xmppAdminJID, xmppMessage);
log.info(AgentConstants.LOG_APPENDER + "Message: '" + xmppMessage.getBody() +
"' sent to XMPP JID [" + xmppAdminJID + "] under subject [" +
xmppMessage.getSubject() + "]");
try {
int currentTemperature = agentManager.getTemperature();
String message = AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
xmppMessage.setTo(xmppAdminJID);
xmppMessage.setSubject("PUBLISHER");
xmppMessage.setBody(payLoad);
xmppMessage.setType(Message.Type.chat);
sendXMPPMessage(xmppAdminJID, xmppMessage);
log.info(AgentConstants.LOG_APPENDER + "Message: '" + message + "' sent to XMPP JID - " +
"[" + xmppAdminJID + "] under subject [" + xmppMessage.getSubject() + "].");
} catch (AgentCoreOperationException e) {
log.warn(AgentConstants.LOG_APPENDER + "Preparing Secure payload failed for XMPP JID - " +
"[" + xmppAdminJID + "] with subject - [" + xmppMessage.getSubject() + "].");
}
}
};
@ -197,22 +219,27 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
public void disconnect() {
Runnable stopConnection = new Runnable() {
public void run() {
while (isConnected()) {
if (dataPushServiceHandler != null) {
dataPushServiceHandler.cancel(true);
}
if (connectorServiceHandler != null) {
connectorServiceHandler.cancel(true);
}
while (isConnected()) {
closeConnection();
if (log.isDebugEnabled()) {
log.warn(AgentConstants.LOG_APPENDER +
"Unable to 'STOP' connection to XMPP server at: " +
server);
"Unable to 'STOP' connection to XMPP server at: " + server);
}
try {
Thread.sleep(timeoutInterval);
} catch (InterruptedException e1) {
log.error(AgentConstants.LOG_APPENDER +
"XMPP-Terminator: Thread Sleep Interrupt Exception");
log.error(AgentConstants.LOG_APPENDER + "XMPP-Terminator: Thread Sleep Interrupt Exception");
}
}
@ -224,8 +251,15 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
terminatorThread.start();
}
@Override
public void processIncomingMessage() {
}
@Override
public void publishDeviceData(String... publishData) {
}
}

@ -24,6 +24,7 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core;
* downloading the device agent from the IoT-Server.
*/
public class AgentConfiguration {
private String serverName;
private String deviceOwner;
private String deviceId;
private String deviceName;
@ -38,6 +39,14 @@ public class AgentConfiguration {
private String refreshToken;
private int dataPushInterval;
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public String getDeviceOwner() {
return deviceOwner;
}

@ -18,12 +18,6 @@
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class AgentConstants {
public static final String DEVICE_TYPE = "virtual_firealarm";
public static final String LOG_APPENDER = "AGENT_LOG:: ";
@ -33,6 +27,7 @@ public class AgentConstants {
IoT-Server specific information
--------------------------------------------------------------------------------------- */
public static final String DEVICE_CONTROLLER_API_EP = "/virtual_firealarm/controller";
public static final String DEVICE_ENROLLMENT_API_EP = "/scep";
public static final String DEVICE_REGISTER_API_EP = "/register";
public static final String DEVICE_PUSH_TEMPERATURE_API_EP = "/push_temperature";
public static final String PUSH_DATA_PAYLOAD =
@ -41,10 +36,9 @@ public class AgentConstants {
public static final String PUSH_SIMULATION_DATA_PAYLOAD =
"{\"owner\":\"%s\",\"deviceId\":\"%s\",\"reply\":\"%s\",\"value\":\"%s\",\"isSimulated\":\"%s\",\"duration\":\"%s\",\"frequency\":\"%s\"}";
public static final String AGENT_CONTROL_APP_EP = "/firealarm-webapp";
public static final String DEVICE_DETAILS_PAGE_EP = "/store/pages/device/%s/%s";
public static final String DEVICE_ANALYTICS_PAGE_URL =
"/store/pages/analytics?deviceId=%s&deviceType=%s";
public static final String AGENT_CONTROL_APP_EP = "/devicemgt/device/%s?id=%s";
public static final String DEVICE_DETAILS_PAGE_EP = "/devicemgt/device/%s?id=%s";
public static final String DEVICE_ANALYTICS_PAGE_URL = "/devicemgt/analytics?deviceId=%s&deviceType=%s&deviceName=%s";
/* ---------------------------------------------------------------------------------------
HTTP Connection specific information for communicating with IoT-Server
--------------------------------------------------------------------------------------- */
@ -62,8 +56,8 @@ public class AgentConstants {
--------------------------------------------------------------------------------------- */
public static final int DEFAULT_MQTT_RECONNECTION_INTERVAL = 2; // time in seconds
public static final int DEFAULT_MQTT_QUALITY_OF_SERVICE = 0;
public static final String MQTT_SUBSCRIBE_TOPIC = "wso2/iot/%s/" + DEVICE_TYPE + "/%s";
public static final String MQTT_PUBLISH_TOPIC = "wso2/iot/%s/" + DEVICE_TYPE + "/%s/publisher";
public static final String MQTT_SUBSCRIBE_TOPIC = "%s/%s/" + DEVICE_TYPE + "/%s";
public static final String MQTT_PUBLISH_TOPIC = "%s/%s/" + DEVICE_TYPE + "/%s/publisher";
/* ---------------------------------------------------------------------------------------
XMPP Connection specific information
--------------------------------------------------------------------------------------- */
@ -72,6 +66,7 @@ public class AgentConstants {
Device/Agent specific properties to be read from the 'deviceConfig.properties' file
--------------------------------------------------------------------------------------- */
public static final String AGENT_PROPERTIES_FILE_NAME = "deviceConfig.properties";
public static final String SERVER_NAME_PROPERTY = "server-name";
public static final String DEVICE_OWNER_PROPERTY = "owner";
public static final String DEVICE_ID_PROPERTY = "deviceId";
public static final String DEVICE_NAME_PROPERTY = "device-name";
@ -89,6 +84,7 @@ public class AgentConstants {
/* ---------------------------------------------------------------------------------------
Default values for the Device/Agent specific configurations listed above
--------------------------------------------------------------------------------------- */
public static final String DEFAULT_SERVER_NAME = "WSO2IoTServer";
public static final String DEFAULT_DEVICE_OWNER = "admin";
public static final String DEFAULT_DEVICE_ID = "1234567890";
public static final String DEFAULT_DEVICE_NAME = "admin_1234567890";

@ -20,15 +20,15 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.communication.http.FireAlarmHTTPCommunicator;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.communication.mqtt.FireAlarmMQTTCommunicator;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.communication.xmpp.FireAlarmXMPPCommunicator;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.enrollment.EnrollmentManager;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.exception.AgentCoreOperationException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.sidhdhi.SidhdhiQuery;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportHandler;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportHandlerException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportUtils;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.sidhdhi.SidhdhiQuery;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.communication.http.FireAlarmHTTPCommunicator;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.communication.mqtt.FireAlarmMQTTCommunicator;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.communication.xmpp.FireAlarmXMPPCommunicator;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.virtual.VirtualHardwareManager;
import java.nio.charset.StandardCharsets;
@ -97,11 +97,12 @@ public class AgentManager {
this.agentConfigs = AgentUtilOperations.readIoTServerConfigs();
// Initialise IoT-Server URL endpoints from the configuration read from file
AgentUtilOperations.initializeHTTPEndPoints();
AgentUtilOperations.initializeServerEndPoints();
String analyticsPageContext = String.format(AgentConstants.DEVICE_ANALYTICS_PAGE_URL,
agentConfigs.getDeviceId(),
AgentConstants.DEVICE_TYPE);
AgentConstants.DEVICE_TYPE,
agentConfigs.getDeviceName());
String controlPageContext = String.format(AgentConstants.DEVICE_DETAILS_PAGE_EP,
AgentConstants.DEVICE_TYPE,
@ -121,28 +122,29 @@ public class AgentManager {
Map<String, String> xmppIPPortMap;
try {
xmppIPPortMap = TransportUtils.getHostAndPort(agentConfigs.getXmppServerEndpoint
());
xmppIPPortMap = TransportUtils.getHostAndPort(agentConfigs.getXmppServerEndpoint());
String xmppServer = xmppIPPortMap.get("Host");
int xmppPort = Integer.parseInt(xmppIPPortMap.get("Port"));
TransportHandler xmppCommunicator = new FireAlarmXMPPCommunicator(xmppServer, xmppPort);
agentCommunicator.put(AgentConstants.XMPP_PROTOCOL, xmppCommunicator);
} catch (TransportHandlerException e) {
log.error("XMPP Endpoint String - " + agentConfigs.getXmppServerEndpoint() +
", provided in the configuration file is invalid.");
", provided in the configuration file is invalid.");
}
String mqttTopic = String.format(AgentConstants.MQTT_SUBSCRIBE_TOPIC,
agentConfigs.getServerName(),
agentConfigs.getDeviceOwner(),
agentConfigs.getDeviceId());
TransportHandler httpCommunicator = new FireAlarmHTTPCommunicator();
TransportHandler mqttCommunicator = new FireAlarmMQTTCommunicator(
agentConfigs.getDeviceOwner(), agentConfigs.getDeviceId(),
agentConfigs.getMqttBrokerEndpoint(), mqttTopic);
// TransportHandler httpCommunicator = new FireAlarmHTTPCommunicator();
TransportHandler mqttCommunicator = new FireAlarmMQTTCommunicator(agentConfigs.getDeviceOwner(),
agentConfigs.getDeviceId(),
agentConfigs.getMqttBrokerEndpoint(),
mqttTopic);
agentCommunicator.put(AgentConstants.HTTP_PROTOCOL, httpCommunicator);
// agentCommunicator.put(AgentConstants.HTTP_PROTOCOL, httpCommunicator);
agentCommunicator.put(AgentConstants.MQTT_PROTOCOL, mqttCommunicator);
try {
@ -169,9 +171,6 @@ public class AgentManager {
}
}
//Start agent communication
agentCommunicator.get(protocol).connect();
try {
EnrollmentManager.getInstance().beginEnrollmentFlow();
} catch (AgentCoreOperationException e) {
@ -179,6 +178,9 @@ public class AgentManager {
e.printStackTrace();
System.exit(0);
}
//Start agent communication
agentCommunicator.get(protocol).connect();
}
private void switchCommunicator(String stopProtocol, String startProtocol) {
@ -189,7 +191,7 @@ public class AgentManager {
Thread.sleep(250);
} catch (InterruptedException e) {
log.info(AgentConstants.LOG_APPENDER +
"Sleep error in 'Switch-Communicator' Thread's shutdown wait.");
"Sleep error in 'Switch-Communicator' Thread's shutdown wait.");
}
}
@ -242,7 +244,7 @@ public class AgentManager {
/*------------------------------------------------------------------------------------------*/
/* Getter and Setter Methods for the private variables */
/*------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------*/
public void setRootPath(String rootPath) {
this.rootPath = rootPath;
@ -336,7 +338,7 @@ public class AgentManager {
default:
log.warn("Unknown protocol " + protocol);
}
transportHandler.publishDeviceData(pushInterval);
transportHandler.publishDeviceData();
if (log.isDebugEnabled()) {
log.debug("The Data Publish Interval was changed to: " + pushInterval);
@ -353,6 +355,7 @@ public class AgentManager {
/**
* Get temperature reading from device
*
* @return Temperature
*/
public int getTemperature() {
@ -361,9 +364,10 @@ public class AgentManager {
/**
* Get humidity reading from device
*
* @return Humidity
*/
public int getHumidity(){
public int getHumidity() {
return VirtualHardwareManager.getInstance().getHumidity();
}

@ -20,13 +20,19 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.core;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONObject;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.enrollment.EnrollmentManager;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.exception.AgentCoreOperationException;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.CommunicationUtils;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport.TransportHandlerException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Properties;
@ -39,6 +45,8 @@ import java.util.Properties;
public class AgentUtilOperations {
private static final Log log = LogFactory.getLog(AgentUtilOperations.class);
private static final String JSON_MESSAGE_KEY = "Msg";
private static final String JSON_SIGNATURE_KEY = "Sig";
/**
* This method reads the agent specific configurations for the device from the
@ -72,6 +80,8 @@ public class AgentUtilOperations {
//load a properties file from class path, inside static method
properties.load(propertiesInputStream);
iotServerConfigs.setServerName(properties.getProperty(
AgentConstants.SERVER_NAME_PROPERTY));
iotServerConfigs.setDeviceOwner(properties.getProperty(
AgentConstants.DEVICE_OWNER_PROPERTY));
iotServerConfigs.setDeviceId(properties.getProperty(
@ -99,6 +109,8 @@ public class AgentUtilOperations {
iotServerConfigs.setDataPushInterval(Integer.parseInt(properties.getProperty(
AgentConstants.PUSH_INTERVAL_PROPERTY)));
log.info(AgentConstants.LOG_APPENDER + "Server name: " +
iotServerConfigs.getServerName());
log.info(AgentConstants.LOG_APPENDER + "Device Owner: " +
iotServerConfigs.getDeviceOwner());
log.info(AgentConstants.LOG_APPENDER + "Device ID: " + iotServerConfigs.getDeviceId());
@ -142,9 +154,8 @@ public class AgentUtilOperations {
propertiesInputStream.close();
} catch (IOException e) {
log.error(AgentConstants.LOG_APPENDER +
"Error occurred whilst trying to close InputStream " +
"resource used to read the '" + propertiesFileName +
"' file");
"Error occurred whilst trying to close InputStream resource used to read the '" +
propertiesFileName + "' file");
}
}
}
@ -162,6 +173,7 @@ public class AgentUtilOperations {
AgentConfiguration iotServerConfigs = new AgentConfiguration();
iotServerConfigs.setDeviceOwner(AgentConstants.DEFAULT_SERVER_NAME);
iotServerConfigs.setDeviceOwner(AgentConstants.DEFAULT_DEVICE_OWNER);
iotServerConfigs.setDeviceId(AgentConstants.DEFAULT_DEVICE_ID);
iotServerConfigs.setDeviceName(AgentConstants.DEFAULT_DEVICE_NAME);
@ -188,12 +200,17 @@ public class AgentUtilOperations {
* retrieve the deviceIP of the network-interface read
* from the configs file
*/
public static void initializeHTTPEndPoints() {
public static void initializeServerEndPoints() {
AgentManager agentManager = AgentManager.getInstance();
String apimEndpoint = agentManager.getAgentConfigs().getHTTP_ServerEndpoint();
String serverSecureEndpoint = agentManager.getAgentConfigs().getHTTPS_ServerEndpoint();
String serverUnSecureEndpoint = agentManager.getAgentConfigs().getHTTP_ServerEndpoint();
String backEndContext = agentManager.getAgentConfigs().getControllerContext();
String deviceControllerAPIEndpoint = apimEndpoint + backEndContext;
String deviceControllerAPIEndpoint = serverSecureEndpoint + backEndContext;
String deviceEnrollmentEndpoint =
serverUnSecureEndpoint + backEndContext + AgentConstants.DEVICE_ENROLLMENT_API_EP;
agentManager.setEnrollmentEP(deviceEnrollmentEndpoint);
String registerEndpointURL =
deviceControllerAPIEndpoint + AgentConstants.DEVICE_REGISTER_API_EP;
@ -205,12 +222,88 @@ public class AgentUtilOperations {
log.info(AgentConstants.LOG_APPENDER + "IoT Server's Device Controller API Endpoint: " +
deviceControllerAPIEndpoint);
log.info(AgentConstants.LOG_APPENDER + "Device Enrollment EndPoint: " +
registerEndpointURL);
log.info(AgentConstants.LOG_APPENDER + "DeviceIP Registration EndPoint: " +
registerEndpointURL);
log.info(AgentConstants.LOG_APPENDER + "Push-Data API EndPoint: " + pushDataEndPointURL);
}
public static String prepareSecurePayLoad(String message) throws AgentCoreOperationException {
PublicKey serverPublicKey = EnrollmentManager.getInstance().getServerPublicKey();
PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey();
String encryptedMsg;
try {
encryptedMsg = CommunicationUtils.encryptMessage(message, serverPublicKey);
} catch (TransportHandlerException e) {
String errorMsg = "Error occurred whilst trying to encryptMessage: [" + message + "]";
log.error(errorMsg);
throw new AgentCoreOperationException(errorMsg, e);
}
String signedPayload;
try {
signedPayload = CommunicationUtils.signMessage(encryptedMsg, devicePrivateKey);
} catch (TransportHandlerException e) {
String errorMsg = "Error occurred whilst trying to sign encrypted message of: [" + message + "]";
log.error(errorMsg);
throw new AgentCoreOperationException(errorMsg, e);
}
JSONObject jsonPayload = new JSONObject();
jsonPayload.put(JSON_MESSAGE_KEY, encryptedMsg);
jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload);
return jsonPayload.toString();
}
public static String extractMessageFromPayload(String message) throws AgentCoreOperationException {
String actualMessage;
PublicKey serverPublicKey = EnrollmentManager.getInstance().getServerPublicKey();
PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey();
JSONObject jsonPayload = new JSONObject(message);
Object encryptedMessage = jsonPayload.get(JSON_MESSAGE_KEY);
Object signedPayload = jsonPayload.get(JSON_SIGNATURE_KEY);
boolean verification;
if (encryptedMessage != null && signedPayload != null) {
try {
verification = CommunicationUtils.verifySignature(
encryptedMessage.toString(), signedPayload.toString(), serverPublicKey);
} catch (TransportHandlerException e) {
String errorMsg =
"Error occurred whilst trying to verify signature on received message: [" + message + "]";
log.error(errorMsg);
throw new AgentCoreOperationException(errorMsg, e);
}
} else {
String errorMsg = "The received message is in an INVALID format. " +
"Need to be JSON - {\"Msg\":\"<ENCRYPTED_MSG>\", \"Sig\":\"<SIGNED_MSG>\"}.";
throw new AgentCoreOperationException(errorMsg);
}
try {
if (verification) {
actualMessage = CommunicationUtils.decryptMessage(encryptedMessage.toString(), devicePrivateKey);
} else {
String errorMsg = "Could not verify payload signature. The message was not signed by a valid client";
log.error(errorMsg);
throw new AgentCoreOperationException(errorMsg);
}
} catch (TransportHandlerException e) {
String errorMsg = "Error occurred whilst trying to decrypt received message: [" + encryptedMessage + "]";
log.error(errorMsg);
throw new AgentCoreOperationException(errorMsg, e);
}
return actualMessage;
}
public static String formatMessage(String message) {
StringBuilder formattedMsg = new StringBuilder(message);

@ -227,10 +227,11 @@ public class EnrollmentManager {
private PKCS10CertificationRequest generateCertSignRequest() throws AgentCoreOperationException {
// Build the CN for the cert that's being requested.
X500NameBuilder nameBld = new X500NameBuilder(BCStyle.INSTANCE);
nameBld.addRDN(BCStyle.CN, AgentManager.getInstance().getAgentConfigs().getDeviceName());
nameBld.addRDN(BCStyle.CN, AgentManager.getInstance().getAgentConfigs().getServerName());
nameBld.addRDN(BCStyle.O, AgentManager.getInstance().getAgentConfigs().getDeviceOwner());
nameBld.addRDN(BCStyle.OU, AgentManager.getInstance().getAgentConfigs().getDeviceOwner());
nameBld.addRDN(BCStyle.UNIQUE_IDENTIFIER, AgentManager.getInstance().getAgentConfigs().getDeviceId());
nameBld.addRDN(BCStyle.SERIALNUMBER, AgentManager.getInstance().getAgentConfigs().getDeviceId());
X500Name principal = nameBld.build();
JcaContentSignerBuilder contentSignerBuilder = new JcaContentSignerBuilder(SIGNATURE_ALG).setProvider(PROVIDER);
@ -403,6 +404,7 @@ public class EnrollmentManager {
/**
* Gets the Public-Key of the client.
*
* @return the public key of the client.
*/
public PublicKey getPublicKey() {
@ -411,6 +413,7 @@ public class EnrollmentManager {
/**
* Gets the Private-Key of the client.
*
* @return the private key of the client.
*/
public PrivateKey getPrivateKey() {
@ -419,6 +422,7 @@ public class EnrollmentManager {
/**
* Gets the SCEP-Certificate of the client.
*
* @return the SCEP Certificate of the client.
*/
public X509Certificate getSCEPCertificate() {
@ -427,6 +431,7 @@ public class EnrollmentManager {
/**
* Gets the Public-Key of the Server.
*
* @return the pubic key of the server.
*/
public PublicKey getServerPublicKey() {

@ -19,39 +19,39 @@
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.exception;
public class AgentCoreOperationException extends Exception{
private static final long serialVersionUID = 2736466230451105710L;
public class AgentCoreOperationException extends Exception {
private static final long serialVersionUID = 2736466230451105710L;
private String errorMessage;
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public AgentCoreOperationException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public AgentCoreOperationException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public AgentCoreOperationException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public AgentCoreOperationException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public AgentCoreOperationException(String msg) {
super(msg);
setErrorMessage(msg);
}
public AgentCoreOperationException(String msg) {
super(msg);
setErrorMessage(msg);
}
public AgentCoreOperationException() {
super();
}
public AgentCoreOperationException() {
super();
}
public AgentCoreOperationException(Throwable cause) {
super(cause);
}
public AgentCoreOperationException(Throwable cause) {
super(cause);
}
}

@ -49,37 +49,37 @@ import java.nio.file.Paths;
* care of re-initializing same.
*/
public class SidhdhiQuery implements Runnable {
private static final Log log = LogFactory.getLog(SidhdhiQuery.class);
final AgentConstants constants = new AgentConstants();
private static final Log log = LogFactory.getLog(SidhdhiQuery.class);
final AgentConstants constants = new AgentConstants();
//Bam data push client
private static SiddhiManager siddhiManager = new SiddhiManager();
//Bam data push client
private static SiddhiManager siddhiManager = new SiddhiManager();
public static SiddhiManager getSiddhiManager() {
return siddhiManager;
}
public static SiddhiManager getSiddhiManager() {
return siddhiManager;
}
public static void setSiddhiManager(SiddhiManager siddhiManager) {
SidhdhiQuery.siddhiManager = siddhiManager;
}
public static void setSiddhiManager(SiddhiManager siddhiManager) {
SidhdhiQuery.siddhiManager = siddhiManager;
}
public void run() {
public void run() {
//Start the execution plan with pre-defined or previously persisted Siddhi query
//Start the execution plan with pre-defined or previously persisted Siddhi query
String sidhdhiQueryPath =
AgentManager.getInstance().getRootPath() + AgentConstants.CEP_FILE_NAME;
String sidhdhiQueryPath =
AgentManager.getInstance().getRootPath() + AgentConstants.CEP_FILE_NAME;
File f = new File(sidhdhiQueryPath);
if (!f.exists()) {
FileOutputStream out = null;
try {
out = new FileOutputStream(sidhdhiQueryPath);
out.write(AgentConstants.CEP_QUERY.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null){
File f = new File(sidhdhiQueryPath);
if (!f.exists()) {
FileOutputStream out = null;
try {
out = new FileOutputStream(sidhdhiQueryPath);
out.write(AgentConstants.CEP_QUERY.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
@ -89,135 +89,135 @@ public class SidhdhiQuery implements Runnable {
}
}
StartExecutionPlan startExecutionPlan = new StartExecutionPlan().invoke();
while (true) {
//Check if there is new policy update available
if (AgentManager.isUpdated()) {
System.out.print("### Policy Update Detected!");
//Restart execution plan with new query
restartSiddhi();
startExecutionPlan = new StartExecutionPlan().invoke();
}
InputHandler inputHandler = startExecutionPlan.getInputHandler();
//Sending events to Siddhi
try {
int humidityReading = AgentManager.getInstance().getTemperature();
inputHandler.send(new Object[]{"FIRE_1", humidityReading});
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
/**
* Re-Initialize SiddhiManager
*/
private void restartSiddhi() {
siddhiManager.shutdown();
siddhiManager = new SiddhiManager();
}
/**
* Read content from a given file and return as a string
*
* @param path
* @param encoding
* @return
*/
public static String readFile(String path, Charset encoding) {
byte[] encoded = new byte[0];
try {
encoded = Files.readAllBytes(Paths.get(path));
} catch (IOException e) {
log.error("Error reading Sidhdhi query from file.");
}
return new String(encoded, encoding);
}
/**
* Read humidity data from API URL
*
* @param humidityAPIUrl
* @return
*/
private String readHumidityData(String humidityAPIUrl) {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(humidityAPIUrl);
String responseStr = null;
try {
HttpResponse response = client.execute(request);
log.debug("Response Code : " + response);
InputStream input = response.getEntity().getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(input, "UTF-8"));
responseStr = String.valueOf(br.readLine());
br.close();
} catch (IOException e) {
//log.error("Exception encountered while trying to make get request.");
log.error("Error while reading humidity reading from file!");
return responseStr;
}
return responseStr;
}
/**
* Initialize SiddhiExecution plan
*/
private static class StartExecutionPlan {
private InputHandler inputHandler;
public InputHandler getInputHandler() {
return inputHandler;
}
public StartExecutionPlan invoke() {
String executionPlan;
String sidhdhiQueryPath =
AgentManager.getInstance().getRootPath() + AgentConstants.CEP_FILE_NAME;
executionPlan = readFile(sidhdhiQueryPath, StandardCharsets.UTF_8);
//Generating runtime
siddhiManager.addExecutionPlan(executionPlan);
siddhiManager.addCallback("bulbOnStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
System.out.println("Bulb on Event Fired!");
if (events.length > 0) {
if (!AgentManager.getInstance().isAlarmOn()) {
AgentManager.getInstance().changeAlarmStatus(true);
System.out.println("#### Performed HTTP call! ON.");
}
}
}
});
siddhiManager.addCallback("bulbOffStream", new StreamCallback() {
@Override
public void receive(Event[] inEvents) {
System.out.println("Bulb off Event Fired");
if (AgentManager.getInstance().isAlarmOn()) {
AgentManager.getInstance().changeAlarmStatus(false);
System.out.println("#### Performed HTTP call! OFF.");
}
}
});
//Retrieving InputHandler to push events into Siddhi
inputHandler = siddhiManager.getInputHandler("fireAlarmEventStream");
//Starting event processing
System.out.println("Execution Plan Started!");
return this;
}
}
StartExecutionPlan startExecutionPlan = new StartExecutionPlan().invoke();
while (true) {
//Check if there is new policy update available
if (AgentManager.isUpdated()) {
System.out.print("### Policy Update Detected!");
//Restart execution plan with new query
restartSiddhi();
startExecutionPlan = new StartExecutionPlan().invoke();
}
InputHandler inputHandler = startExecutionPlan.getInputHandler();
//Sending events to Siddhi
try {
int humidityReading = AgentManager.getInstance().getTemperature();
inputHandler.send(new Object[]{"FIRE_1", humidityReading});
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
/**
* Re-Initialize SiddhiManager
*/
private void restartSiddhi() {
siddhiManager.shutdown();
siddhiManager = new SiddhiManager();
}
/**
* Read content from a given file and return as a string
*
* @param path
* @param encoding
* @return
*/
public static String readFile(String path, Charset encoding) {
byte[] encoded = new byte[0];
try {
encoded = Files.readAllBytes(Paths.get(path));
} catch (IOException e) {
log.error("Error reading Sidhdhi query from file.");
}
return new String(encoded, encoding);
}
/**
* Read humidity data from API URL
*
* @param humidityAPIUrl
* @return
*/
private String readHumidityData(String humidityAPIUrl) {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(humidityAPIUrl);
String responseStr = null;
try {
HttpResponse response = client.execute(request);
log.debug("Response Code : " + response);
InputStream input = response.getEntity().getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(input, "UTF-8"));
responseStr = String.valueOf(br.readLine());
br.close();
} catch (IOException e) {
//log.error("Exception encountered while trying to make get request.");
log.error("Error while reading humidity reading from file!");
return responseStr;
}
return responseStr;
}
/**
* Initialize SiddhiExecution plan
*/
private static class StartExecutionPlan {
private InputHandler inputHandler;
public InputHandler getInputHandler() {
return inputHandler;
}
public StartExecutionPlan invoke() {
String executionPlan;
String sidhdhiQueryPath =
AgentManager.getInstance().getRootPath() + AgentConstants.CEP_FILE_NAME;
executionPlan = readFile(sidhdhiQueryPath, StandardCharsets.UTF_8);
//Generating runtime
siddhiManager.addExecutionPlan(executionPlan);
siddhiManager.addCallback("bulbOnStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
System.out.println("Bulb on Event Fired!");
if (events.length > 0) {
if (!AgentManager.getInstance().isAlarmOn()) {
AgentManager.getInstance().changeAlarmStatus(true);
System.out.println("#### Performed HTTP call! ON.");
}
}
}
});
siddhiManager.addCallback("bulbOffStream", new StreamCallback() {
@Override
public void receive(Event[] inEvents) {
System.out.println("Bulb off Event Fired");
if (AgentManager.getInstance().isAlarmOn()) {
AgentManager.getInstance().changeAlarmStatus(false);
System.out.println("#### Performed HTTP call! OFF.");
}
}
});
//Retrieving InputHandler to push events into Siddhi
inputHandler = siddhiManager.getInputHandler("fireAlarmEventStream");
//Starting event processing
System.out.println("Execution Plan Started!");
return this;
}
}
}

@ -55,7 +55,7 @@ public class CommunicationUtils {
* @param encryptionKey the key to use for the encryption of the message.
* @return the encrypted message in String format.
* @throws TransportHandlerException if an error occurs with the encryption flow which can be due to Padding
* issues, encryption key being invalid or the algorithm used is unrecognizable.
* issues, encryption key being invalid or the algorithm used is unrecognizable.
*/
public static String encryptMessage(String message, Key encryptionKey) throws TransportHandlerException {
Cipher encrypter;
@ -92,6 +92,7 @@ public class CommunicationUtils {
}
///TODO:: Exception needs to change according to the common package
/**
* Signed a given message using the PrivateKey that's passes in.
*
@ -99,7 +100,7 @@ public class CommunicationUtils {
* @param signatureKey the PrivateKey with which the message is to be signed.
* @return the Base64Encoded String of the signed payload.
* @throws TransportHandlerException if some error occurs with the signing process which may be related to the
* signature algorithm used or the key used for signing.
* signature algorithm used or the key used for signing.
*/
public static String signMessage(String message, PrivateKey signatureKey) throws TransportHandlerException {
@ -143,7 +144,7 @@ public class CommunicationUtils {
* the data to be signed by.
* @return true if the signed data verifies to be signed by the corresponding Private Key.
* @throws TransportHandlerException if some error occurs with the verification process which may be related to
* the signature algorithm used or the key used for signing.
* the signature algorithm used or the key used for signing.
*/
public static boolean verifySignature(String data, String signedData, PublicKey verificationKey)
throws TransportHandlerException {
@ -184,7 +185,7 @@ public class CommunicationUtils {
* @param decryptKey the key to use in the decryption process.
* @return the decrypted message in String format.
* @throws TransportHandlerException if an error occurs with the encryption flow which can be due to Padding
* issues, encryption key being invalid or the algorithm used is unrecognizable.
* issues, encryption key being invalid or the algorithm used is unrecognizable.
*/
public static String decryptMessage(String encryptedMessage, Key decryptKey) throws TransportHandlerException {

@ -39,7 +39,9 @@ public interface TransportHandler<T> {
void processIncomingMessage();
void publishDeviceData(int publishInterval);
void publishDeviceData(String... publishData);
void publishDeviceData();
void disconnect();
}

@ -19,38 +19,38 @@
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.transport;
public class TransportHandlerException extends Exception {
private static final long serialVersionUID = 2736466230451105440L;
private static final long serialVersionUID = 2736466230451105440L;
private String errorMessage;
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public TransportHandlerException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public TransportHandlerException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public TransportHandlerException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public TransportHandlerException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public TransportHandlerException(String msg) {
super(msg);
setErrorMessage(msg);
}
public TransportHandlerException(String msg) {
super(msg);
setErrorMessage(msg);
}
public TransportHandlerException() {
super();
}
public TransportHandlerException() {
super();
}
public TransportHandlerException(Throwable cause) {
super(cause);
}
public TransportHandlerException(Throwable cause) {
super(cause);
}
}

@ -41,261 +41,262 @@ import java.util.Map;
import java.util.Random;
public class TransportUtils {
private static final Log log = LogFactory.getLog(TransportUtils.class);
public static final int MIN_PORT_NUMBER = 9000;
public static final int MAX_PORT_NUMBER = 11000;
/**
* Given a server endpoint as a String, this method splits it into Protocol, Host and Port
*
* @param ipString a network endpoint in the format - '<PROTOCOL>://<HOST>:<PORT>'
* @return a map with keys "Protocol", "Host" & "Port" for the related values from the ipString
* @throws TransportHandlerException
*/
public static Map<String, String> getHostAndPort(String ipString)
throws TransportHandlerException {
Map<String, String> ipPortMap = new HashMap<String, String>();
String[] ipPortArray = ipString.split(":");
if (ipPortArray.length != 3) {
String errorMsg =
"The IP String - '" + ipString +
"' is invalid. It needs to be in format '<PROTOCOL>://<HOST>:<PORT>'.";
log.info(errorMsg);
throw new TransportHandlerException(errorMsg);
}
ipPortMap.put("Protocol", ipPortArray[0]);
ipPortMap.put("Host", ipPortArray[1].replace(File.separator, ""));
ipPortMap.put("Port", ipPortArray[2]);
return ipPortMap;
}
/**
* This method validates whether a specific IP Address is of IPv4 type
*
* @param ipAddress the IP Address which needs to be validated
* @return true if it is of IPv4 type and false otherwise
*/
public static boolean validateIPv4(String ipAddress) {
try {
if (ipAddress == null || ipAddress.isEmpty()) {
return false;
}
String[] parts = ipAddress.split("\\.");
if (parts.length != 4) {
return false;
}
for (String s : parts) {
int i = Integer.parseInt(s);
if ((i < 0) || (i > 255)) {
return false;
}
}
return !ipAddress.endsWith(".");
} catch (NumberFormatException nfe) {
log.warn("The IP Address: " + ipAddress + " could not " +
"be validated against IPv4-style");
return false;
}
}
public static Map<String, String> getInterfaceIPMap() throws TransportHandlerException {
Map<String, String> interfaceToIPMap = new HashMap<String, String>();
Enumeration<NetworkInterface> networkInterfaces;
String networkInterfaceName = "";
String ipAddress;
try {
networkInterfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException exception) {
String errorMsg =
"Error encountered whilst trying to get the list of network-interfaces";
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
try {
for (; networkInterfaces.hasMoreElements(); ) {
networkInterfaceName = networkInterfaces.nextElement().getName();
if (log.isDebugEnabled()) {
log.debug("Network Interface: " + networkInterfaceName);
log.debug("------------------------------------------");
}
Enumeration<InetAddress> interfaceIPAddresses = NetworkInterface.getByName(
networkInterfaceName).getInetAddresses();
for (; interfaceIPAddresses.hasMoreElements(); ) {
ipAddress = interfaceIPAddresses.nextElement().getHostAddress();
if (log.isDebugEnabled()) {
log.debug("IP Address: " + ipAddress);
}
if (TransportUtils.validateIPv4(ipAddress)) {
interfaceToIPMap.put(networkInterfaceName, ipAddress);
}
}
if (log.isDebugEnabled()) {
log.debug("------------------------------------------");
}
}
} catch (SocketException exception) {
String errorMsg =
"Error encountered whilst trying to get the IP Addresses of the network " +
"interface: " + networkInterfaceName;
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
return interfaceToIPMap;
}
/**
* Attempts to find a free port between the MIN_PORT_NUMBER(9000) and MAX_PORT_NUMBER(11000).
* Tries 'RANDOMLY picked' port numbers between this range up-until "randomAttempts" number of
* times. If still fails, then tries each port in descending order from the MAX_PORT_NUMBER
* whilst skipping already attempted ones via random selection.
*
* @param randomAttempts no of times to TEST port numbers picked randomly over the given range
* @return an available/free port
*/
public static synchronized int getAvailablePort(int randomAttempts) {
ArrayList<Integer> failedPorts = new ArrayList<Integer>(randomAttempts);
Random randomNum = new Random();
int randomPort = MAX_PORT_NUMBER;
while (randomAttempts > 0) {
randomPort = randomNum.nextInt(MAX_PORT_NUMBER - MIN_PORT_NUMBER) + MIN_PORT_NUMBER;
if (checkIfPortAvailable(randomPort)) {
return randomPort;
}
failedPorts.add(randomPort);
randomAttempts--;
}
randomPort = MAX_PORT_NUMBER;
while (true) {
if (!failedPorts.contains(randomPort) && checkIfPortAvailable(randomPort)) {
return randomPort;
}
randomPort--;
}
}
private static boolean checkIfPortAvailable(int port) {
ServerSocket tcpSocket = null;
DatagramSocket udpSocket = null;
try {
tcpSocket = new ServerSocket(port);
tcpSocket.setReuseAddress(true);
udpSocket = new DatagramSocket(port);
udpSocket.setReuseAddress(true);
return true;
} catch (IOException ex) {
// denotes the port is in use
} finally {
if (tcpSocket != null) {
try {
tcpSocket.close();
} catch (IOException e) {
/* not to be thrown */
}
}
if (udpSocket != null) {
udpSocket.close();
}
}
return false;
}
/**
* This is a utility method that creates and returns a HTTP connection object.
*
* @param urlString the URL pattern to which the connection needs to be created
* @return an HTTPConnection object which cn be used to send HTTP requests
* @throws TransportHandlerException if errors occur when creating the HTTP connection with
* the given URL string
*/
public static HttpURLConnection getHttpConnection(String urlString) throws
TransportHandlerException {
URL connectionUrl;
HttpURLConnection httpConnection;
try {
connectionUrl = new URL(urlString);
httpConnection = (HttpURLConnection) connectionUrl.openConnection();
} catch (MalformedURLException e) {
String errorMsg = "Error occured whilst trying to form HTTP-URL from string: " + urlString;
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, e);
} catch (IOException exception) {
String errorMsg = "Error occured whilst trying to open a connection to: " + urlString;
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
return httpConnection;
}
/**
* This is a utility method that reads and returns the response from a HTTP connection
*
* @param httpConnection the connection from which a response is expected
* @return the response (as a string) from the given HTTP connection
* @throws TransportHandlerException if any errors occur whilst reading the response from
* the connection stream
*/
public static String readResponseFromHttpRequest(HttpURLConnection httpConnection)
throws TransportHandlerException {
BufferedReader bufferedReader;
try {
bufferedReader = new BufferedReader(new InputStreamReader(
httpConnection.getInputStream(), StandardCharsets.UTF_8));
} catch (IOException exception) {
String errorMsg = "There is an issue with connecting the reader to the input stream at: " +
httpConnection.getURL();
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
String responseLine;
StringBuilder completeResponse = new StringBuilder();
try {
while ((responseLine = bufferedReader.readLine()) != null) {
completeResponse.append(responseLine);
}
} catch (IOException exception) {
String errorMsg = "Error occured whilst trying read from the connection stream at: " +
httpConnection.getURL();
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
try {
bufferedReader.close();
} catch (IOException exception) {
log.error("Could not succesfully close the bufferedReader to the connection at: " + httpConnection.getURL());
}
return completeResponse.toString();
}
private static final Log log = LogFactory.getLog(TransportUtils.class);
public static final int MIN_PORT_NUMBER = 9000;
public static final int MAX_PORT_NUMBER = 11000;
/**
* Given a server endpoint as a String, this method splits it into Protocol, Host and Port
*
* @param ipString a network endpoint in the format - '<PROTOCOL>://<HOST>:<PORT>'
* @return a map with keys "Protocol", "Host" & "Port" for the related values from the ipString
* @throws TransportHandlerException
*/
public static Map<String, String> getHostAndPort(String ipString)
throws TransportHandlerException {
Map<String, String> ipPortMap = new HashMap<String, String>();
String[] ipPortArray = ipString.split(":");
if (ipPortArray.length != 3) {
String errorMsg =
"The IP String - '" + ipString +
"' is invalid. It needs to be in format '<PROTOCOL>://<HOST>:<PORT>'.";
log.info(errorMsg);
throw new TransportHandlerException(errorMsg);
}
ipPortMap.put("Protocol", ipPortArray[0]);
ipPortMap.put("Host", ipPortArray[1].replace(File.separator, ""));
ipPortMap.put("Port", ipPortArray[2]);
return ipPortMap;
}
/**
* This method validates whether a specific IP Address is of IPv4 type
*
* @param ipAddress the IP Address which needs to be validated
* @return true if it is of IPv4 type and false otherwise
*/
public static boolean validateIPv4(String ipAddress) {
try {
if (ipAddress == null || ipAddress.isEmpty()) {
return false;
}
String[] parts = ipAddress.split("\\.");
if (parts.length != 4) {
return false;
}
for (String s : parts) {
int i = Integer.parseInt(s);
if ((i < 0) || (i > 255)) {
return false;
}
}
return !ipAddress.endsWith(".");
} catch (NumberFormatException nfe) {
log.warn("The IP Address: " + ipAddress + " could not " +
"be validated against IPv4-style");
return false;
}
}
public static Map<String, String> getInterfaceIPMap() throws TransportHandlerException {
Map<String, String> interfaceToIPMap = new HashMap<String, String>();
Enumeration<NetworkInterface> networkInterfaces;
String networkInterfaceName = "";
String ipAddress;
try {
networkInterfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException exception) {
String errorMsg =
"Error encountered whilst trying to get the list of network-interfaces";
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
try {
for (; networkInterfaces.hasMoreElements(); ) {
networkInterfaceName = networkInterfaces.nextElement().getName();
if (log.isDebugEnabled()) {
log.debug("Network Interface: " + networkInterfaceName);
log.debug("------------------------------------------");
}
Enumeration<InetAddress> interfaceIPAddresses = NetworkInterface.getByName(
networkInterfaceName).getInetAddresses();
for (; interfaceIPAddresses.hasMoreElements(); ) {
ipAddress = interfaceIPAddresses.nextElement().getHostAddress();
if (log.isDebugEnabled()) {
log.debug("IP Address: " + ipAddress);
}
if (TransportUtils.validateIPv4(ipAddress)) {
interfaceToIPMap.put(networkInterfaceName, ipAddress);
}
}
if (log.isDebugEnabled()) {
log.debug("------------------------------------------");
}
}
} catch (SocketException exception) {
String errorMsg =
"Error encountered whilst trying to get the IP Addresses of the network " +
"interface: " + networkInterfaceName;
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
return interfaceToIPMap;
}
/**
* Attempts to find a free port between the MIN_PORT_NUMBER(9000) and MAX_PORT_NUMBER(11000).
* Tries 'RANDOMLY picked' port numbers between this range up-until "randomAttempts" number of
* times. If still fails, then tries each port in descending order from the MAX_PORT_NUMBER
* whilst skipping already attempted ones via random selection.
*
* @param randomAttempts no of times to TEST port numbers picked randomly over the given range
* @return an available/free port
*/
public static synchronized int getAvailablePort(int randomAttempts) {
ArrayList<Integer> failedPorts = new ArrayList<Integer>(randomAttempts);
Random randomNum = new Random();
int randomPort = MAX_PORT_NUMBER;
while (randomAttempts > 0) {
randomPort = randomNum.nextInt(MAX_PORT_NUMBER - MIN_PORT_NUMBER) + MIN_PORT_NUMBER;
if (checkIfPortAvailable(randomPort)) {
return randomPort;
}
failedPorts.add(randomPort);
randomAttempts--;
}
randomPort = MAX_PORT_NUMBER;
while (true) {
if (!failedPorts.contains(randomPort) && checkIfPortAvailable(randomPort)) {
return randomPort;
}
randomPort--;
}
}
private static boolean checkIfPortAvailable(int port) {
ServerSocket tcpSocket = null;
DatagramSocket udpSocket = null;
try {
tcpSocket = new ServerSocket(port);
tcpSocket.setReuseAddress(true);
udpSocket = new DatagramSocket(port);
udpSocket.setReuseAddress(true);
return true;
} catch (IOException ex) {
// denotes the port is in use
} finally {
if (tcpSocket != null) {
try {
tcpSocket.close();
} catch (IOException e) {
/* not to be thrown */
}
}
if (udpSocket != null) {
udpSocket.close();
}
}
return false;
}
/**
* This is a utility method that creates and returns a HTTP connection object.
*
* @param urlString the URL pattern to which the connection needs to be created
* @return an HTTPConnection object which cn be used to send HTTP requests
* @throws TransportHandlerException if errors occur when creating the HTTP connection with
* the given URL string
*/
public static HttpURLConnection getHttpConnection(String urlString) throws
TransportHandlerException {
URL connectionUrl;
HttpURLConnection httpConnection;
try {
connectionUrl = new URL(urlString);
httpConnection = (HttpURLConnection) connectionUrl.openConnection();
} catch (MalformedURLException e) {
String errorMsg = "Error occured whilst trying to form HTTP-URL from string: " + urlString;
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, e);
} catch (IOException exception) {
String errorMsg = "Error occured whilst trying to open a connection to: " + urlString;
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
return httpConnection;
}
/**
* This is a utility method that reads and returns the response from a HTTP connection
*
* @param httpConnection the connection from which a response is expected
* @return the response (as a string) from the given HTTP connection
* @throws TransportHandlerException if any errors occur whilst reading the response from
* the connection stream
*/
public static String readResponseFromHttpRequest(HttpURLConnection httpConnection)
throws TransportHandlerException {
BufferedReader bufferedReader;
try {
bufferedReader = new BufferedReader(new InputStreamReader(
httpConnection.getInputStream(), StandardCharsets.UTF_8));
} catch (IOException exception) {
String errorMsg = "There is an issue with connecting the reader to the input stream at: " +
httpConnection.getURL();
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
String responseLine;
StringBuilder completeResponse = new StringBuilder();
try {
while ((responseLine = bufferedReader.readLine()) != null) {
completeResponse.append(responseLine);
}
} catch (IOException exception) {
String errorMsg = "Error occured whilst trying read from the connection stream at: " +
httpConnection.getURL();
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, exception);
}
try {
bufferedReader.close();
} catch (IOException exception) {
log.error(
"Could not succesfully close the bufferedReader to the connection at: " + httpConnection.getURL());
}
return completeResponse.toString();
}
}

@ -152,13 +152,10 @@ public abstract class XMPPTransportHandler implements TransportHandler<Message>
protected void connectToServer() throws TransportHandlerException {
try {
connection.connect();
log.info(String.format(
"Connection to XMPP Server at %1$s established successfully......", server));
log.info(String.format("Connection to XMPP Server at %1$s established successfully......", server));
} catch (XMPPException xmppExcepion) {
String errorMsg =
"Connection attempt to the XMPP Server at " + server + " via port " + port +
" failed.";
String errorMsg = "Connection attempt to the XMPP Server at " + server + " via port " + port + " failed.";
log.info(errorMsg);
throw new TransportHandlerException(errorMsg, xmppExcepion);
}
@ -180,28 +177,20 @@ public abstract class XMPPTransportHandler implements TransportHandler<Message>
try {
if (resource == null) {
connection.login(username, password);
log.info(String.format("Logged into XMPP Server at %1$s as user %2$s......",
server, username));
log.info(String.format("Logged into XMPP Server at %1$s as user %2$s......", server, username));
} else {
connection.login(username, password, resource);
log.info(String.format(
"Logged into XMPP Server at %1$s as user %2$s on resource %3$s......",
server, username, resource));
log.info(String.format("Logged into XMPP Server at %1$s as user %2$s on resource %3$s......",
server, username, resource));
}
} catch (XMPPException xmppException) {
String errorMsg =
"Login attempt to the XMPP Server at " + server + " with username - " +
username + " failed.";
log.info(errorMsg);
"Login attempt to the XMPP Server at " + server + " with username - " + username + " failed.";
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, xmppException);
}
} else {//TODO:: Log not required
String errorMsg =
"Not connected to XMPP-Server to attempt Login. Please 'connectToServer' " +
"before Login";
if (log.isDebugEnabled()) {
log.debug(errorMsg);
}
} else {
String errorMsg = "Not connected to XMPP-Server to attempt Login. Please 'connectToServer' before Login";
throw new TransportHandlerException(errorMsg);
}
}

@ -16,6 +16,7 @@
#
#[Device-Configurations]
server-name=WSO2IoTServer
owner=shabirmean
deviceId=t4ctwq8qfl11
device-name=SMEAN_t4ctwq8qfl11

@ -59,6 +59,8 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
return dataPushServiceHandler;
}
//TODO:: Terminate logs with a period
//TODO: Need to print exceptions
@Override
public void connect() {
final AgentManager agentManager = AgentManager.getInstance();
@ -67,23 +69,27 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
while (!isConnected()) {
try {
connectToQueue();
subscribeToQueue();
//TODO:: Terminate logs with a period
agentManager.updateAgentStatus("Connected to MQTT Queue");
} catch (TransportHandlerException e) {
log.warn(AgentConstants.LOG_APPENDER + "Connection to MQTT Broker at: " + mqttBrokerEndPoint +
" failed.\n Will retry in " + timeoutInterval + " milli-seconds.");
}
try{
subscribeToQueue();
agentManager.updateAgentStatus("Subscribed to MQTT Queue");
publishDeviceData();
} catch (TransportHandlerException e) {
log.warn(AgentConstants.LOG_APPENDER +
"Connection/Subscription to MQTT Broker at: " +
log.warn(AgentConstants.LOG_APPENDER + "Subscription to MQTT Broker at: " +
mqttBrokerEndPoint + " failed");
agentManager.updateAgentStatus("Subscription to broker failed.");
}
try {
Thread.sleep(timeoutInterval);
} catch (InterruptedException ex) {
//TODO: Need to print exception
log.error(AgentConstants.LOG_APPENDER +
"MQTT-Subscriber: Thread Sleep Interrupt Exception");
}
try {
Thread.sleep(timeoutInterval);
} catch (InterruptedException ex) {
log.error(AgentConstants.LOG_APPENDER + "MQTT: Connect-Thread Sleep Interrupt Exception.");
}
}
}
@ -215,8 +221,12 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
Runnable stopConnection = new Runnable() {
public void run() {
while (isConnected()) {
try {
if (dataPushServiceHandler != null) {
dataPushServiceHandler.cancel(true);
}
try {
closeConnection();
} catch (MqttException e) {

@ -79,17 +79,18 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
if (!isConnected()) {
try {
connectToServer();
} catch (TransportHandlerException e) {
log.warn(AgentConstants.LOG_APPENDER + "Connection to XMPP server at: " + server + " failed");
}
try {
loginToServer(username, password, resource);
agentManager.updateAgentStatus("Connected to XMPP Server");
setMessageFilterAndListener(xmppAdminJID, xmppDeviceJID, true);
publishDeviceData();
} catch (TransportHandlerException e) {
if (log.isDebugEnabled()) {
log.warn(AgentConstants.LOG_APPENDER +
"Connection/Login to XMPP server at: " + server + " failed");
}
log.warn(AgentConstants.LOG_APPENDER + "Login to XMPP server at: " + server + " failed");
agentManager.updateAgentStatus("No XMPP Account for Device");
}
}
}
@ -219,12 +220,15 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
Runnable stopConnection = new Runnable() {
public void run() {
if ( dataPushServiceHandler != null) {
if (dataPushServiceHandler != null) {
dataPushServiceHandler.cancel(true);
}
while (isConnected()) {
if (connectorServiceHandler != null) {
connectorServiceHandler.cancel(true);
}
while (isConnected()) {
closeConnection();
if (log.isDebugEnabled()) {

@ -36,10 +36,9 @@ public class AgentConstants {
public static final String PUSH_SIMULATION_DATA_PAYLOAD =
"{\"owner\":\"%s\",\"deviceId\":\"%s\",\"reply\":\"%s\",\"value\":\"%s\",\"isSimulated\":\"%s\",\"duration\":\"%s\",\"frequency\":\"%s\"}";
public static final String AGENT_CONTROL_APP_EP = "/firealarm-webapp";
public static final String DEVICE_DETAILS_PAGE_EP = "/store/pages/device/%s/%s";
public static final String DEVICE_ANALYTICS_PAGE_URL =
"/store/pages/analytics?deviceId=%s&deviceType=%s";
public static final String AGENT_CONTROL_APP_EP = "/devicemgt/device/%s?id=%s";
public static final String DEVICE_DETAILS_PAGE_EP = "/devicemgt/device/%s?id=%s";
public static final String DEVICE_ANALYTICS_PAGE_URL = "/devicemgt/analytics?deviceId=%s&deviceType=%s&deviceName=%s";
/* ---------------------------------------------------------------------------------------
HTTP Connection specific information for communicating with IoT-Server
--------------------------------------------------------------------------------------- */

@ -40,6 +40,7 @@ public class AgentManager {
private static final Log log = LogFactory.getLog(AgentManager.class);
private static AgentManager agentManager;
private String rootPath = "";
private boolean deviceReady = false;
private boolean isAlarmOn = false;
@ -82,7 +83,8 @@ public class AgentManager {
String analyticsPageContext = String.format(AgentConstants.DEVICE_ANALYTICS_PAGE_URL,
agentConfigs.getDeviceId(),
AgentConstants.DEVICE_TYPE);
AgentConstants.DEVICE_TYPE,
agentConfigs.getDeviceName());
String controlPageContext = String.format(AgentConstants.DEVICE_DETAILS_PAGE_EP,
AgentConstants.DEVICE_TYPE,
@ -102,9 +104,7 @@ public class AgentManager {
Map<String, String> xmppIPPortMap;
try {
xmppIPPortMap = TransportUtils.getHostAndPort(agentConfigs.getXmppServerEndpoint
());
xmppIPPortMap = TransportUtils.getHostAndPort(agentConfigs.getXmppServerEndpoint());
String xmppServer = xmppIPPortMap.get("Host");
int xmppPort = Integer.parseInt(xmppIPPortMap.get("Port"));
@ -120,12 +120,13 @@ public class AgentManager {
agentConfigs.getDeviceOwner(),
agentConfigs.getDeviceId());
TransportHandler httpCommunicator = new FireAlarmHTTPCommunicator();
TransportHandler mqttCommunicator = new FireAlarmMQTTCommunicator(
agentConfigs.getDeviceOwner(), agentConfigs.getDeviceId(),
agentConfigs.getMqttBrokerEndpoint(), mqttTopic);
// TransportHandler httpCommunicator = new FireAlarmHTTPCommunicator();
TransportHandler mqttCommunicator = new FireAlarmMQTTCommunicator(agentConfigs.getDeviceOwner(),
agentConfigs.getDeviceId(),
agentConfigs.getMqttBrokerEndpoint(),
mqttTopic);
agentCommunicator.put(AgentConstants.HTTP_PROTOCOL, httpCommunicator);
// agentCommunicator.put(AgentConstants.HTTP_PROTOCOL, httpCommunicator);
agentCommunicator.put(AgentConstants.MQTT_PROTOCOL, mqttCommunicator);
try {

@ -18,9 +18,9 @@
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;

@ -152,13 +152,10 @@ public abstract class XMPPTransportHandler implements TransportHandler<Message>
protected void connectToServer() throws TransportHandlerException {
try {
connection.connect();
log.info(String.format(
"Connection to XMPP Server at %1$s established successfully......", server));
log.info(String.format("Connection to XMPP Server at %1$s established successfully......", server));
} catch (XMPPException xmppExcepion) {
String errorMsg =
"Connection attempt to the XMPP Server at " + server + " via port " + port +
" failed.";
String errorMsg = "Connection attempt to the XMPP Server at " + server + " via port " + port + " failed.";
log.info(errorMsg);
throw new TransportHandlerException(errorMsg, xmppExcepion);
}
@ -180,28 +177,20 @@ public abstract class XMPPTransportHandler implements TransportHandler<Message>
try {
if (resource == null) {
connection.login(username, password);
log.info(String.format("Logged into XMPP Server at %1$s as user %2$s......",
server, username));
log.info(String.format("Logged into XMPP Server at %1$s as user %2$s......", server, username));
} else {
connection.login(username, password, resource);
log.info(String.format(
"Logged into XMPP Server at %1$s as user %2$s on resource %3$s......",
server, username, resource));
log.info(String.format("Logged into XMPP Server at %1$s as user %2$s on resource %3$s......",
server, username, resource));
}
} catch (XMPPException xmppException) {
String errorMsg =
"Login attempt to the XMPP Server at " + server + " with username - " +
username + " failed.";
log.info(errorMsg);
"Login attempt to the XMPP Server at " + server + " with username - " + username + " failed.";
log.error(errorMsg);
throw new TransportHandlerException(errorMsg, xmppException);
}
} else {//TODO:: Log not required
String errorMsg =
"Not connected to XMPP-Server to attempt Login. Please 'connectToServer' " +
"before Login";
if (log.isDebugEnabled()) {
log.debug(errorMsg);
}
} else {
String errorMsg = "Not connected to XMPP-Server to attempt Login. Please 'connectToServer' before Login";
throw new TransportHandlerException(errorMsg);
}
}

@ -16,6 +16,7 @@
#
#[Device-Configurations]
server-name=WSO2IoTServer
owner=shabirmean
deviceId=t4ctwq8qfl11
device-name=SMEAN_t4ctwq8qfl11

@ -121,8 +121,8 @@ public class VirtualFireAlarmService {
final VirtualFireAlarmXMPPConnector virtualFireAlarmXMPPConnector) {
this.virtualFireAlarmXMPPConnector = virtualFireAlarmXMPPConnector;
if (MqttConfig.getInstance().isEnabled()) {
Runnable mqttStarter = new Runnable() {
if (XmppConfig.getInstance().isEnabled()) {
Runnable xmppStarter = new Runnable() {
@Override
public void run() {
virtualFireAlarmXMPPConnector.initConnector();
@ -130,9 +130,9 @@ public class VirtualFireAlarmService {
}
};
Thread mqttStarterThread = new Thread(mqttStarter);
mqttStarterThread.setDaemon(true);
mqttStarterThread.start();
Thread xmppStarterThread = new Thread(xmppStarter);
xmppStarterThread.setDaemon(true);
xmppStarterThread.start();
} else {
log.warn("MQTT disabled in 'devicemgt-config.xml'. Hence, VirtualFireAlarmMQTTConnector not started.");
}
@ -144,7 +144,7 @@ public class VirtualFireAlarmService {
public void setVirtualFireAlarmMQTTConnector(
final VirtualFireAlarmMQTTConnector virtualFireAlarmMQTTConnector) {
this.virtualFireAlarmMQTTConnector = virtualFireAlarmMQTTConnector;
if (XmppConfig.getInstance().isEnabled()) {
if (MqttConfig.getInstance().isEnabled()) {
virtualFireAlarmMQTTConnector.connect();
} else {
log.warn("XMPP disabled in 'devicemgt-config.xml'. Hence, VirtualFireAlarmXMPPConnector not started.");

@ -71,42 +71,43 @@ public class VirtualFireAlarmXMPPConnector extends XMPPTransportHandler {
}
public void createXMPPAccountForDeviceType() {
boolean accountExists = false;
boolean accountExists;
XmppServerClient xmppServerClient = new XmppServerClient();
xmppServerClient.initControlQueue();
try {
accountExists = xmppServerClient.doesXMPPUserAccountExist(xmppVFireAlarmAdminUsername);
} catch (DeviceControllerException e) {
String errorMsg = "An error was encountered whilst trying to check whether Server XMPP account exists " +
"for device-type - " + VirtualFireAlarmConstants.DEVICE_TYPE;
log.error(errorMsg, e);
}
if (!accountExists) {
XmppAccount xmppAccount = new XmppAccount();
xmppAccount.setAccountName(xmppVFireAlarmAdminUsername);
xmppAccount.setUsername(xmppVFireAlarmAdminUsername);
xmppAccount.setPassword(V_FIREALARM_XMPP_PASSWORD);
xmppAccount.setEmail("");
try {
boolean xmppCreated = xmppServerClient.createXMPPAccount(xmppAccount);
if (!xmppCreated) {
log.warn("Server XMPP Account was not created for device-type - " +
VirtualFireAlarmConstants.DEVICE_TYPE +
". Check whether XMPP is enabled in \"devicemgt-config.xml\" & restart.");
} else {
log.info("Server XMPP Account [" + xmppVFireAlarmAdminUsername +
"] was not created for device-type - " + VirtualFireAlarmConstants.DEVICE_TYPE);
if (!accountExists) {
XmppAccount xmppAccount = new XmppAccount();
xmppAccount.setAccountName(xmppVFireAlarmAdminUsername);
xmppAccount.setUsername(xmppVFireAlarmAdminUsername);
xmppAccount.setPassword(V_FIREALARM_XMPP_PASSWORD);
xmppAccount.setEmail("");
try {
boolean xmppCreated = xmppServerClient.createXMPPAccount(xmppAccount);
if (!xmppCreated) {
log.warn("Server XMPP Account was not created for device-type - " +
VirtualFireAlarmConstants.DEVICE_TYPE +
". Check whether XMPP is enabled in \"devicemgt-config.xml\" & restart.");
} else {
log.info("Server XMPP Account [" + xmppVFireAlarmAdminUsername +
"] was not created for device-type - " + VirtualFireAlarmConstants.DEVICE_TYPE);
}
} catch (DeviceControllerException e) {
String errorMsg =
"An error was encountered whilst trying to create Server XMPP account for device-type - "
+ VirtualFireAlarmConstants.DEVICE_TYPE;
log.error(errorMsg, e);
}
} catch (DeviceControllerException e) {
String errorMsg =
"An error was encountered whilst trying to create Server XMPP account for device-type - "
+ VirtualFireAlarmConstants.DEVICE_TYPE;
log.error(errorMsg, e);
}
} catch (DeviceControllerException e) {
String errorMsg = "An error was encountered whilst trying to check whether Server XMPP account exists " +
"for device-type - " + VirtualFireAlarmConstants.DEVICE_TYPE + ".\n Check [devicemgt-config.xml]";
log.error(errorMsg, e);
}
}

@ -95,14 +95,9 @@ public class VirtualFireAlarmService {
@Context //injected response proxy supporting multiple thread
private HttpServletResponse response;
public static final String XMPP_PROTOCOL = "XMPP";
public static final String HTTP_PROTOCOL = "HTTP";
public static final String MQTT_PROTOCOL = "MQTT";
private VerificationManager verificationManager;
private VirtualFireAlarmMQTTConnector virtualFireAlarmMQTTConnector;
private VirtualFireAlarmXMPPConnector virtualFireAlarmXMPPConnector;
private ConcurrentHashMap<String, String> deviceToIpMap = new ConcurrentHashMap<>();
/**
* @param verificationManager

@ -47,6 +47,10 @@
<artifactId>org.wso2.carbon.device.mgt.iot.androidsense.api</artifactId>
<type>war</type>
</dependency>
<dependency>
<groupId>com.h2database.wso2</groupId>
<artifactId>h2-database-engine</artifactId>
</dependency>
</dependencies>
<build>
@ -134,6 +138,44 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<!-- Creating Android Sense Plugin Management schema -->
<id>create-android-sense-plugin-mgt-schema</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="########### Create Android Sense plugin Management H2 Schema ###########"/>
<property name="db.dir"
value="src/main/resources/database"/>
<property name="userid" value="wso2carbon"/>
<property name="password" value="wso2carbon"/>
<property name="dbURL"
value="jdbc:h2:file:${basedir}/${db.dir}/AndroidSenseDM_DB;DB_CLOSE_ON_EXIT=FALSE"/>
<sql driver="org.h2.Driver" url="${dbURL}" userid="${userid}"
password="${password}"
autocommit="true" onerror="continue">
<classpath refid="maven.dependency.classpath"/>
<classpath refid="maven.compile.classpath"/>
<classpath refid="maven.runtime.classpath"/>
<fileset file="${basedir}/src/main/resources/dbscripts/h2.sql"/>
</sql>
<echo message="##################### END ####################"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -10,4 +10,5 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/android_sense/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.androidsense_${feature.version}/agent/,target:${installFolder}/../../resources/sketches/android_sense/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.androidsense_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\

@ -47,6 +47,10 @@
<artifactId>org.wso2.carbon.device.mgt.iot.arduino.service.impl</artifactId>
<type>war</type>
</dependency>
<dependency>
<groupId>com.h2database.wso2</groupId>
<artifactId>h2-database-engine</artifactId>
</dependency>
</dependencies>
<build>
@ -137,6 +141,45 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<!-- Creating Arduino Plugin Management schema -->
<id>create-arduino-plugin-mgt-schema</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="########### Create Arduino plugin Management H2 Schema ###########"/>
<property name="db.dir"
value="src/main/resources/database"/>
<property name="userid" value="wso2carbon"/>
<property name="password" value="wso2carbon"/>
<property name="dbURL"
value="jdbc:h2:file:${basedir}/${db.dir}/ArduinoDM_DB;DB_CLOSE_ON_EXIT=FALSE"/>
<sql driver="org.h2.Driver" url="${dbURL}" userid="${userid}"
password="${password}"
autocommit="true" onerror="continue">
<classpath refid="maven.dependency.classpath"/>
<classpath refid="maven.compile.classpath"/>
<classpath refid="maven.runtime.classpath"/>
<fileset file="${basedir}/src/main/resources/dbscripts/h2.sql"/>
</sql>
<echo message="##################### END ####################"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -10,3 +10,4 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/jaggeryapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.arduino_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.arduino_${feature.version}/datasources/,target:${installFolder}/../../conf/datasources/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.arduino_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\

@ -32,7 +32,10 @@
<version>1.9.2-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>com.h2database.wso2</groupId>
<artifactId>h2-database-engine</artifactId>
</dependency>
</dependencies>
<build>
@ -123,6 +126,44 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<!-- Creating Digital Display Plugin Management schema -->
<id>create-digital-display-plugin-mgt-schema</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="########### Create Digital Display plugin Management H2 Schema ###########"/>
<property name="db.dir"
value="src/main/resources/database"/>
<property name="userid" value="wso2carbon"/>
<property name="password" value="wso2carbon"/>
<property name="dbURL"
value="jdbc:h2:file:${basedir}/${db.dir}/DigitalDisplayDM_DB;DB_CLOSE_ON_EXIT=FALSE"/>
<sql driver="org.h2.Driver" url="${dbURL}" userid="${userid}"
password="${password}"
autocommit="true" onerror="continue">
<classpath refid="maven.dependency.classpath"/>
<classpath refid="maven.compile.classpath"/>
<classpath refid="maven.runtime.classpath"/>
<fileset file="${basedir}/src/main/resources/dbscripts/h2.sql"/>
</sql>
<echo message="##################### END ####################"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

@ -8,3 +8,4 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.digitaldisplay_${feature.version}/datasources/,target:${installFolder}/../../conf/datasources/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/jaggeryapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.digitaldisplay_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.digitaldisplay_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\

@ -29,6 +29,10 @@
<artifactId>org.wso2.carbon.device.mgt.iot.droneanalyzer.api</artifactId>
<type>war</type>
</dependency>
<dependency>
<groupId>com.h2database.wso2</groupId>
<artifactId>h2-database-engine</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
@ -118,6 +122,45 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<!-- Creating Drone Analyser Plugin Management schema -->
<id>create-drone-analyzer-plugin-mgt-schema</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="########### Create Drone Analyser plugin Management H2 Schema ###########"/>
<property name="db.dir"
value="src/main/resources/database"/>
<property name="userid" value="wso2carbon"/>
<property name="password" value="wso2carbon"/>
<property name="dbURL"
value="jdbc:h2:file:${basedir}/${db.dir}/DroneAnalyzerDM_DB;DB_CLOSE_ON_EXIT=FALSE"/>
<sql driver="org.h2.Driver" url="${dbURL}" userid="${userid}"
password="${password}"
autocommit="true" onerror="continue">
<classpath refid="maven.dependency.classpath"/>
<classpath refid="maven.compile.classpath"/>
<classpath refid="maven.runtime.classpath"/>
<fileset file="${basedir}/src/main/resources/dbscripts/h2.sql"/>
</sql>
<echo message="##################### END ####################"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

@ -10,3 +10,4 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/jaggeryapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.droneanalyzer_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.droneanalyzer_${feature.version}/datasources/,target:${installFolder}/../../conf/datasources/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.droneanalyzer_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\

@ -52,6 +52,10 @@
<artifactId>org.wso2.carbon.device.mgt.iot.raspberrypi.controller.service.impl</artifactId>
<type>war</type>
</dependency>
<dependency>
<groupId>com.h2database.wso2</groupId>
<artifactId>h2-database-engine</artifactId>
</dependency>
</dependencies>
<build>
@ -151,6 +155,45 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<!-- Creating RaspberryPi Plugin Management schema -->
<id>create-raspberrypi-plugin-mgt-schema</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="########### Create RaspberryPi plugin Management H2 Schema ###########"/>
<property name="db.dir"
value="src/main/resources/database"/>
<property name="userid" value="wso2carbon"/>
<property name="password" value="wso2carbon"/>
<property name="dbURL"
value="jdbc:h2:file:${basedir}/${db.dir}/RaspberryPiDM_DB;DB_CLOSE_ON_EXIT=FALSE"/>
<sql driver="org.h2.Driver" url="${dbURL}" userid="${userid}"
password="${password}"
autocommit="true" onerror="continue">
<classpath refid="maven.dependency.classpath"/>
<classpath refid="maven.compile.classpath"/>
<classpath refid="maven.runtime.classpath"/>
<fileset file="${basedir}/src/main/resources/dbscripts/h2.sql"/>
</sql>
<echo message="##################### END ####################"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -10,3 +10,4 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/jaggeryapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.raspberrypi_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.raspberrypi_${feature.version}/datasources/,target:${installFolder}/../../conf/datasources/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.raspberrypi_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\

@ -54,6 +54,10 @@
<version>1.9.2-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>com.h2database.wso2</groupId>
<artifactId>h2-database-engine</artifactId>
</dependency>
</dependencies>
<build>
@ -194,6 +198,44 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<!-- Creating Virtual Firealarm Plugin Management schema -->
<id>create-virtual-firealarm-plugin-mgt-schema</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="########### Create Virtual Firealarm plugin Management H2 Schema ###########"/>
<property name="db.dir"
value="src/main/resources/database"/>
<property name="userid" value="wso2carbon"/>
<property name="password" value="wso2carbon"/>
<property name="dbURL"
value="jdbc:h2:file:${basedir}/${db.dir}/VirtualFireAlarmDM_DB;DB_CLOSE_ON_EXIT=FALSE"/>
<sql driver="org.h2.Driver" url="${dbURL}" userid="${userid}"
password="${password}"
autocommit="true" onerror="continue">
<classpath refid="maven.dependency.classpath"/>
<classpath refid="maven.compile.classpath"/>
<classpath refid="maven.runtime.classpath"/>
<fileset file="${basedir}/src/main/resources/dbscripts/h2.sql"/>
</sql>
<echo message="##################### END ####################"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -14,3 +14,4 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/jaggeryapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.virtualfirealarm_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.virtualfirealarm_${feature.version}/datasources/,target:${installFolder}/../../conf/datasources/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.virtualfirealarm_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\

@ -43,6 +43,10 @@
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
<artifactId>org.wso2.carbon.device.mgt.mobile.android</artifactId>
</dependency>
<dependency>
<groupId>com.h2database.wso2</groupId>
<artifactId>h2-database-engine</artifactId>
</dependency>
</dependencies>
<build>
@ -138,6 +142,45 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<!-- Creating ANDROID Mobile Plugin Management schema -->
<id>create-android-mobile-plugin-mgt-schema</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="########### Create ANDROID Mobile plugin Management H2 Schema ###########"/>
<property name="db.dir"
value="src/main/resources/database"/>
<property name="userid" value="wso2carbon"/>
<property name="password" value="wso2carbon"/>
<property name="dbURL"
value="jdbc:h2:file:${basedir}/${db.dir}/WSO2MobileAndroid_DB;DB_CLOSE_ON_EXIT=FALSE"/>
<sql driver="org.h2.Driver" url="${dbURL}" userid="${userid}"
password="${password}"
autocommit="true" onerror="continue">
<classpath refid="maven.dependency.classpath"/>
<classpath refid="maven.compile.classpath"/>
<classpath refid="maven.runtime.classpath"/>
<fileset file="${basedir}/src/main/resources/dbscripts/plugins/h2.sql"/>
</sql>
<echo message="##################### END ####################"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -4,3 +4,4 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/conf/mobile-config.xml,target:${installFolder}/../../conf/mobile-config.xml,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/dbscripts/plugins/,target:${installFolder}/../../../dbscripts/cdm/plugins/android,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\

@ -43,6 +43,10 @@
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
<artifactId>org.wso2.carbon.device.mgt.mobile.windows</artifactId>
</dependency>
<dependency>
<groupId>com.h2database.wso2</groupId>
<artifactId>h2-database-engine</artifactId>
</dependency>
</dependencies>
<build>
@ -138,6 +142,45 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<!-- Creating WINDOWS Mobile Plugin Management schema -->
<id>create-windows-mobile-plugin-mgt-schema</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="########### Create WINDOWS Mobile plugin Management H2 Schema ###########"/>
<property name="db.dir"
value="src/main/resources/database"/>
<property name="userid" value="wso2carbon"/>
<property name="password" value="wso2carbon"/>
<property name="dbURL"
value="jdbc:h2:file:${basedir}/${db.dir}/WSO2MobileWindows_DB;DB_CLOSE_ON_EXIT=FALSE"/>
<sql driver="org.h2.Driver" url="${dbURL}" userid="${userid}"
password="${password}"
autocommit="true" onerror="continue">
<classpath refid="maven.dependency.classpath"/>
<classpath refid="maven.compile.classpath"/>
<classpath refid="maven.runtime.classpath"/>
<fileset file="${basedir}/src/main/resources/dbscripts/h2.sql"/>
</sql>
<echo message="##################### END ####################"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -3,3 +3,4 @@ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../depl
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/dbscripts/plugins/,target:${installFolder}/../../../dbscripts/cdm/plugins/windows,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\

Loading…
Cancel
Save