SMS az orosz at-parancsok (a példát a java) - programozó kiságy

Egy ponton, az egyik a projektek szükségessé vált szoftver küldeni SMS-orosz GSM-modem segítségével AT-parancsokat. A szerver része a projekt megvalósítása Java, így lesz egy példát ezen a nyelven. Azok számára, akiket érdekel - Üdvözlöm a vágás.

Bites bemeneti adat: a COM-kiszolgáló port (RS232), GSM-modem Cinterion (Siemens) MC52i. A modem AT-parancsokkal.

Az első pont a probléma megoldásának az volt, hogy megtalálja a módját, hogy a barátok Java COM port. Szerencsére keresés a Google szinte azonnal adott egy nagyon kényelmes könyvtár java-egyszerű soros csatlakozót és dokumentáció is. Ennek megfelelően a swing könyvtár, csatlakoztassa azt a projektet, hozzon létre egy osztályt, amely együtt fog működni a modem és írni a címet


import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

A könyvtár van csatlakoztatva. Írásban Class modemhez


public class SMSSender nyilvános SMSSender () <>

private static soros port soros port;

public static boolean smsSend (String sms, karakterlánc telefon, JspWriter ki) dob IOException

// konstruktor Peredaom port neve
soros port = új soros port ( "COM1");
próbálja // nyitni a portot
serialPort.openPort ();
// állítsa be a paramétereket
serialPort.setParams (SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
// Ha azt szeretnénk, hogy válaszoljon a modem válaszok - lógni figyelő és elemezni válaszokat. Azt kihagyja, aki nuzhno- dokumentációt
//serialPort.addEventListener(new PortReader (), SerialPort.MASK_RXCHAR);

return true;
>
catch (SerialPortException ex) out.println (ex);
return false;
>

Így már nyitott és azonnal lezárta a kapcsolatot, hogy a COM portot. Márpedig, ahogyan az orosz küldeni SMS-t. Ehhez szükség van egy modem kommunikál PDU-formátumban. Rendre egy első modem konfigurálva, hogy ebben az üzemmódban:

Következő jöjjön a parancsot

AT + CMGS =<тело смс><Символ CTRL+Z>

Most írom ezt a testet az SMS PDU-formátumban. Ha keres választ, rohantam a következő forrásokból, amelyek szemléltetik a főcím (a Delphi kódot, de minden világos)

Rangsor és érték bájtos fejlécet világos. Lépjünk tovább, hogyan kell kódolni az üzenet szövegét. Meg kell továbbítani egy modemet UCS2-kódolt. Valójában ez egy 7 bites kódolás invertált. konverziós funkció UCS2-formátumban JAVA:


privát static String StringToUSC2 (String text) dob IOException string str = "";

byte [] msgb = text.getBytes ( "UTF-16");

Karakterlánc msgPacked = "";
A (int i = 2; i if (b.length () <2) msgPacked += "0";
msgPacked + = b;
>

Karakterlánc msglenPacked = Integer.toHexString (msgPacked.length () / 2);

if (msglenPacked.length () <2) str += "0";

str + = msglenPacked;
str + = msgPacked;

Nos, akkor adok egy példát a kategóriájában, hogy küldjön SMS orosz app magyarázat:

import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

// Class SMS üzeneteket

public class SMSSender nyilvános SMSSender () <>

private static soros port soros port;

// funkció átalakítására szöveges SMS-ki a USC2 formátumú üzenet hossza (visszatérési érték <длина пакета><пакет>)

privát static String StringToUSC2 (String text) dob IOException string str = "";

byte [] msgb = text.getBytes ( "UTF-16");
// konvertálása a legtöbb SMS
Karakterlánc msgPacked = "";
A (int i = 2; i if (b.length () <2) msgPacked += "0";
msgPacked + = b;
>

// A hossza a kapott csomagot a megfelelő formátumban
Karakterlánc msglenPacked = Integer.toHexString (msgPacked.length () / 2);
// Ha páratlan hosszúságú - add végén 0
if (msglenPacked.length () <2) str += "0";

// Form húr hossza és a csomagolás testén
str + = msglenPacked;
str + = msgPacked;

// Az üzenet hossza
private static int getSMSLength (String sms) return (sms.length () / 2 - 1);
>

public static boolean smsSend (String sms, karakterlánc telefon, JspWriter ki) dob IOException

// konstruktor Peredaom port neve
soros port = új soros port ( "COM1");
próbálja // nyitni a portot
serialPort.openPort ();
// állítsa be a paramétereket
serialPort.setParams (SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
//serialPort.addEventListener(new PortReader (), SerialPort.MASK_RXCHAR);

// Forma üzenetet
String message = "0011000B91" + reversePhone (telefon) + "0008A7" + StringToUSC2 (sms);

// Üzenet a készülék
char c = 0x0D; // kocsi vissza karakter CR
String str = "AT + cMGF = 0" + c;
serialPort.writeString (str);
Thread.sleep (500); // Elméletileg itt meg kell várni a válaszra modem, de mi megelégszünk csak arra vár, fél másodperc
// tiszta kikötő
serialPort.purgePort (serialPort.PURGE_RXCLEAR | serialPort.PURGE_TXCLEAR);
//out.println(str);
str = "AT + CMGS =" + getSMSLength (üzenet) + c;
serialPort.writeString (str);
Thread.sleep (500);
serialPort.purgePort (serialPort.PURGE_RXCLEAR | serialPort.PURGE_TXCLEAR);
//out.println(str);
c = 26; // Symbol CTRL + Z
serialPort.writeString (üzenet + c);
Thread.sleep (1000);

return true;
>
catch (SerialPortException ex) out.println (ex);
return false;
> Fogás (InterruptedException e) //out.println(e);
return false;
>

// osztály olvassa a válaszokat. Elhatároztam, hogy nélküle, de a dokumentációt JSSC minden 🙂
/ * Saját statikus osztály PortReader végrehajtja SerialPortEventListener

public void serialEvent (SerialPortEvent esemény), ha (event.isRXCHAR () event.getEventValue ()> 0) próbálja // kapjunk választ a eszköz, eljárás adatok, stb
Karakterlánc adatok = serialPort.readString (event.getEventValue ());
// Ismét küldje el a vizsgálatot
System.out.println ( "válasz:" + adatok);
>
catch (SerialPortException ex) System.out.println (ex);
>
>
>
> * /
>

P.S>
Én is használtam a PDU módban. reversPhone () módszer képviseli a 4. sorban
Húr phonenumPDU = «»;
phonenum = phonenum + »F»;
A (int i = 1; i<12;i=i+2) phonenumPDU = phonenumPDU + phonenum.charAt(i+1) + phonenum.charAt(i);
>

Egyetértek 🙂 Ez a megvalósítás több helyes, de én amikor írtam - volt izgalom, hogy megértse a modem, így ezt a módszert „vlobovuyu”.