serial_modem 0.3.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f4ad510a17d04cf960fbb07b9fee8da5e3a705d
4
+ data.tar.gz: c561195ce7439aa7a25214caeb3f4ead70ba227c
5
+ SHA512:
6
+ metadata.gz: edee72d6fff2ebd4f98b2a887c45a09a4c2c2f6ae0fab8b6773450bf187cf3615c0710037190efe30e71970a2427f273c3d0e6d71f929c2de4e2f497181499fe
7
+ data.tar.gz: b0ca14f55324f823432c626178af5bea5680a5758022d98c99213dc8d4f98d52b28dfd39529f50618d78e87850b0daee7f9fbd65648d21b638949b7633fbfd95
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ /.hg/
2
+ /.hgignore
3
+ /.bundle/
4
+ /.yardoc
5
+ /Gemfile.lock
6
+ /_yardoc/
7
+ /coverage/
8
+ /doc/
9
+ /pkg/
10
+ /spec/reports/
11
+ /tmp/
12
+ *.bundle
13
+ *.so
14
+ *.o
15
+ *.a
16
+ mkmf.log
17
+ /.idea/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in SerialModem.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,3 @@
1
+ Copyright (c) 2015 Linus Gasser
2
+
3
+ GPLv3 or later at your convenience
data/README.md ADDED
@@ -0,0 +1,139 @@
1
+ # SerialModem
2
+
3
+ Simple interface for Serial Modems. Tested:
4
+ - Huawei E303 in serial mode
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'SerialModem'
12
+ ```
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install SerialModem
21
+
22
+ ## Usage
23
+
24
+ ### Simple
25
+
26
+ If everything is connected and the modem is recognized (/dev/ttyUSB* is
27
+ available), then you can simply do:
28
+
29
+ ```
30
+ require 'serialmodem'
31
+
32
+ SerialModem::setup_modem
33
+ return unless SerialModem.attached?
34
+
35
+ SerialModem::ussd_send('*100#')
36
+ SerialModem::sms_send('+23599999999', 'Hello from SerialModem')
37
+ ```
38
+
39
+ ### Ussd
40
+
41
+ Huawei-modems with Hilink don't support USSD, so you have to switch them
42
+ to serial-mode. Older modems (pre-2015) are handled with _HilinkModem_, newer versions
43
+ not yet. Once the modem is in serial-mode, you can send and receive USSD-codes.
44
+ It is even possible to use USSD-menus.
45
+
46
+ #### Sending
47
+
48
+ Supposing the modem is setup, you can do
49
+
50
+ ```
51
+ SerialModem::send_ussd('*100#')
52
+ ```
53
+
54
+ Or, if you need a menu where each step needs an answer, you can do
55
+
56
+ ```
57
+ SerialModem::send_ussd('*800#', '1', '2', '1234')
58
+ ```
59
+
60
+ Now each command waits for the last command to be completed.
61
+
62
+ #### Receiving
63
+
64
+ The received codes are stored in an array of hashes, where each hash has
65
+ three fields:
66
+
67
+ - time: a string of "%H:%M"
68
+ - code: the ussd-code as sent out by 'ussd_send'
69
+ - result
70
+
71
+ There is a maximum of _SerialModem::serial_ussd_results_max_ messages
72
+ stored.
73
+
74
+ ```
75
+ SerialModem::send_ussd('*128#')
76
+ sleep 10
77
+ result = SerialModem.serial_ussd_results.first.result
78
+ ```
79
+
80
+ #### Asynchronous receiving
81
+
82
+ You can also define a listener in _SerialModem.serial_ussd_new_
83
+
84
+ ### SMS
85
+
86
+ Similar to USSD, you can send and receive SMS. Due to some restrictions in
87
+ Huawei-modems, there is a thread that checks for new SMSs every 20s. Normally
88
+ modems should reply as soon as an SMS is received, but most of the Huawei-modems
89
+ tested delete SMS automatically when in this mode. If you prefer nonethelss to
90
+ rely on this mode, set _SerialModem.serial_sms_autoscan_ to 0.
91
+
92
+ #### Sending
93
+
94
+ If everything is recognized, simply do:
95
+
96
+ ```
97
+ SerialModem.sms_send('+23599999999', 'Hello from SerialModem')
98
+ ```
99
+
100
+ And the message should be sent.
101
+
102
+ #### Receiving
103
+
104
+ All SMS are put in a hash of arrays with the key of the hash being the message-id
105
+ and the elements of the array as follows:
106
+
107
+ 0: sms-flag
108
+ 1: number of sender
109
+ 2: unknown field
110
+ 3: date and time of SMS
111
+ 4: the message
112
+
113
+ #### Asynchronous receiving
114
+
115
+ You can also use the _SerialModem.serial_sms_new_ variable to set up an
116
+ automatic callback whenever a new SMS is received:
117
+
118
+ ```
119
+
120
+ def treat_sms(list, id)
121
+ p "Received SMS from #{list[id][1]}"
122
+ end
123
+
124
+ SerialModem.serial_sms_new.push(Proc.new { |list, id| treat_sms(list, id) })
125
+
126
+ # Wait for SMS
127
+ ```
128
+
129
+ ## Special
130
+
131
+ Some care has been taken that the serial modem is recognized and can be
132
+ functional again in case of error:
133
+
134
+ ### detach and re-attach in case of power-failure
135
+
136
+ It can happen that the modem is in use and is reattached because of errors in the
137
+ power. In that case it is not attached anymore to '/dev/ttyUSB2', but to
138
+ '/dev/ttyUSB3'. With some luck, the _SerialModem.reload_option_ can help to
139
+ make things OK again.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler/gem_tasks'
2
+
data/commit ADDED
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+
3
+ git_func(){
4
+ if [ "$( which git 2>/dev/null )" ]; then
5
+ git "$@"
6
+ fi
7
+ }
8
+
9
+ if [ ! "$1" ]; then
10
+ hg diff
11
+ hg st
12
+ git_func status
13
+ echo
14
+ else
15
+ hg commit -m "$@"
16
+ git_func commit -a -m "$@"
17
+ fi
@@ -0,0 +1,418 @@
1
+ require 'serialport'
2
+ require 'helperclasses'
3
+
4
+ module SerialModem
5
+ DEBUG_LVL = 1
6
+ attr_accessor :serial_sms_new, :serial_sms,
7
+ :serial_ussd_new
8
+ extend self
9
+ include HelperClasses
10
+ include HelperClasses::DPuts
11
+ extend HelperClasses::DPuts
12
+
13
+ def setup_modem(dev = nil)
14
+ @serial_debug = false
15
+ @serial_tty = @serial_tty_error = @serial_sp = nil
16
+ @serial_replies = []
17
+ @serial_codes = {}
18
+ @serial_sms = {}
19
+ # TODO: once serialmodem == class, change this into Observer
20
+ @serial_sms_new = []
21
+ @serial_sms_autoscan = 20
22
+ @serial_sms_autoscan_last = Time.now
23
+ @serial_ussd = []
24
+ @serial_ussd_last = Time.now
25
+ @serial_ussd_timeout = 30
26
+ @serial_ussd_results = []
27
+ @serial_ussd_results_max = 100
28
+ # TODO: once serialmodem == class, change this into Observer
29
+ @serial_ussd_new = []
30
+ @serial_mutex_rcv = Mutex.new
31
+ @serial_mutex_send = Mutex.new
32
+ # Some Huawei-modems eat SMS once they send a +CMTI-message - this
33
+ # turns off the CMTI-messages which slows down incoming SMS detection
34
+ @serial_eats_sms = false
35
+ setup_tty
36
+ end
37
+
38
+ def read_reply(wait = nil)
39
+ @serial_debug and dputs_func
40
+ raise IOError.new('NoModemHere') unless @serial_sp
41
+ ret = []
42
+ begin
43
+ @serial_mutex_rcv.synchronize {
44
+ while !@serial_sp.eof? || wait
45
+ begin
46
+ @serial_replies.push rep = @serial_sp.readline.chomp
47
+ break if rep == wait
48
+ rescue EOFError => e
49
+ dputs(4) { 'Waited for string, but got nothing' }
50
+ break
51
+ end
52
+ end
53
+ }
54
+
55
+ while m = @serial_replies.shift
56
+ @serial_debug and dputs_func
57
+ next if (m == '' || m =~ /^\^/)
58
+ dputs(3) { "Reply: #{m}" }
59
+ ret.push m
60
+ if m =~ /\+[\w]{4}: /
61
+ code, msg = m[1..4], m[7..-1]
62
+ dputs(3) { "found code #{code.inspect} - #{msg.inspect}" }
63
+ @serial_codes[code] = msg
64
+ case code
65
+ when /CMGL/
66
+ # Typical input from the modem:
67
+ # "0,\"REC UNREAD\",\"+23599836457\",,\"15/04/08,17:12:21+04\""
68
+ # Output desired:
69
+ # ["0", "REC UNREAD", "+23599836457", "", "15/04/08,17:12:21+04"]
70
+ id, flag, number, unknown, date =
71
+ msg.scan(/"(.*?)"|([^",]+)\s*|,,/).collect { |a, b| a.to_s + b.to_s }
72
+ ret.push @serial_replies.shift
73
+ sms_new(id, flag, number, date, ret.last, unknown)
74
+ when /CUSD/
75
+ if pdu = msg.match(/.*\"(.*)\".*/)
76
+ ussd_received(pdu_to_ussd(pdu[1]))
77
+ elsif msg == '2'
78
+ #log_msg :serialmodem, 'Closed USSD.'
79
+ #ussd_received('')
80
+ #ussd_close
81
+ else
82
+ log_msg :serialmodem, "Unknown: CUSD - #{msg}"
83
+ end
84
+ when /CMTI/
85
+ if msg =~ /^.ME.,/
86
+ dputs(3) { "I think I got a new message: #{msg}" }
87
+ sms_scan true
88
+ else
89
+ log_msg :serialmodem, "Unknown: CMTI - #{msg}"
90
+ end
91
+ @serial_eats_sms and modem_send('AT+CNMI=0,0,0,0,0', 'OK')
92
+ # Probably a message or so - '+CMTI: "ME",0' is a new message
93
+ end
94
+ end
95
+ end
96
+ rescue IOError => e
97
+ raise e
98
+ =begin
99
+ rescue Exception => e
100
+ puts "#{e.inspect}"
101
+ puts "#{e.to_s}"
102
+ puts e.backtrace
103
+ =end
104
+ end
105
+ ret
106
+ end
107
+
108
+ def sms_new(id, flag, number, date, msg, unknown = nil)
109
+ sms = {flag: flag, number: number, unknown: unknown, date: date,
110
+ msg: msg, id: id}
111
+ @serial_sms[id.to_s] = sms
112
+ if flag =~ /unread/i
113
+ log_msg :SerialModem, "New SMS: #{sms.inspect}"
114
+ rescue_all do
115
+ @serial_sms_new.each { |s|
116
+ s.call(sms)
117
+ }
118
+ end
119
+ end
120
+ sms
121
+ end
122
+
123
+ def modem_send(str, reply = true)
124
+ return unless @serial_sp
125
+ @serial_debug and dputs_func
126
+ dputs(3) { "Sending string #{str} to modem" }
127
+ @serial_mutex_send.synchronize {
128
+ begin
129
+ @serial_sp.write("#{str}\r\n")
130
+ rescue Errno::EIO => e
131
+ log_msg :SerialModem, "Couldn't write to device"
132
+ kill
133
+ return
134
+ rescue Errno::ENODEV => e
135
+ log_msg :SerialModem, 'Device is not here anymore'
136
+ kill
137
+ return
138
+ end
139
+ }
140
+ read_reply(reply)
141
+ end
142
+
143
+ def switch_to_hilink
144
+ modem_send('AT^U2DIAG=119', 'OK')
145
+ end
146
+
147
+ def save_modem
148
+ modem_send('AT^U2DIAG=0', 'OK')
149
+ end
150
+
151
+ def ussd_to_pdu(str)
152
+ str.unpack('b*').join.scan(/.{8}/).map { |s| s[0..6] }.join.
153
+ scan(/.{1,8}/).map { |s| [s].pack('b*').unpack('H*')[0].upcase }.join
154
+ end
155
+
156
+ def pdu_to_ussd(str)
157
+ [str].pack('H*').unpack('b*').join.scan(/.{7}/).
158
+ map { |s| [s+"0"].pack('b*') }.join
159
+ end
160
+
161
+ def ussd_send_now
162
+ return unless @serial_ussd.length > 0
163
+ str_send = @serial_ussd.first
164
+ @serial_ussd_last = Time.now
165
+ if str_send
166
+ #log_msg :SerialModem, "Sending ussd-string #{str_send} with add of #{@ussd_add} "+
167
+ "and queue #{@serial_ussd}"
168
+ modem_send("AT+CUSD=1,\"#{ussd_to_pdu(str_send)}\"#{@ussd_add}", 'OK')
169
+ else
170
+ dputs(2) { 'Sending ussd-close' }
171
+ @serial_ussd.shift
172
+ ussd_close
173
+ end
174
+ end
175
+
176
+ def ussd_close
177
+ modem_send("AT+CUSD=2#{@ussd_add}", 'OK')
178
+ @serial_ussd.length > 0 and ussd_send_now
179
+ end
180
+
181
+ def ussd_send(str)
182
+ if str.class == String
183
+ dputs(3) { "Sending ussd-code #{str}" }
184
+ @serial_ussd.push str
185
+ @serial_ussd.length == 1 and ussd_send_now
186
+ elsif str.class == Array
187
+ dputs(3) { "Sending menu-command #{str}" }
188
+ @serial_ussd.concat str
189
+ @serial_ussd.push nil
190
+ @serial_ussd.length == str.length + 1 and ussd_send_now
191
+ end
192
+ end
193
+
194
+ def ussd_store_result(str)
195
+ if @serial_ussd.length > 0
196
+ code = @serial_ussd.shift
197
+ dputs(2) { "Got USSD-reply for #{code}: #{str}" }
198
+ @serial_ussd_results.push(time: Time.now.strftime('%H:%M'),
199
+ code: code, result: str)
200
+ @serial_ussd_results.shift([0, @serial_ussd_results.length -
201
+ @serial_ussd_results_max].max)
202
+ ussd_send_now
203
+ code
204
+ else
205
+ #log_msg :serialmodem, "Got unasked code #{str}"
206
+ 'unknown'
207
+ end
208
+ end
209
+
210
+ def ussd_received(str)
211
+ code = ussd_store_result(str)
212
+ dputs(2) { "Got result for #{code}: -#{str}-" }
213
+ @serial_ussd_new.each { |s|
214
+ s.call(code, str)
215
+ }
216
+ end
217
+
218
+ def ussd_fetch(str)
219
+ return nil unless @serial_ussd_results
220
+ dputs(3) { "Fetching str #{str} - #{@serial_ussd_results.inspect}" }
221
+ res = @serial_ussd_results.reverse.find { |u| u._code == str }
222
+ res ? res._result : nil
223
+ end
224
+
225
+ def sms_send(number, msg)
226
+ log_msg :SerialModem, "Sending SMS --#{msg.inspect}-- to --#{number.inspect}--"
227
+ modem_send('AT+CMGF=1', 'OK')
228
+ modem_send("AT+CMGS=\"#{number}\"")
229
+ modem_send("#{msg}\x1a", 'OK')
230
+ end
231
+
232
+ def sms_scan(force = false)
233
+ if force || (@serial_sms_autoscan > 0 &&
234
+ Time.now - @serial_sms_autoscan_last > @serial_sms_autoscan)
235
+ dputs(3) { 'Auto-scanning sms' }
236
+ @serial_sms_autoscan_last = Time.now
237
+ modem_send('AT+CMGF=1', 'OK')
238
+ modem_send('AT+CMGL="ALL"', 'OK')
239
+ end
240
+ end
241
+
242
+ def sms_delete(number)
243
+ dputs(3) { "Asking to delete #{number} from #{@serial_sms.inspect}" }
244
+ if @serial_sms.has_key? number.to_s
245
+ dputs(3) { "Deleting #{number}" }
246
+ modem_send("AT+CMGD=#{number}", 'OK')
247
+ @serial_sms.delete number.to_s
248
+ end
249
+ end
250
+
251
+ def get_operator
252
+ modem_send('AT+COPS=3,0', 'OK')
253
+ modem_send('AT+COPS?', 'OK')
254
+ (1..6).each {
255
+ if @serial_codes.has_key? 'COPS'
256
+ return '' if @serial_codes['COPS'] == '0'
257
+ @serial_eats_sms and modem_send('AT+CNMI=0,0,0,0,0', 'OK')
258
+ op = @serial_codes['COPS'].scan(/".*?"|[^",]\s*|,,/)[2].gsub(/"/, '')
259
+ dputs(2) { "Found operator-string #{op}" }
260
+ return op
261
+ end
262
+ sleep 0.5
263
+ }
264
+ return ''
265
+ end
266
+
267
+ def set_connection_type(net, modem = :e303)
268
+ # According to https://wiki.archlinux.org/index.php/3G_and_GPRS_modems_with_pppd
269
+ cmds = {e303: {c3go: '14,2,3FFFFFFF,0,2', c3g: '2,2,3FFFFFFF,0,2',
270
+ c2go: '13,1,3FFFFFFF,0,2', c2g: '2,1,3FFFFFFF,0,2'}}
271
+ modem_send "AT^SYSCFG=#{cmds[modem]["c#{net}".to_sym]}", 'OK'
272
+ end
273
+
274
+ def traffic_statistics
275
+
276
+ end
277
+
278
+ def init_modem
279
+ %w( ATZ
280
+ AT+CNMI=0,0,0,0,0
281
+ AT+CPMS="SM","SM","SM"
282
+ AT+CFUN=1
283
+ AT+CMGF=1 ).each { |at| modem_send(at, 'OK') }
284
+ @serial_eats_sms and modem_send('AT+CNMI=0,0,0,0,0', 'OK')
285
+ set_connection_type '3g'
286
+ end
287
+
288
+ def setup_tty
289
+ check_presence
290
+
291
+ @serial_mutex_rcv.synchronize {
292
+ if !@serial_sp && @serial_tty
293
+ if File.exists? @serial_tty
294
+ dputs(2){ 'setting up SerialPort'}
295
+ @serial_sp = SerialPort.new(@serial_tty, 115200)
296
+ @serial_sp.read_timeout = 500
297
+ end
298
+ elsif @serial_sp &&
299
+ (!@serial_tty||(@serial_tty && !File.exists?(@serial_tty)))
300
+ dputs(2){'disconnecting modem'}
301
+ kill
302
+ end
303
+ }
304
+ if @serial_sp
305
+ dputs(2){'initialising modem'}
306
+ init_modem
307
+ start_serial_thread
308
+ if !@serial_sp
309
+ dputs(2){'Lost serial-connection while initialising - trying again'}
310
+ kill
311
+ reload_option
312
+ setup_tty
313
+ return
314
+ end
315
+ dputs(2){'finished connecting'}
316
+ end
317
+ end
318
+
319
+ def check_presence
320
+ @serial_mutex_rcv.synchronize {
321
+ @serial_tty.to_s.length > 0 and File.exists?(@serial_tty) and return
322
+ case lsusb = System.run_str('lsusb')
323
+ when /12d1:1506/, /12d1:14ac/, /12d1:1c05/
324
+ log_msg :SerialModem, 'Found 3G-modem with ttyUSB0-ttyUSB2'
325
+ @serial_tty_error = '/dev/ttyUSB3'
326
+ @serial_tty = '/dev/ttyUSB2'
327
+ @ussd_add = (lsusb =~ /12d1:14ac/) ? ',15' : ''
328
+ @serial_eats_sms = true
329
+ when /airtel-modem/
330
+ log_msg :SerialModem, 'Found 3G-modem with ttyUSB0-ttyUSB4'
331
+ @serial_tty_error = '/dev/ttyUSB5'
332
+ @serial_tty = '/dev/ttyUSB4'
333
+ @ussd_add = ''
334
+ else
335
+ #puts caller.join("\n")
336
+ @serial_tty = @serial_tty_error = nil
337
+ end
338
+ dputs(2){"serial_tty is #{@serial_tty.inspect} and exists " +
339
+ "#{File.exists?(@serial_tty.to_s)}"}
340
+ if @serial_tty_error && File.exists?(@serial_tty_error)
341
+ log_msg :SerialModem, 'resetting modem'
342
+ reload_option
343
+ end
344
+ }
345
+ end
346
+
347
+ def start_serial_thread
348
+ @serial_thread = Thread.new {
349
+ #dputs_func
350
+ dputs(2){'Thread started'}
351
+ loop {
352
+ begin
353
+ dputs(5) { 'Reading out modem' }
354
+ if read_reply.length == 0
355
+ #@serial_sms.each { |id, sms|
356
+ # ddputs(3) { "Deleting sms #{sms.inspect} afterwards" }
357
+ # sms_delete(id)
358
+ #}
359
+ end
360
+
361
+ dputs(4) { (Time.now - @serial_ussd_last).to_s }
362
+ if (Time.now - @serial_ussd_last > @serial_ussd_timeout) &&
363
+ (@serial_ussd.length > 0)
364
+ log_msg :SerialModem, "Re-sending #{@serial_ussd.first}"
365
+ ussd_send_now
366
+ end
367
+
368
+ sms_scan
369
+
370
+ sleep 0.5
371
+ rescue IOError
372
+ log_msg :SerialModem, 'IOError - killing modem'
373
+ kill
374
+ return
375
+ rescue Exception => e
376
+ dputs(0) { "#{e.inspect}" }
377
+ dputs(0) { "#{e.to_s}" }
378
+ e.backtrace.each { |l| dputs(0) { l } }
379
+ end
380
+ dputs(5) { 'Finished' }
381
+ }
382
+ dputs(1) { 'Finished thread' }
383
+ }
384
+ end
385
+
386
+ def reload_option
387
+ @serial_sp and @serial_sp.close
388
+ @serial_sp = nil
389
+ dputs(1) { 'Trying to reload modem-driver - killing and reloading' }
390
+ %w( chat ppp).each { |pro|
391
+ System.run_str("killall -9 #{pro}")
392
+ }
393
+ %w(rmmod modprobe).each { |cmd|
394
+ System.run_str("#{cmd} option")
395
+ }
396
+ end
397
+
398
+ def kill
399
+ #dputs_func
400
+ if @serial_thread
401
+ if @serial_thread.alive?
402
+ dputs(3) { 'Killing thread' }
403
+ @serial_thread.kill
404
+ dputs(3) { 'Joining thread' }
405
+ @serial_thread.join
406
+ dputs(3) { 'Thread joined' }
407
+ end
408
+ end
409
+ @serial_sp and @serial_sp.close
410
+ dputs(1) { 'SerialModem killed' }
411
+ @serial_sp = nil
412
+ end
413
+
414
+ def attached?
415
+ @serial_sp != nil
416
+ end
417
+
418
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'serial_modem'
7
+ spec.version = '0.3.0'
8
+ spec.authors = ['Linus Gasser']
9
+ spec.email = ['ineiti@linusetviviane.ch']
10
+ spec.summary = %q{Interface to serial-usb-modems}
11
+ spec.description = %q{This can interface a lot of different usb-modems and serial modems}
12
+ spec.homepage = 'https://github.com/ineiti/SerialModem'
13
+ spec.license = 'GPLv3'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.7'
21
+ spec.add_development_dependency 'rake', '~> 10.0'
22
+ spec.add_runtime_dependency 'serialport', '1.3.1'
23
+ end
data/test/run_test ADDED
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+ RP=""
3
+ for a in HilinkModem SerialModem HelperClasses; do
4
+ RP="$RP -I../../$a/lib"
5
+ done
6
+ for a in activesupport-3.1.1 i18n-0.6.0; do
7
+ RP="$RP -I../../QooxView/libs/$a/lib"
8
+ done
9
+ echo $RP
10
+ ruby $RP $1
data/test/test_hw.rb ADDED
@@ -0,0 +1,59 @@
1
+ #!/bin/env ruby
2
+ #$LOAD_PATH.push '../lib'
3
+ DEBUG_LVL=5
4
+
5
+ require 'serial_modem'
6
+ include SerialModem
7
+
8
+ def main
9
+ test_send_ussd
10
+ end
11
+
12
+ def test_remove
13
+ setup_modem
14
+ check_presence
15
+ sleep 3
16
+ kill
17
+ sleep 5
18
+ reload_option
19
+ end
20
+
21
+ def test_send_ussd
22
+ setup_modem
23
+ #check_presence
24
+ ussd_send('*100#')
25
+ sleep 5
26
+ #dp 'done'
27
+ end
28
+
29
+ def test_old
30
+ setup_modem nil
31
+ check_presence
32
+ #set_connection_type '2go'
33
+ #sleep 10
34
+ ussd_send('*128#')
35
+ sleep 5
36
+ #set_connection_type '3g'
37
+ #sleep 10
38
+ #ussd_send('*128#')
39
+ #sleep 10
40
+ #ussd_send('*128#')
41
+ #sleep 10
42
+ #sleep 1
43
+ #ussd_send('*128#')
44
+ #sms_send('93999699', 'SMS from Dreamplug')
45
+ #sms_send('100', 'internet')
46
+ #sms_scan
47
+ #sleep 10
48
+ #ussd_send('*100#')
49
+ #sms_scan
50
+ #@huawei_sms.each{|k,v| puts "#{k}: #{v.inspect}"}
51
+ #sms_scan
52
+ #sms_delete( 0 )
53
+ #sms_scan
54
+ #sleep 10
55
+ #puts SerialModem::send_modem('atz')
56
+ #sleep 10
57
+ end
58
+
59
+ main
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: serial_modem
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Linus Gasser
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: serialport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.1
55
+ description: This can interface a lot of different usb-modems and serial modems
56
+ email:
57
+ - ineiti@linusetviviane.ch
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - commit
68
+ - lib/serial_modem.rb
69
+ - serial_modem.gemspec
70
+ - test/run_test
71
+ - test/test_hw.rb
72
+ homepage: https://github.com/ineiti/SerialModem
73
+ licenses:
74
+ - GPLv3
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.2.2
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Interface to serial-usb-modems
96
+ test_files:
97
+ - test/run_test
98
+ - test/test_hw.rb