JavaRush /Java блог /Random UA /Замикаємо контакти та отримуємо лист
Izhak
22 рівень
Москва

Замикаємо контакти та отримуємо лист

Стаття з групи Random UA
Доброго дня, Хочу поділитися досвідом створення програми, яка відстежує замикання контактів 7 і 8 на звичайному китайському USB-COM-перехіднику (RTS – CTS). І якщо така подія відбувається, то надсилає мені на мейл листа. Спочатку мета була зробити датчик протікання води. Що потім робити із замиканням - за великим рахунком неважливо, але мені захотілося зробити відправлення стану на пошту. Оскільки я навчаюсь Java на JavaRush, то й інструмент був обраний відповідний - IntelliJ Idea. Звичайно, пошта - це не смс, але для смс потрібна робота з комп'ютером, а тут ми освоїмо дуже хороший інструмент для цього, і коли я розберуся з 3g модемом, то можна буде додати трохи інформації, хоча її і так багато в інтернеті. Отже, не будемо загострюватися на залізничній частині, розглянемо сам роз'єм DB9F . підтягнутий 5кілоомним резистором до 0 В. Треба сказати, що коли наша програма не запущена, то на 7 контакті буде напруга -9 В, це треба враховувати, коли братимете датчик розливу, на 8 контакт подати можна, але бувають пристрої, які горять від негативних напруг. Отже, щоб перевірити, як наша програма буде працювати, після її запуску замкнемо контакт 7 на контакт 8, наша програма раз на секунду відстежуватиме таку подію і надсилатиме лист з текстом «Лужа», а потім розімкнемо – і програма відішле лист з текстом « Нема калюжі». Отже, щоб встановити JDK та IntelliJ Idea, вивчити якісь основи java можна скористатися першими уроками JavaRush.ru. Ми ж почнемо зі створення нового проекту. Відразу зазначу, що якщо у вас вже відкритий проект, то при створенні нового проекту буде запропоновано відкрити його у новому вікні – дуже зручно. (Колись я пробував працювати з eclipse, там всі проекти відкриваються в одному вікні). Далі я наводжу багато картинок без опису – і так зрозуміло. Замикаємо контакти та отримуємо лист - 1 Замикаємо контакти та отримуємо лист - 2 Замикаємо контакти та отримуємо лист - 2 Замикаємо контакти та отримуємо лист - 4 Замикаємо контакти та отримуємо лист - 3 Замикаємо контакти та отримуємо лист - 6 Замикаємо контакти та отримуємо лист - 4 Замикаємо контакти та отримуємо лист - 8 Замикаємо контакти та отримуємо лист - 5 Ось починаючи з наступної картинки дуже цікаво – я завжди бачив цей мавен, але боявся щось з ним зробити, а тут спробував – і все виявилося дуже просто – якщо тобі потрібна бібліотека – ти просто вводиш її назву, шукаєш останню версію та завантажуєш. Дивіться. Ми бібліотеку 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. Найкраще для спостереження за протіканням підійде механічна штука PPS. Виведення в консоль обрушує програму через якусь кількість рядків, тому якщо раптом ви повторите такий алгоритм, то не забудьте вимкнути виведення в консоль.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