duibijiOld.py 5.9 KB

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