COutgoingMessage.java
上传用户:shunchung
上传日期:2013-04-07
资源大小:438k
文件大小:9k
源码类别:

手机短信编程

开发平台:

Java

  1. // jSMSEngine API.
  2. // An open-source API package for sending and receiving SMS via a GSM device.
  3. // Copyright (C) 2002-2006, Thanasis Delenikas, Athens/GREECE
  4. // Web Site: http://www.jsmsengine.org
  5. //
  6. // jSMSEngine is a package which can be used in order to add SMS processing
  7. // capabilities in an application. jSMSEngine is written in Java. It allows you
  8. // to communicate with a compatible mobile phone or GSM Modem, and
  9. // send / receive SMS messages.
  10. //
  11. // jSMSEngine is distributed under the LGPL license.
  12. //
  13. // This library is free software; you can redistribute it and/or
  14. // modify it under the terms of the GNU Lesser General Public
  15. // License as published by the Free Software Foundation; either
  16. // version 2.1 of the License, or (at your option) any later version.
  17. // This library is distributed in the hope that it will be useful,
  18. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20. // Lesser General Public License for more details.
  21. // You should have received a copy of the GNU Lesser General Public
  22. // License along with this library; if not, write to the Free Software
  23. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24. //
  25. package org.jsmsengine;
  26. import java.util.*;
  27. /**
  28. This class represents an outgoing SMS message, i.e. message created for dispatch
  29. from the GSM device.
  30. @see CMessage
  31. @see CIncomingMessage
  32. @see CPhoneBook
  33. @see CService#sendMessage(COutgoingMessage)
  34. @see CService#sendMessage(LinkedList)
  35. */
  36. public class COutgoingMessage extends CMessage
  37. {
  38. private Date dispatchDate;
  39. private boolean statusReport;
  40. private boolean flashSms;
  41. private int srcPort;
  42. private int dstPort;
  43. /**
  44. Default constructor of the class.
  45. */
  46. public COutgoingMessage()
  47. {
  48. super(TYPE_OUTGOING, null, null, null, null, -1);
  49. setDispatchDate(null);
  50. setDate(new Date());
  51. statusReport = false;
  52. srcPort = -1;
  53. dstPort = -1;
  54. }
  55. /**
  56. Constructor of the class.
  57. @param recipient the recipients's number.
  58. @param text the actual text of the message.
  59. <br><br>Notes:<br>
  60. <ul>
  61. <li>Phone numbers are represented in their international or national format.</li>
  62. <li>If you use a phonebook, the phone number may be a string starting with the '~' character,
  63. representing an entry in the phonebook.</li>
  64. <li>By default, a created message is set to be encoded in 7bit. If you want to change that, be sure
  65. to operate in PDU mode, and change the encoding with setMessageEncoding() method.</li>
  66. </ul>
  67. */
  68. public COutgoingMessage(String recipient, String text)
  69. {
  70. super(TYPE_OUTGOING, new Date(), null, recipient, text, -1);
  71. setDispatchDate(null);
  72. setDate(new Date());
  73. srcPort = -1;
  74. dstPort = -1;
  75. }
  76. /**
  77. Set the phone number of the recipient. Applicable to outgoing messages.
  78. @param recipient the recipient's phone number (international format).
  79. */
  80. public void setRecipient(String recipient) { this.recipient = recipient; }
  81. /**
  82. Returns the recipient's phone number (international format). 
  83. Applicable only for outgoing messages.
  84. <br>
  85. <strong>This may be an entry from the phonebook.</strong>
  86. @return  the type of the message.
  87. */
  88. public String getRecipient() { return recipient; }
  89. /**
  90. Sets the dispatch date of the message.
  91. @param date the dispatch date of the message.
  92. */
  93. protected void setDispatchDate(Date date) { this.dispatchDate = date; }
  94. /**
  95. Returns the dispatch date of the message.
  96. @return  the dispatch date of the message.
  97. */
  98. public Date getDispatchDate() { return dispatchDate; }
  99. /**
  100. Sets if a status report is requested.
  101. @param statusReport True if a status report is requested. Default is false (no status report).
  102. */
  103. public void setStatusReport(boolean statusReport) { this.statusReport = statusReport; }
  104. /**
  105. Sets the message to be delivered as a flash message.
  106. @param flashSms True if the message should be delivered as a flash SMS message.
  107. */
  108. public void setFlashSms(boolean flashSms) { this.flashSms = flashSms; }
  109. public void setSourcePort(int port) { this.srcPort = port; }
  110. public void setDestinationPort(int port) { this.dstPort = port; }
  111. public String getPDU(String smscNumber)
  112. {
  113. String pdu, udh;
  114. String str1, str2, str3;
  115. int i, high, low;
  116. char c;
  117. pdu = "";
  118. udh = "";
  119. if ((smscNumber != null) && (smscNumber.length() != 0))
  120. {
  121. str1 = "91" + toBCDFormat(smscNumber.substring(1));
  122. str2 = Integer.toHexString(str1.length() / 2);
  123. if (str2.length() != 2) str2 = "0" + str2;
  124. pdu = pdu + str2 + str1;
  125. }
  126. else if ((smscNumber != null) && (smscNumber.length() == 0)) pdu = pdu + "00";
  127. if ((srcPort != -1) && (dstPort != -1))
  128. {
  129. if (statusReport) pdu = pdu + "71";
  130. else pdu = pdu + "51";
  131. }
  132. else
  133. {
  134. if (statusReport) pdu = pdu + "31";
  135. else pdu = pdu + "11";
  136. }
  137. pdu = pdu + "00";
  138. str1 = getRecipient();
  139. if( str1.charAt(0) == '+' )
  140. {
  141. str1 = toBCDFormat(str1.substring(1));
  142. str2 = Integer.toHexString(getRecipient().length() - 1);
  143. str1 = "91" + str1;
  144. }
  145. else
  146. {
  147. str1 = toBCDFormat(str1);
  148. str2 = Integer.toHexString(getRecipient().length());
  149. str1 = "81" + str1;
  150. }
  151. if (str2.length() != 2) str2 = "0" + str2;
  152. pdu = pdu + str2 + str1;
  153. pdu = pdu + "00";
  154. switch (getMessageEncoding())
  155. {
  156. case MESSAGE_ENCODING_7BIT:
  157. if (flashSms) pdu = pdu + "10";
  158. else pdu = pdu + "00";
  159. break;
  160. case MESSAGE_ENCODING_8BIT:
  161. if (flashSms) pdu = pdu + "14";
  162. else pdu = pdu + "04";
  163. break;
  164. case MESSAGE_ENCODING_UNICODE:
  165. if (flashSms) pdu = pdu + "18";
  166. else pdu = pdu + "08";
  167. break;
  168. }
  169. pdu = pdu + "FF";
  170. if ((srcPort != -1) && (dstPort != -1))
  171. {
  172. String s;
  173. udh = "060504";
  174. s = Integer.toHexString(dstPort);
  175. while (s.length() < 4) s = "0" + s;
  176. udh += s;
  177. s = Integer.toHexString(srcPort);
  178. while (s.length() < 4) s = "0" + s;
  179. udh += s;
  180. }
  181. switch (getMessageEncoding())
  182. {
  183. case MESSAGE_ENCODING_7BIT:
  184. str2 = textToPDU(getText());
  185. if ((srcPort != -1) && (dstPort != -1)) str1 = Integer.toHexString((str2.length() * 4 / 7) + 8);
  186. else str1 = Integer.toHexString(str2.length() * 4 / 7);
  187. if (str1.length() != 2) str1 = "0" + str1;
  188. if ((srcPort != -1) && (dstPort != -1)) pdu = pdu + str1 + udh + str2;
  189. else pdu = pdu + str1 + str2;
  190. break;
  191. case MESSAGE_ENCODING_8BIT:
  192. str1 = getText();
  193. str2 = "";
  194. for (i = 0; i < str1.length(); i ++)
  195. {
  196. c = str1.charAt(i);
  197. str2 = str2 + ((Integer.toHexString((int) c).length() < 2) ? "0" + Integer.toHexString((int) c) : Integer.toHexString((int) c));  
  198. }
  199. if ((srcPort != -1) && (dstPort != -1)) str1 = Integer.toHexString(getText().length() + 7);
  200. else str1 = Integer.toHexString(getText().length());
  201. if (str1.length() != 2) str1 = "0" + str1;
  202. if ((srcPort != -1) && (dstPort != -1)) pdu = pdu + str1 + udh + str2;
  203. else pdu = pdu + str1 + str2;
  204. break;
  205. case MESSAGE_ENCODING_UNICODE:
  206. str1 = getText();
  207. str2 = "";
  208. for (i = 0; i < str1.length(); i ++)
  209. {
  210. c = str1.charAt(i);
  211. high = (int) (c / 256);
  212. low = c % 256;
  213. str2 = str2 + ((Integer.toHexString(high).length() < 2) ? "0" + Integer.toHexString(high) : Integer.toHexString(high));
  214. str2 = str2 + ((Integer.toHexString(low).length() < 2) ? "0" + Integer.toHexString(low) : Integer.toHexString(low));
  215. }
  216. if ((srcPort != -1) && (dstPort != -1)) str1 = Integer.toHexString((getText().length() * 2) + 7);
  217. else str1 = Integer.toHexString(getText().length() * 2);
  218. if (str1.length() != 2) str1 = "0" + str1;
  219. if ((srcPort != -1) && (dstPort != -1)) pdu = pdu + str1 + udh + str2;
  220. else pdu = pdu + str1 + str2;
  221. break;
  222. }
  223. return pdu.toUpperCase();
  224. }
  225. private String textToPDU(String text)
  226. {
  227. String pdu, str1;
  228. byte[] oldBytes, newBytes;
  229. BitSet bitSet;
  230. int i, j, k, value1, value2;
  231. str1 = "";
  232. text = CGSMAlphabets.text2Hex(text, CGSMAlphabets.GSM7BITDEFAULT);
  233. for (i = 0; i < text.length(); i += 2)
  234. {
  235. j = (Integer.parseInt("" + text.charAt(i), 16) * 16) + Integer.parseInt("" + text.charAt(i + 1), 16);
  236. str1 += (char) j;
  237. }
  238. text = str1; 
  239. oldBytes = text.getBytes();
  240. bitSet = new BitSet(text.length() * 8);
  241. value1 = 0;
  242. for (i = 0; i < text.length(); i ++)
  243. for (j = 0; j < 7; j ++)
  244. {
  245. value1 = (i * 7) + j;
  246. if ((oldBytes[i] & (1 << j)) != 0) bitSet.set(value1);
  247. }
  248. value1 ++;
  249. if (((value1 / 56) * 56) != value1) value2 = (value1 / 8) + 1;
  250. else value2 = (value1 / 8);
  251. if (value2 == 0) value2 = 1;
  252. newBytes = new byte[value2];
  253. for (i = 0; i < value2; i ++)
  254. for (j = 0; j < 8; j ++)
  255. if ((value1 + 1) > ((i * 8) + j))
  256. if (bitSet.get(i * 8 + j)) newBytes[i] |= (byte) (1 << j);
  257. pdu = "";
  258. for (i = 0; i < value2; i ++)
  259. {
  260. str1 = Integer.toHexString((int) newBytes[i]);
  261. if (str1.length() != 2) str1 = "0" + str1;
  262. str1 = str1.substring(str1.length() - 2, str1.length());
  263. pdu += str1;
  264. }
  265. return pdu;
  266. }
  267. private String toBCDFormat(String s)
  268. {
  269. String bcd;
  270. int i;
  271. if ((s.length() % 2) != 0) s = s + "F";
  272. bcd = "";
  273. for (i = 0; i < s.length(); i += 2) bcd = bcd + s.charAt(i + 1) + s.charAt(i);
  274. return bcd; 
  275. }
  276. }