gt06_server 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -3
- data/Gemfile.lock +4 -29
- data/LICENSE +20 -0
- data/README.md +49 -1
- data/_config.yml +1 -0
- data/gt06_server.gemspec +5 -5
- data/lib/gt06_server.rb +1 -0
- data/lib/gt06_server/crc.rb +1 -0
- data/lib/gt06_server/messages/alarm_packet.rb +1 -0
- data/lib/gt06_server/messages/date_time_information.rb +1 -0
- data/lib/gt06_server/messages/gps_information.rb +10 -1
- data/lib/gt06_server/messages/gps_query_address.rb +1 -0
- data/lib/gt06_server/messages/lbs_information.rb +1 -0
- data/lib/gt06_server/messages/location_data.rb +1 -0
- data/lib/gt06_server/messages/login_message.rb +1 -0
- data/lib/gt06_server/messages/status_information.rb +1 -0
- data/lib/gt06_server/packet.rb +1 -0
- data/lib/gt06_server/protocol.rb +1 -0
- data/lib/gt06_server/server.rb +36 -39
- data/lib/gt06_server/session.rb +9 -7
- data/lib/gt06_server/session_sweeper.rb +20 -14
- data/lib/gt06_server/version.rb +2 -1
- data/lib/libcrc16.rb +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cee3e4400c1b60c86ccb4629c86300b646a6a76a
|
4
|
+
data.tar.gz: 7f913c5eda74b44085cc70b631af583e32aa143d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f8b6500efbb1144cea48af2efb24d05a8b7f4f7ee64470bb1cef8024ab27b913f3f91f2bbccbcb75467762c2f28575d8a5fb70e4e91009bc1496f899763835c
|
7
|
+
data.tar.gz: 631680d9ccaad0c0a7846a0dc835e76f16a35d24af6ebb928d7ab4326edc2a8fc92a93639eaf05dada8840a45dca0ce4d451b251c2957cdc7dd9302e4879b4dc
|
data/Gemfile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
source 'https://rubygems.org'
|
3
4
|
|
4
5
|
# Specify your gem's dependencies in gt06_server.gemspec
|
@@ -16,7 +17,4 @@ group :development do
|
|
16
17
|
gem 'pry-byebug'
|
17
18
|
gem 'rubocop', require: false
|
18
19
|
gem 'reek', require: false
|
19
|
-
gem 'capistrano'
|
20
|
-
gem 'capistrano-rbenv'
|
21
|
-
gem 'capistrano-bundler'
|
22
20
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
gt06_server (0.1.
|
4
|
+
gt06_server (0.1.6)
|
5
5
|
bindata (~> 2.3)
|
6
6
|
celluloid-io (~> 0.17.3)
|
7
7
|
concurrent-ruby (~> 1.0)
|
@@ -9,8 +9,6 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
airbrussh (1.0.2)
|
13
|
-
sshkit (>= 1.6.1, != 1.7.0)
|
14
12
|
ast (2.3.0)
|
15
13
|
axiom-types (0.1.1)
|
16
14
|
descendants_tracker (~> 0.0.4)
|
@@ -18,19 +16,6 @@ GEM
|
|
18
16
|
thread_safe (~> 0.3, >= 0.3.1)
|
19
17
|
bindata (2.3.4)
|
20
18
|
byebug (9.0.5)
|
21
|
-
capistrano (3.5.0)
|
22
|
-
airbrussh (>= 1.0.0)
|
23
|
-
capistrano-harrow
|
24
|
-
i18n
|
25
|
-
rake (>= 10.0.0)
|
26
|
-
sshkit (>= 1.9.0)
|
27
|
-
capistrano-bundler (1.1.4)
|
28
|
-
capistrano (~> 3.1)
|
29
|
-
sshkit (~> 1.2)
|
30
|
-
capistrano-harrow (0.5.2)
|
31
|
-
capistrano-rbenv (2.0.4)
|
32
|
-
capistrano (~> 3.1)
|
33
|
-
sshkit (~> 1.3)
|
34
19
|
celluloid (0.17.3)
|
35
20
|
celluloid-essentials
|
36
21
|
celluloid-extras
|
@@ -59,23 +44,19 @@ GEM
|
|
59
44
|
coderay (1.1.1)
|
60
45
|
coercible (1.0.0)
|
61
46
|
descendants_tracker (~> 0.0.1)
|
62
|
-
concurrent-ruby (1.0.
|
47
|
+
concurrent-ruby (1.0.5)
|
63
48
|
descendants_tracker (0.0.4)
|
64
49
|
thread_safe (~> 0.3, >= 0.3.1)
|
65
50
|
docile (1.1.5)
|
66
51
|
equalizer (0.0.11)
|
67
52
|
ffi (1.9.10-java)
|
68
53
|
hitimes (1.2.4)
|
69
|
-
i18n (0.7.0)
|
70
54
|
ice_nine (0.11.2)
|
71
55
|
json (1.8.3)
|
72
56
|
json (1.8.3-java)
|
73
57
|
method_source (0.8.2)
|
74
58
|
minitest (5.9.0)
|
75
|
-
|
76
|
-
net-ssh (>= 2.6.5)
|
77
|
-
net-ssh (3.2.0)
|
78
|
-
nio4r (1.2.1)
|
59
|
+
nio4r (2.1.0)
|
79
60
|
parser (2.3.1.2)
|
80
61
|
ast (~> 2.2)
|
81
62
|
powerpack (0.1.1)
|
@@ -112,9 +93,6 @@ GEM
|
|
112
93
|
slop (3.6.0)
|
113
94
|
spoon (0.0.4)
|
114
95
|
ffi
|
115
|
-
sshkit (1.11.1)
|
116
|
-
net-scp (>= 1.1.2)
|
117
|
-
net-ssh (>= 2.8.0)
|
118
96
|
thread_safe (0.3.5)
|
119
97
|
thread_safe (0.3.5-java)
|
120
98
|
timers (4.1.2)
|
@@ -132,9 +110,6 @@ PLATFORMS
|
|
132
110
|
|
133
111
|
DEPENDENCIES
|
134
112
|
bundler (~> 1.11)
|
135
|
-
capistrano
|
136
|
-
capistrano-bundler
|
137
|
-
capistrano-rbenv
|
138
113
|
codeclimate-test-reporter
|
139
114
|
gt06_server!
|
140
115
|
minitest
|
@@ -145,4 +120,4 @@ DEPENDENCIES
|
|
145
120
|
rubocop
|
146
121
|
|
147
122
|
BUNDLED WITH
|
148
|
-
1.
|
123
|
+
1.14.3
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2017 CoolElvis
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -33,7 +33,7 @@ sleep
|
|
33
33
|
|
34
34
|
````
|
35
35
|
|
36
|
-
|
36
|
+
Status message:
|
37
37
|
|
38
38
|
````ruby
|
39
39
|
{
|
@@ -60,5 +60,53 @@ The message is a Hash like:
|
|
60
60
|
:serial_number => 48
|
61
61
|
}
|
62
62
|
````
|
63
|
+
|
64
|
+
Location message:
|
65
|
+
```ruby
|
66
|
+
{
|
67
|
+
:packet_length => 31,
|
68
|
+
:protocol_number => 18,
|
69
|
+
:message_type => :location_data,
|
70
|
+
:information_content =>
|
71
|
+
{
|
72
|
+
:date_time => '2011-08-29 17:46:16 +0400',
|
73
|
+
:gps =>
|
74
|
+
{
|
75
|
+
:quantity_satellites =>
|
76
|
+
{
|
77
|
+
:length_gps => 12, :satellites => 12
|
78
|
+
},
|
79
|
+
:latitude => 23.111668333333334,
|
80
|
+
:longitude => 114.409285,
|
81
|
+
:speed => 0,
|
82
|
+
:course_status =>
|
83
|
+
{
|
84
|
+
:null_1 => 0,
|
85
|
+
:null_2 => 0,
|
86
|
+
:gps_positioning_type => 0,
|
87
|
+
:is_gps_positioning => 1,
|
88
|
+
:longitude_bit => 0,
|
89
|
+
:latitude_bit => 1,
|
90
|
+
:course => 143
|
91
|
+
}
|
92
|
+
},
|
93
|
+
:lbs =>
|
94
|
+
{
|
95
|
+
:mcc => 460,
|
96
|
+
:mnc => 0,
|
97
|
+
:lac => 10365,
|
98
|
+
:cell_id => 8120
|
99
|
+
}
|
100
|
+
},
|
101
|
+
:serial_number => 3
|
102
|
+
}
|
103
|
+
```
|
104
|
+
|
63
105
|
The content of 'information_content' depends on 'message_type'
|
64
106
|
See lib/gt06_server/messages for details
|
107
|
+
|
108
|
+
###Copyright
|
109
|
+
|
110
|
+
Copyright (c) 2016 CoolElvis and contributors.
|
111
|
+
|
112
|
+
MIT License. See [LICENSE](LICENSE) for details.
|
data/_config.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
theme: jekyll-theme-minimal
|
data/gt06_server.gemspec
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
# frozen_string_literal: true
|
2
|
+
|
3
3
|
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
4
4
|
require 'gt06_server/version'
|
5
5
|
|
@@ -9,10 +9,10 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['CoolElvis']
|
10
10
|
spec.email = ['elvisplus2@gmail.com']
|
11
11
|
|
12
|
-
spec.summary
|
13
|
-
spec.description
|
14
|
-
spec.homepage
|
15
|
-
spec.license
|
12
|
+
spec.summary = 'TCP server for gt06(TK100) gps tracker'
|
13
|
+
spec.description = 'TCP server for gt06(TK100) gps tracker'
|
14
|
+
spec.homepage = 'https://github.com/CoolElvis/gt06_server'
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
17
|
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.' unless spec.respond_to?(:metadata)
|
18
18
|
|
data/lib/gt06_server.rb
CHANGED
data/lib/gt06_server/crc.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Gt06Server
|
3
4
|
module Messages
|
4
5
|
class GpsInformation < BinData::Record
|
@@ -14,7 +15,7 @@ module Gt06Server
|
|
14
15
|
uint32be :coord
|
15
16
|
|
16
17
|
def get
|
17
|
-
coord.to_f / 30_000 / 60
|
18
|
+
(coord.to_f / 30_000 / 60).round(6)
|
18
19
|
end
|
19
20
|
|
20
21
|
# TODO
|
@@ -39,5 +40,13 @@ module Gt06Server
|
|
39
40
|
bit10 :course
|
40
41
|
end
|
41
42
|
end
|
43
|
+
|
44
|
+
def lat
|
45
|
+
latitude_bit ? latitude : (latitude * -1)
|
46
|
+
end
|
47
|
+
|
48
|
+
def lon
|
49
|
+
longitude_bit ? longitude : (longitude * -1)
|
50
|
+
end
|
42
51
|
end
|
43
52
|
end
|
data/lib/gt06_server/packet.rb
CHANGED
data/lib/gt06_server/protocol.rb
CHANGED
data/lib/gt06_server/server.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'celluloid/current'
|
3
4
|
require 'celluloid/io'
|
4
5
|
require 'logger'
|
@@ -11,41 +12,30 @@ module Gt06Server
|
|
11
12
|
attr_reader :host, :port, :sessions
|
12
13
|
finalizer :shutdown
|
13
14
|
|
14
|
-
class RunError < StandardError;
|
15
|
-
end
|
15
|
+
class RunError < StandardError; end
|
16
16
|
|
17
17
|
# @param [String] host
|
18
18
|
# @param [Integer] port
|
19
|
-
# @param [
|
19
|
+
# @param [Hash] options
|
20
20
|
# @yields [Hash] information_content of packet
|
21
21
|
def self.run(host, port, options: {}, &block)
|
22
|
-
|
23
|
-
|
24
|
-
if actor&.alive?
|
22
|
+
if Celluloid::Actor['Gt06Server']&.alive?
|
25
23
|
raise RunError, 'Attempt to run more than one the Gt06Server'
|
26
24
|
end
|
27
25
|
|
28
26
|
Gt06Server::Server.supervise(
|
29
27
|
as: 'Gt06Server',
|
30
|
-
args: [host, port, block, options: {logger: Logger.new(STDOUT)}.merge(options)
|
28
|
+
args: [host, port, block, options: { logger: Logger.new(STDOUT) }.merge(options)]
|
31
29
|
)
|
32
30
|
end
|
33
31
|
|
34
|
-
def initialize(host, port, handler, options: {}
|
35
|
-
@logger
|
36
|
-
@host
|
37
|
-
@port
|
38
|
-
|
32
|
+
def initialize(host, port, handler, options: {})
|
33
|
+
@logger = options.fetch(:logger, Logger.new(STDOUT))
|
34
|
+
@host = host
|
35
|
+
@port = port
|
39
36
|
@sessions = Concurrent::Map.new
|
40
37
|
|
41
|
-
|
42
|
-
@sessions,
|
43
|
-
options.fetch(:session_timeout, nil),
|
44
|
-
interval: options.fetch(:sweep_interval, nil),
|
45
|
-
logger: @logger
|
46
|
-
)
|
47
|
-
sweeper.run
|
48
|
-
|
38
|
+
sessions_sweeper_run(@sessions, options)
|
49
39
|
async.run handler
|
50
40
|
end
|
51
41
|
|
@@ -53,32 +43,39 @@ module Gt06Server
|
|
53
43
|
|
54
44
|
def run(handler)
|
55
45
|
@server = TCPServer.new(@host, @port)
|
56
|
-
@logger.info "Gt06Server has been run on host:#{@host} port: #{@port}
|
46
|
+
@logger.info "Gt06Server has been run on host:#{@host} port: #{@port}"
|
57
47
|
loop { async.handle_connection(@server.accept, handler) }
|
58
48
|
end
|
59
49
|
|
50
|
+
def sessions_sweeper_run(sessions, options)
|
51
|
+
SessionSweeper.new(
|
52
|
+
sessions,
|
53
|
+
timeout: options.fetch(:session_timeout, nil),
|
54
|
+
interval: options.fetch(:sweep_interval, nil),
|
55
|
+
logger: options.fetch(:logger, Logger.new(STDOUT))
|
56
|
+
).run
|
57
|
+
end
|
58
|
+
|
60
59
|
def shutdown
|
61
|
-
@server
|
60
|
+
@server&.close
|
62
61
|
end
|
63
62
|
|
64
63
|
def handle_connection(socket, handler)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
@logger.info "Disconnect #{addr}"
|
81
|
-
end
|
64
|
+
addr = socket.peeraddr
|
65
|
+
@logger.info "Connect #{addr}"
|
66
|
+
|
67
|
+
session = Session.new(socket, logger: @logger)
|
68
|
+
@sessions[session.object_id] = session
|
69
|
+
|
70
|
+
session.run(&handler)
|
71
|
+
rescue EOFError => exception
|
72
|
+
@logger.warn "#{addr} #{exception.message}"
|
73
|
+
rescue StandardError => exception
|
74
|
+
@logger.error exception.message
|
75
|
+
@logger.error exception.backtrace
|
76
|
+
ensure
|
77
|
+
socket&.close
|
78
|
+
@logger.info "Disconnect #{addr}"
|
82
79
|
end
|
83
80
|
end
|
84
81
|
end
|
data/lib/gt06_server/session.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Gt06Server
|
3
4
|
class Session
|
4
5
|
class SessionError < RuntimeError; end
|
@@ -6,11 +7,12 @@ module Gt06Server
|
|
6
7
|
attr_reader :terminal_id, :socket, :info, :logger, :addr
|
7
8
|
|
8
9
|
# @param socket [TCPSocket]
|
10
|
+
# @param logger [Logger]
|
9
11
|
def initialize(socket, logger: Logger.new(STDOUT))
|
10
12
|
@socket = socket
|
11
13
|
@addr = socket.peeraddr
|
12
14
|
@terminal_id = ''
|
13
|
-
@info = { received_count: 0, sent_count: 0, last_received_at: Time.now}
|
15
|
+
@info = { received_count: 0, sent_count: 0, last_received_at: Time.now }
|
14
16
|
@logger = logger
|
15
17
|
|
16
18
|
logger.debug 'New session has been created'
|
@@ -50,14 +52,14 @@ module Gt06Server
|
|
50
52
|
@info[:received_count] += 1
|
51
53
|
@info[:last_received_at] = Time.now
|
52
54
|
|
53
|
-
|
54
|
-
block.yield({terminal_id: @terminal_id}.merge!(pack.payload.snapshot))
|
55
|
+
block.yield({ terminal_id: @terminal_id }.merge!(pack.payload.snapshot))
|
55
56
|
|
56
57
|
ack_pack = Protocol.replay_on(pack)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
|
59
|
+
return unless ack_pack
|
60
|
+
|
61
|
+
@socket.write(ack_pack.to_binary_s)
|
62
|
+
@info[:sent_count] += 1
|
61
63
|
end
|
62
64
|
end
|
63
65
|
end
|
@@ -1,29 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'concurrent'
|
4
|
+
|
2
5
|
module Gt06Server
|
3
6
|
class SessionSweeper
|
4
|
-
attr_reader :sessions
|
7
|
+
attr_reader :sessions, :info, :timeout, :interval, :logger
|
8
|
+
|
9
|
+
DEFAULT_TIMEOUT = 60
|
10
|
+
DEFAULT_INTERVAL = 30
|
5
11
|
|
6
12
|
# @param sessions[Array<Session>]
|
7
|
-
def initialize(sessions, timeout
|
13
|
+
def initialize(sessions, timeout: DEFAULT_TIMEOUT, interval: DEFAULT_INTERVAL, logger: Logger.new(STDOUT))
|
8
14
|
@sessions = sessions
|
9
|
-
@timeout = timeout
|
10
|
-
@interval = interval
|
11
|
-
@info = {killed: 0, live:0, count:0}
|
15
|
+
@timeout = timeout
|
16
|
+
@interval = interval
|
17
|
+
@info = { killed: 0, live: 0, count: 0 }
|
12
18
|
@logger = logger
|
13
19
|
end
|
14
20
|
|
15
21
|
def run
|
16
22
|
timer = Concurrent::TimerTask.new(execution_interval: @interval) do
|
17
23
|
@sessions.each_pair do |key, session|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@info[:killed] += 1
|
24
|
-
@sessions.delete(key)
|
25
|
-
@logger.debug "Session #{session.inspect} has been killed"
|
24
|
+
next unless expired_session?(session)
|
25
|
+
|
26
|
+
unless session.socket.closed?
|
27
|
+
session.socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, [1, 0].pack('ii'))
|
28
|
+
session.socket.close
|
26
29
|
end
|
30
|
+
|
31
|
+
@info[:killed] += 1
|
32
|
+
@sessions.delete(key)
|
33
|
+
@logger.debug "Session #{session.inspect} has been killed"
|
27
34
|
end
|
28
35
|
|
29
36
|
@info[:live] = @sessions.size
|
@@ -58,6 +65,5 @@ module Gt06Server
|
|
58
65
|
end
|
59
66
|
end
|
60
67
|
end
|
61
|
-
|
62
68
|
end
|
63
69
|
end
|
data/lib/gt06_server/version.rb
CHANGED
data/lib/libcrc16.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gt06_server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CoolElvis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -95,9 +95,11 @@ files:
|
|
95
95
|
- ".travis.yml"
|
96
96
|
- Gemfile
|
97
97
|
- Gemfile.lock
|
98
|
+
- LICENSE
|
98
99
|
- Note.md
|
99
100
|
- README.md
|
100
101
|
- Rakefile
|
102
|
+
- _config.yml
|
101
103
|
- gt06_server.gemspec
|
102
104
|
- lib/ext/CMakeLists.txt
|
103
105
|
- lib/ext/crc_16.cpp
|