Example #1
0
    def uploadRecord(self, data, client):
        '''
        刷卡记录上传
        :param data:
        :param client:
        :return:
        '''
        requestBody = {
            'serial': CommonUtils.bytesToHex(data[0:6]),
            'carNum': CommonUtils.bytesToHex(data[7:12]),
            'dateTime': CommonUtils.bytesToHex(data[12:])
        }

        logger.debug('上传刷卡记录:%s' % (requestBody))

        response = HttpClient.doGet(Config.doorRecord + '?type=1&mac=' +
                                    requestBody['serial'] + '&cardNum=' +
                                    requestBody['carNum'])

        logger.debug('刷卡记录上传结果:%s' % (response))

        data = requestBody['serial'] + '01' + requestBody['carNum']

        if response['success']:
            data += '4F4B'
        else:
            data += '4445'

        data = CommonUtils.xorOperation(bytes.fromhex(data))

        logger.debug('响应UDP门禁:hex=%s' % (CommonUtils.bytesToHex(data)))

        UdpClient.sendUdpData(data, client)
Example #2
0
    def elevatorCardUpload(self, data, client):
        '''
        梯控刷卡记录上传
        :param data:
        :param client:
        :return:
        '''
        requestBody = {
            'mac': CommonUtils.bytesToHex(data[0:6]),
            'carNum': CommonUtils.bytesToHex(data[7:12]),
            'dateTime': CommonUtils.bytesToHex(data[12:])
        }
        logger.debug('梯控卡号上传:%s' % (requestBody))
        # 提交记录到云平台,返回该卡可以使用的楼层
        response = HttpClient.doPost(Config.elevatorRecord, requestBody)
        logger.debug('梯控卡号上传结果:%s' % (response))

        message = None

        if response['success']:
            message = requestBody['mac'] + '11' + requestBody[
                'carNum'] + CommonUtils.getFloorHex(response['data'])
        else:
            message = requestBody['mac'] + '11' + requestBody['carNum'] + '4445'

        message = CommonUtils.xorOperation(bytes.fromhex(message))

        logger.debug('梯控卡号上传响应:%s' % (CommonUtils.bytesToHex(message)))

        UdpClient.sendUdpData(message, client)
Example #3
0
 def elevatorTempPassValidate(self, data, client):
     '''
     梯控临时密码校验
     :param data:
     :param celint:
     :return:
     '''
     requestBody = {
         'serial': CommonUtils.bytesToHex(data[0:6]),
         'pass': CommonUtils.bytesToHex(data[7:9]),
     }
     logger.debug('梯控临时密码校验:%s' % (requestBody))
     response = HttpClient.doPost(Config.elevatorTempPassValidate,
                                  requestBody)
     logger.debug('梯控临时密码校验结果:%s' % (response))
     if response['success']:
         floors = response['data']
         message = None
         if floors:
             # 存在一个或者多个楼层权限
             message = requestBody[
                 'serial'] + '15' + CommonUtils.getFloorHex(floors) + '4F4B'
         else:
             # 校验失败,不存在楼层权限
             message = requestBody['serial'] + '15' + '4445'
         message = CommonUtils.xorOperation(bytes.fromhex(message))
         logger.debug('梯控临时密码响应:%s' % (CommonUtils.bytesToHex(message)))
         UdpClient.sendUdpData(message, client)
Example #4
0
    def uploadPassRecord(self, data, client):
        '''
        密码开门记录上传
        :param data:
        :param client:
        :return:
        '''
        requestBody = {
            'serial': CommonUtils.bytesToHex(data[0:6]),
            'pass': CommonUtils.bytesToHex(data[7:9]),
        }

        logger.debug('上传密码开门记录:%s' % (requestBody))

        response = HttpClient.doGet(Config.doorRecord + '?type=2&mac=' +
                                    requestBody['serial'] + '&cardNum=' +
                                    requestBody['pass'])

        logger.debug('密码开门记录上传结果:%s' % (response))

        data = requestBody['serial'] + '0A4F4B'

        data = CommonUtils.xorOperation(bytes.fromhex(data))

        logger.debug('响应UDP门禁:hex=%s' % (CommonUtils.bytesToHex(data)))

        UdpClient.sendUdpData(data, client)
