发现身边很多朋友都在学习Python,而Python作为一个计算语言,很少有练习的机会,今天开放一个之前给广州客户做的消息中间件源码,读懂这套代码基本上就会应用Python,包括了:

1、websocket 

2、类与对象

3、多线程

4、日志处理

5、json处理

6、时间处理

7、MySQL数据库处理

8、HTTP request 处理

9、头文件引用


一、定义配置文件 uncall_config.py

__author__ = 'ideacall'

LISTEN_IP =  "xx.xx.xx.xx"
LISTEN_PORT = 6899

HOST= ""
PORT=3306
USER='root'
PASSWD=''
DB=''

UNCALL_HTTP_HOST =  ""



二、主文件


#coding=utf8
#!/usr/bin/python

from __future__ import print_function
import struct,socket
import hashlib
import threading,random
import time
import json
import pymysql
from base64 import b64encode, b64decode
import urllib  
import uncall_config
from time import ctime,sleep

SEND_BUF_SIZE = 4096 # send buf
RECV_BUF_SIZE = 4096 # recv buf

LISTEN_IP = uncall_config.LISTEN_IP #listen ip address
LISTEN_PORT = uncall_config.LISTEN_PORT #listen ip ports
HOST = uncall_config.HOST #db host
PORT = uncall_config.PORT #db port
USER = uncall_config.USER #db user
PASSWD = uncall_config.PASSWD #db pwd
DB = uncall_config.DB # db datanames
UNCALL_HTTP_HOST = uncall_config.UNCALL_HTTP_HOST #uncallcc webservices address

connectionlist = {}
webclasslist = {}
pymysql.install_as_MySQLdb()

def write_log(msg):
    f=open("/tmp/cxst_socket.log","a+")
    f.write(msg+"\n")
    f.close()

#check number strip is 0
def str_number_strip_check(s):
    if (s.startswith('01')) :
        return s.strip('0')
    else:
        return s

#check exten login
def check_extension(extension):
    rows = 0
    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cur.execute("select extension, status, dnd from users where extension='"+str(extension)+"'")
    rows = cur.rowcount
    cur.close()
    conn.close()
    return rows

def pushData():

    global webclasslist

    for webclient in webclasslist.values():

        write_log(' TASK THREAD -----> %s is_login status %s %s ' %(webclient.index, webclient.is_login, webclient.extension))

        if webclient.is_login > 0 :

            status = get_extension_status(webclient.extension)

            if status != webclient.status and len(status)>0 :
                webclient.status = status
                ret_data = {'Event':'STATUS','errorCode':'E0','errorMsg':'SUCCESS','data':status}
                sendMessageIndex(json.dumps(ret_data),webclient.index)

            pop_list_callin = get_extension_pop_callin(webclient.extension)
            if len(pop_list_callin) >0 :
                sendMessageIndex(json.dumps(pop_list_callin),webclient.index)

            pop_list_callout = get_extension_pop_callout(webclient.extension)
            if len(pop_list_callout) >0 :
                sendMessageIndex(json.dumps(pop_list_callout),webclient.index)

            cdr_list = get_extension_cdr(webclient.extension)
            if len(cdr_list):
                ret_data = {'Event':'CDR','errorCode':'E0','errorMsg':'SUCCESS','data':cdr_list}
                sendMessageIndex(json.dumps(ret_data),webclient.index)

    sleep(3)

def data_check():
    while True:
        pushData()
        sleep(2)

def get_extension_status(extension):

    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cur.execute("SELECT d.device as TerminalId, d.extension as StaffId , FROM_UNIXTIME(d.logintime) as `Time`, u.dnd, u.`status` from asterisk.device_login as d LEFT JOIN asterisk.users as u on u.extension = d.device where d.extension ='"+extension+"'")
    retlist=[]

    for r in cur:
        row ={'TerminalId': 'MIDEA'+str(r[0]),'StaffId' : str(r[1]), 'Time': str(r[2]), 'dnd': str(r[3]), 'status': str(r[4])}
        retlist.append(row)

    cur.close()
    conn.close()
    return retlist

