# -*- coding: utf-8 -*- # !/usr/bin/env python import os import sys import threading import time # from base import init_env # # os.environ.setdefault("DJANGO_SETTINGS_MODULE", "configs.production") # # init_env(interactive = False) # # from apps.web.device.models import Group from gevent import socket os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.testing') PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..') sys.path.insert(0, PROJECT_ROOT) from script.base import init_env, get_logger init_env(interactive = False) logger = get_logger(__name__) from apps.web.common.event import do_device_event from apps.web.device.models import Device import simplejson as json # 启动2个线程,一个线程用于维持心跳,一个线程专门用于监听并处理事件。每分钟一次心跳,如果心跳失败,就重新建立连接。 # server = '127.0.0.1' port = 8000 def send_beat(): global gclient while True: try: print('i have send heartbeat') strJson = json.dumps({"cmd":"I00","IMEI":"","data":"","sqNo":""}) gclient.sendall(strJson) time.sleep(5) except Exception,e: logger.info('send heartbeat failed,e=%s' % e) try: gclient.close() except Exception,e: pass try: gclient = socket.socket() gclient.connect((server,port)) except Exception,e: pass time.sleep(1) continue try: global gclient gclient = socket.socket() # 定义协议类型,相当于生命socket类型,同时生成socket连接对象 gclient.connect((server,port)) # 维持心跳的线程 heartThread = threading.Thread(target = send_beat) heartThread.setDaemon(False) heartThread.start() while True: try: data = gclient.recv(1024)#这里是字节1k if not data: time.sleep(0.5) continue print("receive msg:",data.decode()) payload = json.loads(data.decode()) cmd = payload.get('cmd','') if not cmd : continue if cmd == 'I00':# I00是心跳,不需要处理 logger.info('receive heartbeat from server!') continue # 启动一个事件处理线程处理事件,沿用以前旧的框架,这样业务和以前的开发流程 dev = None devNo = payload.get('IMEI','') if devNo: dev = Device.get_dev(devNo = devNo) workerthread = threading.Thread(target = do_device_event,args=(cmd,dev,payload)) workerthread.setDaemon(False) workerthread.start() except Exception,e: try: gclient.close() except Exception,e: pass try: gclient = socket.socket() gclient.connect((server,port)) except Exception,e: pass time.sleep(1) continue gclient.close() except Exception as ex: print(ex) print 'I am OVER'