# Send UDP broadcast packets
import socket
import re

PORT = 1025
IP = "192.168.4.1"
cmd = "SCAN"
addr = (IP, PORT)

def udp_list():
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.settimeout(1)
    ssid_list = []
    flag = False
    for i in range(3):
        s.sendto('SCAN', addr)
        try:
            while 1:
                data, a = s.recvfrom(1024)
                ssid = data
                if ssid in '\r\n':
                    flag = True
                    break
                ssid = ssid.strip('\r\n')
                ssid_list.append(ssid)
        except socket.timeout:
            continue
        except:
            break
            
        if flag:
            break
    s.close()

    if flag:
        return ssid_list
    else:
        return None

def udp_version():
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.settimeout(1)
    version = 1.1
    flag = False
    for i in range(3):
        s.sendto('VERSION', addr)
        try:
            while 1:
                data, a = s.recvfrom(1024)
                flag = True
                break
        except socket.timeout:
            continue
        except:
            break

        if flag:
            break
    s.close()

    if flag:
        try:
            version = float(re.match(r"([0-9]+.[0-9]+)", data).group(0))
        except Exception as e:
            version = 1.1
        return version
    else:
        return version
    
def udp_debug():
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.settimeout(1)
    flag = False
    for i in range(3):
        s.sendto('DEBUG', addr)
        try:
            while 1:
                data, a = s.recvfrom(1024)
                flag = True
                break
        except socket.timeout:
            continue
        except:
            break

        if flag:
            break
    s.close()

    if flag:
        try:
            debug = re.match(r"([0-9])", data).group(0)
            return debug
        except Exception as e:
            raise e
    
    return flag
    
def send(cmd):
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.settimeout(1)
    flag = False
    for i in range(3):
        try:
            s.sendto(cmd, addr)
            while 1:
                data, a = s.recvfrom(1024)
                if 'ok' in data:
                    flag = True
                    break
        except socket.timeout:
            continue
        except:
            break

        if flag:
            break
    s.close()

    return flag

def common_send(cmd):
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.settimeout(1)
    cmd = cmd.replace(r"\t", "\t")
    cmd = cmd.replace(r"\n", "\n")
    cmd = cmd.replace(r"\r", "\r")
    for i in range(5):
        # print "try: ", i
        result = ""
        flag = False
        try:
            s.sendto(cmd, addr)
            while 1:
                data, adr = s.recvfrom(1024)
                # print data.encode('string_escape')
                result += data
                if data == "\r\n" or data == "ok\r\n" or "192.168.4.1\r\n" in data:
                    flag = True
                    break
        except socket.timeout:
            continue
        except Exception as e:
            print e
            break
        if flag:
            break
    s.close()
        
    return result if flag else None