# -*- coding: utf-8 -*- # !/usr/bin/env python import random import time from apps.web.constant import DeviceCmdCode from apps.web.core.adapter.base import SmartBox, fill_2_hexByte from apps.web.core.exceptions import ServiceException from apps.web.core.networking import MessageSender from apps.web.user.models import DuibijiOrderMap, ConsumeRecord class DuibijiBox(SmartBox): def __init__(self, device): super(DuibijiBox, self).__init__(device) # 只需要处理抓到娃娃以及NG的消息。 def analyze_event_data(self, data): if not data.has_key('data'): return None data = data['data'] funCode = data[6:8] if funCode == 'D1': # 出币的结果上报 subFunCode = data[8:10] devOrderId = int(data[10:22],16) money = int(data[22:26],16)/100 result = data[26:28] return {'funCode':funCode,'subFunCode':subFunCode,'devOrderId':devOrderId,'money':money,'result':result} elif funCode == '13':# 账目增量上传 sid = int(data[8:10],16) faultCode = data[10:12] coinCount = int(data[12:14],16) itemCount = int(data[14:16],16) payCount = int(data[16:18],16) return {'funCode':funCode,'sid':sid,'faultCode':faultCode,'coinCount':coinCount,'itemCount':itemCount,'payCount':payCount} elif funCode == '10': return {'funCode':funCode} elif funCode == '14': return {'funCode':funCode,'coinCount':int(data[16:18],16),'money':int(data[12:14],16)} return None def check_result(self,devInfo): if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException( {'result': 2, 'description': u'兑币机正在玩命找网络,请您稍候再试'}) elif devInfo['rst'] == 1: raise ServiceException( {'result': 2, 'description': u'兑币机忙,无响应,请您稍候再试'}) def check_dev_status(self, attachParas = None): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'D1','data':'01000000000000'}) self.check_result(devInfo) if devInfo['data'][22:24] != '01': raise ServiceException({'result': 0, 'description': u'设备当前不处于待支付状态,请您稍后再用' }) def test(self, coins): # 注意订单唯一编号全为0,表示测试命令 devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'D1','data':'02000000000000000A0001'}) self.check_result(devInfo) result = devInfo['data'][26:28] if result != '00' or result != '02': raise ServiceException({'result': 0, 'description': u'设备启动失败,请确认原因' }) def start_device(self, package, openId, attachParas): money = int(package['coins']) outCoins = int(package['time']) devOrderId = time.time() * 10000 + random.randint(1, 9) data = '02' + fill_2_hexByte(hex(devOrderId), 12) + fill_2_hexByte(hex(money), 4) + fill_2_hexByte(hex(outCoins), 4) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'D1','data':data}) self.check_result(devInfo) result = devInfo['data'][26:28] if result != '00' or result != '02': raise ServiceException({'result': 0, 'description': u'设备启动失败,请确认原因' }) # 订单关联信息,存入数据库 consumeRcdId = attachParas.get('orderNo') if 'linkedRechargeRecordId' not in attachParas: consumeRcd = ConsumeRecord.objects.get(orderNo = consumeRcdId) # type: ConsumeRecord rechargeRcdId = consumeRcd.recharge_record_id else: rechargeRcdId = attachParas.get('linkedRechargeRecordId') newObj = DuibijiOrderMap(devOrderId = devOrderId, consumeRcdId = consumeRcdId, rechargeRcdId = rechargeRcdId, openId = openId) newObj.save() return devInfo def get_package_from_device(self): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'05','data':''}) self.check_result(devInfo) data = devInfo['data'][8:20] return { 'price1':int(data[0:2],16), 'price5':int(data[2:4],16), 'price10':int(data[4:6],16), 'price20':int(data[6:8],16), 'price50':int(data[8:10],16), 'price100':int(data[10:12],16), } def set_device_package(self,conf): data = fill_2_hexByte(hex(int(conf['price1'])), 2) data += fill_2_hexByte(hex(int(conf['price5'])), 2) data += fill_2_hexByte(hex(int(conf['price10'])), 2) data += fill_2_hexByte(hex(int(conf['price20'])), 2) data += fill_2_hexByte(hex(int(conf['price50'])), 2) data += fill_2_hexByte(hex(int(conf['price100'])), 2) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'15','data':data}) self.check_result(devInfo) if devInfo['data'][8:10] == '00': raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' }) def ack_duibi_event(self,devOrderId): data = '03' + fill_2_hexByte(hex(devOrderId), 12) + '00' MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'D1','data':data}) def get_dev_setting(self): return self.get_package_from_device() def set_device_function_param(self, request,setConf): if setConf.has_key('price1'): self.set_device_package(request.POST)