Advertisement
dyeske

watchport

May 22nd, 2025
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 3.66 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2.  
  3. def is_linux
  4.   RUBY_PLATFORM.downcase.include?('linux')
  5. end
  6.  
  7. def is_windows
  8.   RUBY_PLATFORM.downcase.include?('-mingw32')
  9. end
  10.  
  11. def is_freebsd
  12.   RUBY_PLATFORM.downcase.include?('x86_64-freebsd9.0')
  13. end
  14.  
  15. def is_darwin
  16.   RUBY_PLATFORM.downcase.include?('x86_64-darwin10.8.0')
  17. end
  18.  
  19. require 'awesome_print'
  20. require 'serialport'
  21. require 'sqlite3'
  22. require 'win32ole' if is_windows
  23.  
  24. STDOUT.sync = true
  25.  
  26. def 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
  41. end
  42.  
  43. def 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)
  75. end
  76.  
  77. def 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
  136. end
  137.  
  138. begin
  139.   # db.execute( "drop table if exists watchport" )
  140.   loop do
  141.     com_sniff
  142.     sleep(60 * 2)
  143.   end
  144. # usb_sniff
  145. rescue StandardError => e
  146.   print "e.class=>[#{e.class}] e.message=>[#{e.message}]\n"
  147.   puts e.backtrace.join("\n")
  148.   sp.close
  149. end
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement