Ejemplo n.º 1
0
 def _get_push_data(self):
     """
     1、从队列获取package;
     2、分析包并触发相应处理程序;
     3、发送package。
     :return:
     """
     print('start send data')
     while self.isrunning:
         try:
             if not self.q_rsl.empty():
                 transfer_package = self.q_rsl.get()
                 data_dict = transfer_package.to_dict()
                 # print('get push data--', data_dict)
                 self._analyze_pkg(package=data_dict)
                 # data_send = bytes('{}'.format(data_dict), encoding='utf-8')
                 # print('File: "' + __file__ + '", Line ' + str(sys._getframe().f_lineno) + ' , in ' + sys._getframe().f_code.co_name)
                 # print(data_send)
                 # if self.sock:
                 #     self.sock.send(data_send)
             else:
                 time.sleep(1)
         except (OSError, BrokenPipeError):
             continue
         except Exception as e:
             print(e)
             mylogger.error(e)
             continue
Ejemplo n.º 2
0
 def _operate_equipment(self, transfer_package):
     """
     异步访问硬件
     :param transfer_package:
     :return:
     """
     try:
         target = transfer_package.target
         task = transfer_package.data['func']
         args = transfer_package.data['args']
         # get the queue of equipment
         self.lock.acquire()
         qt = self.terminal_active[target]['queuetask']
         qr = self.terminal_active[target]['queuersl']
         subevent = self.terminal_active[target]['subevent']
         self.lock.release()
         subevent.clear()
         qt.put((task, args))
         subevent.wait()
         if not qr.empty():
             pkg = qr.get()
             self.queue_rsl.put(pkg)
         else:
             print(target, ' qr is empty!')
     except Exception as e:
         print('except------', e)
         mylogger.error(e)
Ejemplo n.º 3
0
 def _save_data2db(self):
     """
     1、先查询用户是否有借出,有则清除并更新格子重量;
     2、更改对应EPC的在库状态,更新用户的借还历史;
     3、同时检测是否放置错误的重力格子或者RFID格子;
     :return:
     """
     try:
         print('_save_data2db')
         print('\033[1;33m', 'all gravity--', self.gravity_goods)
         print('all RFID--', self.rfid_goods, '\033[0m')
         history_list = History_inbound_outbound.by_user_need_return(self.user_id)
         # print('history_list--', history_list)
         history_gravity = [h for h in history_list if h.monitor_way == 1]
         history_rfid = [h for h in history_list if h.monitor_way == 2]
         if self.manage_mode == 1:
             self._save_gravity_data(history=history_gravity)
         self._save_rfid_data(rfid_history=history_rfid)
         with self.lock:
             self.rfid_goods.clear()
             self.gravity_goods.clear()
         return True
     except Exception as e:
         mylogger.error(e)
         return False
Ejemplo n.º 4
0
 def delete_equipment(self, ip: str, port: int, isserver: bool):
     """
     1、加入设备服务器列表或设备客户端列表;
     2、尝试连接设备;
     :param ip:
     :param port:
     :param type_new:
     :param isserver:
     :return:
     """
     addr = (ip, port)
     try:
         if isserver:
             self.lock.acquire()
             del self.servers[addr]
             self.lock.release()
         else:
             self.lock.acquire()
             del self.clients[addr]
             self.lock.release()
         return True
     except Exception as e:
         print('gateway server is failed to delete_equipment():%s' % e)
         mylogger.error(
             'gateway server is failed to delete_equipment():%s' % e)
         return False
Ejemplo n.º 5
0
 def _handle_cmd(self):
     try:
         if not self.queue_task.empty():
             # get transfer package type 'TransferPackage' from queue
             transfer_package = self.queue_task.get()
             target = transfer_package.target
             task = transfer_package.data['func']
             args = transfer_package.data['args']
             print('\033[1;33m CMD: ', task, ' ', args, '\033[0m')
             # cmd for the equipment running async
             if transfer_package.msg_type == 0:
                 thd = threading.Thread(target=self._operate_equipment,
                                        args=(transfer_package, ))
                 thd.setDaemon(True)
                 thd.start()
             # cmd for gateway server
             elif transfer_package.msg_type == 1:
                 rsl = methodcaller(task, *args)(self)
                 if rsl is True:
                     transfer_package.code = SUCCESS
                     transfer_package.msg_type = 4
                 else:
                     transfer_package.code = ERR_EQUIPMENT_RESP
                     transfer_package.msg_type = 4
                 self.queue_rsl.put(transfer_package)
             else:
                 pass
         else:
             pass
     except KeyboardInterrupt:
         with self.lock:
             self.isrunning = False
     except Exception as e:
         print('excetp', e)
         mylogger.error(e)
Ejemplo n.º 6
0
def main():
    mydb = MyDB()
    myserver = None
    mycontroler = None
    thd_timer = None
    # task_controler与gateway_server交互的全局队列
    q_task = Queue(50)
    q_rsl = Queue(50)
    try:
        rsl = get_all_equipments()
        servers_registered = dict()  # {addr: (type, storeroom_id, uuid)}
        clients_registered = dict()
        for r_id, s_c in rsl.items():
            temp_servers = {
                k: (v[0], r_id, v[1])
                for k, v in s_c['servers'].items()
            }
            servers_registered.update(temp_servers)
            temp_clients = {
                k: (v[0], r_id, v[1])
                for k, v in s_c['clients'].items()
            }
            clients_registered.update(temp_clients)
        myserver = GatewayServer(port=8809,
                                 servers_registered=servers_registered,
                                 clients_registered=clients_registered,
                                 queue_task=q_task,
                                 queue_rsl=q_rsl)
        mycontroler = TaskControler(queue_task=q_task, queue_rsl=q_rsl)
        myserver.daemon = True
        mycontroler.daemon = True
        myserver.start()
        progress['gateway_server'] = myserver
        mycontroler.start()
        progress['task_controler'] = mycontroler
        thd_timer = threading.Timer(interval=60,
                                    function=ontime_progress_monitor,
                                    args=([q_task, q_rsl]))
        thd_timer.start()
        thd_timer.join()
    except KeyboardInterrupt:
        mydb.close()
        myserver.stop()
        mycontroler.stop()
        thd_timer.cancel()
        while mycontroler.is_alive() or myserver.is_alive():
            time.sleep(1)
            print('thread--mycontroler/myserver is still alive')
    except Exception as e:
        print('exception from main', e)
        mylogger.error('exception from main: %s' % e)
Ejemplo n.º 7
0
 def run(self):
     """
     1、主动连接所有已注册服务端;
     2、监听等待连接所有已注册客户端;
     3、打开注册子线程;
     4、打开创建与监测子线程;
     5、打开交互接口。
     :return:
     """
     try:
         # connect all servers
         if self.servers is not None:
             print("Start to connect to registered servers!!!!")
             for k, v in self.servers.items():
                 self._connect_server(addr=k,
                                      ttype=v[0],
                                      storeroom_id=v[1],
                                      uuid=v[2])
         else:
             mylogger.info(
                 'There is None registered server for connecting!')
         # monitor and reconn servers
         thread_reconn_server = threading.Thread(
             target=self._reconnect_offline_server)
         thread_reconn_server.daemon = True
         thread_reconn_server.start()
         # listen all access clients
         thread_monitor_client = threading.Thread(
             target=self._monitor_access)
         thread_monitor_client.daemon = True
         thread_monitor_client.start()
         # monitor status subthread on time
         t = threading.Timer(interval=1, function=self.time_thread)
         t.daemon = True
         t.start()
         # wait for cmd
         while True:
             with self.lock:
                 status = self.isrunning
             if status:
                 self._handle_cmd()
             else:
                 break
     except Exception as e:
         print('gateway_server: ', e)
         mylogger.error(e)
Ejemplo n.º 8
0
    def call_cpp(self, func_name, *args):
        # print(func_name)
        for so_lib in self.so_list:
            try:
                lib = cdll.LoadLibrary(so_lib)
                try:
                    value = eval("lib.%s" % func_name)(*args)
                    # mylogger.info("调用的库:" + so_lib)
                    # mylogger.info("执行成功,返回值:" + str(value))
                    return value
                except:
                    continue
            except:
                continue
            # logging.info("库文件载入失败:" + so_lib )

        mylogger.error("没有找到接口!")
        return False