Example #5
0
    def elevatorHeartBeat(self, data, client):
        '''
        梯控心跳
        :return:
        '''
        requestBody = {
            'sourceIp': client[0],
            'sourcePort': client[1],
            'mac': CommonUtils.bytesToHex(data[0:6]),
            'targetIp': '' if not Config.udpServerIp else Config.udpServerIp,
            'targetPort': Config.udpServerPort,
            'date': CommonUtils.now(),
        }
        logger.debug("梯控心跳:%s" % (requestBody))
        response = HttpClient.doPost(Config.elevatorHeartbeat, requestBody)
        logger.debug('梯控心跳结果:%s' % (response))
        if response['success']:
            cardFormat = response['data']['cardFormat']
            key = response['data']['key']
            if not key:
                logger.error('没有密钥')
                return
            if not cardFormat:
                cardFormat = '04'

            message = requestBody['mac'] + '17' + key + time.strftime(
                "%y%m%d%H%M%S") + cardFormat
            message = CommonUtils.xorOperation(bytes.fromhex(message))
            logger.debug('梯控心跳响应:%s' % (CommonUtils.bytesToHex(message)))
            UdpClient.sendUdpData(message, client)
Example #6
0
    def heartbeatWithStatus(self, data, client):
        '''
        带有状态的心跳包
        :param data:
        :param client:
        :return:
        '''
        requestBody = {
            'sourceIp': client[0],
            'sourcePort': client[1],
            'mac': CommonUtils.bytesToHex(data[0:6]),
            'targetIp': '' if not Config.udpServerIp else Config.udpServerIp,
            'targetPort': Config.udpServerPort,
            'status': CommonUtils.bytesToHex(data[7:8]),
            'date': CommonUtils.now(),
        }

        logger.debug('状态心跳:%s' % (requestBody))

        response = HttpClient.doPost(Config.doorHeartbeat, requestBody)

        logger.debug('状态响应:%s' % (response))

        if not response['success']:
            logger.error('服务器异常:%s' % (response['message']))
            return

        if 'data' not in response or not response['data']:
            logger.error('门禁没有密钥和卡片输出格式:serital=%s' % (requestBody['mac']))
            return

        if 'key' not in response['data']:
            logger.error('门禁没有密钥信息:serital=%s' % (requestBody['mac']))
            return

        key = response['data']['key']

        if 'cardOutFormat' not in response['data']:
            cardFormat = '04'
        else:
            cardFormat = response['data']['cardOutFormat'].zfill(2)

        responseHex = requestBody['mac'] + '07' + key + time.strftime(
            "%y%m%d%H%M%S") + cardFormat

        data = CommonUtils.xorOperation(bytes.fromhex(responseHex))

        logger.debug('状态响应包:hex=%s' % (CommonUtils.bytesToHex(data)))

        UdpClient.sendUdpData(data, client)
Example #7
0
    def setCards(self,requestBody):
        '''
        电梯下发/删除卡号
        :param requestBody:
        :return:
        '''
        serial = requestBody['serial']
        ip = requestBody['ip']
        port = int(requestBody['port'])
        cards = requestBody['cards']
        if cards:
            for card in cards:
                num = card['num'].zfill(10)
                operation = card['operation']
                floors = card.get('floors',[])

                message = serial

                if operation == "create":
                    # 下发卡
                    message += '12' + num + CommonUtils.getFloorHex(floors)
                else:
                    # 删除卡
                    message += '13' + num
                message = CommonUtils.xorOperation(bytes.fromhex(message))
                logger.debug('梯控卡号下发/删除:%s'%(CommonUtils.bytesToHex(message)))
                UdpClient.sendUdpData(message,(ip,port))
Example #8
0
 def uploadElevatorPass(self, data, client):
     '''
     梯控密码记录上传
     :param data:
     :param client:
     :return:
     '''
     requestBody = {
         'mac': CommonUtils.bytesToHex(data[0:6]),
         'pass': CommonUtils.bytesToHex(data[7:12]),
     }
     logger.debug('梯控密码记录上传:%s' % (requestBody))
     response = HttpClient.doPost(Config.elevatorPassRecord, requestBody)
     logger.debug('梯控密码记录上传结果:%s' % (response))
     if response['success']:
         message = requestBody['mac'] + '1A4F4B'
         message = CommonUtils.xorOperation(bytes.fromhex(message))
         logger.debug('梯控密码记录上传响应:%s' % (CommonUtils.bytesToHex(message)))
         UdpClient.sendUdpData(message, client)