def get_extension_status_all():

    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cur.execute("SELECT d.device as TerminalId, d.extension as StaffId , FROM_UNIXTIME(d.logintime) as `Time`, u.dnd, u.`status` from asterisk.device_login as d LEFT JOIN asterisk.users as u on u.extension = d.device")
    retlist=[]

    for r in cur:
        row ={'TerminalId': 'MIDEA'+str(r[0]),'StaffId' : str(r[1]), 'Time': str(r[2]), 'dnd': str(r[3]), 'status': str(r[4])}
        retlist.append(row)

    cur.close()
    conn.close()
    return retlist


def get_extension_cdr(extension):

    retlist =[]

    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cur_update = conn.cursor()
    cdr_tables = "cdro_"+str(time.strftime("%Y_%-m_%-d",time.localtime()))
    cur.execute("select 1 from information_schema.TABLES where table_name='"+cdr_tables+"'")

    if cur.rowcount > 0 :

        cur.execute("select src, dst, amaflags, billsec,disposition,uniqueid,userfield,calldate,hangup_src from asteriskcdrdb."+cdr_tables+" where (src ='"+extension+"' or dst = '"+extension+"') and analysis = '0' LIMIT 1")
        for r in cur:
            row ={'src': str_number_strip_check(str(r[0])),'dst' : str_number_strip_check(str(r[1])),'amaflags': str(r[2]),'billsec': str(r[3]),'disposition': str(r[4]),'uniqueid': str(r[5]),'userfield': str(r[6]),'calldate': str(r[7]),'hangup_src': str(r[8])}
            retlist.append(row)
            cur_update.execute("update asteriskcdrdb."+cdr_tables+" set analysis = '1' where uniqueid = '"+str(r[5])+"'")

    cur_update.close()
    cur.close()
    conn.close()
    return retlist


def check_extension_cdr(uniqueid):

    retlist =[]

    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cdr_tables = "cdro_"+str(time.strftime("%Y_%-m_%-d",time.localtime()))
    cur.execute("select 1 from information_schema.TABLES where table_name='"+cdr_tables+"'")

    if cur.rowcount > 0 :

        cur.execute("select src, dst, amaflags, billsec,disposition,uniqueid,userfield,calldate,hangup_src from asteriskcdrdb."+cdr_tables+" where uniqueid = '"+uniqueid+"'")
        for r in cur:
            row ={'src': str_number_strip_check(str(r[0])),'dst' : str_number_strip_check(str(r[1])),'amaflags': str(r[2]),'billsec': str(r[3]),'disposition': str(r[4]),'uniqueid': str(r[5]),'userfield': str(r[6]),'calldate': str(r[7]),'hangup_src': str(r[8])}
            retlist.append(row)

    cur.close()
    conn.close()
    return retlist


def get_device_by_extension(extension):

    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cur.execute("select device from `asterisk`.`device_login` where extension = '"+extension+"'  limit 1 ")
    device = ""
    for r in cur:
        device = 'MIDEA'+str(r[0])
    cur.close()
    conn.close()

    return device

#update set heart data
def update_set_heart(extension):

    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cur.execute("UPDATE asterisk.device_login set heart_time = UNIX_TIMESTAMP(NOW()) where extension = '" + extension +"'")
    cur.close()
    conn.close()

    return ""


def get_extension_pop_callin(extension):

    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cur.execute("select activation, calla as src , callb as dst, uid, Stats, action, pjid from asteriskcdrdb.pop where  callb='"+extension+"' limit 1 ")
    row = ""
    for r in cur:
        device = get_device_by_extension(str(r[2]));
        row ={'Event':'CALLIN','Time':str(r[0]),'CallId' : str_number_strip_check(str(r[1])), 'StaffId': str(r[2]), 'CallSession': str(r[3]), 'Stats': str(r[4]),'action': str(r[5]),'action': str(r[6]),'TerminalId':device}
        cur.execute("DELETE from asteriskcdrdb.pop where uid = '"+str(r[3])+"'")

    cur.execute("update asterisk.users set heart_times =NOW() where extension = '"+extension+"'")

    cur.close()
    conn.close()
    return row

