# -*- coding: utf-8 -*- from apps.web.core.adapter.base import * from apps.web.device.models import Cell class CellBox(SmartBox): def __init__(self, device): super(CellBox, self).__init__(device) def start(self, packageId, openId = None, attachParas = {}): package = { 'cellId': packageId } return self.start_device(package, openId, attachParas) def start_device(self, package, openId, attachParas): cell = Cell.objects.get(id = package['cellId']) hexBoardNo = fill_2_hexByte(hex(cell.boardNo), 2) hexLockNo = fill_2_hexByte(hex(cell.lockNo), 2) devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.OPERATE_DEV_SYNC, payload = { 'IMEI': self._device['devNo'], "funCode": '8A', 'data': '8A' + hexBoardNo + hexLockNo + '11'}, timeout = MQTT_TIMEOUT.START_DEVICE) 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'格子柜正在忙,无响应,您的金币还在,请试试其他线路,或者请稍后再试哦'}) data = devInfo['data'] if data[6:8] == '00':#表示成功 pass else: raise ServiceException({'result': 2, 'description': u'格子柜打开异常失败,您试试其他格子里的商品吧,或者找下老板吧'}) return devInfo #注意格子锁的状态,只用读取全部的这个命令,单个锁的不要用了。 def get_board_lock_status(self,boardNo): hexBoardNo = fill_2_hexByte(hex(int(boardNo)), 2) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '80', 'data': '80' + hexBoardNo + '0033'}) 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'格子柜正在忙,无响应,您的金币还在,请试试其他线路,或者请稍后再试哦'}) #1:表示开。0:表示关。 lockData = hexbyte_2_bin(devInfo['data'][4:6]) + hexbyte_2_bin(devInfo['data'][6:8]) + hexbyte_2_bin(devInfo['data'][8:10]) result = {} ii = 1 for data in lockData[::-1]: if data == '0': result[str(ii)] ='open' else: result[str(ii)] = 'close' ii += 1 return result def get_all_lock_status(self): cells = Cell.objects.filter(logicalCode = self._device['logicalCode']) boardList = list(set([cell.boardNo for cell in cells])) devLockDict = {} for boardNo in boardList: lockDict = self.get_board_lock_status(boardNo) devLockDict[str(boardNo)] = lockDict resultDict = {} for cell in cells: resultDict[cell.cellNo] = devLockDict[str(cell.boardNo)][str(cell.lockNo)] return resultDict def open_many_locks(self,boardNo,lockNos): lockNoDict = {'0':8,'1':7,'2':6,'3':5,'4':4,'5':3,'6':2,'7':1,'8':16,'9':15,'10':14,'11':13,'12':12,'13':11,'14':10,'15':9, '16':24,'17':23,'18':22,'19':21,'20':20,'21':19,'22':18,'23':17} binData = "" for ii in range(24): lockNo = lockNoDict.get(str(ii)) if lockNo in lockNos: binData += '1' else: binData += '0' hexData1 = fill_2_hexByte(hex(int(binData[0:8],2)),2) hexData2 = fill_2_hexByte(hex(int(binData[8:16],2)),2) hexData3 = fill_2_hexByte(hex(int(binData[16:24],2)),2) hexBoardNo = fill_2_hexByte(hex(int(boardNo)), 2) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE, {'IMEI': self._device['devNo'], "funCode": '90', 'data': '90' + hexBoardNo + hexData1 + hexData2 + hexData3}) 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'格子柜正在忙,无响应,您的金币还在,请试试其他线路,或者请稍后再试哦'}) return devInfo