Example #9
0
    def tempPassValidate(self, data, client):
        '''
        临时密码校验
        :param data:
        :param client:
        :return:
        '''
        requestBody = {
            'serial': CommonUtils.bytesToHex(data[0:6]),
            'pass': CommonUtils.bytesToHex(data[7:9]),
        }

        logger.debug('临时密码校验:%s', requestBody)

        #response = HttpClient.doGet(Config.doorTempPassValidate + '?mac=' + requestBody['serial'] + '&code=' + requestBody['pass'])
        with request.urlopen(Config.doorTempPassValidate + '?mac=' +
                             requestBody['serial'] + '&code=' +
                             requestBody['pass']) as response:
            '''
            响应非标准JSON
            '''
            response = str(response.read(), 'UTF_8')

            logger.debug('临时密码校验结果:%s' % (response))

            data = requestBody['serial'] + '05'

            if response:
                data += '4F4B'
                # 服务端有响应任何数据,则校验成功,进行密码记录开门上传
                response = HttpClient.doGet(Config.doorRecord +
                                            '?type=2&mac=' +
                                            requestBody['serial'] +
                                            '&cardNum=' + requestBody['pass'])
                logger.debug('密码开门记录上传结果:%s' % (response))
            else:
                data += '4445'

            data = CommonUtils.xorOperation(bytes.fromhex(data))

            logger.debug('临时密码校验响应:hex=%s' % (CommonUtils.bytesToHex(data)))

            UdpClient.sendUdpData(data, client)
Example #10
0
    def timeAsync(self,requestBody):
        '''
        主动时间同步
        :param requestBody:
        :return:
        '''
        serial = requestBody['serial']
        ip = requestBody['ip']
        port = int(requestBody['port'])

        message = serial + '14' + time.strftime("%y%m%d%H%M%S")
        message = CommonUtils.xorOperation(bytes.fromhex(message))
        logger.debug('梯控时间同步:%s'%(CommonUtils.bytesToHex(message)))
        UdpClient.sendUdpData(message, (ip, port))
Example #11
0
 def setElevatorKey(self,requestBody):
     '''
     下发密钥            密钥在心跳数据里面已经包含,该接口不做实现
     :param requestBody:
     :return:
     '''
     serial = requestBody['serial']
     ip = requestBody['ip']
     port = int(requestBody['port'])
     key = requestBody['key']
     message = serial + '16' + key
     message = CommonUtils.xorOperation(bytes.fromhex(message))
     logger.debug('设置梯控密钥:%s'%(CommonUtils.bytesToHex(message)))
     UdpClient.sendUdpData(message,(ip,port))
Example #12
0
 def setElevatorCardFormat(self,requestBody):
     '''
     下发卡号输出格式        在心跳里面包含有,该接口不做实现
     :param requestBody:
     :return:
     '''
     serial = requestBody['serial']
     ip = requestBody['ip']
     port = int(requestBody['port'])
     cardFormat = requestBody['cardFormat']
     message = serial + '18' + cardFormat
     message = CommonUtils.xorOperation(bytes.fromhex(message))
     logger.debug('设置梯控卡号输出格式:%s' % (CommonUtils.bytesToHex(message)))
     UdpClient.sendUdpData(message, (ip, port))
Example #13
0
    def setElevatorPass(self,requestBody):
        '''
        设置电梯固定密码
        :param requestBody:
        :return:
        '''
        serial = requestBody['serial']
        ip = requestBody['ip']
        port = int(requestBody['port'])
        _pass = requestBody['pass']

        message = serial + '1B' + _pass
        message = CommonUtils.xorOperation(bytes.fromhex(message))
        logger.debug('设置电梯固定密码:%s'%(CommonUtils.bytesToHex(message)))
        UdpClient.sendUdpData(message,(ip,port))
Example #14
0
    def elevatorControll(self,requestBody):
        '''
        电梯控制
        :return:
        '''
        serial = requestBody['serial']
        ip = requestBody['ip']
        port = int(requestBody['port'])
        floors = requestBody['floors']

        message = serial + '10' + CommonUtils.getFloorHex(floors)
        message = CommonUtils.xorOperation(bytes.fromhex(message))

        logger.debug('执行电梯控制:%s'%(CommonUtils.bytesToHex(message)))
        UdpClient.sendUdpData(message,(ip,port))
