# -*- coding: utf-8 -*- # !/usr/bin/env python import random 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.device.models import Device from apps.web.dealer.utils import consume_stock class DuibijiBox(SmartBox): def __init__(self, device): super(DuibijiBox, self).__init__(device) def check_dev_status(self, attachParas=None): devInfo = MessageSender.send(device = self._device, cmd = DeviceCmdCode.GET_DEVINFO, payload = {'IMEI': self._device['devNo']}) if devInfo.has_key('rst') and devInfo['rst'] != 0: raise ServiceException({'result': 2, 'description': u'兑币机离线,请联系设备老板,或者换一台设备试试'}) # 只需要处理抓到娃娃以及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 test(self, coins): # 注意订单唯一编号全为0,表示测试命令 devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'03','data':'0101000100'}) 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): coins = int(package['coins']) tempData = fill_2_hexByte(hex(coins), 4) tempData1 = tempData[2:4] + tempData[0:2] data = fill_2_hexByte(hex(random.randint(0, 255)), 2) + tempData1 + tempData1 devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'03','data':data}) self.check_result(devInfo) result = devInfo['data'][8:10] if result != '01': raise ServiceException({'result': 0, 'description': u'设备启动失败,请确认原因' }) devObj = Device.objects.get(devNo = self._device['devNo']) consume_stock(devObj, coins, u'在线支付') 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)