weifule_blower.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. import copy
  4. import datetime
  5. import time
  6. from apilib.utils_json import JsonResponse
  7. from apps.web.constant import DeviceCmdCode, Const, MQTT_TIMEOUT
  8. from apps.web.core.adapter.base import SmartBox
  9. from apps.web.core.exceptions import ServiceException
  10. from apps.web.core.networking import MessageSender
  11. from apps.web.device.models import Device
  12. from apps.web.user.models import ConsumeRecord
  13. class BlowerWEIFULEBox(SmartBox):
  14. def __init__(self, device):
  15. super(BlowerWEIFULEBox, self).__init__(device)
  16. def translate_funcode(self, fun_code):
  17. fun_codeDict = {
  18. '02': u'查询业务详细信息',
  19. '04': u'取消订单',
  20. '06': u'远程停止充电',
  21. '07': u'远程启动充电',
  22. }
  23. return fun_codeDict.get(fun_code, '')
  24. def translate_event_cmdcode(self, cmdCode):
  25. cmdDict = {
  26. }
  27. return cmdDict.get(cmdCode, '')
  28. def test(self, coins):
  29. data = {'fun_code':0x07,'order_id':'1111','amount':int(coins*100)}
  30. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  31. {'IMEI': self._device['devNo'], 'data': data})
  32. return devInfo
  33. def check_dev_status(self, attachParas=None):
  34. curOrder = self.get_order()
  35. if curOrder:
  36. raise ServiceException({"result": 2, "description": u"当前设备正在运行,运行完毕,才允许继续投币哦"})
  37. def check_feedback_result(self,devInfo):
  38. if not devInfo.has_key('rst'):
  39. raise ServiceException({'result': 2, 'description': u'报文异常'})
  40. if devInfo['rst'] == -1:
  41. raise ServiceException({'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  42. if devInfo['rst'] == 1:
  43. raise ServiceException({'result': 2, 'description': u'设备被禁用,无法使用'})
  44. if devInfo['rst'] == 2:
  45. raise ServiceException({'result': 2, 'description': u'扫码禁用,无法使用'})
  46. def start_device(self, package, openId, attachParas):
  47. coins = int(float(package['coins'])*100)#单位为分
  48. onPoints = attachParas.get('onPoints')
  49. if onPoints: # 远程上分
  50. order_no = ConsumeRecord.make_no()
  51. else:
  52. order_no = str(attachParas.get("orderNo"))
  53. data = {'fun_code':0x07,'order_id':order_no,'amount':coins}
  54. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  55. {'IMEI': self._device['devNo'], 'data': data}, timeout = MQTT_TIMEOUT.START_DEVICE)
  56. self.check_feedback_result(devInfo)
  57. data = devInfo['data']
  58. finishedTime = int(time.time()) + 24*3600
  59. if devInfo['rst'] == 0: # 成功
  60. devInfo['consumeOrderNo'] = order_no
  61. newValue = {
  62. 'status': Const.DEV_WORK_STATUS_WORKING,
  63. 'startTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  64. 'finishedTime':finishedTime
  65. }
  66. else:#TODO result的枚举列出原因
  67. raise ServiceException({'result': 2, 'description': u'当前设备响应异常,请您稍后再试哦'})
  68. Device.update_dev_control_cache(self._device['devNo'], newValue)
  69. devInfo['consumeOrderNo'] = order_no
  70. devInfo['finished_time'] = finishedTime
  71. return devInfo
  72. def analyze_event_data(self, data):
  73. if data['fun_code'] == 34:#如果是结束事件,需要把reason翻译出来
  74. descDict = {
  75. '0':u'超过时间',
  76. '1':u'使用结束',
  77. '13':u'用户关闭结束',
  78. '14':u'管理员远程结束'
  79. }
  80. order = data['order']
  81. order['reason'] = descDict.get(str(order['cause']),u'')
  82. data['order'] = order
  83. return data
  84. def __translate_status_from_str(self,status):
  85. dictConf = {
  86. 'idle':Const.DEV_WORK_STATUS_IDLE,
  87. 'busy':Const.DEV_WORK_STATUS_WORKING,
  88. 'forbid':Const.DEV_WORK_STATUS_FORBIDDEN,
  89. 'fault':Const.DEV_WORK_STATUS_FAULT,
  90. 'running':Const.DEV_WORK_STATUS_WORKING
  91. }
  92. return dictConf.get(status,Const.DEV_WORK_STATUS_IDLE)
  93. #停止该端口下的所有任务
  94. def stop_charging_port(self, port=None):
  95. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  96. {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x06}})
  97. self.check_feedback_result(devInfo)
  98. if devInfo['rst'] == 0:
  99. Device.update_dev_control_cache(self._device['devNo'], {'status': Const.DEV_WORK_STATUS_IDLE})
  100. return True if devInfo['rst'] == 0 else False
  101. def get_order(self,order_no=None):
  102. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,{'IMEI': self._device['devNo'], 'data': {'fun_code': 0x02, 'exec_orders': True}})
  103. self.check_feedback_result(devInfo)
  104. orders = devInfo['data'].get('exec_orders',None)
  105. if not orders:
  106. return None
  107. curOrder = orders[0]
  108. result = {}
  109. if not curOrder or not curOrder.has_key('order_type'):#有可能没有订单,应该返回空
  110. return result
  111. result['status'] = curOrder['status']
  112. if curOrder['order_type'] == 'apps_start':
  113. result['consumeType'] = 'mobile'
  114. try:
  115. rcd = ConsumeRecord.objects.get(orderNo = curOrder['id'])
  116. if u'虚拟卡' in rcd.remarks:
  117. result['consumeType'] = 'mobile_vcard'
  118. except Exception,e:
  119. pass
  120. elif curOrder['order_type'] == 'coin_start':
  121. result['consumeType'] = 'coin'
  122. elif curOrder['order_type'] == 'card_start':
  123. result['consumeType'] = 'card'
  124. if curOrder.has_key('total_time'):
  125. result['needTime'] = round(curOrder['total_time']/60.0,1)
  126. if curOrder.has_key('time'):
  127. result['duration'] = round(curOrder['time']/60.0,1)
  128. result['usedTime'] = round(curOrder['time']/60.0,1)
  129. if curOrder.has_key('left_time'):
  130. result['leftTime'] = round(curOrder['left_time']/60.0,1)
  131. if curOrder.has_key('exec_time'):
  132. result['startTime'] = datetime.datetime.fromtimestamp(int(curOrder['exec_time'])).strftime('%m-%d %H:%M:%S')
  133. if curOrder.has_key('card_no'):
  134. result['cardNo'] = str(int(curOrder['card_no'],16))
  135. if curOrder.has_key('id') and (curOrder['order_type'] not in ['coin_start','card_charge']) :#card_charge
  136. try:
  137. rcd = ConsumeRecord.objects.get(orderNo = curOrder['id'])
  138. result['openId'] = rcd['openId']
  139. result['coins'] = float(str(rcd['coin']))#都用coins
  140. result['money'] = float(str(rcd['money']))
  141. result['orderNo'] = str(curOrder['id'])
  142. except Exception,e:
  143. pass
  144. return result
  145. def response_card_balance(self, cardNo,balance,result):
  146. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  147. {'IMEI': self._device['devNo'], 'data': {'fun_code':35,'card_no':cardNo,'balance':int(100*float(balance)),'result':result}})
  148. self.check_feedback_result(devInfo)
  149. # 获取设备配置参数
  150. def get_dev_setting(self):
  151. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  152. {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x0C}})
  153. self.check_feedback_result(devInfo)
  154. result = devInfo['data']
  155. result.pop('fun_code')
  156. return result
  157. # 获取设备配置参数
  158. def set_dev_setting(self, setConf):
  159. data = {'fun_code':0x0B}
  160. data.update(setConf)
  161. if not (int(setConf['volume']) >= 0 and int(setConf['volume']) <= 7):
  162. raise ServiceException({'result': 2, 'description': u'音量必须大于等于0,小于等于7'})
  163. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  164. {'IMEI': self._device['devNo'], 'data': data})
  165. self.check_feedback_result(devInfo)
  166. def ack_event(self,orderNo,funCode):
  167. devInfo = MessageSender.send(self.device, DeviceCmdCode.PASSTHROUGH_OPERATE_DEV_NO_RESPONSE,
  168. {'IMEI': self._device['devNo'], 'data': {'fun_code':funCode,'order_id':orderNo}})
  169. self.check_feedback_result(devInfo)
  170. def set_device_function_param(self, request, lastSetConf):
  171. newConf = copy.deepcopy(request.POST)
  172. newConf.pop('logicalCode', None)
  173. self.set_dev_setting(newConf)
  174. def translante_card_no(self,hexCardNo):
  175. return int(hexCardNo,16)
  176. def set_device_function(self, request, lastSetConf):
  177. if request.POST.has_key('stop') and request.POST.get('stop'):
  178. self.stop_charging_port()
  179. lastSetConf.update(request.POST)
  180. lastSetConf.pop('logicalCode', None)
  181. self.set_dev_setting(lastSetConf)
  182. def support_count_down(self,openId=None,port=None):
  183. return True
  184. def count_down(self, request, dev, agent, group, devType, lastOpenId, port = None):
  185. curOrder = self.get_order()
  186. status = 'idle'
  187. if curOrder:
  188. status = 'working'
  189. surplus = curOrder['leftTime']
  190. sumtime = curOrder.get('needTime', surplus)
  191. orderProcessing = False
  192. if surplus == 0.0 and sumtime == 0.0:
  193. orderProcessing = True
  194. return JsonResponse(
  195. {
  196. 'result': 1,
  197. 'description': '',
  198. 'payload': {
  199. 'workStatus': status,
  200. 'surplus': surplus,
  201. 'sum': sumtime,
  202. 'name': group['groupName'],
  203. 'address': group['address'],
  204. 'code': devType.get('code'),
  205. 'orderProcessing': orderProcessing,
  206. 'logicalCode': dev['logicalCode'],
  207. 'user': 'me' if lastOpenId == request.user.openId else 'notme',
  208. 'agentFeatures': agent.features,
  209. }
  210. })
  211. def stop(self, port = None):
  212. return self.stop_charging_port()
  213. def isHaveStopEvent(self):
  214. return True