📄 smstools.java
字号:
// Useful tools for coding and decoding SMS
//
// file: SMSTools.java
// used by: Msg.java
//
// For comments see header of SMS.java.
//---------------------------------------------------------------------------------------
package com.zjjzl.comm.at;
class SMSTools {
/**
* Convert a char array to a string
* @param test character array
* @return string
*/
public static String convertCharArray2String(char[] chararray) {
int i, l;
String text = new String();
l = chararray.length;
for (i = 0; i < l; i++) {
text = text + chararray[i];
} // for
return text;
} // convertChar2String
/**
* Create the main part part of a PDU, for sending via AT commands to
* the mobile phone. The mobile phone complete this part of a PDU with
* some data of the mobile phone and sends it then to the base station.
* @param number dialing number
* @param numbertype national/international dialing number
* @param message message to send (SMS)
* @return PDU
*/
public static byte[] getPDUPart(String number, boolean numbertype, String message) {
byte[] pdu;
byte[] no = convertDialNumber(number);
byte[] msg = compress(convertUnicode2GSM(message));
int l = no.length;
int m = msg.length;
pdu = new byte[4 + l + 4 + m];
pdu[0] = 0x11; // message flags
pdu[1] = 0x00; // message reference number with default value
pdu[2] = (byte)number.length(); // set length of dialing number
if (numbertype = SMS.TOA_NATIONAL)
pdu[3] = (byte)0x81; // indicator for a national number
else
pdu[3] = (byte)0x91; // indicator for a international number
System.arraycopy(no, 0, pdu, 4, l); // set dialing number
pdu[4 + l] = 0x00; // protocol identifier with GSM 03.40 default value
pdu[4 + l + 1] = 0x00; // data coding scheme, use GSM 03.38 character set (= default value)
pdu[4 + l + 2] = (byte)0xAA; // message validity period = 4 days
// message (= SMS content)
pdu[4 + l + 3] = (byte)message.length(); // set length of message
System.arraycopy(msg, 0, pdu, 4 + l + 4, m); // set message
return pdu;
} // getPDUPart
/**
* Convert a dialing number into the GSM format
* @param number dialing number
* @return coded dialing number
*/
public static byte[] convertDialNumber(String number) {
int l = number.length();
int j = 0; // index in addr
int n; // length of converted dial number
byte[] data;
// calculate length of converted dialing number
n = l / 2;
if (l % 2 != 0) {
n++;
}
data = new byte[n];
for (int i = 0; i < n; i++) {
switch (number.charAt(j)) {
case '0': data[i] += 0x00; break;
case '1': data[i] += 0x01; break;
case '2': data[i] += 0x02; break;
case '3': data[i] += 0x03; break;
case '4': data[i] += 0x04; break;
case '5': data[i] += 0x05; break;
case '6': data[i] += 0x06; break;
case '7': data[i] += 0x07; break;
case '8': data[i] += 0x08; break;
case '9': data[i] += 0x09; break;
} // switch
if (j + 1 < l) {
switch (number.charAt(j + 1)) {
case '0': data[i] += 0x00; break;
case '1': data[i] += 0x10; break;
case '2': data[i] += 0x20; break;
case '3': data[i] += 0x30; break;
case '4': data[i] += 0x40; break;
case '5': data[i] += 0x50; break;
case '6': data[i] += 0x60; break;
case '7': data[i] += 0x70; break;
case '8': data[i] += 0x80; break;
case '9': data[i] += 0x90; break;
} // switch
} // if
else {
data[i] += 0xF0;
} // else
j += 2;
} // for
return data;
} // convertDialNumber
/**
* Convert the address field (dialing number) from the GSM format
* @param number dialing number
* @return decoded dialing number
*/
public static String decodeAddressField(String number) {
int len; // length of originating adress
int n; // length of converted dial number
String s, orgAdr="";
s = number.substring(0, 2); // get raw length [digits] of originating adress
// System.out.println("s="+s);
len = Integer.parseInt(s, 16); // calculate length [digits] of originating adress
// System.out.println("number="+number);
number = number.substring(2, number.length());
System.out.println("number="+number);
s = number.substring(0, 2); // get raw length [digits] of originating adress
if (s.compareTo("91") == 0) {
orgAdr = "+";
number = number.substring(2, number.length());
} // if
//----- digit swap procedure for the number
n = 0;
if (len % 2 != 0) {
number = number.substring(0, number.length()-1); // shorten number in case of wrong number format
} // if
do {
orgAdr += number.substring(n+1, n+2) + number.substring(n, n+1);
n += 2;
} while (n < number.length());
return orgAdr;
} // decodeAddressField
/**
* Convert a Unicode text string into the GSM standard alphabet
* @param msg text string in ASCII
* @return text string in GSM standard alphabet
*/
public static byte[] convertUnicode2GSM(String msg) {
byte[] data = new byte[msg.length()];
for (int i = 0; i < msg.length(); i++) {
switch (msg.charAt(i)) {
case '@': data[i] = 0x00; break;
case '$': data[i] = 0x02; break;
case '\n': data[i] = 0x0A; break;
case '\r': data[i] = 0x0D; break;
case '_': data[i] = 0x11; break;
case '?': data[i] = 0x1E; break;
case ' ': data[i] = 0x20; break;
case '!': data[i] = 0x21; break;
case '\"': data[i] = 0x22; break;
case '#': data[i] = 0x23; break;
case '%': data[i] = 0x25; break;
case '&': data[i] = 0x26; break;
case '\'': data[i] = 0x27; break;
case '(': data[i] = 0x28; break;
case ')': data[i] = 0x29; break;
case '*': data[i] = 0x2A; break;
case '+': data[i] = 0x2B; break;
case ',': data[i] = 0x2C; break;
case '-': data[i] = 0x2D; break;
case '.': data[i] = 0x2E; break;
case '/': data[i] = 0x2F; break;
case '0': data[i] = 0x30; break;
case '1': data[i] = 0x31; break;
case '2': data[i] = 0x32; break;
case '3': data[i] = 0x33; break;
case '4': data[i] = 0x34; break;
case '5': data[i] = 0x35; break;
case '6': data[i] = 0x36; break;
case '7': data[i] = 0x37; break;
case '8': data[i] = 0x38; break;
case '9': data[i] = 0x39; break;
case ':': data[i] = 0x3A; break;
case ';': data[i] = 0x3B; break;
case '<': data[i] = 0x3C; break;
case '=': data[i] = 0x3D; break;
case '>': data[i] = 0x3E; break;
//case '?': data[i] = 0x3F; break;
case 'A': data[i] = 0x41; break;
case 'B': data[i] = 0x42; break;
case 'C': data[i] = 0x43; break;
case 'D': data[i] = 0x44; break;
case 'E': data[i] = 0x45; break;
case 'F': data[i] = 0x46; break;
case 'G': data[i] = 0x47; break;
case 'H': data[i] = 0x48; break;
case 'I': data[i] = 0x49; break;
case 'J': data[i] = 0x4A; break;
case 'K': data[i] = 0x4B; break;
case 'L': data[i] = 0x4C; break;
case 'M': data[i] = 0x4D; break;
case 'N': data[i] = 0x4E; break;
case 'O': data[i] = 0x4F; break;
case 'P': data[i] = 0x50; break;
case 'Q': data[i] = 0x51; break;
case 'R': data[i] = 0x52; break;
case 'S': data[i] = 0x53; break;
case 'T': data[i] = 0x54; break;
case 'U': data[i] = 0x55; break;
case 'V': data[i] = 0x56; break;
case 'W': data[i] = 0x57; break;
case 'X': data[i] = 0x58; break;
case 'Y': data[i] = 0x59; break;
case 'Z': data[i] = 0x5A; break;
/*case '?': data[i] = 0x5B; break;
case '?': data[i] = 0x5C; break;
case '?': data[i] = 0x5E; break;
case '?': data[i] = 0x5F; break;*/
case 'a': data[i] = 0x61; break;
case 'b': data[i] = 0x62; break;
case 'c': data[i] = 0x63; break;
case 'd': data[i] = 0x64; break;
case 'e': data[i] = 0x65; break;
case 'f': data[i] = 0x66; break;
case 'g': data[i] = 0x67; break;
case 'h': data[i] = 0x68; break;
case 'i': data[i] = 0x69; break;
case 'j': data[i] = 0x6A; break;
case 'k': data[i] = 0x6B; break;
case 'l': data[i] = 0x6C; break;
case 'm': data[i] = 0x6D; break;
case 'n': data[i] = 0x6E; break;
case 'o': data[i] = 0x6F; break;
case 'p': data[i] = 0x70; break;
case 'q': data[i] = 0x71; break;
case 'r': data[i] = 0x72; break;
case 's': data[i] = 0x73; break;
case 't': data[i] = 0x74; break;
case 'u': data[i] = 0x75; break;
case 'v': data[i] = 0x76; break;
case 'w': data[i] = 0x77; break;
case 'x': data[i] = 0x78; break;
case 'y': data[i] = 0x79; break;
case 'z': data[i] = 0x7A; break;
/*case '?': data[i] = 0x7B; break;
case '?': data[i] = 0x7C; break;
case '?': data[i] = 0x7E; break;*/
default: data[i] = 0x3F; break; // found unknown character -> '?'
} // switch
} // for
return data;
} // convertUnicode2GSM
/**
* Convert one GSM standard alphabet character into a Unicode character
* @param b one GSM standard alphabet character
* @return one Unicode character
*/
public static char convertGSM2Unicode(int b) {
char c;
if ((b >= 0x41) && (b <= 0x5A)) { // character is between "A" and "Z"
c = (char) b;
return c;
} // if
if ((b >= 0x61) && (b <= 0x7A)) { // character is between "a" and "z"
c = (char) b;
return c;
} // if
if ((b >= 0x30) && (b <= 0x39)) { // character is between "0" and "9"
c = (char) b;
return c;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -