Добрый день,
Хочу поделиться опытом создания приложения, которое отслеживает замыкание контактов
7 и 8 на обычном китайском USB-COM переходнике (RTS – CTS). И если такое событие происходит, то отправляет мне на мэйл письмо.
Изначально цель была – сделать датчик протекания воды. Что потом делать с замыканием – по большому счёту неважно, но мне захотелось сделать отправку состояния на почту.
Поскольку я учусь Java на JavaRush, то и инструмент был выбран соответствующий – IntelliJ Idea.
Конечно, почта – это не смс, но для смс нужна работа с ком портом, а здесь мы освоим очень хороший инструмент для этого, и когда я разберусь с 3g модемом, то можно будет добавить немного информации, хотя её и так много в интернете.
Итак, не будем заостряться на железячной части, рассмотрим сам разъём
Контакт 5 – это земля, контакт 7 – это RTS – в нашей программе на нём всегда будет висеть 1 ( + 9 В относительно контакта 5), и контакт 8 – это вход – он подтянут 5килоомным резистором к 0 В.
Надо сказать, что когда наша программа не запущена, то на 7 контакте будет напряжение -9 В, это надо учитывать, когда будете брать датчик разлива, на 8 контакт подать можно, но бывают устройства, которые горят от отрицательных напряжений.
Итак, чтобы проверить, как наша программа будет работать, после её запуска замкнём контакт 7 на контакт 8, наша программа раз в секунду будет отслеживать такое событие и присылать письмо с текстом «Лужа», а потом разомкнём – и программа отошлёт письмо с текстом «Нет лужи».
Итак, чтобы установить JDK и IntelliJ Idea, выучить какие-то основы java, можно воспользоваться первыми уроками JavaRush.ru. Мы же начнём с создания нового проекта.
Сразу оговорюсь, что если у вас уже открыт проект, то при создании нового проекта будет предложено открыть его в новом окне – очень удобно. (Когда-то я пробовал работать с eclipse, там все проекты открываются в одном окне).
Дальше я привожу много картинок без описания – и так всё понятно.
![Замыкаем контакты и получаем письмо - 6]()
Вот начиная со следующей картинки очень интересно – я всегда видел этот мавен, но боялся что-то с ним сделать, а тут попробовал – и всё оказалось очень просто – если тебе нужна библиотека – ты просто вводишь её название, ищешь последнюю версию и скачиваешь. Смотрите.
Мы скачиваем библиотеку http://habrahabr.ru/post/133766/ jSSC
И библиотеку javax:mail – она я так понимаю была удалена из стандартного списка библиотек, но в мавене её легко скачать.
Нажимаем OK и библиотеки добавились. Вуаля :)
Набираем текст
Вот что у меня в почте
Теперь хочется иметь приложение. Здесь пока я изучал материал – я плакал – неужели надо создавать манифест файл, класспатч прописывать… страшное дело. У skipy всё это описано. Я чуть руки не опустил, но у меня на кухне в ящиках стола уже перевелись давно перфокарты, и у нас есть идея, поэтому делал jar архив я очень просто – смотрите.
Ставим галочку Build on Make – после очередной компиляции в idea в папке out будет результат.
Всё – jar в ауте, и настолько самостоятелен, что во всяком случае, в пределах машины копируется и запускается откуда угодно.
Но если его просто запустить, то письма отсылаться будут, а консоли не будет, и убить процесс можно только найдя такую запись в диспетчере задач.
Переносим в другую папку, оттуда он тоже запускается, и делаем bat файл
Запускаем батник
Вот и консоль, а по Ctrl+C – запрос на выход.
Но если запустить jar два раза, то второй раз не удастся- ком порт будет занят. Поэтому желательно сделать сингл аппликэйшн.
Ставим себе Launch4j, запускаем, выбираем аутпут файл – любое имя, должно быть exe в основном окошке, затем наш jar, выбираем консольный тип, минимальную версию 1.4.0
Указываем, что нам не надо много экземпляров
Нажимаем на кнопку с шестерёнкой
Нас спрашивают, где хранить временные файлы, мы отвечаем
Гуд лак – всё готово. Запускаем экзешник.
Правда, в диспетчере он будет всё равно исполняться под javaw
Письма идут
Такие дела, мне понравилась джава.
PS. Лучше всего для слежения за протечкой подойдёт механическая штука
http://www.vse-sam.ru/10249-mexanicheskaya-sistema-dlya-kontrolya-i-predotvrashheniya-protechki-vody.html
PPS. Вывод в консоль обрушивает программу через какое-то количество строк, поэтому если вдруг вы повторите такой алгоритм, то не забудьте отключить вывод в консоль.
















