Buon pomeriggio, vorrei condividere la mia esperienza nella creazione di un'applicazione che monitora la chiusura dei pin 7 e 8 su un normale adattatore USB-COM cinese (RTS - CTS). E se si verifica un evento del genere, mi invia un'e-mail.
Inizialmente, l'obiettivo era realizzare un sensore del flusso d'acqua. Cosa fare in seguito con la chiusura non è, nel complesso, importante, ma volevo inviare lo stato all'ufficio postale. Dato che sto imparando Java utilizzando JavaRush, è stato scelto lo strumento appropriato: IntelliJ Idea. Naturalmente, la posta non è un SMS, ma gli SMS richiedono di lavorare con una porta com, e qui impareremo un ottimo strumento per questo, e quando avrò capito il modem 3G, posso aggiungere alcune informazioni, anche se c'è già un molto su Internet. Quindi, non concentriamoci sulla parte hardware, diamo un'occhiata al connettore stesso
: il pin 5 è terra, il pin 7 è RTS - nel nostro programma ce ne sarà sempre 1 appeso (+ 9 V rispetto al pin 5) e il pin 8 è l'ingresso - viene portato su 0 V da una resistenza da 5 kiloohm. Va detto che quando il nostro programma non è in esecuzione, la tensione sul pin 7 sarà -9 V, questo deve essere tenuto in considerazione quando si prendi un sensore di versamento, puoi applicarlo al pin 8, ma ci sono dispositivi che bruciano per tensioni negative. Quindi, per verificare come funzionerà il nostro programma, dopo averlo avviato, chiuderemo il contatto 7 con il contatto 8, il nostro programma monitorerà tale evento una volta al secondo e invierà una lettera con il testo "Pozzanghera", quindi la aprirà - e il programma invierà una lettera con il testo "Pozzanghera". Non c'è nessuna pozzanghera." Quindi, per installare JDK e IntelliJ Idea e apprendere alcune nozioni di base su Java, puoi utilizzare le prime lezioni di JavaRush.ru. Inizieremo creando un nuovo progetto. Permettimi subito di prenotare che se hai già un progetto aperto, quando crei un nuovo progetto ti verrà chiesto di aprirlo in una nuova finestra - molto conveniente. (Una volta ho provato a lavorare con Eclipse, dove tutti i progetti si aprono in un'unica finestra). Successivamente fornisco molte immagini senza descrizioni, quindi tutto è chiaro.
A partire dall'immagine successiva, è molto interessante: ho sempre visto questo esperto, ma avevo paura di farci qualcosa, ma poi l'ho provato - e tutto si è rivelato molto semplice - se hai bisogno di una libreria, basta inserisci il suo nome, cerca la versione più recente e scarica. Aspetto. Scarichiamo la libreria http://habrahabr.ru/post/133766/ jSSC E la libreria javax:mail: a quanto ho capito, è stata rimossa dall'elenco standard delle librerie, ma è facile da scaricare in Maven.
Fare clic su OK e le librerie verranno aggiunte. Voilà :)
Digita il testo
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 не меняется- можно это использовать How выход +-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 // Создаем address отправителя и прлучателя 76 InternetAddress from = new InternetAddress("*****@yandex.ru", "From"); 77 InternetAddress to = new InternetAddress("****@****.ru", "To"); 78 // Далее создаем т.н. транспорт с определенными параметрами, который 79 // будет "заниматься" отправкой messages 80 Properties props = new Properties(); 81 // Тип протокола, address serverа и номер порта 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 serverа: логин и пароль 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
Imposta gli indirizzi e le password esistenti (a proposito, è interessante che nell'aiuto di Yandex su smtp sia scritto sulla porta 465, ma su Internet ho trovato la porta 25 - e questo si è rivelato corretto ). Iniziamo l'esecuzione. Chiudiamo i contatti 7 e 8, dopo tre secondi rilasciamo 1 – i contatti sono chiusi, viene inviata la lettera “Pozzanghera”, 0 – i contatti sono aperti – viene inviata la lettera “No Puddle”, ecco cosa c'è nella mia
posta
Ora voglio avere una domanda. Qui, mentre studiavo il materiale, ho pianto: è davvero necessario creare un file manifest, registrare una patch di classe... una cosa terribile. Skipy descrive tutto questo. Stavo quasi per arrendermi, ma molto tempo fa nei cassetti della scrivania della mia cucina non c'erano le schede perforate e abbiamo avuto un'idea, quindi ho creato un archivio di barattoli in modo molto semplice: guarda.
Seleziona la casella Build on Make: dopo la successiva compilazione in idea, il risultato sarà nella cartella out.
Tutto è barattolo, ed è così indipendente che, in ogni caso, all'interno della macchina viene copiato e lanciato da qualunque posto.
Ma se lo esegui semplicemente, le lettere verranno inviate, ma non ci sarà la console e potrai interrompere il processo solo trovando tale voce nel task manager.
Lo trasferiamo in un'altra cartella, da lì si avvia anche e creiamo un file bat.
Avviamo il file batch
. Ecco la console e usando Ctrl + C - una richiesta per uscire.
Ma se esegui il jar due volte, la seconda volta non funzionerà: la porta com sarà occupata. Si consiglia pertanto di presentare un'unica domanda. Installiamo Launch4j, lanciamolo, selezioniamo il file di output - qualsiasi nome, dovrebbe essere exe nella finestra principale, poi il nostro jar, selezioniamo il tipo di console, versione minima 1.4.0 Indichiamo che non abbiamo bisogno di molte copie
Clicca
su pulsante con l'ingranaggio
Ci viene chiesto dove archiviare i file temporanei, rispondiamo
Good Lak: è tutto pronto. Lanciamo l'eseguibile.
È vero, nel dispatcher verrà comunque eseguito sotto Javaw.
Le lettere stanno arrivando.
Cose del genere, mi è piaciuto Java. PS. La migliore soluzione meccanica per monitorare le perdite è http://www.vse-sam.ru/10249-mexanicheskaya-sistema-dlya-kontrolya-i-predotvrashheniya-protechki-vody.html PPS. L'output della console blocca il programma dopo un certo numero di righe, quindi se ripeti improvvisamente questo algoritmo, non dimenticare di disabilitare l'output della console.
GO TO FULL VERSION