Ejemplo n.º 9
0
    def _check_data_update(self):
        start = time.time()
        try:
            with self.lock:
                print('CM_R2000FH old EPCs: ', self.data_buff)
                print('CM_R2000FH new EPCs: ', self.current_epcs)
                if self.current_epcs is not None:
                    print(
                        time.asctime(), 'CM_R2000RH(%s, %d) exception:' %
                        (self.addr[0], self.addr[1]), self.current_epcs)
                    diff_epcs = list(
                        set(epc[0] for epc in self.current_epcs)
                        ^ set(epc[0] for epc in self.data_buff))
                    print('CM_R2000FH diff_epcs--', diff_epcs)
                    if diff_epcs:
                        is_increase = True if len(self.current_epcs) > len(
                            self.data_buff) else False
                        diff = [
                            epc_ant for epc_ant in self.current_epcs
                            if epc_ant[0] in diff_epcs
                        ] if is_increase else [
                            epc_ant for epc_ant in self.data_buff
                            if epc_ant[0] in diff_epcs
                        ]
                        data = {'epcs': diff, 'is_increase': is_increase}
                        # pkg = TransferPackage(code=EQUIPMENT_DATA_UPDATE, eq_type=4, data=data, source=self.addr,
                        #                       msg_type=3, storeroom_id=self.storeroom_id, eq_id=self.uuid)
                        # self.queue_push_data.put(pkg)
                    self.data_buff.clear()
                    self.data_buff = [epc_ant for epc_ant in self.current_epcs]
                    self.current_epcs.clear()
        except Exception as e:
            print('CM_R2000RH(%s, %d) exception: %s' %
                  (self.addr[0], self.addr[1], e))
            mylogger.error('CM_R2000RH(%s, %d) exception: %s' %
                           (self.addr[0], self.addr[1], e))
        end = time.time()
        start_end = end - start
        interval = round((self.update_interval - start_end), 2)

        thread_ontime = threading.Timer(interval=interval,
                                        function=self._check_data_update)
        thread_ontime.daemon = True
        thread_ontime.start()
Ejemplo n.º 10
0
def main():
    mydb = MyDB()
    myserver = None
    mycontroler = None
    # task_controler与gateway_server交互的全局队列
    q_task = Queue(50)
    q_rsl = Queue(50)
    try:
        rsl = get_all_equipments()
        servers_registered = dict()  # {addr: (type, storeroom_id, uuid)}
        clients_registered = dict()
        for r_id, s_c in rsl.items():
            temp_servers = {
                k: (v[0], r_id, v[1])
                for k, v in s_c['servers'].items()
            }
            servers_registered.update(temp_servers)
            temp_clients = {
                k: (v[0], r_id, v[1])
                for k, v in s_c['clients'].items()
            }
            clients_registered.update(temp_clients)
        myserver = GatewayServer(port=8809,
                                 servers_registered=servers_registered,
                                 clients_registered=clients_registered,
                                 queue_task=q_task,
                                 queue_rsl=q_rsl)
        mycontroler = TaskControler(queue_task=q_task, queue_rsl=q_rsl)
        myserver.start()
        mycontroler.start()
        mycontroler.join()
        # while True:
        #     pass
    except KeyboardInterrupt:
        # mydb.close()
        # myserver.stop()
        mycontroler.stop()
        while mycontroler.is_alive():
            time.sleep(1)
            print('thread is still alive')
    except Exception as e:
        print(e)
        mylogger.error(e)
Ejemplo n.º 11
0
    def _create_socket(self, addr: tuple):
        ##############################
        # create every socket connected to equipment
        ##############################
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(1)

        failed_count = 0
        while True:
            try:
                s.connect(addr)
                print('success to conn client: ', addr)
                break
            except socket.error:
                failed_count += 1
                print("fail to connect to server %d times" % failed_count)
                if failed_count == 10:
                    print('Fail to connect Client: ', addr)
                    mylogger.error('Fail conn to: ' + str(addr))
                    return None
        return s