def get_extension_pop_callout(extension):

    conn = pymysql.connect(host=HOST, port=PORT,user=USER,passwd=PASSWD,db=DB)
    cur = conn.cursor()
    cur.execute("select activation, calla as src , callb as dst, uid, Stats, action, pjid from asteriskcdrdb.pop where  calla='"+extension+"' limit 1")
    row = ""
    for r in cur:
        device = get_device_by_extension(str(r[1]))
        row ={'Event':'CALLOUT','Time':str(r[0]),'StaffId' : str(r[1]), 'CallId': str_number_strip_check(str(r[2])), 'CallSession': str(r[3]), 'Stats': str(r[4]),'action': str(r[5]),'action': str(r[6]),'TerminalId':device}
        cur.execute("DELETE from asteriskcdrdb.pop where uid = '"+str(r[3])+"'")

    cur.close()
    conn.close()
    return row

#get http request
def http_reques_uncallcc(url):
    req_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
             'Accept':'text/html;q=0.9,*/*;q=0.8',
             'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
             'Accept-Encoding':'gzip',
             'Connection':'close',
             'Referer':None
             }
    req_timeout = 3
    req = urllib2.Request(url,None,req_header)
    resp = urllib2.urlopen(req,None,req_timeout)
    html = resp.read()
    return html

def parse_data(msg):
    code_length = ord(msg[1]) & 127

    if code_length == 126:
        masks = msg[4:8]
        data = msg[8:]
    elif code_length == 127:
        masks = msg[10:14]
        data = msg[14:]
    else:
        masks = msg[2:6]
        data = msg[6:]

    i = 0
    raw_str = ''

    for d in data:
        raw_str += chr(ord(d) ^ ord(masks[i%4]))
        i += 1
    return raw_str  
        
def sendMessage(message):
    global connectionlist
    for connection in connectionlist.values():
        back_str = []
        back_str.append('\x81')
        data_length = len(message)
    
        if data_length <= 125:
            back_str.append(chr(data_length))
        else:
            back_str.append(chr(126))
            back_str.append(chr(data_length >> 8))
            back_str.append(chr(data_length & 0xFF))
    
        back_str = "".join(back_str) + message
        write_log(u'send message:' +  message)
        connection.send(back_str)

def sendMessageIndex(message, index):

    try:

        global connectionlist

        back_str = []
        back_str.append('\x81')
        data_length = len(message)

        if data_length <= 125:
            back_str.append(chr(data_length))
        else:
            back_str.append(chr(126))
            back_str.append(chr(data_length >> 8))
            back_str.append(chr(data_length & 0xFF))

        back_str = "".join(back_str) + message
        write_log(u'send message:' +  message)

        connectionlist['connection'+str(index)].send(back_str)

    except (ZeroDivisionError,Exception) as e:
        del webclasslist[index]
        connectionlist['connection'+str(index)].is_login = 0
        deleteconnection(str(index))
        connectionlist['connection'+str(index)].close()
        write_log("EX1------->"+e)
 
def deleteconnection(item):
    global connectionlist
    global webclasslist
    del webclasslist[item]
    del connectionlist['connection'+item]