comRun.java
1 package ru.example.comTest.Test1;
2
3 import jssc.*;
4
5 import java.io.UnsupportedEncodingException;
6 import java.util.Properties;
7 import javax.mail.*;
8 import javax.mail.internet.*;
9
10 /**
11 * Created by ipolma on 8/12/2014.
12 */
13
14 public class comRun {
15
16
17 private static SerialPort serialPort;
18
19 public static void main(String[] args) {
20
21
22 String[] retPorts = SerialPortList.getPortNames();
23 //for (String port: retPorts){System.out.println(port);}
24
25 serialPort = new SerialPort(retPorts[1]);//"COM4"); указываем второй порт
26 System.out.println(serialPort.getPortName());
27 try {
28 //Открываем порт
29 if (serialPort.isOpened()) serialPort.closePort(); //Здесь бывает ситуация Busy, которую не обработаешь - только если ожидать
30 serialPort.openPort();
31 //Выставляем параметры
32 serialPort.setParams(SerialPort.BAUDRATE_9600,
33 SerialPort.DATABITS_8,
34 SerialPort.STOPBITS_1,
35 SerialPort.PARITY_NONE);
36 //Включаем аппаратное управление потоком
37 serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN |
38 SerialPort.FLOWCONTROL_RTSCTS_OUT);
39
40 int tempData0 = 0;
41
42 while(true){
43 Thread.sleep(1000);
44 int[] data = serialPort.getLinesStatus();//readString(event.getEventValue());
45 //7 и 8 контакты замыкаются - 1010
46 //разомкнуты - 0010
47 //7 и 6 контакты замыкаются - 0110
48 //data[0] - 12 В на 8 (CTS)
49 //data[1] - 12 В на 6 (DCE)
50 //serialPort.setDTR(status); //Меняется напряжение только на 4 контакте - но и это хорошо
51 //serialPort.setRTS(status); // На 7 не меняется- можно это использовать как выход +-7В.
52
53 if (data[0] == 1){
54 tempData0 = 1;
55 sendEmail("Лужа");
56 System.out.println("1");
57 }
58 if (data[0] == 0 && tempData0 == 1){
59 tempData0 =0;
60 System.out.println("0");
61 sendEmail("Нет лужи");
62 }
63 }
64 }
65 catch (SerialPortException ex) {
66 System.out.println(ex);
67 }
68 catch (InterruptedException ty){}
69
70 }
71
72 private static void sendEmail(String text){
73
74 try {
75 // Создаем адреса отправителя и прлучателя
76 InternetAddress from = new InternetAddress("*****@yandex.ru", "From");
77 InternetAddress to = new InternetAddress("****@****.ru", "To");
78 // Далее создаем т.н. транспорт с определенными параметрами, который
79 // будет "заниматься" отправкой сообщения
80 Properties props = new Properties();
81 // Тип протокола, адрес сервера и номер порта
82 props.put("mail.transport.protocol", "smtp");
83 props.put("mail.smtp.host", "smtp.yandex.ru");
84 props.put("mail.smtp.port", "25");
85 Session session = Session.getDefaultInstance(props);
86 Transport transport = session.getTransport();
87 // Теперь создаем сообщение
88 MimeMessage message = new MimeMessage(session);
89 message.setText(text, "utf-8");
90 message.setFrom(from);
91 message.setRecipient(Message.RecipientType.TO, to);
92 message.setSubject("Тема", "utf-8");
93 // При подключении указываем параметры для smtp сервера: логин и пароль
94 transport.connect("*****@yandex.ru", "**Password***");
95 transport.sendMessage(message, new Address[]{to});
96 transport.close();
97 } catch (UnsupportedEncodingException ex) {
98 ex.printStackTrace();
99 } catch (NoSuchProviderException ex) {
100 ex.printStackTrace();
101 } catch (MessagingException ex) {
102 ex.printStackTrace();
103 }
104 }
105
106 }
107
Ставим существующие адреса и пароли (кстати, интересно, что в помощи на яндексе про смтп написано про 465 порт, а в интернете я нашёл 25 порт- и это оказалось верно).
Запускаем на выполнение. Замыкаем контакты 7 и 8, через три секунды отпускаем 1 – контакты замкнуты, отсылается письмо «Лужа», 0 – контакты разомкнуты – отсылается письмо «Лужи нет»




























ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Приятно встретить на этом сайте «олдскульщика», который и в железе разбирается ;)
www.terraelectronica.ru/catalog_info.php?CODE=1184952
на таком habrahabr.ru/post/160745/ процессоре
поставляются с Linux или android.
Вот на них и на телефоны за 1000 р я ориентируюсь.