def upgrade_firmware(self, file_name, buffer, buff_len): pfile_name = create_string_buffer(file_name) pbuffer = create_string_buffer(buffer) write_log("-----devcomm before SetDeviceFileData device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.SetDeviceFileData(self.hcommpro, pfile_name, pbuffer, buff_len, "") write_log("-----devcomm after SetDeviceFileData device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) return {"result": ret, "data": ""}
def set_options(self, items): pitems=create_string_buffer(items) write_log("-----devcomm before SetDeviceParam device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret=self.commpro.SetDeviceParam(self.hcommpro, pitems) write_log("-----devcomm after SetDeviceParam device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) #print "result=",ret," set_options:",items return {"result":ret, "data":""}
def delete_data(self,table,filter): ptable = create_string_buffer(table) pfilter = create_string_buffer(filter) write_log("-----devcomm before DeleteDeviceData device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.DeleteDeviceData(self.hcommpro,ptable,pfilter,"") write_log("-----devcomm after DeleteDeviceData device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) return {"result":ret,"data":""}
def update_data(self,table,data,options): ptable = create_string_buffer(table) str_buf = create_string_buffer(data) write_log("-----devcomm before SetDeviceData device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.SetDeviceData(self.hcommpro, ptable, str_buf, options) write_log("-----devcomm after SetDeviceData device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) return { "result": ret, "data": ""}
def disconnect(self): if self.hcommpro>0: write_log("-----devcomm before disconnect the device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) self.commpro.Disconnect(self.hcommpro) write_log("-----devcomm before disconnect the device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) self.connected = False self.hcommpro = 0
def get_options(self, items): op_buf = create_string_buffer(2048) pitems=create_string_buffer(items) write_log("-----devcomm before GetDeviceParam device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret=self.commpro.GetDeviceParam(self.hcommpro, op_buf, 2048, pitems) write_log("-----devcomm after GetDeviceParam device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) if (ret>=0): result = op_buf.raw result = result.split('\0')[0] return {"result":ret, "data":result} else: return {"result":ret, "data":""}
def get_rtlog(self): if self.hcommpro <= 0: return {'result':ERROR_COMM_HANDLE,'data':''} #communication error global m_rtlog_buffer if not m_rtlog_buffer: m_rtlog_buffer = create_string_buffer(16*1024)#2048)#256 write_log("-----devcomm before GetRTLog device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.GetRTLog(self.hcommpro, m_rtlog_buffer, 16*1024) write_log("-----devcomm after GetRTLog device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) if ret >= 0: rtlog = m_rtlog_buffer.raw rtlog = rtlog.split('\0')[0] return {"result": ret,"data": rtlog} else: return {"result": ret,"data": ""}
def query_data(self, table, fieldname, filter, option): ptable = create_string_buffer(table) pfieldname = create_string_buffer(fieldname) pfilter = create_string_buffer(filter) poption= create_string_buffer(option) str_buf_len = 6*1024*1024 str_buf = create_string_buffer(str_buf_len) write_log("-----devcomm before GetDeviceData device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.GetDeviceData(self.hcommpro, str_buf, str_buf_len, ptable, pfieldname, pfilter, poption) write_log("-----devcomm after GetDeviceData device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) if(ret>=0): result = str_buf.raw result = result.split('\0')[0] return {"result":ret,"data":result} else: return {"result":ret,"data":""}
def connect(self): params="" if (self.hcommpro>0): return {"result":self.hcommpro,"data":str(self.hcommpro)} if (self.comminfo["comm_type"] == 1): params=u"protocol=TCP,ipaddress=%s,port=%d,timeout=3000,passwd=%s"%(self.comminfo["ipaddress"], self.comminfo["ip_port"], self.comminfo["password"]) elif (self.comminfo["comm_type"] == 2): params=u"protocol=RS485,port=%s,baudrate=%sbps,deviceid=%d,timeout=4000,passwd=%s"%(self.comminfo["com_port"], self.comminfo["baudrate"], self.comminfo["com_address"], self.comminfo["password"]) constr = create_string_buffer(params) #print params write_log("-----devcomm before connect the device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) self.hcommpro = self.commpro.Connect(constr) write_log("-----devcomm after connect the device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) # printf("13. dev=%s, ret=%d"%(params, self.hcommpro)) #print "Connect....",self.hcommpro if(self.hcommpro>0): self.connected = True else: error=self.get_last_error() if error > 0: error = 0 - error self.hcommpro = error self.connected = False return {"result": self.hcommpro, "data": str(self.hcommpro)}
def get_transaction(self, newlog=True, file_buffer=None, file_len=None): if (self.hcommpro <= 0) and newlog != "SD":#通过SD卡获取记录时不需要连接设备 return {'result':ERROR_COMM_HANDLE,'data':''} #communication error log="" ret = -1007 str_buf_len = 8*1024*1024 str_buf = create_string_buffer(str_buf_len) try: if newlog: if newlog == "SD": ret = self.commpro.ProcessBackupData(file_buffer, file_len, str_buf, str_buf_len) else: write_log("-----devcomm before GetDeviceData newlog device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.GetDeviceData(self.hcommpro, str_buf, str_buf_len, "transaction", "*", "", "NewRecord"); write_log("-----devcomm after GetDeviceData newlog device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) else: write_log("-----devcomm before GetDeviceData all logs device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.GetDeviceData(self.hcommpro, str_buf, str_buf_len, "transaction", "*", "", ""); write_log("-----devcomm after GetDeviceData all logs device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) except Exception,e: printf("-----devcomm before GetDeviceData newlog device:%s e:%s"%(self.comminfo["ipaddress"], e), True) return {"result":ret, "data":""}
def run(self): from mysite.iclock.cache_cmds import TEMP_CMD_KEY print '----run push process temp cmd====' while True: timeout = 0 temp_cmd_obj = None while True: temp_cmd_lock = cache.get("TEMP_CMD_LOCK_PUSH") if temp_cmd_lock: timeout = timeout+1 if timeout > 300: printf("-process_temp_cmd---push---timeout***break-", True) break time.sleep(0.5) continue else: cache.set("TEMP_CMD_LOCK_PUSH", 1) temp_cmd_list = cache.get(TEMP_CMD_KEY) #print temp_cmd_list,'======temp_cmd_list==key=',cache.get(TEMP_CMD_KEY) if temp_cmd_list: temp_cmd_obj = temp_cmd_list.pop() cache.set(TEMP_CMD_KEY, temp_cmd_list) cache.set("TEMP_CMD_LOCK_PUSH", 0) break if temp_cmd_obj: device = temp_cmd_obj.SN ipaddress = device.ipaddress params = "" device_server_info = "%s:8370"%ipaddress #device_server_info = "192.168.8.41:80" conn = httplib.HTTPConnection(device_server_info) headers = {"Content-type": "application/x-www-form-urlencoded;charset=gb2312","Accept": "application/json, text/javascript, */*"} try: conn.timeout = 50 conn.request('GET', "?urgCmd=%s"%temp_cmd_obj.CmdContent, params, headers) #conn.request('GET', "?urgCmd=GET OPTION NetMask,GATEIPAddress", params, headers) #conn.request('GET', "/accounts/login/", params, headers) print '--------conn send request--dir==%s'%dir(conn) except Exception, e: print '---conn.request-error=%s'%e temp_cmd_obj.CmdReturn = -10060#发送请求失败 temp_cmd_obj.save() conn.close() write_log('---conn.request-error=%s'%e) time.sleep(1.5) continue print '========before get response==' ret = None try: ret = conn.getresponse() except Exception, e: print '============get response error=%s'%e pass print '========after get response==%s'%ret ret_read = ret.read() print ret.status,'============ret.status' print ret_read, '-------ret_read' ret_dict = {} if ret.status == 200: rets = ret_read.split('&') print '========rets==',rets ret_return = rets[0] ret_dict[ret_return.split('=')[0]] = ret_return.split('=')[1] if ret_dict["Return"] >= 0: from mysite.iaccess.dev_comm_center import G_DEVICE_GET_OPTION if temp_cmd_obj.CmdContent.startswith("DATA QUERY transaction") > 0: from dev_comm_center import process_event_log try: process_event_log(device, ret_dict["Result"]) except Exception, e: printf("PUSH****process_event_log-=-=%s"%e, True) pass elif temp_cmd_obj.CmdContent.startswith(G_DEVICE_GET_OPTION) > 0: ret_result = rets[1].split('Result=') if len(ret_result) > 0: ret_result = ret_result[1].split('=') print '=====ret_result=!!!',ret_result for r in ret_result: rets = r.split('=') ret_dict[rets[0]] = rets[1]#待处理 print '&&&&&&&&ret_dict===', ret_dict temp_cmd_obj.CmdReturn = ret_dict["Return"]
def append_rtlog_status_push(devobj, rtlog, d_server):#append_rtlog_push(d_server, devobj, rtlog):#push ----cccc20110726 from mysite.iaccess.models import AccRTMonitor from base.middleware import threadlocals from mysite.iaccess.models.accdoor import AccDoor try: rtlogs = rtlog.split("\t") operator = threadlocals.get_current_user() cursor = connection.cursor() dev_door_list = AccDoor.objects.filter(device=devobj) #读设备门列表到缓存 for rtlog in rtlogs:#修改支持一次获取多条事件记录 #print '---rtlog=',rtlog # if not rtlog:#非记录 # continue # str = rtlog.split("\t")#pull为',' str = rtlog.split(",") #----cccc doorstr="" if len(str) < 7: #不合规范数据 return 0 d_server.set_to_dict(devobj.get_doorstate_cache_key(), "%s,%s,1"%(str[7],str[8])) print 'door_state---status====',d_server.get_from_dict(devobj.get_doorstate_cache_key()) # if strtoint(str[4]) == DOOR_STATE_ID:#0时间+1门开关状态+2报警或门开超时+3没用+4(255标明该事件为门状态,否则为事件)+5 没用+6验证方式(200其他) # d_server.set_to_dict(devobj.get_doorstate_cache_key(), "%s,%s,1"%(str[1],str[2])) # write_log("rtlog ---- %s %s"%(str[1],str[2])) # return ## print '---str=',str # if strtoint(str[4]) == EVENT_DOORSENSOROPEN: # doorstate = d_server.get_from_dict(devobj.get_doorstate_cache_key())#dict中读取 # # print "doorstate=",doorstate # if doorstate is None: # doorstate = "0,0,0" # doorstr = doorstate.split(",", 3) # try: # val = set_doorstr(int(doorstr[0]), 0x02, int(str[3])) # except: # val = 0 # d_server.set_to_dict(devobj.get_doorstate_cache_key(), "%d,%s,1"%(val,doorstr[1])) # # if strtoint(str[4]) == EVENT_DOORSENSORCLOSE: # doorstate = d_server.get_from_dict(devobj.get_doorstate_cache_key()) # #print "doorstate=",doorstate # if doorstate is None: # doorstate = "0,0,0" # doorstr = doorstate.split(",", 3) # try: # val = set_doorstr(int(doorstr[0]), 0x01, int(str[3])) # except: # val = 0 # d_server.set_to_dict(devobj.get_doorstate_cache_key(), "%d,%s,1"%(val,doorstr[1])) # # if (strtoint(str[4]) >= ALAEM_ID_START) and (strtoint(str[4]) < ALAEM_ID_END): # doorstate = d_server.get_from_dict(devobj.get_doorstate_cache_key()) # #print "doorstate=",doorstate # if doorstate is None: # doorstate = "0,0,0" # doorstr = doorstate.split(",", 3) # try: # val = set_doorstr(int(doorstr[1]), int(str[4]), int(str[3])) # except: # val = 0 # d_server.set_to_dict(devobj.get_doorstate_cache_key(), "%s,%d,1"%(doorstr[0], val)) doorobj = None try: for obj in dev_door_list: if obj.door_no == int(str[3]): #查找相应的门对像,避免重复查询数据库 doorobj = obj break doorobj = obtain_doorobj_from_log(str, doorobj) if doorobj is not None: str[3] = doorobj and doorobj.id or 0 # str[3] = str[3] or 0 #----cccc20110726 area_id = doorobj.device.area.id except: print_exc() #print '--!!!!!!!--str=',str #if d_server.llen("MONITOR_RT")<MAX_RTLOG: #暂不考虑,设备人员不在数据库中的情况。固件已判断,只有验证通过的人才会上来41事件。darcy20110803锦湖轮胎 try: #新记录格式:0:时间, 1:PIN号 , 2:卡号, 3:门编号, 4:事件类型, 5:出入状态, 6:验证方式 ----cccc #time, Pin, cardno, doorID, even_type, reserved, verified #push方式给设备发命令 ----chenwj20110726 if int(str[4]) == EVENT_GAPB_SUCCEED or int(str[4]) == EVENT_GAPB_RESET: #反潜验证开门成功或者初始化反潜规则---222 #d_server.set_to_dict("APB_STATE_EMP_"+str[1], str[5]) if doorobj: if doorobj.global_apb: d_server.set_to_dict("GLOBAL_APB_AREA_%s_EMP_%s"%(area_id, str[1]), str[5]) #由于devview中已经做了设备所属区域内是否都在线的判断,所以程序执行至此时,说明区域内所有设备都在线 if int(str[4]) == EVENT_ANTIPASSBACK: #反潜验证41 if doorobj: global_apb_cmd = ""#返回空,表示后台验证失败--darcy20110803锦湖轮胎 #查看区域反潜范围内的设备的当前状态(不需要检查当前设备)-darcy20110803锦湖轮胎 if not check_apb_device_state(devobj, d_server): #if area_apb_offline:#如果区域反潜上一个状态是离线的,那么整个区域内的所有设备上来的之后的第一条记录都按照固件权限组逻辑判断。 #d_server.delete_dict("GLOBAL_APB_AREA_"+area_id)#清空 global_apb_cmd = "NA" print '------NA' keys = d_server.get_keys_from_dict()#效率不高。。。 #print '-@@@@@@--keys=',keys for key in keys: if key.startswith("GLOBAL_APB_AREA_%s"%area_id): #print '--------delete the emp key=',key d_server.delete_dict(key) #print '--get key=',key,'---',d_server.get_from_dict(key) else: lock_delay = doorobj.lock_delay#获取锁驱动时长 print '----GLOBAL_APB_AREA=',"GLOBAL_APB_AREA_%s_EMP_%s"%(area_id, str[1]) apb_state = d_server.get_from_dict("GLOBAL_APB_AREA_%s_EMP_%s"%(area_id, str[1])) #print '---apb_state=',apb_state #DEVICE SET %d %d %d %d #1继电器,门id,1继电器类型为门,时长 if apb_state:#缓存中存在此人员 if apb_state != str[5]:#出入状态匹配成功,可以开门--darcy20110803锦湖轮胎 #print '-----can open the door' global_apb_cmd = "DEVICE SET 1 %d 1 %s"%(int(str[3]), lock_delay) elif apb_state is None:#第一次,里面还没有内容,即初始化反潜规则,要求固件发送224事件-darcy20110803 #print '--apb_state is None---can open the door' global_apb_cmd = "RESET_GAPB DEVICE SET 1 %d 1 %s"%(int(str[3]), lock_delay) else: pass #print '------cannot open the door' d_server.set_to_dict("GLOBAL_APB_CMD_%s"%devobj.sn, global_apb_cmd + '\n' + rtlog.strip())#生成开门命令 #else:#其它情况,如:卡未注册 if doorobj is not None: str[3] = doorobj and doorobj.id or 0 log = "%s,%s,%s,%s,%s,%s,%s,%d"%(FmtTTime(str[0]).strftime('%Y-%m-%d %H:%M:%S'),str[1],str[3],str[4],str[5], str[6].strip(), str[2], devobj and devobj.id or 0) write_log("---log=%s"%log) save_event_log(str, cursor, operator, doorobj, devobj)#写入报表 d_server.rpush_to_dict("MONITOR_RT", log)#{"MONITOR_RT':['log1','log2']}#push实时监控 if (strtoint(str[4]) >= ALAEM_ID_START) and (strtoint(str[4]) < ALAEM_ID_END): d_server.rpush_to_dict("ALARM_RT", log) except Exception, e: print '--e2=',e print_exc() connection.close()
def trigger_cmd_device(cmd_obj): #写入新命令队列 old_cmd = 0 write_log('---------in trigger_cmd_device cmd_obj=%s' % cmd_obj) try: q_server = queqe_server() d_server = start_dict_server() cln = cmd_obj.SN.new_command_list_name() #NEWCMD_* #向文件缓存和dict中同时写入新命令 dev = cmd_obj.SN #命令总数 cntkey = dev.command_count_key() #print '---cntkey=',cntkey cnt = d_server.get_from_dict(cntkey) #从dict中取 old_cmd = q_server.llen_file(cln) write_log('---cmd_obj=%s,---cnt=%s,-----old_cmd=%s' % (cmd_obj, cnt, old_cmd)) if cnt is None: cnt = str(old_cmd) write_log('------devcmd get length from file-cnt=%s' % cnt) if cnt.find('\x00'): cnt = cnt.strip('\x00') #q_server.set(cntkey, "%d"%(int(cnt)+1)) if dev.device_type == DEVICE_ACCESS_CONTROL_PANEL and cmd_obj.CmdImmediately: timeout = 0 while True: temp_cmd_lock = d_server.get_from_dict("TEMP_CMD_LOCK") if temp_cmd_lock: #如果当前其他线程或者进程在进行同样的操作,等待 write_log( '--------!cmd_obj=%s temp_cmd_lock=%s timeout=%s' % (cmd_obj, temp_cmd_lock, timeout)) timeout += 1 if timeout > 300: break #超时后不放入缓存 time.sleep(0.5) continue else: d_server.set_to_dict("TEMP_CMD_LOCK", 1) immed_cmd_dict = d_server.get_from_dict("TEMP_CMD") write_log('-devcmd-before immed_cmd_dict=%s, cmd_obj=%s' % (immed_cmd_dict, cmd_obj)) if not immed_cmd_dict: immed_cmd_dict = {} immed_cmd_dict.setdefault(dev.id, [cmd_obj]) else: devcmds = immed_cmd_dict.get(dev.id) or [ ] #获取到当前设备对应的所有的紧急命令 # if devcmds: # devcmds.append(cmd_obj) # else: # devcmds = [] devcmds.append(cmd_obj) immed_cmd_dict[dev.id] = devcmds write_log( '-devcmd-before set_to_dict cmd_obj=%s,immed_cmd_dict=%s' % (cmd_obj, immed_cmd_dict)) d_server.set_to_dict("TEMP_CMD", immed_cmd_dict) d_server.set_to_dict("TEMP_CMD_LOCK", 0) #immed_cmd_dict = d_server.get_from_dict("TEMP_CMD") #write_log('-devcmd-after cmd_obj=%s,immed_cmd_dict=%s'%(cmd_obj, immed_cmd_dict)) #time.sleep(1) #immed_cmd_dict = d_server.get_from_dict("TEMP_CMD") #printf('-devcmd-after 5s cmd_obj=%s, immed_cmd_dict=%s'%(cmd_obj, immed_cmd_dict), True) break #print d_server.get_from_dict("TEMP_CMD"),'-----------devcmds' else: write_log('-------------------file catch') q_server.lpush_to_file(cln, pickle.dumps(cmd_obj)) if not cmd_obj.CmdImmediately: d_server.set_to_dict(cntkey, "%d" % (int(cnt) + 1)) #命令总数写入dict write_log('---cmd_obj=%s--cnt========%s' % (cmd_obj, d_server.get_from_dict(cntkey))) q_server.connection.disconnect() except: print_exc() if not (dev.comm_type == COMMU_MODE_PUSH_HTTP): #门禁设备不须通知 return pass #UDP 广播通知设备来读取命令 if old_cmd: #若新命令队列不空,说明设备上次的命令还没有执行,不需要再次通知设备 return try: ip = cmd_obj.SN.ipaddress sNotify = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) if ip: sNotify.sendto("R-CMD", (ip, 4374)) except: print_exc()
def control_normal_open(self, doorid, state): write_log("-----devcomm before ControlDevice device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.ControlDevice(self.hcommpro, 4, doorid, state, 0, 0 , "") write_log("-----devcomm after ControlDevice device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) return {"result": ret, "data": ""}
def reboot(self): write_log("-----devcomm before ControlDevice device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret = self.commpro.ControlDevice(self.hcommpro, 3, 0, 0, 0, 0 , "") write_log("-----devcomm after ControlDevice device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) return {"result": ret, "data": ""}
def controldevice(self, doorid, index, state): #输出状态, state由软件控制 write_log("-----devcomm before ControlDevice device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) ret=self.commpro.ControlDevice(self.hcommpro, 1, doorid, index, state, 0 , "") write_log("-----devcomm after ControlDevice device:%s pid=%d"%(self.comminfo["ipaddress"], os.getpid())) return {"result":ret,"data":""}