class WebSocket(threading.Thread):

    GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

    def __init__(self,conn,index,name,remote, path="/"):

        threading.Thread.__init__(self)
        self.conn = conn
        self.index = index
        self.name = name
        self.remote = remote
        self.path = path
        self.buffer = ""
        self.extension = ""
        self.is_login = 0
        self.device =""
        self.status = ""


    def run(self):
        
        write_log('Uncallcc Web Socket%s Start!' % self.index)
        headers = {}
        self.handshaken = False

        while True:

            if self.handshaken == False:
                
                write_log('Socket%s Start Handshaken with %s!' % (self.index,self.remote))
                self.buffer += bytes.decode(self.conn.recv(RECV_BUF_SIZE))
                if self.buffer.find('\r\n\r\n') != -1:
                    header, data = self.buffer.split('\r\n\r\n', 1)
                    for line in header.split("\r\n")[1:]:
                        key, value = line.split(": ", 1)
                        headers[key] = value

                    headers["Location"] = ("ws://%s%s" %(headers["Host"], self.path))
                    key = headers['Sec-WebSocket-Key']
                    token = b64encode(hashlib.sha1(str.encode(str(key + self.GUID))).digest())

                    handshake="HTTP/1.1 101 Switching Protocols\r\n"\
                        "Upgrade: websocket\r\n"\
                        "Connection: Upgrade\r\n"\
                        "Sec-WebSocket-Accept: "+bytes.decode(token)+"\r\n"\
                        "WebSocket-Origin: "+str(headers["Origin"])+"\r\n"\
                        "WebSocket-Location: "+str(headers["Location"])+"\r\n\r\n"

                    self.conn.send(str.encode(str(handshake)))
                    self.handshaken = True
                    write_log('Socket%s Handshaken with %s success!' %(self.index, self.remote)) 
            else:

                try:

                    mm=self.conn.recv(RECV_BUF_SIZE)
                    msg_utf8 = parse_data(mm) #utf8
                    msg_unicode = msg_utf8.decode('utf-8', 'ignore') #unicode
                    msg_json_data = json.loads(msg_unicode)

                    action = msg_json_data['Event']

                    if self.is_login == 0:

                        if action!="LOGIN":

                            if action == 'LOGOUT': #quit

                                extension = msg_json_data['extension']
                                paaswd = msg_json_data['paaswd'] 

                                request_url = "http://"+UNCALL_HTTP_HOST+"/phpapi/deviceloout.php?exten="+ extension +"&device="+devices
                                write_log('-----> %s action LOGOUT : %s ' %(self.index, request_url))

                                request = http_reques_uncallcc(request_url) 

                                if request == "OK":
                                    ret_data = {'Event':'LOGOUT','errorCode':'E0','errorMsg':'SUCCESS'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)
                                else:
                                    ret_data = {'Event':'LOGOUT','errorCode':'E6','errorMsg':request}
                                    sendMessageIndex(json.dumps(ret_data),self.index)

                            else :
                                ret_data = {'Event':'LOGIN','errorCode':'E2','errorMsg':'NO LOGIN'}
                                sendMessageIndex(json.dumps(ret_data),self.index)

                        else :

                            extension = msg_json_data['extension']
                            paaswd = msg_json_data['paaswd'] 

                            write_log('----->action start login : %s : %s ' %(self.index, paas))

                            if check_extension(extension) > 0 :

                                self.is_login=1
                                self.extension = extension
                                ret_data = {'Event':'LOGIN','errorCode':'E0','errorMsg':'SUCCESS'}
                                sendMessageIndex(json.dumps(ret_data),self.index)

                            else :
                                ret_data = {'Event':'LOGIN','errorCode':'E4','errorMsg':'NO EXTEN'}
                                sendMessageIndex(json.dumps(ret_data),self.index)
                    else:

                        # dial
                        if action != "DIAL" and action != "QUIT" and action != "LOGOUT" and action !="HANGUP" and action != "GETSEATALL" and action !="GETSEAT" and action !="HB" and action !="SETBUSY"  and action !="SETIDLE" and action !="TRANSFERCALL" and action!='CHECK_CDR' and action !="CALLIN" and action != "CALLOUT" :
                            ret_data = {'errorCode':'E3','errorMsg':'NO EVENT'}
                            sendMessageIndex(json.dumps(ret_data),self.index)

                        else:

                            if action == 'QUIT': #quit
                                extension = msg_json_data['StaffId']
                                devices_midea = msg_json_data['TerminalId']
                                devices = devices_midea[5:]
                                request_url = "http://"+UNCALL_HTTP_HOST+"/phpapi/deviceloout.php?exten="+self.extension+"&device="+devices
                                write_log('-----> %s action QUIT : %s ' %(self.index, request_url))
                                request = http_reques_uncallcc(request_url)
                                ret_data = {'Event':'QUIT','errorCode':'E0','errorMsg':'SUCCESS'}
                                sendMessageIndex(json.dumps(ret_data),self.index)
                                self.is_login=0
                                deleteconnection(str(self.index))
                                self.conn.close()
                                break


                            if action == 'DIAL': #dial event
                                request_url = "http://"+UNCALL_HTTP_HOST+"/phpapi/call.php?extension="+self.device+"&phone="+msg_json_data['DTMF']
                                request = http_reques_uncallcc(request_url)
                                write_log('-----> %s action DIAL : %s ' %(self.index, request_url))
                                if request == "OK":
                                    ret_data = {'Event':'DIAL','errorCode':'E0','errorMsg':'SUCCESS'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)
                                else:
                                    ret_data = {'Event':'DIAL','errorCode':'E5','errorMsg':'FAILED'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)


                            if action == "HB": #pop event
                                ret_data = {'Event':'HB','errorCode':'E0','errorMsg':'SUCCESS'}
                                write_log('-----> %s action HB : %s ' %(self.index, extension))
                                update_set_heart(extension)
                                sendMessageIndex(json.dumps(ret_data),self.index)

                            if action == "GETSEATALL" : #ALL STATUS
                                ret_data = {'Event':'GETSEATALL','errorCode':'E0','errorMsg':'SUCCESS','data':get_extension_status_all()}
                                sendMessageIndex(json.dumps(ret_data),self.index)

                            if action == "HANGUP": #HANGUP
                                request_url = "http://"+UNCALL_HTTP_HOST+"/phpapi/hangup.php?extension="+self.device
                                request = http_reques_uncallcc(request_url)
                                write_log('-----> %s action HANGUP : %s ' %(self.index, request_url))
                                if request == "OK":
                                    ret_data = {'Event':'HANGUP','errorCode':'E0','errorMsg':'SUCCESS'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)
                                else:
                                    ret_data = {'Event':'HANGUP','errorCode':'E5','errorMsg':'FAILED'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)

                            if action == "SETBUSY" : #set busy

                                request_url = "http://"+UNCALL_HTTP_HOST+"/phpapi/setbusy.php?extension="+self.device
                                request = http_reques_uncallcc(request_url)
                                write_log('-----> %s action SETBUSY : %s ' %(self.index, request_url))
                                if request == "OK":
                                    ret_data = {'Event':'SETBUSY','errorCode':'E0','errorMsg':'SUCCESS'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)
                                else:
                                    ret_data = {'Event':'SETBUSY','errorCode':'E5','errorMsg':'FAILED'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)

                            if action == "SETIDLE" : #set idle
                                request_url = "http://"+UNCALL_HTTP_HOST+"/phpapi/setIdle.php?extension="+self.device
                                write_log('-----> %s action SETIDLE : %s ' %(self.index, request_url))
                                request = http_reques_uncallcc(request_url)
                                if request == "OK":
                                    ret_data = {'Event':'SETIDLE','errorCode':'E0','errorMsg':'SUCCESS'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)
                                else:
                                    ret_data = {'Event':'SETIDLE','errorCode':'E5','errorMsg':'FAILED'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)

                            if action == "TRANSFERCALL" : #transferCall
                                request_url = "http://"+UNCALL_HTTP_HOST+"/phpapi/transferCall.php?extension="+self.device+"&phone="+msg_json_data['Phone']
                                write_log('-----> %s action TRANSFERCALL : %s ' %(self.index, request_url))
                                request = http_reques_uncallcc(request_url)
                                if request == "OK":
                                    ret_data = {'Event':'TRANSFERCALL','errorCode':'E0','errorMsg':'SUCCESS'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)
                                else:
                                    ret_data = {'Event':'TRANSFERCALL','errorCode':'E5','errorMsg':'FAILED'}
                                    sendMessageIndex(json.dumps(ret_data),self.index)

                            if action == "CHECK_CDR":
                                uniquid = msg_json_data['Uniquid']
                                cdr_list = check_extension_cdr(uniquid)
                                ret_data = {'Event':'CHECK_CDR','errorCode':'E0','errorMsg':'SUCCESS','data':cdr_list}
                                sendMessageIndex(json.dumps(ret_data),self.index)

                            if action == "CALLIN":
                                ret_data = {'Event':'CALLIN','errorCode':'E0','errorMsg':'SUCCESS'}
                                sendMessageIndex(json.dumps(ret_data),self.index)

                            if action == "LOGOUT":
                                request_url = "http://"+UNCALL_HTTP_HOST+"/phpapi/deviceloout.php?exten="+self.extension+"&device="+self.device
                                request = http_reques_uncallcc(request_url)
                                write_log('-----> %s action LOGOUT : %s ' %(self.index, request_url))
                                ret_data = {'Event':'CALLOUT','errorCode':'E0','errorMsg':'SUCCESS'}
                                sendMessageIndex(json.dumps(ret_data),self.index)
                                self.is_login=0
                                deleteconnection(str(self.index))
                                self.conn.close()
                                break

                except (ZeroDivisionError,Exception) as e:
                        ret_data = {'errorCode':'E1','errorMsg':'REQUEST ERROR'}
                        self.is_login=0
                        deleteconnection(str(self.index))
                        self.conn.close()
                        write_log("EX02---> "+str(self.index)+" :"+str(e))
                        break

            self.buffer = ""


