JavaRush /Java блог /Архив info.javarush /Замыкаем контакты и получаем письмо
Izhak
22 уровень
Москва

Замыкаем контакты и получаем письмо

Статья из группы Архив info.javarush
Добрый день, Хочу поделиться опытом создания приложения, которое отслеживает замыкание контактов 7 и 8 на обычном китайском USB-COM переходнике (RTS – CTS). И если такое событие происходит, то отправляет мне на мэйл письмо. Изначально цель была – сделать датчик протекания воды. Что потом делать с замыканием – по большому счёту неважно, но мне захотелось сделать отправку состояния на почту. Поскольку я учусь Java на JavaRush, то и инструмент был выбран соответствующий – IntelliJ Idea. Конечно, почта – это не смс, но для смс нужна работа с ком портом, а здесь мы освоим очень хороший инструмент для этого, и когда я разберусь с 3g модемом, то можно будет добавить немного информации, хотя её и так много в интернете. Итак, не будем заостряться на железячной части, рассмотрим сам разъём DB9F Контакт 5 – это земля, контакт 7 – это RTS – в нашей программе на нём всегда будет висеть 1 ( + 9 В относительно контакта 5), и контакт 8 – это вход – он подтянут 5килоомным резистором к 0 В. Надо сказать, что когда наша программа не запущена, то на 7 контакте будет напряжение -9 В, это надо учитывать, когда будете брать датчик разлива, на 8 контакт подать можно, но бывают устройства, которые горят от отрицательных напряжений. Итак, чтобы проверить, как наша программа будет работать, после её запуска замкнём контакт 7 на контакт 8, наша программа раз в секунду будет отслеживать такое событие и присылать письмо с текстом «Лужа», а потом разомкнём – и программа отошлёт письмо с текстом «Нет лужи». Итак, чтобы установить JDK и IntelliJ Idea, выучить какие-то основы java, можно воспользоваться первыми уроками JavaRush.ru. Мы же начнём с создания нового проекта. Сразу оговорюсь, что если у вас уже открыт проект, то при создании нового проекта будет предложено открыть его в новом окне – очень удобно. (Когда-то я пробовал работать с eclipse, там все проекты открываются в одном окне). Дальше я привожу много картинок без описания – и так всё понятно. Замыкаем контакты и получаем письмо - 1 Замыкаем контакты и получаем письмо - 2 Замыкаем контакты и получаем письмо - 2 Замыкаем контакты и получаем письмо - 4 Замыкаем контакты и получаем письмо - 3 Замыкаем контакты и получаем письмо - 6Замыкаем контакты и получаем письмо - 4 Замыкаем контакты и получаем письмо - 8 Замыкаем контакты и получаем письмо - 5 Вот начиная со следующей картинки очень интересно – я всегда видел этот мавен, но боялся что-то с ним сделать, а тут попробовал – и всё оказалось очень просто – если тебе нужна библиотека – ты просто вводишь её название, ищешь последнюю версию и скачиваешь. Смотрите. Мы скачиваем библиотеку http://habrahabr.ru/post/133766/ jSSC И библиотеку javax:mail – она я так понимаю была удалена из стандартного списка библиотек, но в мавене её легко скачать. Замыкаем контакты и получаем письмо - 6 Замыкаем контакты и получаем письмо - 11 Замыкаем контакты и получаем письмо - 7 Замыкаем контакты и получаем письмо - 13 Замыкаем контакты и получаем письмо - 8 Нажимаем OK и библиотеки добавились. Вуаля :) Замыкаем контакты и получаем письмо - 9 Набираем текст 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 – контакты разомкнуты – отсылается письмо «Лужи нет» Замыкаем контакты и получаем письмо - 10 Вот что у меня в почте Замыкаем контакты и получаем письмо - 17 Замыкаем контакты и получаем письмо - 11 Замыкаем контакты и получаем письмо - 19 Теперь хочется иметь приложение. Здесь пока я изучал материал – я плакал – неужели надо создавать манифест файл, класспатч прописывать… страшное дело. У skipy всё это описано. Я чуть руки не опустил, но у меня на кухне в ящиках стола уже перевелись давно перфокарты, и у нас есть идея, поэтому делал jar архив я очень просто – смотрите. Замыкаем контакты и получаем письмо - 12 Замыкаем контакты и получаем письмо - 21 Замыкаем контакты и получаем письмо - 13 Ставим галочку Build on Make – после очередной компиляции в idea в папке out будет результат. Замыкаем контакты и получаем письмо - 14 Всё – jar в ауте, и настолько самостоятелен, что во всяком случае, в пределах машины копируется и запускается откуда угодно. Замыкаем контакты и получаем письмо - 15 Но если его просто запустить, то письма отсылаться будут, а консоли не будет, и убить процесс можно только найдя такую запись в диспетчере задач. Замыкаем контакты и получаем письмо - 16 Переносим в другую папку, оттуда он тоже запускается, и делаем bat файл Замыкаем контакты и получаем письмо - 17 Замыкаем контакты и получаем письмо - 27 Запускаем батник Замыкаем контакты и получаем письмо - 18 Замыкаем контакты и получаем письмо - 29 Вот и консоль, а по Ctrl+C – запрос на выход. Замыкаем контакты и получаем письмо - 19 Замыкаем контакты и получаем письмо - 31 Но если запустить jar два раза, то второй раз не удастся- ком порт будет занят. Поэтому желательно сделать сингл аппликэйшн. Ставим себе Launch4j, запускаем, выбираем аутпут файл – любое имя, должно быть exe в основном окошке, затем наш jar, выбираем консольный тип, минимальную версию 1.4.0 Замыкаем контакты и получаем письмо - 20 Замыкаем контакты и получаем письмо - 33 Замыкаем контакты и получаем письмо - 21 Замыкаем контакты и получаем письмо - 35 Указываем, что нам не надо много экземпляров Замыкаем контакты и получаем письмо - 22 Замыкаем контакты и получаем письмо - 37 Нажимаем на кнопку с шестерёнкой Замыкаем контакты и получаем письмо - 23 Нас спрашивают, где хранить временные файлы, мы отвечаем Замыкаем контакты и получаем письмо - 24 Замыкаем контакты и получаем письмо - 40 Гуд лак – всё готово. Запускаем экзешник. Замыкаем контакты и получаем письмо - 25 Правда, в диспетчере он будет всё равно исполняться под javaw Замыкаем контакты и получаем письмо - 26 Письма идут Замыкаем контакты и получаем письмо - 43 Такие дела, мне понравилась джава. PS. Лучше всего для слежения за протечкой подойдёт механическая штука http://www.vse-sam.ru/10249-mexanicheskaya-sistema-dlya-kontrolya-i-predotvrashheniya-protechki-vody.html PPS. Вывод в консоль обрушивает программу через какое-то количество строк, поэтому если вдруг вы повторите такой алгоритм, то не забудьте отключить вывод в консоль.
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Sant9Iga Уровень 41
14 августа 2014
круто)
blacky Уровень 23
14 августа 2014
Вставь подкат, а то пост очень длинный. Вроде, этот тег:
<cut>
EvIv Уровень 30
14 августа 2014
А можно и не управлять потоком COM и проверять замыкание 2 и 3 контактов периодической отправкой какого-то сообщения и проверкой, вернулось ли оно же. Если вернулось — вход замкнут на выход (2 и 3 замкнуты), если не вернулось, значит нет =)