empp 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ require 'empp/empp_base'
2
+ require 'empp/constants'
3
+
4
+ module Empp
5
+
6
+ class MsgConnectResp < EmppBase
7
+
8
+ attr_accessor :status
9
+
10
+ def initialize
11
+ @command_id = Constants::EMPP_CONNECT_RESP
12
+ @status = nil
13
+ end
14
+
15
+ def to_s
16
+ str = super
17
+ str + ", status = #{@status}"
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,21 @@
1
+ require 'empp/empp_base'
2
+ require 'empp/constants'
3
+
4
+ module Empp
5
+
6
+ class MsgDelivery < EmppBase
7
+
8
+ attr_accessor :msg_id, :dest_id, :service_id, :msg_format, :src_terminal_id, :registered_delivery, :msg_length, :msg_content
9
+
10
+ def initialize
11
+ @command_id = Constants::EMPP_DELIVER
12
+ end
13
+
14
+ def to_s
15
+ str = super
16
+ str + "msg_id=#{@msg_id}, dest_id=#{@dest_id}, service_id=#{@service_id}, msg_format=#{@msg_format}, src_terminal_id=#{@src_terminal_id}, msg_length=#{@msg_length}, msg_content=#{@msg_content}"
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,35 @@
1
+ require 'empp/empp_base'
2
+ require 'empp/utils/bytebuffer'
3
+ require 'empp/utils/utils'
4
+ require 'empp/constants'
5
+
6
+ module Empp
7
+
8
+ class MsgDeliveryResp < EmppBase
9
+
10
+ attr_accessor :msg_id
11
+
12
+ def initialize
13
+ @command_id = Constants::EMPP_DELIVER_RESP
14
+ @result = 0
15
+ @total_length = 12 + 10 + 4
16
+ setSequenceId
17
+ end
18
+
19
+ def package
20
+ buf = Utils::ByteBuffer.new
21
+ # add header
22
+ buf.append_uint_be(@total_length)
23
+
24
+ buf.append_uint_be(@command_id)
25
+ buf.append_uint_be(@sequence_id)
26
+ buf.append_string(@msg_id)
27
+ buf.append_string("\0\0\0\0")
28
+
29
+ buf.data
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,105 @@
1
+ require 'empp/empp_base'
2
+ require 'empp/constants'
3
+ require 'empp/empp_logger'
4
+ require 'empp/utils/bytebuffer'
5
+ require 'empp/utils/utils'
6
+
7
+
8
+ module Empp
9
+
10
+ class MsgSubmit < EmppBase
11
+
12
+ attr_accessor :terminal_id, :pk_total, :pk_number, :msg_id, :sequence_ids
13
+
14
+ def initialize(terminal_id, message, account_id, service_id)
15
+ @command_id = Constants::EMPP_SUBMIT
16
+ @terminal_id = terminal_id
17
+ @account_id = account_id
18
+ @service_id = service_id
19
+ @message = Utils::Utils.convert_utf8_to_gbk(message)
20
+ @splitted_messages = Utils::Utils.get_splitted_msgs(@message)
21
+ @sequence_ids = []
22
+ # assign sequence_id for each slice
23
+ @splitted_messages.each do |msg|
24
+ setSequenceId
25
+ @sequence_ids << @sequence_id
26
+ end
27
+
28
+ @msg_id = Time.now.to_i.to_s[0...10]
29
+
30
+ @pk_total = @splitted_messages.length
31
+ @pk_number = 1
32
+
33
+ @logger = EmppLogger.instance
34
+ end
35
+
36
+ def package
37
+ @logger.debug("Enter MsgSubmit::package")
38
+
39
+ tmp_buf = ''
40
+ index = 0
41
+
42
+ @splitted_messages.each do |msg|
43
+ @sequence_id = @sequence_ids[index]
44
+ index += 1
45
+ tmp_buf << package_msg(msg)
46
+ end
47
+
48
+ @logger.debug("Leave MsgSubmit::package")
49
+
50
+ tmp_buf
51
+ end
52
+
53
+ private
54
+
55
+ def package_msg(a_msg)
56
+ @logger.debug("Enter MsgSubmit::package_msg")
57
+ buf = Utils::ByteBuffer.new
58
+ @total_length = 12 + 10 + 1*4 + 17 + 17 + 4 + 32*1 + 1 + a_msg.length + 21*2 + 10 + 20 + 1*2 + 32 + 1*3 + 2 + 6 + 1
59
+
60
+
61
+ # add header
62
+ buf.append_uint_be(@total_length)
63
+
64
+ buf.append_uint_be(@command_id)
65
+ buf.append_uint_be(@sequence_id)
66
+
67
+ buf.append_string(@msg_id)
68
+
69
+ tmp_str = ''
70
+ tmp_str << @pk_total
71
+ buf.append_string(tmp_str)
72
+
73
+ tmp_str = ''
74
+ tmp_str << @pk_number
75
+ @pk_number += 1
76
+ buf.append_string(tmp_str)
77
+
78
+ buf.append_string("\1")
79
+ buf.append_string("\017") # 15
80
+ buf.append_string("\0" * 17)
81
+ buf.append_string("\0" * 17)
82
+ buf.append_uint_be(1)
83
+ buf.append_string(@terminal_id.ljust(32, "\0"))
84
+ buf.append_string([a_msg.length].pack("C"))
85
+ buf.append_string(a_msg)
86
+ buf.append_string(" " * 21)
87
+ buf.append_string(@account_id.ljust(21, "\0"))
88
+ buf.append_string(@service_id.ljust(10, "\0"))
89
+ buf.append_string("\0" * 20)
90
+ buf.append_string("\0")
91
+ buf.append_string("\0")
92
+ buf.append_string("\0" * 32)
93
+ buf.append_string("\0")
94
+ buf.append_string("\0")
95
+ buf.append_string("\0")
96
+ buf.append_string("\0" * 2)
97
+ buf.append_string("\0" * 6)
98
+ buf.append_string("\0")
99
+
100
+ @logger.debug("Leave MsgSubmit::package_msg")
101
+ buf.data
102
+ end
103
+ end
104
+
105
+ end
@@ -0,0 +1,23 @@
1
+ require 'empp/empp_base'
2
+ require 'empp/constants'
3
+
4
+ module Empp
5
+
6
+ class MsgSubmitResp < EmppBase
7
+
8
+ attr_accessor :status, :msg_id
9
+
10
+ def initialize
11
+ @command_id = Constants::EMPP_SUBMIT_RESP
12
+ @msg_id = nil
13
+ @status = nil
14
+ end
15
+
16
+ def to_s
17
+ str = super
18
+ str + ", status = #{@status}, msg_id=#{@msg_id}"
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,103 @@
1
+ require 'socket'
2
+ require 'empp/empp_logger'
3
+
4
+ module Empp
5
+
6
+ class TcpConnection
7
+
8
+ def initialize(host, port)
9
+ @socket = nil
10
+ @host = host
11
+ @port = port
12
+ @max_to_read = 4096
13
+ @logger = EmppLogger.instance
14
+ @alive = false
15
+ end
16
+
17
+ def self.getConnection(host, port)
18
+ return self.new(host, port)
19
+ end
20
+
21
+ def alive?
22
+ @alive
23
+ end
24
+
25
+ def send(data)
26
+ @logger.debug("Enter TcpConnection::send")
27
+
28
+ @logger.debug("TcpConnection: send bytes:#{data.unpack("H*")}")
29
+ if @socket
30
+ begin
31
+ @socket.write(data)
32
+ rescue
33
+ @logger.fatal("Get exception to write data")
34
+ @alive = false
35
+ end
36
+ end
37
+
38
+ @logger.debug("Leave TcpConnection::send")
39
+ end
40
+
41
+ def connect
42
+ @logger.debug("Enter TcpConnection::connect")
43
+
44
+ begin
45
+ @socket = TCPSocket.new(@host, @port)
46
+ @alive = true
47
+ rescue
48
+ @alive = false
49
+ @socket = nil
50
+ @logger.fatal("Open socket error for host=#{@host}, port=#{@port}")
51
+ end
52
+
53
+ @logger.debug("Leave TcpConnection::connect")
54
+ end
55
+
56
+ def close
57
+ @logger.debug("Enter TcpConnection::close")
58
+
59
+ begin
60
+ @alive = false
61
+ if @socket
62
+ @socket.close()
63
+ end
64
+ rescue
65
+ @logger.warn("Unable to close socket.")
66
+ end
67
+
68
+ @logger.debug("Leave TcpConnection::close")
69
+ end
70
+
71
+ def receive(count = 0)
72
+ @logger.debug("Enter TcpConnection::receive")
73
+
74
+ count ||= @max_to_read
75
+
76
+ if count < 0 || count > @max_to_read
77
+ return
78
+ end
79
+
80
+ bytes = nil
81
+ begin
82
+
83
+ while !bytes || bytes.length == 0
84
+ if @socket
85
+ bytes = @socket.recvfrom(count)[0]
86
+ else
87
+ raise
88
+ end
89
+ end
90
+
91
+ rescue
92
+ @logger.fatal("TcpConnection::receive: get exception from socket recvFrom")
93
+ @alive = false
94
+ return
95
+ end
96
+ @logger.info("TcpConnectin receive bytes=" + bytes.unpack("H*").to_s )
97
+ @logger.debug("Leave TcpConnection::receive")
98
+ return bytes
99
+ end
100
+
101
+ end
102
+
103
+ end
@@ -0,0 +1,39 @@
1
+ require 'bindata'
2
+ require 'empp/utils/utils'
3
+
4
+ module Empp
5
+
6
+ module Utils
7
+
8
+ class ByteBuffer
9
+
10
+ def initialize(data = nil)
11
+ @buf = data || ''
12
+ @offset = 0
13
+ end
14
+
15
+ def append_uint_be(intValue)
16
+ @buf << Utils.getUintBe(intValue)
17
+ end
18
+
19
+ def append_uint_le(intValue)
20
+ @buf << Utils.getUintLe(intValue)
21
+ end
22
+
23
+ def append_string(strValue)
24
+ @buf << strValue
25
+ end
26
+
27
+ def data
28
+ @buf
29
+ end
30
+
31
+ def to_s
32
+ @buf.unpack("H*")
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,36 @@
1
+ require 'thread'
2
+
3
+ module Empp
4
+
5
+ module Utils
6
+
7
+ class Hashtable < Hash
8
+
9
+ def initialize
10
+ super
11
+ @mutex = Mutex.new
12
+ end
13
+
14
+ def put(key, value)
15
+ @mutex.synchronize{
16
+ self[key] = value
17
+ }
18
+ end
19
+
20
+ def get(key)
21
+ @mutex.synchronize{
22
+ self[key]
23
+ }
24
+ end
25
+
26
+ def delete(key)
27
+ @mutex.synchronize{
28
+ super(key)
29
+ }
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,120 @@
1
+
2
+ require 'bindata'
3
+ require 'iconv'
4
+
5
+ module Empp
6
+
7
+ module Utils
8
+
9
+ class Utils
10
+
11
+ # MMDDHHMMSS
12
+ def self.getTimestampInt(now)
13
+ u8 = BinData::Uint8.new
14
+ intVal = now.month * 10**8 + now.day * 10**6 + now.hour * 10**4 + now.min * 10**2 + now.sec
15
+ end
16
+
17
+ def self.getTimestampStr(now)
18
+ now.month.to_s.rjust(2, "0") + now.day.to_s.rjust(2, "0") + now.hour.to_s.rjust(2, "0") + now.min.to_s.rjust(2, "0") + now.sec.to_s.rjust(2, "0")
19
+ end
20
+
21
+ def self.getUintLe(intValue)
22
+ ibe = BinData::Uint32le.new
23
+ ibe.assign( intValue )
24
+ ibe.to_binary_s
25
+ end
26
+
27
+ def self.getUintBe(intValue)
28
+ ibe = BinData::Uint32be.new
29
+ ibe.assign( intValue )
30
+ ibe.to_binary_s
31
+ end
32
+
33
+ def self.getVersion
34
+ version = 0b00010000
35
+ u8 = BinData::Uint8be.new
36
+ u8.assign(version)
37
+ u8.to_binary_s
38
+ end
39
+
40
+ private
41
+
42
+ def self.fill_zero(binaryStr)
43
+ binaryStr.rjust(2, "\0")
44
+ end
45
+
46
+ def self.convert_utf8_to_gbk(strVal)
47
+ conv = Iconv.new("gbk", "utf-8")
48
+ conv.iconv(strVal)
49
+ end
50
+
51
+ def self.convert_gbk_to_utf8(strVal)
52
+ conv = Iconv.new("utf-8", "gbk")
53
+ conv.iconv(strVal)
54
+ end
55
+
56
+ def self.convert_ucs2_to_utf8(strVal)
57
+ conv = Iconv.new("utf-8", "utf-16")
58
+ conv.iconv(strVal)
59
+ end
60
+
61
+ ###########################################################
62
+ ## strip the possible prefix like "86" "+86" in ##
63
+ ## terminal_id ##
64
+ ###########################################################
65
+ def self.deal_with_terminal_id(terminal_id)
66
+
67
+ start_index = 0
68
+ if terminal_id.start_with?"86"
69
+ start_index = 2
70
+ elsif terminal_id.start_with?"+86"
71
+ start_index = 3
72
+ end
73
+ terminal_id[start_index .. -1]
74
+ end
75
+
76
+ ############################################################
77
+ ## split msg_content to slices which has characters<70 ##
78
+ ## to fit empp's requirement, msg_content is coded as gbk ##
79
+ ############################################################
80
+ def self.get_splitted_msgs(msg_content)
81
+ fix_len = 68
82
+ msgs = []
83
+ count, index = 0, 0;
84
+ tmp_str = ''
85
+ step = 1
86
+
87
+ while true
88
+
89
+ if count > fix_len || index >= msg_content.length
90
+ msgs << tmp_str
91
+ tmp_str = ''
92
+ count = 0
93
+ end
94
+
95
+ break if index >= msg_content.length
96
+ bt = msg_content[index]
97
+
98
+ if bt.to_i < 128 && bt.to_i > 0
99
+ tmp_str << msg_content[index]
100
+ step = 1
101
+ else
102
+ tmp_str << msg_content[index]
103
+ tmp_str << msg_content[index + 1]
104
+ step = 2
105
+ end
106
+
107
+ index += step
108
+ count += 1
109
+
110
+ end
111
+
112
+ msgs
113
+
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+
120
+ end