ПредишенСледващото

В един момент, в един от проектите, е необходимо да изпратите SMS програмно чрез български GSM-модем с помощта на най-команди. Частта на сървъра на проекта се осъществява в Java, така че ще бъде за пример на този език. За тези, които се интересуват - добре дошли при среза.

Bit въвеждане на данни: COM-порт, а (RS232), GSM-модем Cinterion (Siemens) MC52i. Модемът работи с AT-команди.

Първата точка за решаване на проблема е да се намери начин да се сприятеляват с Java COM-порт. За щастие, търсене в Google почти веднага даде много удобна библиотека на Java-прост-сериен конектор и документация за него. Съответно, люлка библиотеката, да го свържете към проекта, създаване на клас, който ще работи с модем и пишат титлата


внос jssc.SerialPort;
внос jssc.SerialPortEvent;
внос jssc.SerialPortEventListener;
внос jssc.SerialPortException;

Библиотеката е свързан. Писане клас за модема


обществени клас SMSSender обществен SMSSender () <>

частен статично SerialPort serialPort;

публично статично булев smsSend (String SMS, String телефон, JspWriter навън) хвърля IOException

// конструктор Peredaom име порт
serialPort = нов SerialPort ( "COM1");
опитайте // Отваряне на пристанището
serialPort.openPort ();
// определят параметрите
serialPort.setParams (SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
// Ако искате да се отговори на отговорите на модема - виси на слушател и разбор отговори. Аз го пропуснете, който nuzhno- документация има
//serialPort.addEventListener(new PortReader (), SerialPort.MASK_RXCHAR);

върнете вярно;
>
улова (SerialPortException ех) out.println (предишен);
върнете невярна;
>

Така че ние сме отворени и веднага затвори връзката към COM порт. Сега, точно както руснакът да изпратите SMS. За да направите това, трябва да имате модем за комуникация PDU-формат. Съответно, първият модем конфигуриран да работи в този режим:

Следваща трябва да дойде командата

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

Сега пиша това е тялото на SMS в PDU-формат. При търсене на отговор, аз се завтече следните източници, които илюстрират заглавие (в Делфи код, но всичко е ясно)

Класиране и стойност байт глава ясно. Сега да преминем как да се кодира текста на съобщението. Тя трябва да предаде модем в UCS2 кодиран. В действителност е 7-битово кодиране на е обърнат. функция превръщане в UCS2 формат JAVA:


частни статични String StringToUSC2 (String текст) хвърля IOException String ул = "";

байт [] msgb = text.getBytes ( "UTF-16");

String msgPacked = "";
за (INT I = 2; и ако (b.length () <2) msgPacked += "0";
msgPacked + = б;
>

String msglenPacked = Integer.toHexString (msgPacked.length () / 2);

ако (msglenPacked.length () <2) str += "0";

ул + = msglenPacked;
ул + = msgPacked;

Е, тогава аз дам един пример за своя клас за изпращането на български SMS ап с обяснения:

внос jssc.SerialPort;
внос jssc.SerialPortEvent;
внос jssc.SerialPortEventListener;
внос jssc.SerialPortException;

// клас за изпращане на текстови съобщения

обществени клас SMSSender обществен SMSSender () <>

частен статично SerialPort serialPort;

// функция за конвертиране на текст SMS-ки в USC2 формат с дължина на съобщението (Return Value <длина пакета><пакет>)

частни статични String StringToUSC2 (String текст) хвърля IOException String ул = "";

байт [] msgb = text.getBytes ( "UTF-16");
// Конвертиране най SMS
String msgPacked = "";
за (INT I = 2; и ако (b.length () <2) msgPacked += "0";
msgPacked + = б;
>

// Дължината на получения пакет в подходящ формат
String msglenPacked = Integer.toHexString (msgPacked.length () / 2);
// Ако странно дължина - добавете в края 0
ако (msglenPacked.length () <2) str += "0";

// Форма низ с дължина и на тялото пакет
ул + = msglenPacked;
ул + = msgPacked;

// Получаване на дължината на съобщение
частен статично вътр getSMSLength (String SMS) възвръщаемост (sms.length () / 2 - 1);
>

публично статично булев smsSend (String SMS, String телефон, JspWriter навън) хвърля IOException

// конструктор Peredaom име порт
serialPort = нов SerialPort ( "COM1");
опитайте // Отваряне на пристанището
serialPort.openPort ();
// определят параметрите
serialPort.setParams (SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
//serialPort.addEventListener(new PortReader (), SerialPort.MASK_RXCHAR);

// Форма съобщение
String съобщение = "0011000B91" + reversePhone (телефон) + "0008A7" + StringToUSC2 (SMS);

// Запитване към устройство
овъгляване с = 0x0D; // връщане характер CR
ул String = "AT + CMGF = 0" + С;
serialPort.writeString (STR);
Thread.sleep (500); // На теория, тук е необходимо да се чака за модема за отговор, но ние се ограничи себе си просто чака половин секунда
// Чисто порт
serialPort.purgePort (serialPort.PURGE_RXCLEAR | serialPort.PURGE_TXCLEAR);
//out.println(str);
ул = "AT + CMGS =" + getSMSLength (съобщение) + С;
serialPort.writeString (STR);
Thread.sleep (500);
serialPort.purgePort (serialPort.PURGE_RXCLEAR | serialPort.PURGE_TXCLEAR);
//out.println(str);
с = 26; // символ CTRL + Z
serialPort.writeString (съобщение + в);
Thread.sleep (1000);

върнете вярно;
>
улова (SerialPortException ех) out.println (предишен);
върнете невярна;
> Улова (InterruptedException д) //out.println(e);
върнете невярна;
>

// клас четене отговорите. Реших да правя без него, но документацията за JSSC всичко е 🙂
/ * Private статичен клас PortReader изпълнява SerialPortEventListener

обществени невалидни serialEvent (SerialPortEvent събитие), ако (event.isRXCHAR () event.getEventValue ()> 0) // опитате получаване на отговор от страна на устройството, данните на процеса и т.н.
String данни = serialPort.readString (event.getEventValue ());
// Отново, изпратете вашето запитване
System.out.println ( "отговор" + данни);
>
улова (SerialPortException ех) System.out.println (предишен);
>
>
>
> * /
>

P.S>
Също така се използва в режим на PDU. reversPhone () метод може да бъде представено с четвъртия ред
String phonenumPDU = «»;
phonenum = phonenum + »F";
за (INT I = 1; и<12;i=i+2) phonenumPDU = phonenumPDU + phonenum.charAt(i+1) + phonenum.charAt(i);
>

Съгласен съм 🙂 Тази реализация е по-правилно, но аз когато писах - беше тръпка да го разберем с модем, така че този метод се прилага "vlobovuyu".

Подкрепете проекта - споделете линка, благодаря!