duibiji.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import random
  4. import time
  5. from apps.web.constant import DeviceCmdCode
  6. from apps.web.core.adapter.base import SmartBox, fill_2_hexByte
  7. from apps.web.core.exceptions import ServiceException
  8. from apps.web.core.networking import MessageSender
  9. from apps.web.user.models import DuibijiOrderMap, ConsumeRecord
  10. class DuibijiBox(SmartBox):
  11. def __init__(self, device):
  12. super(DuibijiBox, self).__init__(device)
  13. # 只需要处理抓到娃娃以及NG的消息。
  14. def analyze_event_data(self, data):
  15. if not data.has_key('data'):
  16. return None
  17. data = data['data']
  18. funCode = data[6:8]
  19. if funCode == 'D1': # 出币的结果上报
  20. subFunCode = data[8:10]
  21. devOrderId = int(data[10:22],16)
  22. money = int(data[22:26],16)/100
  23. result = data[26:28]
  24. return {'funCode':funCode,'subFunCode':subFunCode,'devOrderId':devOrderId,'money':money,'result':result}
  25. elif funCode == '13':# 账目增量上传
  26. sid = int(data[8:10],16)
  27. faultCode = data[10:12]
  28. coinCount = int(data[12:14],16)
  29. itemCount = int(data[14:16],16)
  30. payCount = int(data[16:18],16)
  31. return {'funCode':funCode,'sid':sid,'faultCode':faultCode,'coinCount':coinCount,'itemCount':itemCount,'payCount':payCount}
  32. elif funCode == '10':
  33. return {'funCode':funCode}
  34. elif funCode == '14':
  35. return {'funCode':funCode,'coinCount':int(data[16:18],16),'money':int(data[12:14],16)}
  36. return None
  37. def check_result(self,devInfo):
  38. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  39. if devInfo['rst'] == -1:
  40. raise ServiceException(
  41. {'result': 2, 'description': u'兑币机正在玩命找网络,请您稍候再试'})
  42. elif devInfo['rst'] == 1:
  43. raise ServiceException(
  44. {'result': 2, 'description': u'兑币机忙,无响应,请您稍候再试'})
  45. def check_dev_status(self, attachParas = None):
  46. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  47. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'D1','data':'01000000000000'})
  48. self.check_result(devInfo)
  49. if devInfo['data'][22:24] != '01':
  50. raise ServiceException({'result': 0, 'description': u'设备当前不处于待支付状态,请您稍后再用' })
  51. def test(self, coins):
  52. # 注意订单唯一编号全为0,表示测试命令
  53. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  54. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'D1','data':'02000000000000000A0001'})
  55. self.check_result(devInfo)
  56. result = devInfo['data'][26:28]
  57. if result != '00' or result != '02':
  58. raise ServiceException({'result': 0, 'description': u'设备启动失败,请确认原因' })
  59. def start_device(self, package, openId, attachParas):
  60. money = int(package['coins'])
  61. outCoins = int(package['time'])
  62. devOrderId = time.time() * 10000 + random.randint(1, 9)
  63. data = '02' + fill_2_hexByte(hex(devOrderId), 12) + fill_2_hexByte(hex(money), 4) + fill_2_hexByte(hex(outCoins), 4)
  64. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  65. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'D1','data':data})
  66. self.check_result(devInfo)
  67. result = devInfo['data'][26:28]
  68. if result != '00' or result != '02':
  69. raise ServiceException({'result': 0, 'description': u'设备启动失败,请确认原因' })
  70. # 订单关联信息,存入数据库
  71. consumeRcdId = attachParas.get('orderNo')
  72. if 'linkedRechargeRecordId' not in attachParas:
  73. consumeRcd = ConsumeRecord.objects.get(orderNo = consumeRcdId) # type: ConsumeRecord
  74. rechargeRcdId = consumeRcd.recharge_record_id
  75. else:
  76. rechargeRcdId = attachParas.get('linkedRechargeRecordId')
  77. newObj = DuibijiOrderMap(devOrderId = devOrderId, consumeRcdId = consumeRcdId, rechargeRcdId = rechargeRcdId,
  78. openId = openId)
  79. newObj.save()
  80. return devInfo
  81. def get_package_from_device(self):
  82. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  83. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'05','data':''})
  84. self.check_result(devInfo)
  85. data = devInfo['data'][8:20]
  86. return {
  87. 'price1':int(data[0:2],16),
  88. 'price5':int(data[2:4],16),
  89. 'price10':int(data[4:6],16),
  90. 'price20':int(data[6:8],16),
  91. 'price50':int(data[8:10],16),
  92. 'price100':int(data[10:12],16),
  93. }
  94. def set_device_package(self,conf):
  95. data = fill_2_hexByte(hex(int(conf['price1'])), 2)
  96. data += fill_2_hexByte(hex(int(conf['price5'])), 2)
  97. data += fill_2_hexByte(hex(int(conf['price10'])), 2)
  98. data += fill_2_hexByte(hex(int(conf['price20'])), 2)
  99. data += fill_2_hexByte(hex(int(conf['price50'])), 2)
  100. data += fill_2_hexByte(hex(int(conf['price100'])), 2)
  101. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  102. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'15','data':data})
  103. self.check_result(devInfo)
  104. if devInfo['data'][8:10] == '00':
  105. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  106. def ack_duibi_event(self,devOrderId):
  107. data = '03' + fill_2_hexByte(hex(devOrderId), 12) + '00'
  108. MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  109. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'D1','data':data})
  110. def get_dev_setting(self):
  111. return self.get_package_from_device()
  112. def set_device_function_param(self, request,setConf):
  113. if setConf.has_key('price1'):
  114. self.set_device_package(request.POST)