# -*- 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()