wawaji_huaying.py 15 KB

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