123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- # -*- 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'
|