| 
					
				 | 
			
			
				@@ -0,0 +1,78 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.nokia.sms.blacklist.message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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 com.nokia.sms.blacklist.BlacklistTcpClient; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.nokia.sms.blacklist.exception.ParseException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class SmitBindMessage { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private final MessageHeader header; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static BlacklistTcpClient CLIENT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public SmitBindMessage(BlacklistTcpClient client) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 初始化header 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        header = new MessageHeader(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // header 12 + body 16+20 所以是48字节 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        header.setMessageLength(48); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        header.setCommandId(CommandId.SMIT_BIND); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 所有的初始连接需要从0开始 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        header.setSequenceNumber(0L); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SmitBindMessage.CLIENT = client; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public byte[] toByteArray() throws NoSuchAlgorithmException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 初始化 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        byte[] message = new byte[header.getMessageLength()]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 填充header 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        System.arraycopy(header.toByteArray(), 0, message, 0, 12); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 填充systemId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        byte[] systemIdByteArray = SmitBindMessage.CLIENT.getSystemId().getBytes(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        System.arraycopy(systemIdByteArray, 0, message, 12, systemIdByteArray.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 填充AuthCode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String authCodeString = SmitBindMessage.CLIENT.getPassword() + dateFormat.format(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MessageDigest digest = MessageDigest.getInstance("SHA-1"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // sha1以后为20字节 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        System.arraycopy(digest.digest(authCodeString.getBytes()), 0, message, 28, 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public BindRespStatus parseAndResp(byte[] message) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MessageHeader header = MessageHeader.parse(message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 判断消息类型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (CommandId.SMIT_BIND.equals(header.getCommandId())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 获取并对比systemId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                byte[] systemIdByteArray = Arrays.copyOfRange(message, 12, 28); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (SmitBindMessage.CLIENT.getSystemId().equals(new String(systemIdByteArray).trim())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 获取和判断鉴权信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    String authCodeString = SmitBindMessage.CLIENT.getPassword() + dateFormat.format(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    MessageDigest digest = MessageDigest.getInstance("SHA-1"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // sha1后的本地字符串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    String authCodeLocal = new String(digest.digest(authCodeString.getBytes())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 获取到的authCode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    String authCode = new String(Arrays.copyOfRange(message, 28, 48)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (authCodeLocal.equals(authCode)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return BindRespStatus.SUCCESS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return BindRespStatus.AUTH_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (ParseException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (NoSuchAlgorithmException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return BindRespStatus.STRUCTURE_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |