wawaji_3706.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. # 支持比较通用类型的娃娃机协议
  4. import random
  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. class WawajiSerialBox(SmartBox):
  10. def __init__(self, device):
  11. super(WawajiSerialBox, self).__init__(device)
  12. # 只需要处理抓到娃娃以及NG的消息。
  13. def analyze_event_data(self, data):
  14. funCode = data[6:8]
  15. if funCode == '13':
  16. randomCode = data[8:10]
  17. faultCode = data[10:12]
  18. coinCount = int(data[12:14],16)
  19. itemCount = int(data[14:16],16)
  20. money = int(data[16:18],16)
  21. return {'funCode':'13','randomCode':randomCode,'faultCode':faultCode,
  22. 'coinCount':coinCount,
  23. 'itemCount':itemCount,
  24. 'money':money
  25. }
  26. return None
  27. def check_result(self,devInfo):
  28. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  29. if devInfo['rst'] == -1:
  30. raise ServiceException(
  31. {'result': 2, 'description': u'娃娃机正在玩命找网络,请您稍候再试'})
  32. elif devInfo['rst'] == 1:
  33. raise ServiceException(
  34. {'result': 2, 'description': u'娃娃机忙,无响应,请您稍候再试'})
  35. def check_result_by_version(self,devInfo):
  36. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  37. if devInfo['rst'] == -1:
  38. raise ServiceException(
  39. {'result': 2, 'description': u'娃娃机正在玩命找网络,请您稍候再试'})
  40. elif devInfo['rst'] == 1:
  41. raise ServiceException(
  42. {'result': 2, 'description': u'哦豁,该版本的娃娃机不支持此特性,请您试试其他功能吧'})
  43. def check_dev_status(self, attachParas = None):
  44. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  45. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'D1','data':'01000000000000'})
  46. self.check_result(devInfo)
  47. if devInfo['data'][22:24] != '01':
  48. raise ServiceException({'result': 0, 'description': u'设备当前不处于待支付状态,请您稍后再用' })
  49. def test(self, coins):
  50. # 注意订单唯一编号全为0,表示测试命令
  51. data = fill_2_hexByte(hex(random.randint(0,255)), 2)
  52. data += '0101'
  53. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  54. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'03','data':data})
  55. self.check_result(devInfo)
  56. result = devInfo['data'][8:10]
  57. if result != '01':
  58. raise ServiceException({'result': 0, 'description': u'设备启动失败,请您重试操作吧' })
  59. def start_device(self, package, openId, attachParas):
  60. money = int(package['coins'])
  61. data = fill_2_hexByte(hex(random.randint(0,255)), 2)
  62. data += fill_2_hexByte(hex(money), 2)
  63. data += fill_2_hexByte(hex(money), 2)
  64. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  65. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'03','data':data})
  66. self.check_result(devInfo)
  67. result = devInfo['data'][8:10]
  68. if result != '01':
  69. raise ServiceException({'result': 0, 'description': u'设备启动失败,请您重试操作吧' })
  70. return devInfo
  71. def get_terminal_account(self):
  72. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  73. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'04','data':''})
  74. self.check_result(devInfo)
  75. data = devInfo['data'][8:-4]
  76. return {
  77. 'faultCode':int(data[0:2],16),
  78. 'allAccount':int(data[2:6],16),
  79. 'allItemCount':int(data[6:10],16),
  80. 'allMoney':int(data[10:14],16),
  81. 'allCoinCount':int(data[14:18],16),
  82. }
  83. def get_paras_from_device(self):
  84. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  85. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'05','data':''})
  86. self.check_result(devInfo)
  87. data = devInfo['data'][8:-4]
  88. result = {
  89. 'youximoshi':int(data[0:2],16),
  90. 'zhongjianggailv':int(data[2:6],16),
  91. 'qianglidianya':int(data[6:10],16),
  92. 'ruolidianya':int(data[10:14],16),
  93. 'qiangzhuanruoshijian':int(data[14:18],16),
  94. 'daodingzhuanruozhuali ':int(data[18:20],16),
  95. 'jibiyiwan':int(data[20:22],16),
  96. 'youxishijian':int(data[22:24],16),
  97. 'beijinyinyue':int(data[24:26],16),
  98. 'zhuabudaobubi':int(data[26:28],16),
  99. 'anjianzhuawu':int(data[28:30],16),
  100. 'liantouzengbi ':int(data[30:32],16),
  101. 'youxizhidongjieshu':int(data[32:34],16),
  102. }
  103. if len(data)>34:
  104. result.update({'qianhousudu':int(data[34:36],16),
  105. 'zuoyoushudu':int(data[36:38],16),
  106. 'shangxiashudu':int(data[38:40],16),
  107. 'fangxianchangdu':int(data[40:42],16)})
  108. return result
  109. def set_device_paras(self,conf):
  110. data = fill_2_hexByte(hex(int(conf['youximoshi'])), 2)
  111. data += fill_2_hexByte(hex(int(conf['zhongjianggailv'])), 4)
  112. data += fill_2_hexByte(hex(int(conf['qianglidianya'])), 4)
  113. data += fill_2_hexByte(hex(int(conf['ruolidianya'])), 4)
  114. data += fill_2_hexByte(hex(int(conf['qiangzhuanruoshijian'])), 4)
  115. data += fill_2_hexByte(hex(int(conf['daodingzhuanruozhuali'])), 2)
  116. data += fill_2_hexByte(hex(int(conf['jibiyiwan'])), 2)
  117. data += fill_2_hexByte(hex(int(conf['youxishijian'])), 2)
  118. data += fill_2_hexByte(hex(int(conf['beijinyinyue'])), 2)
  119. data += fill_2_hexByte(hex(int(conf['zhuabudaobubi'])), 2)
  120. data += fill_2_hexByte(hex(int(conf['anjianzhuawu'])), 2)
  121. data += fill_2_hexByte(hex(int(conf['liantouzengbi'])), 2)
  122. data += fill_2_hexByte(hex(int(conf['youxizhidongjieshu'])), 2)
  123. if conf.has_key('qianhousudu'):
  124. data += fill_2_hexByte(hex(int(conf['qianhousudu'])), 2)
  125. data += fill_2_hexByte(hex(int(conf['zuoyoushudu'])), 2)
  126. data += fill_2_hexByte(hex(int(conf['shangxiashudu'])), 2)
  127. data += fill_2_hexByte(hex(int(conf['fangxianchangdu'])), 2)
  128. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  129. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'06','data':data})
  130. self.check_result(devInfo)
  131. if devInfo['data'][8:10] == '00':
  132. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  133. def clear_pannel_account(self):
  134. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  135. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'07','data':''})
  136. self.check_result(devInfo)
  137. if devInfo['data'][8:10] == '00':
  138. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  139. def clear_back_account(self):
  140. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  141. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'08','data':''})
  142. self.check_result(devInfo)
  143. if devInfo['data'][8:10] == '00':
  144. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  145. def recover_factory_setting(self):
  146. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  147. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'0B','data':''})
  148. self.check_result(devInfo)
  149. if devInfo['data'][8:10] == '00':
  150. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  151. def clear_local_account(self):
  152. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  153. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'0C','data':''})
  154. self.check_result(devInfo)
  155. if devInfo['data'][8:10] == '00':
  156. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  157. def clear_prize(self):
  158. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  159. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'1C','data':''})
  160. self.check_result(devInfo)
  161. if devInfo['data'][8:10] == '00':
  162. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  163. def clear_this_account(self):
  164. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  165. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'1E','data':''})
  166. self.check_result(devInfo)
  167. if devInfo['data'][8:10] == '00':
  168. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  169. def reboot_device(self):
  170. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  171. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'1F','data':''})
  172. self.check_result(devInfo)
  173. if devInfo['data'][8:10] == '00':
  174. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  175. def stop_service(self):
  176. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  177. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'31','data':''})
  178. self.check_result(devInfo)
  179. if devInfo['data'][8:10] == '00':
  180. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  181. def start_service(self):
  182. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  183. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'32','data':''})
  184. self.check_result(devInfo)
  185. if devInfo['data'][8:10] == '00':
  186. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  187. def set_local_account(self,conf):
  188. data = fill_2_hexByte(hex(int(conf['offlineCoins'])), 4)
  189. data += fill_2_hexByte(hex(int(conf['itemCount'])), 4)
  190. data = fill_2_hexByte(hex(int(conf['onlineCoins'])), 4)
  191. data = fill_2_hexByte(hex(int(conf['daibiCount'])), 4)
  192. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  193. {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'1D','data':data})
  194. self.check_result(devInfo)
  195. if devInfo['data'][8:10] == '00':
  196. raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
  197. def translate_fault_desc(self,faultCode):
  198. faultDict = {
  199. '01':u'错误:概率队列溢出错误。原因:光眼板感应故障。解决:维修光眼板,清零概率队列',
  200. '02':u'错误:存储器故障。解决:更换主板存储器或者直接换主板',
  201. '41':u'错误:投币器1故障。原因:投币器坏了或者投币器拨到了NC电平。解决:更换投币器。投币器拨到NO',
  202. '42':u'错误:投币器2故障。原因:投币器坏了或者投币器拨到了NC电平。解决:更换投币器。投币器拨到NO',
  203. '05':u'错误:光眼板故障。原因:光眼板坏或者接线断或者系统设置电平与光眼板电平不匹配。解决:更换光眼板,接好线,设置系统里面的感应板电平',
  204. '06':u'错误:天车回到礼品口故障。原因:礼品口处的微动故障。解决:维修或更换微动',
  205. '07':u'错误:天车回到起始位置故障。原因:起始位置处的微动故障。解决:维修或更换微动',
  206. '81':u'关机天车自检时,前微动故障',
  207. '82':u'关机天车自检时,后微动故障',
  208. '83':u'关机天车自检时,上微动故障',
  209. '84':u'关机天车自检时,下微动故障',
  210. '85':u'关机天车自检时,左微动故障',
  211. '86':u'关机天车自检时,右微动故障',
  212. }
  213. return faultDict.get(faultCode,'')
  214. def get_device_function_by_key(self,key):
  215. result = {}
  216. if 'status' in key or 'account' in key:
  217. # return {'status':u'阿迪发顺丰是','account':u'sddfeaweffs'}
  218. data = self.get_terminal_account()
  219. if data['faultCode'] != '00':
  220. faultDesc = self.translate_fault_desc(data['faultCode'])
  221. result.update({'status':faultDesc})
  222. else:
  223. result.update({'status':''})
  224. accountInfo = u'本地营收总账:%s,退礼总账:%s,线上投币数:%s' % (data['allAccount'],data['allItemCount'],data['allCoinCount'])
  225. result.update({'account':accountInfo})
  226. return result
  227. if 'zhongjianggailv' in key:
  228. data = self.get_paras_from_device()
  229. result.update(data)
  230. return result
  231. return None
  232. def set_device_function(self,request,conf):
  233. if request.POST.has_key('recover'):
  234. self.recover_factory_setting()
  235. elif request.POST.has_key('reboot'):
  236. self.reboot_device()