|
@@ -1,113 +0,0 @@
|
|
-package com.nokia.sms.blacklist;
|
|
|
|
-
|
|
|
|
-import java.nio.ByteBuffer;
|
|
|
|
-import java.security.MessageDigest;
|
|
|
|
-import java.security.NoSuchAlgorithmException;
|
|
|
|
-import java.text.DateFormat;
|
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
|
-import java.util.Arrays;
|
|
|
|
-import java.util.Date;
|
|
|
|
-
|
|
|
|
-import org.snmp4j.smi.OctetString;
|
|
|
|
-
|
|
|
|
-import lombok.extern.slf4j.Slf4j;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * 构建由客户端发送给服务器的各类消息
|
|
|
|
- *
|
|
|
|
- * 协议参考 河北联通垃圾短信一键解黑接口规范.docx
|
|
|
|
- *
|
|
|
|
- * 这里需要注意一下,规范中是c-octet string 需要在末尾加上 0x00
|
|
|
|
- */
|
|
|
|
-@Slf4j
|
|
|
|
-public class RequestMessageUtil {
|
|
|
|
- private static DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 协议中SMIT_BIND 绑定请求消息
|
|
|
|
- *
|
|
|
|
- * @throws NoSuchAlgorithmException
|
|
|
|
- */
|
|
|
|
- public static byte[] getSmitBindMessage(String username, String password) throws NoSuchAlgorithmException {
|
|
|
|
- // header 4+4+4 body 16+20
|
|
|
|
- int messageLength = 48;
|
|
|
|
- byte[] message = new byte[messageLength];
|
|
|
|
- Arrays.fill(message, (byte) 0);
|
|
|
|
- // 填充header
|
|
|
|
- // 前4个(0-3)字节是 Unsigned Integer 消息长度
|
|
|
|
- message[3] = (byte) messageLength;
|
|
|
|
- // 4-7字节是消息类型 Command ID SMIT_BIND 绑定请求为 0x00000001
|
|
|
|
- message[7] = (byte) 1;
|
|
|
|
- // 8-11字节是消息序列号 从0到0XFFFFFFFF之间 请求的应该从0开始
|
|
|
|
-
|
|
|
|
- // 填充body 16+20
|
|
|
|
- // system_id 登录用户id username
|
|
|
|
- byte[] byteArraySystemId = new OctetString(username).toByteArray();
|
|
|
|
- // 把username的字节复制到message 从12开始到27结束 27位应为0x00
|
|
|
|
- // 用户名转化成octet字符串后可能小于16位 因此开始位数应该是 28 - byteArraySystemId.length
|
|
|
|
- System.arraycopy(byteArraySystemId, 0, message, 27 - byteArraySystemId.length,
|
|
|
|
- byteArraySystemId.length);
|
|
|
|
- // authcode 28位开始 共 20位
|
|
|
|
- byte[] octetAuthCode = new OctetString(password + dateFormat.format(new Date())).toByteArray();
|
|
|
|
- MessageDigest digest = MessageDigest.getInstance("SHA-1");
|
|
|
|
- // sha1后正好20位
|
|
|
|
- octetAuthCode = digest.digest(octetAuthCode);
|
|
|
|
- System.arraycopy(octetAuthCode, 0, message, 28, 20);
|
|
|
|
- log.debug("已完成SMIT_BIND消息组装: {}", Arrays.toString(message));
|
|
|
|
- return message;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 协议中SMIT_ACTIVE_TEST 链路检测请求 消息
|
|
|
|
- */
|
|
|
|
- public static byte[] getSmitActiveTestMessage(long messageCount) {
|
|
|
|
- // header 4+4+4 body为空
|
|
|
|
- int messageLength = 12;
|
|
|
|
- byte[] message = new byte[messageLength];
|
|
|
|
- Arrays.fill(message, (byte) 0);
|
|
|
|
- // 填充header
|
|
|
|
- // 前4个(0-3)字节是 Unsigned Integer 消息长度
|
|
|
|
- message[3] = (byte) messageLength;
|
|
|
|
- // 4-7字节是消息类型 SMIT_ACTIVE_TEST 0x0000000f 链路检测
|
|
|
|
- message[7] = (byte) 15;
|
|
|
|
- // 8-11字节是消息序列号 从0到0XFFFFFFFF之间 请求的应该从0开始
|
|
|
|
- ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
|
|
|
- byteBuffer.putLong(0, messageCount);
|
|
|
|
- // java中没有unsigned integer 用long表示以后需要截取后4位byte
|
|
|
|
- System.arraycopy(byteBuffer.array(), 4, message, 8, 4);
|
|
|
|
- return message;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 协议中的 SMIT_DELBLK 0x00000003 解除黑名单请求 消息
|
|
|
|
- */
|
|
|
|
- public static byte[] getSmitDelblkMessage(long messageCount, String phoneNumber, boolean isMo) {
|
|
|
|
- // header 4+4+4 body为21+1+1+1
|
|
|
|
- int messageLength = 36;
|
|
|
|
- byte[] message = new byte[messageLength];
|
|
|
|
- Arrays.fill(message, (byte) 0);
|
|
|
|
-
|
|
|
|
- // 填充header
|
|
|
|
- // 前4个(0-3)字节是 Unsigned Integer 消息长度
|
|
|
|
- message[3] = (byte) messageLength;
|
|
|
|
- // 4-7字节是消息类型 SMIT_DELBLK 0x00000003 解除黑名单请求
|
|
|
|
- message[7] = (byte) 3;
|
|
|
|
- // 8-11字节是消息序列号 从0到0XFFFFFFFF之间 请求的应该从0开始
|
|
|
|
- ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
|
|
|
- byteBuffer.putLong(0, messageCount);
|
|
|
|
- // java中没有unsigned integer 用long表示以后需要截取后4位byte
|
|
|
|
- System.arraycopy(byteBuffer.array(), 4, message, 8, 4);
|
|
|
|
-
|
|
|
|
- // 填充body
|
|
|
|
- // 11-32字节 blk_num 21字节 点对点和网间用户黑名单号码带86,端口用户黑名单号码不带86
|
|
|
|
- byte[] blk_num = new OctetString(phoneNumber).toByteArray();
|
|
|
|
- System.arraycopy(blk_num, 0, message, 33 - blk_num.length, blk_num.length);
|
|
|
|
- // 33字节 blk_type 1 黑名单号码 2 黑名单
|
|
|
|
- message[33] = (byte) 1;
|
|
|
|
- // 34字节
|
|
|
|
- message[34] = (byte) (isMo ? 1 : 2);
|
|
|
|
- // 35字节
|
|
|
|
- message[35] = (byte) 14;
|
|
|
|
- return message;
|
|
|
|
- }
|
|
|
|
-}
|
|
|