123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- # -*- 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)
|