module Milight::BridgeBox
Constants
- MILIGHT_WIFI
- PORT
- RECEIVE_IP
- SERVER_IP
Public Class Methods
choice_ssid(ssids)
click to toggle source
# File lib/milight/bridge_box.rb, line 128 def self.choice_ssid ssids puts '', '-'*20 puts " no: 'ssid' (security types)" ssids.each.with_index do |s, idx| num = '%#2d' % (idx+1) puts " #{num}: '#{s[:ssid]}' (#{s[:sec]})" end puts '-'*20, '' puts <<-DESC Choise your SSID(no). but if your Access point not found, restart app DESC while true msg = ">> input your SSID no(1-#{ssids.size-1}) > " num = Readline.readline(msg).chomp.to_i if num == 0 next # 0 or nil (not a number) elsif !(1..ssids.size).cover? num puts <<-MSG invalid number : '#{num}' exit. MSG exit 0 end return ssids[num-1] end end
milight_wifi?(ipaddr)
click to toggle source
# File lib/milight/bridge_box.rb, line 91 def self.milight_wifi? ipaddr !(ipaddr && MILIGHT_WIFI =~ ipaddr).nil? end
security_key()
click to toggle source
# File lib/milight/bridge_box.rb, line 157 def self.security_key while true msg = '>> Input security key > ' key = Readline.readline(msg).chomp if key != "" return key end end end
setup()
click to toggle source
# File lib/milight/bridge_box.rb, line 11 def self.setup puts "-- Please connect wifi 'milight_XXXXXXX'." if self.wait_connection true puts '... milight connected.' else puts <<DESC milight wifi connection timeout (1min) if milight wifi not found, initialize your controller box. DESC exit 1 end sock = self.socket t1 = Thread.new do self.wait_wscan_results end sleep 1 puts '-- send command: WSCAN ....' sock.command "Link_Wi-Fi" sock.command "+ok" sock.command "AT+WSCAN\r" t1.join wlans = t1.value.split "\n" wlans.shift # ignore header ssids = wlans.map do |line| ch, ssid, _, sec, _ = line.split ',' if ssid.is_a?(String) && ssid.length > 1 {ch: ch, ssid: ssid, sec: sec} end end.compact ssid = self.choice_ssid ssids puts "-- set wifi SSID : '#{ssid[:ssid]}'" sock.command "AT+WSSSID=#{ssid[:ssid]}\r" key = self.security_key puts "-- set wifi security key : '#{key}'" sock.command "AT+WSKEY=WPA2PSK,AES,#{key}\r" sock.command "AT+WMODE=STA\r" sock.command "AT+Z\r" sock.command "AT+Q\r" sock.close if self.wait_connection false puts <<DESC ... miligt wifi disconnected. check your controller box led! DESC else puts ' milight wifi connection still connected' exit 1 end end
socket()
click to toggle source
# File lib/milight/bridge_box.rb, line 95 def self.socket sock = UDPSocket.open sock.setsockopt( Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1 ) def sock.command msg self.send msg, 0, SERVER_IP, PORT end sock end
wait_connection(milight = true)
click to toggle source
# File lib/milight/bridge_box.rb, line 75 def self.wait_connection(milight = true) 20.times do sleep 3 if ipaddr = Milight::Util.current_ipaddr print '.' else print '-' end if self.milight_wifi?(ipaddr) == milight return true end end false end
wait_wscan_results()
click to toggle source
# File lib/milight/bridge_box.rb, line 108 def self.wait_wscan_results puts '-- waiting receive response: WSCAN ....' rsock = UDPSocket.new rsock.bind(RECEIVE_IP, PORT) string = nil sel = IO::select([rsock]) if sel != nil sel[0].each do |s| data = s.recvfrom_nonblock(65535) string = data[0].chomp! end else puts '-- not received ....' exit 1 end rsock.close string.gsub(/\+ok=\n/, '') end