File manager - Edit - /home/wwwroot/camplus.hk/master.camplus.hk/public_html/station.py
Back
import urllib2, base64,urllib import socket import os import fcntl import errno import Queue from threading import Thread import threading import sys from os import curdir, sep import cgi import json import collections from time import sleep from cardMysql import cardMysql import RPi.GPIO as GPIO from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer from datetime import datetime, timedelta cardDB=None devices=None devID=0; devRole="" devTxCh=1 devRxCh=0 running = True devices=[] currentIdx=-1 cardRecordBuffer=Queue.Queue() httpReqBuffer=Queue.Queue() serverURL="http://192.168.10.51/access_control/save_status" eventLogUrl="http://192.168.10.51/eventLog.php" cardDB=None def pinUp(pin): GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, True) def pinDown(pin): GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) def makeJSONData(): devObj=[] if(devices!=None): if(len(devices)>0): for dev in devices: #devSer=self.json_serial(dev) devObj+=[{'devID':str(dev.devID),'state':str(dev.doorState),'lastUpdate':dev.timeStr}] else: devs=cardDB.getAllDevs('station') for dev in devs: #devSer=self.json_serial(dev) devObj+=[{'devID':dev['devID'],'state':dev['state'],'lastUpdate':str(dev['lastUpdate'])}] devJson = json.dumps(devObj) return devJson class myHandler(BaseHTTPRequestHandler): #mLORA=0 #Handler for the GET requests #cardDB=None def json_serial(self,obj): if isinstance(obj, (datetime)): serial = obj.isoformat() return serial raise TypeError ("Type %s not serializable" % type(obj)) def do_GET(self): devObj=[] if self.path=="/json": if(devices!=None): if(len(devices)>0): for dev in devices: #devSer=self.json_serial(dev) devObj+=[{'devID':str(dev.devID),'state':str(dev.doorState),'rssi':str(dev.rssi),'lastUpdate':dev.timeStr}] else: devs=cardDB.getAllDevs('station') for dev in devs: #devSer=self.json_serial(dev) devObj+=[{'devID':dev['devID'],'state':dev['state'],'lastUpdate':str(dev['lastUpdate']),'rssi':'0'}] devJson = json.dumps(devObj) mimetype='text/html' self.send_response(200) mimetype='text/json' self.send_header('Content-type',mimetype) self.end_headers() self.wfile.write(str(devJson)) return if self.path=="/": myForm=""" TX Channel:"""+str(devTxCh)+"""<br/> RX Channel:"""+str(devRxCh)+"""<br/> Device ID :"""+str(devID)+"""<br/> <form action="sendB" method="post"> src: <input type="text" name="src" value='"""+str(devID)+"""'><br> dest: <input type="text" name="dest" value="2"><br> msg: <input type="text" name="msg"><br> <input type="submit" value="Submit"> </form> """ mimetype='text/html' self.send_response(200) self.send_header('Content-type',mimetype) self.end_headers() self.wfile.write("<br/>%s<br/>" % myForm) return else: self.send_error(404,'File Not Found: %s' % self.path) def do_POST(self): global devRole global httpReqBuffer if self.path=="/sendB": form = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'], }) mimetype='text/html' self.send_response(200) self.send_header('Content-type',mimetype) self.end_headers() try: print "msg: %s" % form["msg"].value self.wfile.write("src:%s<br/>" % form["dest"].value) self.wfile.write("dest:%s<br/>" % form["src"].value) self.wfile.write("msg:%s<br/>" % form["msg"].value) msg_src=form["src"].value msg_dest=form["dest"].value msg=form["msg"].value httpReqBuffer.put([msg_src,msg_dest,msg]) except Exception, e: print(str(e)) myForm=""" TX Channel:"""+str(devTxCh)+"""<br/> RX Channel:"""+str(devRxCh)+"""<br/> Device ID :"""+str(devID)+"""<br/> <form action="sendB" method="post"> src: <input type="text" name="src" value='"""+str(devID)+"""'><br> dest: <input type="text" name="dest" value="2"><br> msg: <input type="text" name="msg"><br> <input type="submit" value="Submit"> </form> """ self.wfile.write("<br/>%s<br/>" % myForm) #self.mLORA.sx1276_7_8_LosaTxString(msg) return class stationDev(): devID=0 doorState=0 stateDone=True dataDone=True numData=0 dataReceived=True dataQueue=None startTime="" endTime="" totalRecords=0 rssi=0 curTime=datetime.strptime("1970-01-01 00:00:00","%Y-%m-%d %H:%M:%S") timeStr="" def __init__(self,_ID): self.devID=_ID self.dataQueue=Queue.Queue() self.timeStr=self.curTime.strftime("%Y-%m-%d %H:%M:%S") class udpComm(): def __init__(self,_port): print('Initializing udp comm') self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.sock.bind(('0.0.0.0', _port)) fcntl.fcntl(self.sock, fcntl.F_SETFL, os.O_NONBLOCK) self.clients_list = [] def talkToClient(self, ip): print("Sending 'ok' to %s", ip) self.sock.sendto("ok", ip) def sendMsg(self, _ip,_port,_msg): #print("Sending to ",(_ip,_port)) self.sock.sendto(_msg, (_ip,_port)) def listen_clients(self): global devices while running: try: msg, client = self.sock.recvfrom(1024) print('Received data from client %s: %s', client, msg) if(msg.startswith("dev:")): pinDown(24) sleep(0.1) pinUp(24) eventRet=sendMsg2(eventLogUrl,msg); print(eventRet) data=msg[4:].split(',') if(data[0]=="RSSI"): if(devices!=None): mDevID=int(data[1]) for dev in devices: if(dev.devID==mDevID): dev.rssi=int(data[2]) elif(data[0]=="startCardRecord"): if(int(data[1])==devices[currentIdx].devID): devices[currentIdx].dataReceived=True devices[currentIdx].totalRecords=int(data[2]) elif(data[0]=="cardRecord"): print("dev ID: "+str(data[1])) print("idx:"+str(data[2])) print("card no: "+str(data[3])) global cardRecordBuffer if(int(data[1])==devices[currentIdx].devID): devices[currentIdx].dataReceived=True devices[currentIdx].dataQueue.put(str(data[2])) cardRecord={'devID':data[1],'cardNo':data[3],'cardTime':data[4],'result':int(data[5])} cardRecordBuffer.put(cardRecord) if(int(data[2])==0): devices[currentIdx].startTime=data[4] devices[currentIdx].endTime=data[4] elif(data[0]=="doorState"): print("dev ID: "+str(data[1])) if(int(data[1])==devices[currentIdx].devID): devices[currentIdx].stateDone=True devices[currentIdx].doorState=int(data[2]) elif(data[0]=="endCardRecord"): print("dev ID: "+str(data[1])+" no more record") devices[currentIdx].dataDone=True devices[currentIdx].dataReceived=True #t = threading.Thread(target=self.talkToClient, args=(client,)) #t.start() sleep(0.05) except socket.error, e: err = e.args[0] if err == errno.EAGAIN or err == errno.EWOULDBLOCK: sleep(0.2) #print 'No data available' continue else: # a "real" error occurred print (e) #sys.exit(1) devs=None def run_udp_comm(): global mUDPComm mUDPComm=udpComm(9007) mUDPComm.listen_clients() def readDeviceData(): with open('device.json') as data_file: data = json.load(data_file) global devID devID=int(data['dev']['id']) global devRole devRole=data['dev']['role'] global devTxCh devTxCh=int(data['dev']['TxCh']) print("TX:"+str(devTxCh)) global devRxCh devRxCh=int(data['dev']['RxCh']) print("RX:"+str(devRxCh)) global cardDB cardDB=cardMysql(data['mysql']['ip'],data['mysql']['user'],data['mysql']['pw'],data['mysql']['db'],data['mysql']['table']) def routineJob(): global devs global devices global currentIdx devices=None while running: try: global devices devs=cardDB.getAllDevs('station') if(devices==None): print("adding devices to list") devices=[] for dev in devs: device=stationDev(dev['devID']) device.doorState=int(dev['state']) devices+=[device] print("devID:"+str(device.devID)) if(len(devs)!= len(devices)): print("adding devices to list") del devices[:] for dev in devs: device=stationDev(dev['devID']) device.doorState=int(dev['state']) devices+=[device] print("devID:"+str(device.devID)) #devices.sort(key=lambda x: x.devID, reverse=False) waitTime=0 idx=0 currentIdx=0 if(devices!=None): for i in range(len(devices)): idx=i device=devices[idx] currentIdx=idx print("checking dev:"+str(device.devID)+" ["+str(i)+"/"+str(len(devices))+"]") device.stateDone=False device.dataDone=False sendMsg(devID,str(device.devID),"door state") waitTime=0 while(waitTime<10 and not(device.stateDone)): waitTime+=1 sleep(0.4) if(device.stateDone): print("dev state:"+str(devs[i]['state'])+">"+str(device.doorState)) pinDown(24) sleep(0.2) pinUp(24) if(device.doorState != int(devs[idx]['state'])): cardDB.addDev(str(device.devID),'station',str(device.doorState))#dev[idx]['state']) #devices[i].doorState=int(dev[idx]['state']) print("door stateChanged") print("delay:"+str(waitTime)) waitTime=0 else: #sendMsg(devID,str(device.devID),"initDev") #print("try to re-init Device "+str(device.devID)) print("no reply from "+str(device.devID)) sleep(1) waitTime=0 global httpReqBuffer while(not httpReqBuffer.empty()): try: mRequest=httpReqBuffer.get() sendMsg(mRequest[0],mRequest[1],mRequest[2]) sleep(5) except Exception, e: print(str(e)) if(device.stateDone): device.curTime=datetime.now() device.timeStr=device.curTime.strftime("%Y-%m-%d %H:%M:%S") waitTime=0 device.dataReceived=False device.numData=0 device.totalRecords=-1 sendMsg(devID,str(device.devID),"getAllCardRecord") print("Get all card record from device") while(waitTime<10 and device.totalRecords==-1): sleep(0.5) waitTime+=1 if(device.totalRecords>=0): print("there are "+str(device.totalRecords)+"record(s) in card reader") else: print("no feed back >_<") waitTime=0 while(waitTime<10 and (not(device.dataDone)) or (not device.dataQueue.empty())): waitTime+=1 if(device.dataReceived or not device.dataQueue.empty()): waitTime=0 while(not device.dataQueue.empty()): print("record idx:"+device.dataQueue.get()) device.numData+=1 device.dataReceived=False sleep(1) if(device.dataDone and device.numData>0): #print("del all card record from dev:"+str(device.devID)) #sendMsg(devID,str(device.devID),"delAllCardRecord") global cardRecordBuffer if(device.totalRecords==device.numData): print("get "+str(device.totalRecords)+" records") startTime=None endTime=None while(not cardRecordBuffer.empty()): cardRecord=cardRecordBuffer.get() cardTime=datetime.strptime(cardRecord['cardTime'],"%Y-%m-%d %H:%M:%S") if(startTime==None and endTime==None): startTime=cardTime endTime=cardTime device.startTime=cardRecord['cardTime'] device.endTime=cardRecord['cardTime'] if(cardTime>endTime): endTime=cardTime device.endTime=cardRecord['cardTime'] if(cardTime<startTime): startTime=cardTime device.startTime=cardRecord['cardTime'] cardDB.addCardRecordMainStr(cardRecord['cardNo'],cardRecord['cardTime'],cardRecord['result'],cardRecord['devID']) #if(dt0>dt1): # tmpDate=device.startTime # device.startTime=device.endTime # device.endTime=tmpDate print("del card record from dev:"+str(device.devID)+"("+device.startTime+" to "+device.endTime+")") sendMsg(devID,str(device.devID),"delCardRecord,"+device.startTime+","+device.endTime) print("next Device") sleep(2) print("sync Time.") sendMsg(devID,"65535","syncTime") sleep(1) sendMsg(devID,"65535","initDev") sendMsg(devID,devID,"initMe") sleep(5) global serverURL global httpReqBuffer while(not httpReqBuffer.empty()): try: mRequest=httpReqBuffer.get() sendMsg(mRequest[0],mRequest[1],mRequest[2]) sleep(5) except Exception, e: print(str(e)) except Exception, e: print(str(e)) def jsonRunner(): global running while(running): sleep(10) data=str(makeJSONData()) print(data) sendJSON(serverURL,data) def main(argv): PORT_NUMBER=8081 GPIO.setmode(GPIO.BOARD) pinUp(12) sleep(0.2) pinDown(12) sleep(0.2) pinUp(12) sleep(0.2) pinDown(12) sleep(0.2) pinUp(12) sleep(0.5) pinDown(12) sleep(0.2) try: readDeviceData() global cardDB running=True threadUDP=Thread(target=run_udp_comm) threadUDP.start() threadRoutine=Thread(target=routineJob) threadRoutine.start() threadJson=Thread(target=jsonRunner) threadJson.start() handler=myHandler handler.cardDB=cardDB server = HTTPServer(('', PORT_NUMBER), handler) print ('Started httpserver on port ') , print(PORT_NUMBER) server.serve_forever() except KeyboardInterrupt: print '^C received, shutting down the web server' global running #ws.running=False running=False threadUDP.join() def testCard(): url="http://127.0.0.1:8080/sendB" values = { 'src': '101','dest': '2' ,'msg':'openDoor'} data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) result = response.read() print result def sendMsg(_src,_dest,_msg): try: url="http://127.0.0.1:8080/sendB" values = { 'src': str(_src),'dest': str(_dest) ,'msg':_msg} data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) result = response.read() #print result except Exception, e: print(str(e)) def sendMsg2(_url,_msg): try: url=_url values = {'event':_msg} data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) result = response.read() #print result except Exception, e: print(str(e)) def sendJSON(_URL,_msg): try: url=_URL values = {'json':_msg} data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) result = response.read() return result except Exception, e: print(str(e)) return "" if __name__ == "__main__": main(sys.argv[1:])
| ver. 1.4 |
Github
|
.
| PHP 7.2.34 | Generation time: 0.22 |
proxy
|
phpinfo
|
Settings