org.wso2.carbon.device.mgt.iot.services.sensebot.SenseBotControllerService.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.device.mgt.iot.services.sensebot.SenseBotControllerService.java

Source

/*
 * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.wso2.carbon.device.mgt.iot.services.sensebot;

import org.apache.commons.httpclient.HttpStatus;
import org.apache.log4j.Logger;
import org.wso2.carbon.device.mgt.iot.services.DeviceControllerService;
import org.wso2.carbon.device.mgt.iot.services.DeviceJSON;

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

//@Path(value = "/FireAlarmController")
public class SenseBotControllerService {

    private static Logger log = Logger.getLogger(SenseBotControllerService.class);
    private static final Map<String, String> deviceIPList = new HashMap<String, String>();

    private static HttpURLConnection httpConn;
    private static final String URL_PREFIX = "http://";
    private static final String FORWARD_URL = "/move/F";
    private static final String BACKWARD_URL = "/move/B";
    private static final String LEFT_URL = "/move/L";
    private static final String RIGHT_URL = "/move/R";
    private static final String STOP_URL = "/move/S";

    /*    Service to switch "ON" and "OFF" the FireAlarm bulb
           Called by an external client intended to control the FireAlarm bulb */
    @Path("/forward")
    @POST
    public String moveForward(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId,
            @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) {

        String result = null;
        result = sendCommand(deviceIp, deviceServerPort, FORWARD_URL);
        return result;
    }

    /*    Service to read the temperature from the FireAlarm temperature sensor
               Called by an external client intended to get the current temperature */
    @Path("/backward")
    @POST
    public String moveBackward(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId,
            @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) {
        String result = null;
        result = sendCommand(deviceIp, deviceServerPort, BACKWARD_URL);
        return result;
    }

    /*    Service to toggle the FireAlarm fan between "ON" and "OFF"
           Called by an external client intended to control the FireAlarm fan */
    @Path("/left")
    @POST
    public String turnLeft(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId,
            @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) {
        String result = null;
        result = sendCommand(deviceIp, deviceServerPort, LEFT_URL);
        return result;
    }

    @Path("/right")
    @POST
    public String turnRight(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId,
            @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) {
        String result = null;
        result = sendCommand(deviceIp, deviceServerPort, RIGHT_URL);
        return result;
    }

    @Path("/stop")
    @POST
    public String stop(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId,
            @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) {
        String result = null;
        result = sendCommand(deviceIp, deviceServerPort, STOP_URL);
        return result;
    }

    /*    Service to push all the sensor data collected by the FireAlarm
       Called by the FireAlarm device  */
    @Path("/pushsensordata")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String pushAlarmData(final DeviceJSON dataMsg, @Context HttpServletResponse response) {
        String result = null;

        String sensorValues = dataMsg.value; //TEMP-PIR-SONAR-LDR
        log.info("Recieved Sensor Data Values: " + sensorValues);

        String sensors[] = sensorValues.split(":");

        if (sensors.length == 4) {
            String temperature = sensors[0];
            String motion = sensors[1];
            String sonar = sensors[2];
            String light = sensors[3];

            if (sonar.equals("-1")) {
                sonar = "No Object";
            }

            sensorValues = "Temperature:" + temperature + "C\t\tMotion:" + motion + "\tSonar:" + sonar + "\tLight:"
                    + light;
            log.info(sensorValues);

            result = DeviceControllerService.pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId,
                    System.currentTimeMillis(), "DeviceData", temperature, "TEMP", response);

            if (response.getStatus() != HttpStatus.SC_ACCEPTED) {
                return result;
            }

            result = DeviceControllerService.pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId,
                    System.currentTimeMillis(), "DeviceData", motion, "MOTION", response);

            if (response.getStatus() != HttpStatus.SC_ACCEPTED) {
                return result;
            }

            if (!sonar.equals("No Object")) {
                result = DeviceControllerService.pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId,
                        System.currentTimeMillis(), "DeviceData", sonar, "SONAR", response);

                if (response.getStatus() != HttpStatus.SC_ACCEPTED) {
                    return result;
                }
            }

            result = DeviceControllerService.pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId,
                    System.currentTimeMillis(), "DeviceData", light, "LIGHT", response);

        } else {
            response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
            return "Invalid data stream format. Needs to be \"TEMP:PIR:SONAR:LDR\"";
        }

        return result;
    }

    @Path("/pushtempdata")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String pushTempData(final DeviceJSON dataMsg, @Context HttpServletResponse response) {
        String result = null;

        String temperature = dataMsg.value; //TEMP-PIR-SONAR-LDR
        log.info("Recieved Tenperature Data Value: " + temperature + " degrees C");

        result = DeviceControllerService.pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId,
                System.currentTimeMillis(), "DeviceData", temperature, "TEMP", response);

        return result;
    }

    @Path("/pushpirdata")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String pushPIRData(final DeviceJSON dataMsg, @Context HttpServletResponse response) {
        String result = null;

        String motion = dataMsg.value; //TEMP-PIR-SONAR-LDR
        log.info("Recieved PIR (Motion) Sensor Data Value: " + motion);

        result = DeviceControllerService.pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId,
                System.currentTimeMillis(), "DeviceData", motion, "MOTION", response);

        return result;
    }

    @Path("/pushsonardata")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String pushSonarData(final DeviceJSON dataMsg, @Context HttpServletResponse response) {
        String result = null;

        String sonar = dataMsg.value; //TEMP-PIR-SONAR-LDR

        if (sonar.equals("-1")) {
            log.info("Recieved a 'No Obstacle' Sonar value. (Means there are no abstacles within 30cm)");
        } else {
            log.info("Recieved Sonar Sensor Data Value: " + sonar + " cm");

            result = DeviceControllerService.pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId,
                    System.currentTimeMillis(), "DeviceData", sonar, "SONAR", response);

            if (response.getStatus() != HttpStatus.SC_ACCEPTED) {
                return result;
            }
        }

        return result;
    }

    @Path("/pushlightdata")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String pushlightData(final DeviceJSON dataMsg, @Context HttpServletResponse response) {
        String result = null;

        String light = dataMsg.value; //TEMP-PIR-SONAR-LDR
        log.info("Recieved LDR (Light) Sensor Data Value: " + light);

        result = DeviceControllerService.pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId,
                System.currentTimeMillis(), "DeviceData", light, "LIGHT", response);

        return result;
    }

    private String sendCommand(String deviceIp, int deviceServerPort, String motionType) {

        if (deviceServerPort == 0) {
            deviceServerPort = 80;
        }

        String urlString = URL_PREFIX + deviceIp + ":" + deviceServerPort + motionType;
        log.info(urlString);

        String result = null;
        URL url = null;
        int responseCode = 200;

        try {
            url = new URL(urlString);
        } catch (MalformedURLException e) {
            log.error("Invalid URL: " + urlString);
        }
        try {
            httpConn = (HttpURLConnection) url.openConnection();
        } catch (IOException e) {
            log.error("Error Connecting to HTTP Endpoint at: " + urlString);
        }

        try {
            httpConn.setRequestMethod(HttpMethod.GET);
            httpConn.setRequestProperty("User-Agent", "WSO2 Carbon Server");
            responseCode = httpConn.getResponseCode();
            result = "" + responseCode + HttpStatus.getStatusText(responseCode) + "(No reply from Robot)";

            log.info("\nSending 'GET' request to URL : " + urlString);
            log.info("Response Code : " + responseCode);
        } catch (ProtocolException e) {
            log.error("Protocol mismatch exception occured whilst trying to 'GET' resource");
        } catch (IOException e) {
            log.error(
                    "Error occured whilst reading return code from server. This could be because the server did not return anything");
            result = "" + responseCode + " " + HttpStatus.getStatusText(responseCode) + "(No reply from Robot)";
            return result;
        }

        return result;
    }

}