apex-aprs 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/apex/app_info.rb +1 -1
- data/lib/apex/igate_tcp.rb +160 -0
- data/lib/apex.rb +2 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ab4abfcc8a45fe0ed8cf65e3af8027d5ef5bcf851f70a8e9067207b51699cc8
|
4
|
+
data.tar.gz: d9aeb612963bd2f85bd527d94ae8b77794326550590c98b4e51d45c3f8255991
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 436265f8be51ee2cb49ff0f074a60a7d87214a68c56459a4ae33346da851e2013188735a0f1bdeaca974437c49720e80b4641a91f70c04fc476f831cc6e329cb
|
7
|
+
data.tar.gz: 6e1e45ee6ee7e680db9d3889a57f6a1c8fe1120fea3cc97484ee4c22158aa07949aaea97a7e2daea363a4fef4d0c09de5930ef1adffacb3b644c5a56da34b52d
|
data/CHANGELOG.md
CHANGED
data/lib/apex/app_info.rb
CHANGED
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'apex/app_info'
|
2
|
+
|
3
|
+
module Apex
|
4
|
+
class IGateTcp
|
5
|
+
DEFAULT_APRSIS_URL = 'http://srvr.aprs-is.net:8080'
|
6
|
+
DEFAULT_APRSIS_SERVER = 'rotate.aprs.net'
|
7
|
+
DEFAULT_APRSIS_FILTER_PORT = 14580
|
8
|
+
|
9
|
+
protected
|
10
|
+
def initialize(user, password='-1')
|
11
|
+
@user = user
|
12
|
+
@auth = ['user', user, 'pass', password, 'vers', "APEX #{VERSION}"].join(' ')
|
13
|
+
@aprsis_sock = nil
|
14
|
+
@data_buffer = ''
|
15
|
+
@packet_buffer = []
|
16
|
+
@lock = Mutex.new
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def reset_buffer
|
21
|
+
@data_buffer = ''
|
22
|
+
@packet_buffer = []
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def self.format_path(path_list)
|
27
|
+
path_list.join(',')
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def self.encode_frame(frame)
|
32
|
+
formatted_frame = [frame[:source], frame[:destination]].join('>')
|
33
|
+
if frame[:path] and frame[:path].length > 0
|
34
|
+
formatted_frame = [formatted_frame, IGateTcp::format_path(frame[:path])].join(',')
|
35
|
+
end
|
36
|
+
formatted_frame += ':'
|
37
|
+
formatted_frame += frame[:text]
|
38
|
+
return formatted_frame
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def self.decode_frame(frame)
|
43
|
+
decoded_frame = {}
|
44
|
+
frame_so_far = ''
|
45
|
+
path = nil
|
46
|
+
frame.chars.each do |char|
|
47
|
+
if char == '>' and !decoded_frame.include? :source
|
48
|
+
decoded_frame[:source] = frame_so_far
|
49
|
+
frame_so_far = ''
|
50
|
+
elsif char == ':' and !path
|
51
|
+
path = frame_so_far
|
52
|
+
frame_so_far = ''
|
53
|
+
else
|
54
|
+
frame_so_far = [frame_so_far, char].join
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
path = path.split(',')
|
59
|
+
decoded_frame[:destination] = path.shift
|
60
|
+
decoded_frame[:path] = path
|
61
|
+
decoded_frame[:text] = frame_so_far
|
62
|
+
|
63
|
+
decoded_frame
|
64
|
+
end
|
65
|
+
|
66
|
+
public
|
67
|
+
def connect(server=nil, port=nil, aprs_filter=nil, *args, **kwargs)
|
68
|
+
@lock.synchronize do
|
69
|
+
unless @aprsis_sock
|
70
|
+
reset_buffer
|
71
|
+
|
72
|
+
unless server
|
73
|
+
server = DEFAULT_APRSIS_SERVER
|
74
|
+
end
|
75
|
+
|
76
|
+
unless port
|
77
|
+
port = DEFAULT_APRSIS_FILTER_PORT
|
78
|
+
end
|
79
|
+
|
80
|
+
if aprs_filter.nil?
|
81
|
+
@full_auth = @auth
|
82
|
+
else
|
83
|
+
@full_auth = [@auth, 'filter', aprs_filter].join(' ')
|
84
|
+
end
|
85
|
+
|
86
|
+
@server = server
|
87
|
+
@port = port
|
88
|
+
@aprsis_sock = TCPSocket.open(@server, @port)
|
89
|
+
@aprsis_sock.puts( @full_auth + "\r\n" )
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
public
|
95
|
+
def close(*args, **kwargs)
|
96
|
+
@lock.synchronize do
|
97
|
+
if @aprsis_sock
|
98
|
+
@aprsis_sock.close
|
99
|
+
reset_buffer
|
100
|
+
@aprsis_sock = nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
public
|
106
|
+
def read(filter_logresp=true, *args, **kwargs)
|
107
|
+
@lock.synchronize do
|
108
|
+
# check if there is any data waiting
|
109
|
+
read_more = true
|
110
|
+
while read_more
|
111
|
+
begin
|
112
|
+
read_line = @aprsis_sock.read_nonblock(100)
|
113
|
+
unless read_line.nil?
|
114
|
+
@data_buffer << read_line
|
115
|
+
end
|
116
|
+
rescue IO::WaitReadable
|
117
|
+
read_more = false
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# check for any complete packets and move them to the packet buffer
|
122
|
+
if @data_buffer.include? "\r\n"
|
123
|
+
partial = true
|
124
|
+
if @data_buffer.end_with? "\r\n"
|
125
|
+
partial = false
|
126
|
+
end
|
127
|
+
|
128
|
+
packets = @data_buffer.split("\r\n")
|
129
|
+
if partial
|
130
|
+
@data_buffer = packets.pop.dup
|
131
|
+
else
|
132
|
+
@data_buffer = ''
|
133
|
+
end
|
134
|
+
|
135
|
+
packets.each do |packet|
|
136
|
+
@packet_buffer << packet.dup
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# return the next packet that matches the filter
|
141
|
+
while @packet_buffer.length > 0
|
142
|
+
packet = @packet_buffer.pop
|
143
|
+
unless (filter_logresp and packet.start_with?('#'))
|
144
|
+
return IGateTcp::decode_frame(packet)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
return nil
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
public
|
153
|
+
def write(frame, *args, **kwargs)
|
154
|
+
@lock.synchronize do
|
155
|
+
encoded_frame = IGateTcp::encode_frame(frame)
|
156
|
+
@aprsis_sock.puts( encoded_frame )
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
data/lib/apex.rb
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
require 'apex/aprs_kiss'
|
1
|
+
require 'apex/aprs_kiss'
|
2
|
+
require 'apex/igate_tcp'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apex-aprs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeffrey Phillips Freeman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: abstraction
|
@@ -129,6 +129,7 @@ files:
|
|
129
129
|
- lib/apex.rb
|
130
130
|
- lib/apex/app_info.rb
|
131
131
|
- lib/apex/aprs_kiss.rb
|
132
|
+
- lib/apex/igate_tcp.rb
|
132
133
|
homepage: https://github.com/Syncleus/apex-aprs
|
133
134
|
licenses:
|
134
135
|
- Apache-2.0
|