cell.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # -*- coding: utf-8 -*-
  2. from apps.web.core.adapter.base import *
  3. from apps.web.device.models import Cell
  4. class CellBox(SmartBox):
  5. def __init__(self, device):
  6. super(CellBox, self).__init__(device)
  7. def start(self, packageId, openId = None, attachParas = {}):
  8. package = {
  9. 'cellId': packageId
  10. }
  11. return self.start_device(package, openId, attachParas)
  12. def start_device(self, package, openId, attachParas):
  13. cell = Cell.objects.get(id = package['cellId'])
  14. hexBoardNo = fill_2_hexByte(hex(cell.boardNo), 2)
  15. hexLockNo = fill_2_hexByte(hex(cell.lockNo), 2)
  16. devInfo = MessageSender.send(device = self.device,
  17. cmd = DeviceCmdCode.OPERATE_DEV_SYNC,
  18. payload = {
  19. 'IMEI': self._device['devNo'],
  20. "funCode": '8A',
  21. 'data': '8A' + hexBoardNo + hexLockNo + '11'},
  22. timeout = MQTT_TIMEOUT.START_DEVICE)
  23. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  24. if devInfo['rst'] == -1:
  25. raise ServiceException({'result': 2, 'description': u'格子柜正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'})
  26. elif devInfo['rst'] == 1:
  27. raise ServiceException({'result': 2, 'description': u'格子柜正在忙,无响应,您的金币还在,请试试其他线路,或者请稍后再试哦'})
  28. data = devInfo['data']
  29. if data[6:8] == '11':#表示成功
  30. pass
  31. else:
  32. raise ServiceException({'result': 2, 'description': u'格子柜打开异常失败,您试试其他格子里的商品吧,或者找下老板吧'})
  33. return devInfo
  34. #注意格子锁的状态,只用读取全部的这个命令,单个锁的不要用了。
  35. def get_board_lock_status(self,boardNo):
  36. hexBoardNo = fill_2_hexByte(hex(int(boardNo)), 2)
  37. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  38. {'IMEI': self._device['devNo'], "funCode": '80',
  39. 'data': '80' + hexBoardNo + '0033'})
  40. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  41. if devInfo['rst'] == -1:
  42. raise ServiceException({'result': 2, 'description': u'格子柜正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'})
  43. elif devInfo['rst'] == 1:
  44. raise ServiceException({'result': 2, 'description': u'格子柜正在忙,无响应,您的金币还在,请试试其他线路,或者请稍后再试哦'})
  45. #1:表示开。0:表示关。
  46. lockData = hexbyte_2_bin(devInfo['data'][4:6]) + hexbyte_2_bin(devInfo['data'][6:8]) + hexbyte_2_bin(devInfo['data'][8:10])
  47. result = {}
  48. ii = 1
  49. for data in lockData[::-1]:
  50. if data == '1':
  51. result[str(ii)] ='open'
  52. else:
  53. result[str(ii)] = 'close'
  54. ii += 1
  55. return result
  56. def get_all_lock_status(self):
  57. cells = Cell.objects.filter(logicalCode = self._device['logicalCode'])
  58. boardList = list(set([cell.boardNo for cell in cells]))
  59. devLockDict = {}
  60. for boardNo in boardList:
  61. lockDict = self.get_board_lock_status(boardNo)
  62. devLockDict[str(boardNo)] = lockDict
  63. resultDict = {}
  64. for cell in cells:
  65. resultDict[cell.cellNo] = devLockDict[str(cell.boardNo)][str(cell.lockNo)]
  66. return resultDict
  67. def open_many_locks(self,boardNo,lockNos):
  68. 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,
  69. '16':24,'17':23,'18':22,'19':21,'20':20,'21':19,'22':18,'23':17}
  70. binData = ""
  71. for ii in range(24):
  72. lockNo = lockNoDict.get(str(ii))
  73. if lockNo in lockNos:
  74. binData += '1'
  75. else:
  76. binData += '0'
  77. hexData1 = fill_2_hexByte(hex(int(binData[0:8],2)),2)
  78. hexData2 = fill_2_hexByte(hex(int(binData[8:16],2)),2)
  79. hexData3 = fill_2_hexByte(hex(int(binData[16:24],2)),2)
  80. hexBoardNo = fill_2_hexByte(hex(int(boardNo)), 2)
  81. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_NO_RESPONSE,
  82. {'IMEI': self._device['devNo'], "funCode": '90',
  83. 'data': '90' + hexBoardNo + hexData1 + hexData2 + hexData3})
  84. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  85. if devInfo['rst'] == -1:
  86. raise ServiceException({'result': 2, 'description': u'格子柜正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'})
  87. elif devInfo['rst'] == 1:
  88. raise ServiceException({'result': 2, 'description': u'格子柜正在忙,无响应,您的金币还在,请试试其他线路,或者请稍后再试哦'})
  89. return devInfo