Ejemplo n.º 12
0
 def run(self):
     cursec = 0
     current_data = {}
     while self.isrunning:
         try:
             if not self.queuetask.empty():
                 task, args = self.queuetask.get()
                 rsl = methodcaller(task, *args)(self)
                 if rsl is not None:
                     pkg = TransferPackage(code=200,
                                           eq_type=1,
                                           data={'rsl': rsl},
                                           source=self.addr,
                                           msg_type=4)
                     self.queuersl.put(pkg)
                     self.event.set()
             else:
                 time.sleep(30)
                 localtime = time.localtime(time.time())
                 if localtime.tm_sec != cursec:
                     cursec = localtime.tm_sec
                     rsl = cursec
                     allg = {}
                     if rsl is not None and rsl % 10 == 0:
                         allg[str(rsl)] = rsl
                         if allg != current_data:
                             current_data.update(allg)
                             pkg = TransferPackage(code=206,
                                                   eq_type=1,
                                                   data=allg,
                                                   source=self.addr,
                                                   msg_type=3)
                             self.queue_push_data.put(pkg)
                             # print(time.asctime(), 'G--getAllInfo: ', allg)
                 else:
                     pass
         except Exception as e:
             print(e)
             mylogger.error(e)
     print('网络断开啦,子线程%s要关闭了!' % threading.current_thread().name)
Ejemplo n.º 13
0
def ontime_progress_monitor(q_task, q_rsl):
    print('*********times out progress monitor**********')
    if not progress['gateway_server'].is_alive():
        print('progress gateway_server is not alive')
        mylogger.error('progress gateway_server is not alive')
        rsl = get_all_equipments()
        servers_registered = dict()  # {addr: (type, storeroom_id, uuid)}
        clients_registered = dict()
        for r_id, s_c in rsl.items():
            temp_servers = {
                k: (v[0], r_id, v[1])
                for k, v in s_c['servers'].items()
            }
            servers_registered.update(temp_servers)
            temp_clients = {
                k: (v[0], r_id, v[1])
                for k, v in s_c['clients'].items()
            }
            clients_registered.update(temp_clients)
        myserver_demo = GatewayServer(port=8809,
                                      servers_registered=servers_registered,
                                      clients_registered=clients_registered,
                                      queue_task=q_task,
                                      queue_rsl=q_rsl)
        myserver_demo.daemon = True
        myserver_demo.start()
        progress['gateway_server'] = myserver_demo
        mylogger.info('progress gateway_server is start again')
    if not progress['task_controler'].is_alive():
        print('progress task_controler is not alive')
        mylogger.error('progress task_controler is not alive')
        mycontroler_demo = TaskControler(queue_task=q_task, queue_rsl=q_rsl)
        mycontroler_demo.daemon = True
        mycontroler_demo.start()
        progress['task_controler'] = mycontroler_demo
        mylogger.info('progress task_controler is start again')
    thd_timer1 = threading.Timer(interval=60,
                                 function=ontime_progress_monitor,
                                 args=([q_task, q_rsl]))
    thd_timer1.start()
Ejemplo n.º 14
0
 def run(self):
     try:
         print('PID--task_controler:', os.getpid())
         mylogger.info('PID--task_controler: %d' % os.getpid())
         thread_conn = threading.Thread(target=self._monitorconn)
         thread_send = threading.Thread(target=self._get_push_data)
         thread_conn.daemon = True
         thread_send.daemon = True
         thread_conn.start()
         thread_send.start()
         print('start task')
         thread_conn.join()
         print('stop task controler')
         mylogger.error('task controler was stop')
     except KeyboardInterrupt:
         # while self.sock is not None:
         #     print(self.server_sock)
         #     self.server_sock.shutdown(socket.SHUT_RDWR)
         #     self.server_sock.close()
         #     time.sleep(2)
             print('self.sock', self.sock)
     except Exception as e:
         print('task_controler was stop by exception: ', e)
         mylogger.error('task_controler was stop by exception:' + e)
     print('\033[1;33m', 'task_controler was stop', '\033[0m')
     mylogger.error('task_controler was stop')