Example #15
0
 def delay(self,requestBody):
     '''
     设置开门延迟
     :param requestBody:
     :return:
     '''
     logger.debug('设置开门延迟:%s'%(requestBody))
     ip = requestBody['ip']
     port = int(requestBody['port'])
     serial = requestBody['serial']
     delay = requestBody['delay'].zfill(2)
     message = serial + '09' + delay
     message = CommonUtils.xorOperation(bytes.fromhex(message))
     logger.debug('延迟设置指令:%s'%(CommonUtils.bytesToHex(message)))
     UdpClient.sendUdpData(message,(ip,port))
     return responseBody['success']
Example #16
0
    def doorSetting(self,requestBody):
        '''
        执行udp门禁远程设置
        :param requestBody:
        :return:
        '''
        logger.debug('执行远程设置:%s' % (requestBody))

        ip = requestBody['ip']                  # 目标IP
        port = int(requestBody['port'])         # 目标端口
        operation = int(requestBody['type'])    # 操作类型
        header = requestBody['header'].zfill(2) # 机号
        param = requestBody['param'].zfill(2)   # 设置参数
        do = requestBody['do'].zfill(2)         # 继电器动作(operation)

        message = None

        if operation == 1:  # 设备初始化             03{0}0A
            template = '03{0}0A'
            message = template.format(header)
        elif operation == 2:  # 设置机号            05FF71{0}{1}
            template = '05FF71{0}{1}'
            message = template.format(param, CommonUtils.getHexComplement(param))
        elif operation == 3:  # 设置开门延迟        05{0}0E{1}{2}
            template = '05{0}0E{1}{2}'
            message = template.format(header, param, do)
        elif operation == 4:  # 设置扇区读写指令    09{0}11{1}
            template = '09{0}11{1}'
            message = template.format(header, param)
        elif operation == 5:  # 设置扇区区号        05{0}05{1}{2}
            template = ' 05{0}05{1}{2}'
            message = template.format(header, param, CommonUtils.getHexComplement(param))

        if not message:
            return

        message = message.upper()

        logger.debug("指令渲染结果:%s" % (message))

        message = CommonUtils.xorOperation(bytes.fromhex(message))

        logger.debug("指令运算结果:%s" % (CommonUtils.bytesToHex(message)))

        UdpClient.sendUdpData(message,(ip, port))
        return responseBody['success']
Example #17
0
 def heartbeat(self, data, client):
     '''
     普通心跳
     :param data:
     :param client:
     :return:
     '''
     requestBody = {
         'sourceIp': client[0],  # 门禁ip
         'sourcePort': client[1],  # 门禁端口
         'mac': CommonUtils.bytesToHex(data),  # 序列号
         'targetIp': Config.udpServerIp,  # 目标服务器ip(当前服务器ip)
         'targetPort': Config.udpServerPort,  # 目标服务器端口
         'date': CommonUtils.now(),  # 心跳时间
     }
     logger.debug('心跳注册:%s' % (requestBody))
     HttpClient.doPost(Config.doorHeartbeat, requestBody)
Example #18
0
    def setElevatorConfig(self,requestBody):
        '''
        设置电梯参数格式
        :param requestBody:
        :return:
        '''
        serial = requestBody['serial']
        ip = requestBody['ip']
        port = int(requestBody['port'])

        delay = requestBody['delay'] .zfill(2)       # 开门延迟
        switch = requestBody['switch'].zfill(2)      # 行程开关号

        message = serial + '19' + delay + switch
        message = CommonUtils.xorOperation(bytes.fromhex(message))
        logger.debug('设置电梯参数格式:%s'%(CommonUtils.bytesToHex(message)))
        UdpClient.sendUdpData(message, (ip, port))
Example #19
0
    def setPass(self,requestBody):
        '''
        设置固定密码
        :param requestBody:
        :return:
        '''
        logger.debug('设置固定密码:%s'%(requestBody))

        ip = requestBody['ip']
        port = int(requestBody['port'])
        serial = requestBody['serial']
        pass_ = requestBody['pass']

        message = serial + '0B' + pass_
        message = CommonUtils.xorOperation(bytes.fromhex(message))

        logger.debug('固定密码设置指令:%s' % (CommonUtils.bytesToHex(message)))
        UdpClient.sendUdpData(message, (ip, port))
        return responseBody['success']
