sodz.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import time
  4. from apps.web.constant import MQTT_TIMEOUT, DeviceCmdCode, Const
  5. from apps.web.core.adapter.base import SmartBox, fill_2_hexByte
  6. from apps.web.core.exceptions import ServiceException
  7. from apps.web.core.networking import MessageSender
  8. from apps.web.device.models import Device
  9. class ShengOuBox(SmartBox):
  10. def _send_data(self, funcCode, sendData=None, cmd=None, timeout=MQTT_TIMEOUT.NORMAL,orderNo=None):
  11. """
  12. 发送 报文
  13. :param funcCode: 串口命令
  14. :param sendData: 发送数据
  15. :param cmd: 报文命令
  16. :param timeout: 超时时间
  17. :return:
  18. """
  19. if sendData is None:
  20. sendData = ""
  21. if cmd is None:
  22. cmd = DeviceCmdCode.OPERATE_DEV_SYNC
  23. if timeout is None:
  24. timeout = MQTT_TIMEOUT.NORMAL
  25. result = MessageSender.send(device = self.device, cmd = cmd, payload = {
  26. "IMEI": self._device["devNo"],
  27. "funCode": funcCode,
  28. "data": sendData
  29. }, timeout = timeout)
  30. if "rst" in result:
  31. if result["rst"] == -1:
  32. raise ServiceException({'result': 2, 'description': u'网络不通畅,请稍候再试'})
  33. elif result["rst"] == 1:
  34. raise ServiceException({'result': 2, 'description': u'主板连接故障,请稍后再试'})
  35. elif result["rst"] == 0:
  36. return result
  37. else:
  38. raise ServiceException({'result': 2, 'description': u'系统错误'})
  39. else:
  40. raise ServiceException({'result': 2, 'description': u'系统错误'})
  41. def _trans_time(self, needTime, unit):
  42. """
  43. 根据所给的单位将时间转换成分钟
  44. :param needTime:
  45. :param unit:
  46. :return:
  47. """
  48. if unit == u"小时":
  49. needTime = needTime * 60
  50. elif unit == u"分钟":
  51. needTime = needTime
  52. elif unit == u"秒":
  53. needTime = int(needTime / 60)
  54. else:
  55. needTime = None
  56. return needTime
  57. def _charge(self, chargeIndex, chargeTime=None, chargeFee=None,orderNo=None):
  58. """
  59. 下发支付信息
  60. :param chargeIndex:
  61. :param chargeTime
  62. :param chargeFee
  63. :return:
  64. """
  65. wechatAddr = "{:0>8}".format(self._device["logicalCode"].replace("G", ""))
  66. hostAddr = "{:0>8}".format(0)
  67. portHex = fill_2_hexByte(hex(int(chargeIndex)), 4, reverse=True)
  68. timeHex = fill_2_hexByte(hex(int(chargeTime)), 4, reverse=True)
  69. feeHex = fill_2_hexByte(hex(int(chargeFee)), 4, reverse=True)
  70. sendData = wechatAddr + hostAddr + portHex + feeHex + timeHex
  71. result = self._send_data(funcCode="01", sendData=sendData,orderNo=orderNo, timeout = MQTT_TIMEOUT.START_DEVICE)
  72. data = result.get("data")
  73. if data[24:26] != "01":
  74. raise ServiceException({"result": 2, "description": u"插座启动失败"})
  75. return result
  76. def is_port_can_use(self, port, canAdd=False):
  77. """
  78. 判断端口是否可用
  79. :param port:
  80. :param canAdd:
  81. :return:
  82. """
  83. return True, u""
  84. def start_device(self, package, openId, attachParas):
  85. """
  86. 开启服务
  87. :param package:
  88. :param openId:
  89. :param attachParas:
  90. :return:
  91. """
  92. portStr = attachParas.get("chargeIndex")
  93. orderNo = attachParas.get("orderNo")
  94. coins = package.get("coins")
  95. price = package.get("price")
  96. unit = package.get("unit")
  97. needTime = package.get("time")
  98. if not portStr:
  99. raise ServiceException({"result": 2, "description": u"请选择合适充电线路"})
  100. needTime = self._trans_time(needTime, unit)
  101. result = self._charge(chargeIndex=portStr, chargeTime=needTime, chargeFee=coins,orderNo = orderNo)
  102. finishedTime = int(time.time()) + needTime * 60
  103. result.update({"finishedTime": finishedTime})
  104. dataDict = {
  105. "status": Const.DEV_WORK_STATUS_WORKING,
  106. "finishedTime": finishedTime,
  107. "coins": coins,
  108. "price": price,
  109. "needTime": needTime,
  110. "port": portStr,
  111. "openId": openId,
  112. "vCardId": self._vcard_id,
  113. "isStart": True,
  114. }
  115. Device.update_dev_control_cache(self._device["devNo"], {str(portStr): dataDict})
  116. return result