Ejemplo n.º 15
0
 def add_new_equipment(self, ip: str, port: int, type_new: str,
                       isserver: bool, storeroom_id: str, uuid: str):
     """
     1、加入设备服务器列表或设备客户端列表;
     2、尝试连接设备;
     :param ip:
     :param port:
     :param type_new:
     :param isserver:
     :return:
     """
     addr = (ip, port)
     try:
         if isserver:
             self.lock.acquire()
             self.servers[addr] = (type_new, storeroom_id, uuid)
             self.lock.release()
             self._connect_server(addr=addr,
                                  ttype=type_new,
                                  storeroom_id=storeroom_id,
                                  uuid=uuid)
             if addr in self.server_active.keys():
                 return True
             else:
                 return False
         else:
             self.lock.acquire()
             self.clients[addr] = (type_new, storeroom_id, uuid)
             self.lock.release()
             time.sleep(1)
             if addr in self.client_active:
                 return True
             else:
                 return False
     except Exception as e:
         print('gateway server is failed to add_new_equipment():%s' % e)
         mylogger.error(
             'gateway server is failed to add_new_equipment():%s' % e)
         return False
Ejemplo n.º 16
0
 def run(self):
     num = 0
     cursec = 0
     while self.isrunning:
         try:
             if not self.queuetask.empty():
                 task, args = self.queuetask.get()
                 rsl = methodcaller(task, *args)(self)
                 if rsl is not None:
                     pkg = TransferPackage(code=200,
                                           eq_type=1,
                                           data={'rsl': rsl},
                                           source=self.addr,
                                           msg_type=6)
                     self.queuersl.put(pkg)
                     self.event.set()
             else:
                 localtime = time.localtime(time.time())
                 if localtime.tm_sec != cursec:
                     cursec = localtime.tm_sec
                     num = num + 1 if num < 1000 else 0
                     for i in self.alladdrs:
                         rsl = self.showNum(num, i)
                         activate = True if num % 2 == 0 else False
                         self.onLed(activate=activate, pos='up', addr=i)
                         self.onLed(activate=not activate,
                                    pos='down',
                                    addr=i)
                         # if rsl:
                         #     print('L(%s)--showNum: %i' % (i, num))
                 else:
                     pass
         except Exception as e:
             print(e)
             mylogger.error(e)
     print('网络断开啦,子线程%s要关闭了!' % threading.current_thread().name)
Ejemplo n.º 17
0
    def run(self):
        """
        1、主动连接所有已注册服务端;
        2、监听等待连接所有已注册客户端;
        3、打开注册子线程;
        4、打开创建与监测子线程;
        5、打开交互接口。
        :return:
        """
        try:
            print('PID--gateway_server:', os.getpid())
            mylogger.info('PID--gateway_server: %d' % os.getpid())
            # connect all servers
            if self.servers is not None:
                print("Start to connect to registered servers!!!!")
                for k, v in self.servers.items():
                    self._connect_server(addr=k,
                                         ttype=v[0],
                                         storeroom_id=v[1],
                                         uuid=v[2])
            else:
                mylogger.info(
                    'There is None registered server for connecting!')

            # monitor and reconn servers
            thread_reconn_server = threading.Thread(
                target=self._reconnect_offline_server)
            thread_reconn_server.daemon = True
            thread_reconn_server.start()

            # listen all access clients
            thread_monitor_client = threading.Thread(
                target=self._monitor_access)
            thread_monitor_client.daemon = True
            thread_monitor_client.start()

            # monitor status subthread on time
            self.check_interval = conpar.read_yaml_file(
                'configuration')['gateway_server_check_interval']
            t = threading.Timer(interval=self.check_interval,
                                function=self._thread_ontime)
            t.daemon = True
            t.start()
            # wait for cmd
            print('gateway server was start')
            while self.isrunning:
                self._handle_cmd()
                time.sleep(1)
            print('gateway server was stop')
            mylogger.error('gateway server was stop')
        except Exception as e:
            print('gateway server was stop by exception: ', e)
            mylogger.error('gateway server was stop by exception:' + e)
        print('\033[1;33m', 'gateway_server was stop', '\033[0m')
        mylogger.error('gateway_server was stop')
Ejemplo n.º 18
0
 def print_error(self, msg=""):
     error_info = self.call_cpp("NET_DVR_GetLastError")
     mylogger.error(msg + str(error_info))