class WebSocketServer(object):

    def __init__(self):
        self.socket = None

    def begin(self):

        write_log('Uncallcc WebSocketServer Start!') 

        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, SEND_BUF_SIZE)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, RECV_BUF_SIZE)
        self.socket.bind((LISTEN_IP,LISTEN_PORT))
        self.socket.listen(100)

        global connectionlist
        global webclasslist

        i=0
        while True:
            connection, address = self.socket.accept()
            username=address[0]     
            newSocket = WebSocket(connection,i,username,address)
            newSocket.start()
            webclasslist[i]= newSocket
            connectionlist['connection'+str(i)]=connection
            write_log('add connection'+str(i))
            i = i + 1


if __name__ == "__main__":
    t = threading.Thread(target=data_check)
    t.setDaemon(True)
    t.start()
    server = WebSocketServer()
    server.begin()



三、HTML websocket 测试


<!DOCTYPE html>
<html>
<head>
    <title>WebSocket</title>
    <style>
        html, body {
            font: normal 0.9em arial, helvetica;
        }

        #log {
            width: 800px;
            height: 400px;
            border: 1px solid #7F9DB9;
            overflow: auto;
        }

        #msg {
            width: 800px;
        }
    </style>

    <script>

        var socket;
        
        function init() {
            var host = "ws://120.177.122.25:6899/";
            try {
                socket = new WebSocket(host);
                socket.onopen = function (msg) {
                    log('Connected');
                };
                socket.onmessage = function (msg) {
                    
                    log(msg.data);

                    if(msg.data=="SUCCESS"){//连接成功

                    }

                    if(msg.data.indexOf("errorCode")){//有事件交互
                        var json_data = JSON.parse(msg.data); 
                        console.log(json_data['errorCode']); 
                        if(json_data['errorCode']=="E0"){
                            if(json_data['Event']=="LOGIN"){//
                                console.log('SUCCESS LOGIN');
                                send_hearbeat();
                            }
                        }
                    }

                };
                socket.onclose = function (msg) {
                    log("Lose Connection!");
                };
            }
            catch (ex) {
                log(ex);
            }
            $("msg").focus();
        }

        function send_hearbeat()
        { 
            socket.send("{\"Event\":\"HB\",\"Exten\":\"801\"}");
            setTimeout("send_hearbeat();", 30000);
        }
        

        function send() {
            var txt, msg;
            txt = $("msg");
            msg = txt.value;
            if (!msg) {
                alert("Message can not be empty");
                return;
            }
            txt.value = "";
            txt.focus();
            try {
                socket.send(msg);
            } catch (ex) {
                log(ex);
            }
        }

        window.onbeforeunload = function () {
            try {
                socket.send('quit');
                socket.close();
                socket = null;
            }
            catch (ex) {
                log(ex);
            }
        };


        function $(id) {
            return document.getElementById(id);
        }
        
        function log(msg) {
            $("log").innerHTML += "<br>" + msg;
        }

        function onkey(event) {
            if (event.keyCode == 13) {
                send();
            }
        }
    </script>

</head>


<body onload="init()">
<h3>Uncallcc WebSocket Demo</h3>
<br><br>

<div id="log"></div><br><br>
<input id="msg" type="textbox" onkeypress="onkey(event)"/>
<br><br>
<button onclick="send()">Send</button>
</body>

</html>