Появление новой всеохватывающей сети Internet of Things (IoT) теперь стало возможным в связи с развитием облачных вычислений. В IoT реальные объекты имеют виртуальное представление, что позволяет нам взаимодействовать с ними через Интернет. Соответствующие ресурсы в IoT предоставляются с помощью облачных вычислений. Связь устройств друг с другом и с Интернетом позволяет управлять своими данными удаленно.
Для этого требуются приложения, которые:
Давайте рассмотрим простой пример создания и развертывания веб-приложения, которое получает и визуализирует данные с датчика.
Второй шаг включает разработку Java приложения, которое будет получать информацию от датчика и визуализировать ее. Для этого случая нам понадобится два сервлета: один для получения данных от датчика и второй для ее визуализации.
Теперь вы за один шаг от того, чтобы увидеть, как ваше приложение получает и визуализирует данные с датчика.
Приложения такого типа предоставляют вам прямой и доступный способ загрузки показаний датчиков. Все, что вам нужно, это сетевой микроконтроллер, такой как Arduino, который может легко получить доступ к URL-адресам.
Очень важно, что Jelastic позволяет сконцентрироваться на функциональности приложения и не беспокоится о количестве одновременных запросов для обновления значений датчиков и настройке серверной среды для создания резервных копий ваших данных. Jelastic устраняет все дополнительные хлопоты и позволяет легко развертывать и масштабировать ваши приложения.
При подготовке использовалась статья Charalampos Doukas, автора книги «Arduino, Sensors and the Cloud», Using Jelastic for the Internet of Things.
Для этого требуются приложения, которые:
- предоставляют легкий, открытый и простой пользовательский интерфейс для обмена данными с устройствами;
- могут обрабатывать частые запросы многочисленных устройств, которые участвуют в сети IоT;
- могут легко расширяться для обеспечения новых функций.
Давайте рассмотрим простой пример создания и развертывания веб-приложения, которое получает и визуализирует данные с датчика.
Cоздание окружения на Jelastic
- Во-первых, вы должны создать и сконфигурировать окружение для вашего приложения. Для целей получения и визуализации данных с датчиков, нам понадобится сервер приложений (Tomcat 6) и сервера баз данных (MySQL 5.0)
Через несколько минут окружение будет создано. Также вы получите подтверждение на электронную почту, которое будет включать логин и пароль для вашей базы данных и ссылку на админ страницу MySQL. - Зайдите на админ страницу MySQL и создайте новую базу данных для данных датчика (не беспокойтесь о сортировке, мы будем использовать базу данных для обработки простых данных).
Для этого примера нам понадобится две таблицы: одна для информации о датчике (например, название или id) и вторая для данных с датчика.
Вы также можете создать нового пользователя со всеми привилегиями, но для нашего случая можно воспользоваться дефолтовым пользователем.
Теперь ваше окружение полноценное и сконфигурированное под ваше приложение и ваши данные.
Создание Java сервлета
Второй шаг включает разработку Java приложения, которое будет получать информацию от датчика и визуализировать ее. Для этого случая нам понадобится два сервлета: один для получения данных от датчика и второй для ее визуализации.
- Запустите Eclipce IDE и создайте новый Dynamic Web Project (например, JelasticSensorArduino), выберите Tomcat в качестве сервера приложений.
- Откройте проект и создайте соответствующий класс сервлета (предлагаем вам создать иерархию пакета первой). Создайте класс JelasticArduinoServlet и добавьте в него следующий код:
- import java.io.IOException;
- import java.util.Date;
- import javax.servlet.http.*;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- @SuppressWarnings("serial")
- public class JelasticArduinoServlet extends HttpServlet {
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws IOException {
- resp.setContentType("text/plain");
- //Retrieve the sensor name and value from the GET requests
- String SensorName = req.getParameter("sensor");
- String value = req.getParameter("value");
- //Create a new date object for retrieving date values from the server
- Date date = new Date();
- //Create the connection string to the MySQL DB hosted on Jelastic
- String url="jdbc:mysql://mysql.arduinocloud.jelastic.servint.net:3306/sensor";
- //User your credential for connecting to the DB
- String user = "DBUSERNAME";
- String password = "DBPASSWORD";
- Connection con = null;
- Statement st = null;
- ResultSet rs = null;
- boolean exists = false;
- int id = 0;
- //Make the connection to the server
- try {
- con = DriverManager.getConnection(url, user, password);
- st = con.createStatement();
- //Execute the query for retrieving the sensor id
- rs = st.executeQuery("SELECT id from sensor where name='"+SensorName+"';");
- if (rs.next()) {
- exists = true;
- id = rs.getInt(1);
- }
- //If there is an ID for the given sensor name update the value
- if(exists) {
- st.executeUpdate("Insert into data(sensorid, date, value) VALUES ('"+id+"','"+date+"','"+value+"');");
- }
- resp.getWriter().println("Sensor data updated!");
- con.close();
- }catch (Exception ex) {
- resp.getWriter().println(ex.toString());
- }
- }
- }
Это код сервлета, обрабатывающего обновления значений датчика. Он может быть вызван с помощью Arduino или вашего браузера:
http://server.ip/servletname?sensor=sensorname&value=sensorvalue
Сначала он обращается к базе данных датчика и получает ее ID. Затем ID обновляет данные таблицы соответственно. - Давайте перейдем к JSP-файлу, который будет визуализировать данные с датчика. JSP-файл должен быть создан в папке WebContent в структуре вашего проекта. Создайте новый файл (например, sensorgraph.jsp):
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <%@ page import="java.util.List" %>
- <%@ page import="java.sql.Connection" %>
- <%@ page import="java.sql.DriverManager" %>
- <%@ page import="java.sql.ResultSet" %>
- <%@ page import="java.sql.Statement" %>
- <html>
- <head>
- <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
- <script type="text/javascript" src="www.google.com/jsapi"></script>
- <script type="text/javascript">
- google.load("visualization", "1", {packages:["corechart"]});
- google.setOnLoadCallback(drawChart);
- function drawChart() {
- var data = new google.visualization.DataTable();
- data.addColumn('string', 'Time');
- data.addColumn('number', '<%=request.getParameter("sensor")%>');
- <%
- int counter=1;
- String SensorName = request.getParameter("sensor");
- if (SensorName == null) {
- SensorName = "temp";
- }
- String url = "jdbc:mysql://mysql.arduinocloud.jelastic.servint.net:3306/sensor";
- String user = "DBUSERNAME";
- String password = "DBPASSWORD";
- Connection con = null;
- Statement st = null;
- ResultSet rs = null;
- boolean exists = false;
- int id = 0;
- try {
- con = DriverManager.getConnection(url, user, password);
- st = con.createStatement();
- rs = st.executeQuery("SELECT id from sensor where name='"+SensorName+"';");
- if (rs.next()) {
- exists = true;
- id = rs.getInt(1);
- }
- if(exists) {
- rs = st.executeQuery("SELECT value from data where sensorid="+id);
- while (rs.next()) {
- counter++;
- }
- %>
- data.addRows(<%=counter%>);
- <%
- rs = st.executeQuery("SELECT date, value from data where sensorid="+id);
- counter = 0;
- while (rs.next()) {
- %>
- data.setValue(<%=counter%>, 0, '<%= rs.getString(1) %>');
- data.setValue(<%=counter%>, 1, <%= rs.getString(2) %>);
- <%
- counter++;
- }
- }
- con.close();
- }catch (Exception ex) {ex.printStackTrace();}
- %>
- var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
- chart.draw(data, {width: 600, height: 240, title: 'My Arduino <%=SensorName%> Sensor Readings'});
- }
- </script>
- </head>
- <body>
- <p></p>
- <div id="chart_div"></div>
- </body>
- </html>
JSP использует Google Chart API для визуализации данных (элемент chart_div). Для этого ему необходимо заполнить поля данными для диаграммы путем извлечения значений из базы данных.
Вы могли заметить, что в начале HTML код использует определенный стиль CSS, включенный в файл с именем main.css. Чтобы включить такой файл в ваш проект, просто создайте новую папку в разделе WebContent/stylesheets вашего проекта.
body {
font-family: Verdana, Helvetica, sans-serif;
background-color: #FFFFFF;
}
- И последнее, но не менее важное, вам необходимо отредактировать файл web.xml (папка WEB-INF) и создать соответствующий сервлет «имя-отображение», чтобы связать сервлеты с JSP-файлом. Замените содержимое web.xml на следующее:
- <?xml version=“1.0″ encoding=“UTF-8″?>
- <web-app xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns=“http://java.sun.com/xml/ns/javaee” xmlns:web=“http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” id=“WebApp_ID” version=“2.5″>
- <display-name>JelasticSensorArduino</display-name>
- <servlet>
- <servlet-name>JelasticArduino</servlet-name>
- <servlet-class>doukas.jelastic.arduino.JelasticArduinoServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>JelasticArduino</servlet-name>
- <url-pattern>/jelasticarduino</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>sensorgraph.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>add</servlet-name>
- <servlet-class>doukas.jelastic.arduino.JelasticArduinoServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>add</servlet-name>
- <url-pattern>/add</url-pattern>
- </servlet-mapping>
- </web-app>
Развертывание и тестирование приложения
Теперь вы за один шаг от того, чтобы увидеть, как ваше приложение получает и визуализирует данные с датчика.
- Во-первых, вам понадобится создать WAR архив с вашими сервлетами, чтобы развернуть приложение в окружении Jelastic.
- Загрузите ваш WAR-архив в Deployment Manager.
- Разверните ваше приложение.
- Еще одна маленькая деталь: необходимо загрузить mysql-connector jar файл.
- Давайте протестируем наше приложение.
Для этого проследуйте по следующей ссылке (sensorcloud – имя окружения):
http://sensorcloud.jelastic.servint.net/add?sensor=temp&value=20
Вы увидите сообщение: «Sensor data updated!». Если это не так (очень маловероятно, если вы выполнили все шаги правильно), увидите сообщение об ошибке. Добавьте несколько значений датчика, используя предыдущую ссылку. Потом перейдите по следующей ссылке, чтобы увидеть визуализированные данные в виде графика:
http://sensorcloud.jelastic.servint.net/?sensor=temp
- Теперь осталось добавить код который будет считывать данные с датчика и сохранять их в базу.
Следующий Си код считывает данные с датчика подключенного по Ethernet и сохраняет их в базе вашего окружения:
- #include <SPI.h>
- #include <Ethernet.h>
- // Enter a MAC address for your controller below.
- byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
- char serverName[] ="sensorcloud.jelastic.servint.net";
- // Initialize the Ethernet client library
- EthernetClient client;
- void setup() {
- // start the serial library:
- Serial.begin(57600);
- //start the Ethernet connection:
- if (Ethernet.begin(mac) == 0) {
- Serial.println("Failed to configure Ethernet using DHCP");
- }
- }
- void loop() {
- int temperature = analogRead(0);
- String s = String(temperature,DEC);
- if (client.connect(serverName, 80)) {
- // Make a HTTP request:
- client.println("GET /add?sensor=temp&value="+s+" HTTP/1.0");
- client.println("Host:sensorcloud.jelastic.servint.net");
- client.println();
- client.stop();
- }
- delay(60000);
- }
Приложения такого типа предоставляют вам прямой и доступный способ загрузки показаний датчиков. Все, что вам нужно, это сетевой микроконтроллер, такой как Arduino, который может легко получить доступ к URL-адресам.
Очень важно, что Jelastic позволяет сконцентрироваться на функциональности приложения и не беспокоится о количестве одновременных запросов для обновления значений датчиков и настройке серверной среды для создания резервных копий ваших данных. Jelastic устраняет все дополнительные хлопоты и позволяет легко развертывать и масштабировать ваши приложения.
При подготовке использовалась статья Charalampos Doukas, автора книги «Arduino, Sensors and the Cloud», Using Jelastic for the Internet of Things.