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 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