· 4 months ago · May 22, 2025, 05:26 PM
1#!/usr/bin/env ruby
2
3def is_linux
4 RUBY_PLATFORM.downcase.include?('linux')
5end
6
7def is_windows
8 RUBY_PLATFORM.downcase.include?('-mingw32')
9end
10
11def is_freebsd
12 RUBY_PLATFORM.downcase.include?('x86_64-freebsd9.0')
13end
14
15def is_darwin
16 RUBY_PLATFORM.downcase.include?('x86_64-darwin10.8.0')
17end
18
19require 'awesome_print'
20require 'serialport'
21require 'sqlite3'
22require 'win32ole' if is_windows
23
24STDOUT.sync = true
25
26def usb_sniff
27 wmi = WIN32OLE.connect('winmgmts://')
28 devs = wmi.ExecQuery('Select * From Win32_USBControllerDevice')
29
30 devs.each do |dev|
31 dev_name = dev.Dependent.gsub('"', '').split('=')[1]
32 usb_devs = wmi.ExecQuery("Select * From Win32_PnPEntity Where DeviceID = '#{dev_name}' and Description = 'Watchport/H'")
33 usb_devs.each do |usb_obj|
34 str = ''
35 usb_obj.properties_.each do |prop|
36 str << "usb:#{prop.name}->#{prop.value}\n" if prop.value
37 end
38 puts str
39 end
40 end
41end
42
43def com_sniff
44 if is_windows
45 wmi = WIN32OLE.connect('winmgmts://')
46 wsql = 'Select * From Win32_SerialPort where '
47 wsql << "Description = 'Watchport Virtual Port' and Status = 'OK'"
48 ap wsql
49 wmio = wmi.ExecQuery(wsql)
50 wmio.each do |dev|
51 pnpdevice = dev.PNPDeviceID
52 pnpdevice.gsub!(/EDGESER\\/, '')
53 pnpdevice.gsub!(/\\PORT_0/, '')
54 com_port = dev.DeviceID
55 sql_insert(com_port, pnpdevice)
56 end
57 end
58
59 if is_linux
60 myfoo = '/dev/serial/by-id/*-Inside_Out_Networks_Watchport_H*'
61 watchports = Dir.glob(myfoo)
62 ap watchports
63
64 watchports.each do |watchport|
65 com_port = File.realpath(watchport)
66 ap com_port
67 re = Regexp.new('^.*_H_(.*)-if.*') # fixme
68 serialnum = watchport.slice(re, 1) # fixme
69 ap serialnum
70 sql_insert(com_port, serialnum)
71 end
72 end
73
74 sleep(1)
75end
76
77def sql_insert(com_port, desc_str)
78 dbfile = ENV['USERPROFILE'] + '\Desktop\watchport.db' if is_windows
79 dbfile = 'watchport.db' if is_linux
80 db = SQLite3::Database.new(dbfile)
81
82 sql = 'CREATE TABLE IF NOT EXISTS watchport '
83 sql << '( wp_string TEXT, wp_port TEXT, temp TEXT, humid TEXT, tbuf DATE)'
84 db.execute(sql)
85
86 baud_rate = 9600
87 data_bits = 8
88 stop_bits = 1
89 parity = SerialPort::NONE
90
91 begin
92 sp = SerialPort.new(com_port, baud_rate, data_bits, stop_bits, parity)
93 rescue Errno::EACCES
94 warn("Errno::EACCES for #{com_port}")
95 return
96 rescue StandardError => e
97 print "e.class=>[#{e.class}] e.message=>[#{e.message}]\n"
98 puts e.backtrace.join("\n")
99 end
100
101 sp.read_timeout = 3
102 sp.write_timeout = 3 if is_windows
103
104 sp.write("H\r")
105 sleep(2)
106 humid = sp.read.strip
107 sp.close
108
109 begin
110 sp = SerialPort.new(com_port, baud_rate, data_bits, stop_bits, parity)
111 rescue Errno::EACCES
112 warn("Errno::EACCES for #{com_port}")
113 return
114 rescue StandardError => e
115 print "e.class=>[#{e.class}] e.message=>[#{e.message}]\n"
116 puts e.backtrace.join("\n")
117 end
118
119 sp.read_timeout = 3
120 sp.write_timeout = 3 if is_windows
121 sp.write("TF\r")
122 sleep(2)
123 temp = sp.read.strip
124 sp.close
125
126 t = Time.now
127 # d = SQLite3::Database.quote(datetime('now'))
128 # SQLite3::Blob.new( "\0\1\2\3\4\5" ),
129 sql = 'insert into watchport values ( ?, ?, ?, ?, ? )'
130 db.execute(sql, desc_str, com_port, temp, humid, t.to_s)
131
132 db.execute('select count(*),* from watchport') do |row|
133 p row
134 end
135 db.close
136end
137
138begin
139 # db.execute( "drop table if exists watchport" )
140 loop do
141 com_sniff
142 sleep(60 * 2)
143 end
144# usb_sniff
145rescue StandardError => e
146 print "e.class=>[#{e.class}] e.message=>[#{e.message}]\n"
147 puts e.backtrace.join("\n")
148 sp.close
149end
150