gt06_server 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 345c27d03df39a644236872709e1144b5e5b4562
4
- data.tar.gz: c8479b8c502021cb75755713f5b7b98c80b8f7e2
3
+ metadata.gz: cee3e4400c1b60c86ccb4629c86300b646a6a76a
4
+ data.tar.gz: 7f913c5eda74b44085cc70b631af583e32aa143d
5
5
  SHA512:
6
- metadata.gz: 2112fc5c4b6417f9e76a320fafc613b0fa5eb70eb474636f565bea3691eac873d2e3064701aecaf2052c60f65253de87893569c59cff2692a3d9a451c221a8aa
7
- data.tar.gz: 06893edd463f19ee5bf0217a1e7555fbe5184dc102dcbf7a02dde617bccbf09fb13b943da1d49ad9faa60f81f7747b7607c0725b0e447005194408587a3a8b9c
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.5)
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.3)
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
- net-scp (1.2.1)
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.13.6
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
- The message is a Hash like:
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 = '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'
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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'gt06_server/version'
3
4
  require_relative 'gt06_server/crc'
4
5
  require_relative 'gt06_server/packet'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class CRC16
3
4
  def self.calc(data)
4
5
  lookup_table = [
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
4
  module Messages
4
5
  class AlarmPacket < BinData::Record
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
4
  module Messages
4
5
  class DateTimeInformation < BinData::Primitive
@@ -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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
4
  module Messages
4
5
  class GpsQueryAddressInformation < BinData::Record
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
4
  module Messages
4
5
  class LbsInformation < BinData::Record
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
4
  module Messages
4
5
  class LocationData < BinData::Record
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
4
  module Messages
4
5
  class LoginMessage < BinData::Record
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
4
  module Messages
4
5
  # 5.3. Alarm Packet (Combined information packet of GPS, LBS and Status)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bindata'
3
4
 
4
5
  require_relative 'messages/date_time_information'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
4
  module Protocol
4
5
  module_function
@@ -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 [Logger] logger
19
+ # @param [Hash] options
20
20
  # @yields [Hash] information_content of packet
21
21
  def self.run(host, port, options: {}, &block)
22
- actor = Celluloid::Actor['Gt06Server']
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 = options.fetch(:logger, Logger.new(STDOUT))
36
- @host = host
37
- @port = 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
- sweeper = SessionSweeper.new(
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.close if @server
60
+ @server&.close
62
61
  end
63
62
 
64
63
  def handle_connection(socket, handler)
65
- begin
66
- addr = socket.peeraddr
67
- @logger.info "Connect #{addr}"
68
-
69
- session = Session.new(socket, logger: @logger)
70
- @sessions[session.object_id] = session
71
-
72
- session.run(&handler)
73
- rescue EOFError => exception
74
- @logger.warn "#{addr} #{exception.message}"
75
- rescue StandardError => exception
76
- @logger.error exception.message
77
- @logger.error exception.backtrace
78
- ensure
79
- socket.close if socket
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
@@ -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
- if ack_pack
58
- @socket.write(ack_pack.to_binary_s)
59
- @info[:sent_count] += 1
60
- end
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 , :info, :timeout, :interval, :logger
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 = 60, interval: 30, logger: Logger.new(STDOUT))
13
+ def initialize(sessions, timeout: DEFAULT_TIMEOUT, interval: DEFAULT_INTERVAL, logger: Logger.new(STDOUT))
8
14
  @sessions = sessions
9
- @timeout = timeout || 60
10
- @interval = interval || 30
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
- if expired_session?(session)
19
- unless session.socket.closed?
20
- session.socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, [1, 0].pack('ii'))
21
- session.socket.close
22
- end
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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gt06Server
3
- VERSION = '0.1.5'
4
+ VERSION = '0.1.6'
4
5
  end
data/lib/libcrc16.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'ffi'
3
4
 
4
5
  module GetCrc16
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.5
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-01-04 00:00:00.000000000 Z
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