Deliver.java
上传用户:leafage163
上传日期:2022-08-08
资源大小:15k
文件大小:3k
源码类别:

Java编程

开发平台:

Java

  1. package com.zzxy.shortmessage.SGIP;
  2. import java.nio.ByteBuffer;
  3. import java.nio.ByteOrder;
  4. import java.nio.channels.SocketChannel;
  5. public class Deliver extends SGIPAbstractStruct {
  6. public String Mobile_no; // 21B 发送短消息的用户手机号,手机号码前加"86"国别标志
  7. public String SPNumber; // 21B SP的接入号码
  8. public byte TP_pid; // 1B GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
  9. public byte TP_udhi; // 1B GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
  10. public byte MessageCoding; // 1B
  11. // 短消息的编码格式。0:纯ASCII字符串3:写卡操作4:二进制编码8:UCS2编码15:
  12. // GBK编码其它参见GSM3.38第4节:SMS Data Coding Scheme
  13. public int MessageLength;// 4B Integer 短消息的长度
  14. public String msg;// Message Length 短消息的内容
  15. public String Reserve;// 8B 保留,扩展用
  16. public static final int STRUCT_SIZE = 49;// 不含短消息内容的长度
  17. // @Override
  18. public ByteBuffer getBuffer() {
  19. ByteBuffer buffer = ByteBuffer.allocate(STRUCT_SIZE + MessageLength);
  20. buffer.order(byteOrder);
  21. buffer.put(Mobile_no.getBytes());
  22. for (int i = Mobile_no.getBytes().length; i < 21; i++) {
  23. buffer.put((byte) 0);
  24. }
  25. buffer.put(SPNumber.getBytes());
  26. for (int i = SPNumber.getBytes().length; i < 21; i++) {
  27. buffer.put((byte) 0);
  28. }
  29. buffer.put(TP_pid);
  30. buffer.put(TP_udhi);
  31. buffer.put(MessageCoding);
  32. buffer.putInt(MessageLength);
  33. buffer.put(msg.getBytes());
  34. for (int i = 0; i < 8; i++) {
  35. buffer.put((byte) 0);
  36. }
  37. buffer.flip();
  38. return buffer;
  39. }
  40. // @Override
  41. public void setBuffer(ByteBuffer buffer) throws Exception {
  42. buffer.order(byteOrder);
  43. byte temp[] = new byte[21];
  44. buffer.get(temp, 0, 21);
  45. Mobile_no = new String(temp, "GB2312");
  46. Mobile_no = Mobile_no.trim();
  47. buffer.get(temp, 0, 21);
  48. SPNumber = new String(temp, "GB2312");
  49. SPNumber = SPNumber.trim();
  50. TP_pid = buffer.get();
  51. TP_udhi = buffer.get();
  52. MessageCoding = buffer.get();
  53. MessageLength = buffer.getInt();
  54. }
  55. private String UCS2String(byte[] msg) {
  56. int zhong, zhong1;
  57. String snr = "";
  58. for (int j = 0; j < this.MessageLength; j += 2) {
  59. zhong = msg[j];
  60. if (zhong < 0)
  61. zhong += 256;
  62. zhong1 = msg[j + 1];
  63. if (zhong1 < 0)
  64. zhong1 += 256;
  65. zhong = zhong * 256 + zhong1;
  66. if (zhong == 0)
  67. break;
  68. snr = snr + (char) zhong;
  69. }
  70. return snr;
  71. }
  72. public void setBuffermsg(ByteBuffer buffer) throws Exception {
  73. buffer.order(byteOrder);
  74. byte temp[] = new byte[this.MessageLength];
  75. buffer.get(temp, 0, this.MessageLength);
  76. // 判断接收信息格式
  77. switch (MessageCoding) {
  78. case 0:// ASCII串
  79. msg = new String(temp).trim();
  80. break;
  81. case 3:// 短信写卡操作
  82. break;
  83. case 4:// 二进制信息
  84. break;
  85. case 8:// UCS2编码
  86. msg = UCS2String(temp);
  87. break;
  88. case 15:// 含GB汉字
  89. break;
  90. default:
  91. break;
  92. }
  93. }
  94. public void read(SocketChannel channel) throws Exception {
  95. ByteBuffer buffer = ByteBuffer.allocate(STRUCT_SIZE);
  96. buffer.order(byteOrder);
  97. channel.read(buffer);
  98. buffer.flip();
  99. this.setBuffer(buffer);
  100. buffer = ByteBuffer.allocate(this.MessageLength);
  101. buffer.order(ByteOrder.nativeOrder());
  102. channel.read(buffer);
  103. buffer.flip();
  104. msg = new String(buffer.array(), charset);
  105. }
  106. }