123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- # 支持比较通用类型的娃娃机协议
- import random
- 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
- class WawajiSerialBox(SmartBox):
- def __init__(self, device):
- super(WawajiSerialBox, self).__init__(device)
- # 只需要处理抓到娃娃以及NG的消息。
- def analyze_event_data(self, data):
- funCode = data[6:8]
- if funCode == '13':
- randomCode = data[8:10]
- faultCode = data[10:12]
- coinCount = int(data[12:14],16)
- itemCount = int(data[14:16],16)
- money = int(data[16:18],16)
- return {'funCode':'13','randomCode':randomCode,'faultCode':faultCode,
- 'coinCount':coinCount,
- 'itemCount':itemCount,
- 'money':money
- }
- 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_result_by_version(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,表示测试命令
- data = fill_2_hexByte(hex(random.randint(0,255)), 2)
- data += '0101'
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'03','data':data})
- self.check_result(devInfo)
- result = devInfo['data'][8:10]
- if result != '01':
- raise ServiceException({'result': 0, 'description': u'设备启动失败,请您重试操作吧' })
-
- def start_device(self, package, openId, attachParas):
- money = int(package['coins'])
- data = fill_2_hexByte(hex(random.randint(0,255)), 2)
- data += fill_2_hexByte(hex(money), 2)
- data += fill_2_hexByte(hex(money), 2)
-
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'03','data':data})
-
- self.check_result(devInfo)
- result = devInfo['data'][8:10]
- if result != '01':
- raise ServiceException({'result': 0, 'description': u'设备启动失败,请您重试操作吧' })
-
- return devInfo
- def get_terminal_account(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'04','data':''})
-
- self.check_result(devInfo)
-
- data = devInfo['data'][8:-4]
- return {
- 'faultCode':int(data[0:2],16),
- 'allAccount':int(data[2:6],16),
- 'allItemCount':int(data[6:10],16),
- 'allMoney':int(data[10:14],16),
- 'allCoinCount':int(data[14:18],16),
- }
-
- def get_paras_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:-4]
- result = {
- 'youximoshi':int(data[0:2],16),
- 'zhongjianggailv':int(data[2:6],16),
- 'qianglidianya':int(data[6:10],16),
- 'ruolidianya':int(data[10:14],16),
- 'qiangzhuanruoshijian':int(data[14:18],16),
- 'daodingzhuanruozhuali ':int(data[18:20],16),
- 'jibiyiwan':int(data[20:22],16),
- 'youxishijian':int(data[22:24],16),
- 'beijinyinyue':int(data[24:26],16),
- 'zhuabudaobubi':int(data[26:28],16),
- 'anjianzhuawu':int(data[28:30],16),
- 'liantouzengbi ':int(data[30:32],16),
- 'youxizhidongjieshu':int(data[32:34],16),
- }
- if len(data)>34:
- result.update({'qianhousudu':int(data[34:36],16),
- 'zuoyoushudu':int(data[36:38],16),
- 'shangxiashudu':int(data[38:40],16),
- 'fangxianchangdu':int(data[40:42],16)})
-
- return result
-
- def set_device_paras(self,conf):
- data = fill_2_hexByte(hex(int(conf['youximoshi'])), 2)
- data += fill_2_hexByte(hex(int(conf['zhongjianggailv'])), 4)
- data += fill_2_hexByte(hex(int(conf['qianglidianya'])), 4)
- data += fill_2_hexByte(hex(int(conf['ruolidianya'])), 4)
- data += fill_2_hexByte(hex(int(conf['qiangzhuanruoshijian'])), 4)
- data += fill_2_hexByte(hex(int(conf['daodingzhuanruozhuali'])), 2)
- data += fill_2_hexByte(hex(int(conf['jibiyiwan'])), 2)
- data += fill_2_hexByte(hex(int(conf['youxishijian'])), 2)
- data += fill_2_hexByte(hex(int(conf['beijinyinyue'])), 2)
- data += fill_2_hexByte(hex(int(conf['zhuabudaobubi'])), 2)
- data += fill_2_hexByte(hex(int(conf['anjianzhuawu'])), 2)
- data += fill_2_hexByte(hex(int(conf['liantouzengbi'])), 2)
- data += fill_2_hexByte(hex(int(conf['youxizhidongjieshu'])), 2)
-
- if conf.has_key('qianhousudu'):
- data += fill_2_hexByte(hex(int(conf['qianhousudu'])), 2)
- data += fill_2_hexByte(hex(int(conf['zuoyoushudu'])), 2)
- data += fill_2_hexByte(hex(int(conf['shangxiashudu'])), 2)
- data += fill_2_hexByte(hex(int(conf['fangxianchangdu'])), 2)
-
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'06','data':data})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def clear_pannel_account(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'07','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def clear_back_account(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'08','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def recover_factory_setting(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'0B','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def clear_local_account(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'0C','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def clear_prize(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'1C','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def clear_this_account(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'1E','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def reboot_device(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'1F','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def stop_service(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'31','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def start_service(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'32','data':''})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
- def set_local_account(self,conf):
- data = fill_2_hexByte(hex(int(conf['offlineCoins'])), 4)
- data += fill_2_hexByte(hex(int(conf['itemCount'])), 4)
- data = fill_2_hexByte(hex(int(conf['onlineCoins'])), 4)
- data = fill_2_hexByte(hex(int(conf['daibiCount'])), 4)
-
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
- {'cmd': DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, 'IMEI': self._device['devNo'],'funCode':'1D','data':data})
-
- self.check_result(devInfo)
-
- if devInfo['data'][8:10] == '00':
- raise ServiceException({'result': 0, 'description': u'设备参数配置失败,请重试,或者联系客服' })
-
-
- def translate_fault_desc(self,faultCode):
- faultDict = {
- '01':u'错误:概率队列溢出错误。原因:光眼板感应故障。解决:维修光眼板,清零概率队列',
- '02':u'错误:存储器故障。解决:更换主板存储器或者直接换主板',
- '41':u'错误:投币器1故障。原因:投币器坏了或者投币器拨到了NC电平。解决:更换投币器。投币器拨到NO',
- '42':u'错误:投币器2故障。原因:投币器坏了或者投币器拨到了NC电平。解决:更换投币器。投币器拨到NO',
- '05':u'错误:光眼板故障。原因:光眼板坏或者接线断或者系统设置电平与光眼板电平不匹配。解决:更换光眼板,接好线,设置系统里面的感应板电平',
- '06':u'错误:天车回到礼品口故障。原因:礼品口处的微动故障。解决:维修或更换微动',
- '07':u'错误:天车回到起始位置故障。原因:起始位置处的微动故障。解决:维修或更换微动',
- '81':u'关机天车自检时,前微动故障',
- '82':u'关机天车自检时,后微动故障',
- '83':u'关机天车自检时,上微动故障',
- '84':u'关机天车自检时,下微动故障',
- '85':u'关机天车自检时,左微动故障',
- '86':u'关机天车自检时,右微动故障',
- }
- return faultDict.get(faultCode,'')
-
- def get_device_function_by_key(self,key):
- result = {}
- if 'status' in key or 'account' in key:
- # return {'status':u'阿迪发顺丰是','account':u'sddfeaweffs'}
- data = self.get_terminal_account()
-
- if data['faultCode'] != '00':
- faultDesc = self.translate_fault_desc(data['faultCode'])
- result.update({'status':faultDesc})
- else:
- result.update({'status':''})
-
- accountInfo = u'本地营收总账:%s,退礼总账:%s,线上投币数:%s' % (data['allAccount'],data['allItemCount'],data['allCoinCount'])
- result.update({'account':accountInfo})
-
- return result
- if 'zhongjianggailv' in key:
- data = self.get_paras_from_device()
- result.update(data)
- return result
-
- return None
-
- def set_device_function(self,request,conf):
- if request.POST.has_key('recover'):
- self.recover_factory_setting()
- elif request.POST.has_key('reboot'):
- self.reboot_device()
|