Ejemplo n.º 19
0
 def _analyze_pkg(self, package: dict):
     """
     1、门禁事件:
         查询是否存在该门禁的处理线程,存活的就放入pkg,否则创建开始新线程;
     2、数据更新事件:
         根据设备pkg中storeroom的ID号放入相应的线程;
     3、其他推送到web的响应事件;
     :param package:
     :return:
     """
     try:
         print('analyze pkg: ', package)
         # if self.sock:
         #     data_send = bytes('{}'.format(package), encoding='utf-8')
         #     self.sock.send(data_send)
         storeroom_id = package['storeroom_id']
         if package['msg_type'] == 3 and package['equipment_type'] in (3, 5):
             print('111')
             # 门禁的数据更新pkg处理
             if storeroom_id in self.storeroom_thread.keys() and self.storeroom_thread[storeroom_id]['thread'].isAlive():
                 self.storeroom_thread[storeroom_id]['queue'].put(package)
             else:
                 print('\033[1;33m', package['data']['user'] + 'enter to storeroom--' + storeroom_id + ' by entrance--' + str(package['source']), '\033[0m')
                 addr = package['source']
                 eq_id = package['equipment_id']
                 user_code = package['data']['user']
                 queue_storeroom = Queue(50)
                 thread_store_mag = StoreroomManager(entrance_addr=addr, entrance_id=eq_id, user_code=user_code,
                                                     queue_storeroom=queue_storeroom, q_send=self.q_rsl, q_task=self.q_task)
                 thread_store_mag.daemon = True
                 thread_store_mag.start()
                 self.storeroom_thread[storeroom_id] = {'thread': thread_store_mag, 'queue': queue_storeroom}
         elif package['msg_type'] == 3:
             print('222')
             # 其他设备的数据更新pkg处理. 判断是否为重力,并更新DB的实时总重量;若有人在库,则放入库房处理程序;
             if package['equipment_type'] == 1:
                 self._update_db_data(package=package)
             if storeroom_id in self.storeroom_thread.keys() and self.storeroom_thread[storeroom_id]['thread'].isAlive():
                 self.storeroom_thread[storeroom_id]['queue'].put(package)
             else:
                 print('someone has not login but did something')
                 path_cur = os.path.abspath(os.path.dirname(__file__))
                 playsound(path_cur + '/../util/a_o.mp3')
         elif package['msg_type'] == 2 and package['code'] == 301:
             print('333')
             # web确定按钮pkg
             if storeroom_id in self.storeroom_thread.keys() and self.storeroom_thread[storeroom_id]['thread'].isAlive():
                 self.storeroom_thread[storeroom_id]['queue'].put(package)
                 # 等待线程结束信号并返回web
             else:
                 # 此借还线程不存在,返回web信息不成功
                 package['code'] = TASK_HANDLE_ERR
                 package['msg_type'] = 4
                 package['data'] = {'msg': 'the thread of storeroom is not alive'}
                 if self.sock:
                     # data_send = bytes('{}'.format(package), encoding='utf-8')
                     print(type(package))
                     data_send = json.dumps(package).encode()
                     length = len(data_send)
                     # 定制包头 i为4个字节,所以接收方为四个字节,这个大小并不是输入的大小,而是封装固定的大小
                     data_length = struct.pack('i', length)  # 使用struct,直接将int转为二进制型数据传输,对方使用struct解包
                     self.sock.send(data_length)
                     self.sock.send(data_send)
         elif package['msg_type'] == 4 and package['source'] is None:
             print('444')
             # web response
             print('web response--', package)
         else:
             print('555')
             if self.sock:
                 # data_send = bytes('{}'.format(package), encoding='utf-8')
                 print(type(package))
                 data_send = json.dumps(package).encode()
                 length = len(data_send)
                 # 定制包头 i为4个字节,所以接收方为四个字节,这个大小并不是输入的大小,而是封装固定的大小
                 data_length = struct.pack('i', length)  # 使用struct,直接将int转为二进制型数据传输,对方使用struct解包
                 self.sock.send(data_length)
                 self.sock.send(data_send)
                 print('\033[1;34m', 'send to web pkg--', data_send, '\033[0m')
                 mylogger.info('send web pkg--%s' % str(data_send, encoding='utf-8'))
     except Exception as e:
         mylogger.error(e)