⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smstools.java

📁 自己实现的基于串口通讯发送短消息的JAVA代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// 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 + -