Example #20
0
    def setServerInfo(self,requestBody):
        '''
        设置设备的目标服务器ip和端口
        :param requestBody:
        :return:
        '''
        logger.debug('设置服务器信息:%s'%(requestBody))

        ip = requestBody['ip']
        port = int(requestBody['port'])
        serverIp = requestBody['serverInfo']['ip']
        # 端口按照协议来说,最大长度为4,也就是说端口号只能是 0 - 9999
        serverPort = requestBody['serverInfo']['port']
        # 去除'.',ip每一段必须是3位长度,不足补0
        serverIp = ''.join(list(map(lambda x: x.strip().zfill(3), serverIp.split('.'))))
        message = requestBody['mac'] + '0D' + serverIp + serverPort.zfill(4)
        message = CommonUtils.xorOperation(bytes.fromhex(message))
        logger.debug('执行服务器信息设置:%s'%(CommonUtils.bytesToHex(message)))
        UdpClient.sendUdpData(message, (ip, port))
Example #21
0
    def restart(self,requestBody):
        '''
        门禁重启
        :param requestBody:
        :return:
        '''
        logger.debug('重启门禁:%s'%(requestBody))
        for door in requestBody:
            serial = door['serial']
            ip = door['ip']
            port = int(door['port'])

            reverseSerial = list(serial)
            reverseSerial.reverse()

            message = CommonUtils.xorOperation(bytes.fromhex(serial + '0C' + ''.join(reverseSerial)))

            logger.debug('重启指令:%s'%(CommonUtils.bytesToHex(message)))
            UdpClient.sendUdpData(message,(ip,port))
        return responseBody['success']
Example #22
0
    def handle(self):
        try:
            data = self.request[0]

            client = self.client_address

            if len(data) == 6:
                # 旧版本门禁心跳
                self.heartbeat(data, client)
            elif len(data) > 6:

                operation = data[6]

                # 忽略最后位校验字节
                data = data[0:-1]

                ##############      门禁指令开始    ###############

                if operation == 0x01:
                    self.uploadRecord(data, client)
                elif operation == 0x04:
                    # 时间同步(心跳包里有,忽略)
                    pass
                elif operation == 0x05:
                    self.tempPassValidate(data, client)
                elif operation == 0x06:
                    pass
                elif operation == 0x07:
                    self.heartbeatWithStatus(data, client)
                elif operation == 0x08:
                    pass
                elif operation == 0x09:
                    logger.debug('开门延迟设置结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x0A:
                    self.uploadPassRecord(data, client)
                elif operation == 0x0B:
                    logger.debug('固定密码设置结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x0C:
                    logger.debug('门禁重启结果:%s' % (CommonUtils.bytesToHex(data)))

                ##############      梯控指令开始    ###############

                elif operation == 0x17:
                    self.elevatorHeartBeat(data, client)
                elif operation == 0x10:
                    logger.debug('梯控远程控制结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x11:
                    self.elevatorCardUpload(data, client)
                elif operation == 0x12:
                    logger.debug('梯控下发电梯卡号结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x13:
                    logger.debug('梯控删除电梯卡号结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x14:
                    logger.debug('梯控同步时间设置结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x15:
                    self.elevatorTempPassValidate(data, client)
                elif operation == 0x16:
                    logger.debug('梯控密钥下发结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x18:
                    logger.debug('梯控读卡器卡号格式下发结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x19:
                    logger.debug('梯控参数设置结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x1A:
                    self.uploadElevatorPass(data, client)
                elif operation == 0x1B:
                    logger.debug('梯控固定密码设置结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                elif operation == 0x0D:
                    logger.debug('设置服务器信息结果:%s' %
                                 (CommonUtils.bytesToHex(data)))
                else:
                    logger.error('未识别指令:data=%s,client=%s' %
                                 (CommonUtils.bytesToHex(data), client))
            else:
                logger.error('非法数据:data=%s,client=%s' %
                             (CommonUtils.bytesToHex(data), client))
        except Exception as exception:
            logger.error('异常:%s' % (exception))