lishenhuanbao.py 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181
  1. # -*- coding: utf-8 -*-
  2. import re
  3. from apilib.utils_datetime import get_zero_time
  4. from apps.web.core.adapter.base import *
  5. from apps.web.device.models import Device
  6. from apps.web.user.models import Card, RechargeRecord
  7. class WasherCarLSHBBox(SmartBox):
  8. def __init__(self, device):
  9. super(WasherCarLSHBBox, self).__init__(device)
  10. def reverse_hex(self, data):
  11. # type:(str) -> str
  12. if not isinstance(data, (str, unicode)):
  13. raise TypeError
  14. return ''.join(list(reversed(re.findall(r'.{2}', data))))
  15. def check_dev_status(self, attachParas = None):
  16. if attachParas and attachParas.has_key('price'):
  17. return
  18. if not self.device.need_fetch_online:
  19. raise ServiceException(
  20. {'result': 2, 'description': DeviceErrorCodeDesc.get(ErrorCode.DEVICE_CONN_CHECK_FAIL)})
  21. try:
  22. workStatus = self.get_device_workstatus()
  23. if workStatus == 0x05 or workStatus == 0x01:
  24. raise ServiceException({'result': 2, 'description': u'设备缺货、缺液,请联系老板'})
  25. elif workStatus == 0x04:
  26. raise ServiceException({'result': 2, 'description': u'设备工作中, 请等待设备工作完成再使用'})
  27. else:
  28. pass
  29. except ServiceException, e:
  30. raise e
  31. def get_device_workstatus(self):
  32. devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.OPERATE_DEV_SYNC,
  33. payload = {'IMEI': self._device['devNo'], "funCode": '02', 'data': ''})
  34. if devInfo['rst'] != ErrorCode.DEVICE_SUCCESS:
  35. if devInfo['rst'] == ErrorCode.DEVICE_CONN_FAIL:
  36. raise ServiceException(
  37. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  38. elif devInfo['rst'] == ErrorCode.BOARD_UART_TIMEOUT:
  39. raise ServiceException(
  40. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  41. else:
  42. raise ServiceException(
  43. {'result': 2, 'description': u'检测设备状态失败({})'.format(devInfo['rst'])})
  44. workStatus = devInfo['data'][-4:-2]
  45. return int(workStatus)
  46. #获取计费工作模式
  47. def get_jfgzms(self):
  48. data = '0504000100'
  49. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  50. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  51. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  52. if devInfo['rst'] == -1:
  53. raise ServiceException(
  54. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  55. elif devInfo['rst'] == 1:
  56. raise ServiceException(
  57. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  58. mode = devInfo['data'][-4:-2]
  59. return int(mode)
  60. #设置计费工作模式
  61. def set_jfgzms(self,mode):
  62. if int(mode) not in [0,1]:
  63. raise ServiceException({'result': 2, 'description': u'输入错误的参数,请输入正确的参数'})
  64. data = '05040001'
  65. if int(mode) == 0:
  66. data += '00'
  67. else:
  68. data += '01'
  69. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  70. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  71. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  72. if devInfo['rst'] == -1:
  73. raise ServiceException(
  74. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  75. elif devInfo['rst'] == 1:
  76. raise ServiceException(
  77. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  78. resultMode = devInfo['data'][-4:-2]
  79. if resultMode == '00' and mode != '0':
  80. raise ServiceException({'result': 2, 'description': u'设置失败,请再重新试试看哦'})
  81. elif resultMode == '01' and mode != '1':
  82. raise ServiceException({'result': 2, 'description': u'设置失败,请再重新试试看哦'})
  83. #获取清水刷卡模式费率
  84. def get_qsskmsfl(self):
  85. data = '0602000400000000'
  86. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  87. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  88. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  89. if devInfo['rst'] == -1:
  90. raise ServiceException(
  91. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  92. elif devInfo['rst'] == 1:
  93. raise ServiceException(
  94. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  95. fl = int(devInfo['data'][-10:-2],16)
  96. return fl
  97. #设置清水刷卡计费费率
  98. def set_qsskmsfl(self,fl):
  99. hexFl = fill_2_hexByte(hex(int(fl)), 8)
  100. data = '06020004' + hexFl
  101. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  102. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  103. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  104. if devInfo['rst'] == -1:
  105. raise ServiceException(
  106. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  107. elif devInfo['rst'] == 1:
  108. raise ServiceException(
  109. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  110. resultMode = devInfo['data'][-10:-2]
  111. if hexFl.lower() != resultMode.lower():
  112. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  113. #获取刷卡模式费率
  114. def get_qstbmsfl(self):
  115. data = '0702000400000000'
  116. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  117. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  118. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  119. if devInfo['rst'] == -1:
  120. raise ServiceException(
  121. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  122. elif devInfo['rst'] == 1:
  123. raise ServiceException(
  124. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  125. fl = int(devInfo['data'][-10:-2],16)
  126. return fl
  127. #设置投币计费费率
  128. def set_qstbmsfl(self,fl):
  129. hexFl = fill_2_hexByte(hex(int(fl)), 8)
  130. data = '07020004' + hexFl
  131. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  132. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  133. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  134. if devInfo['rst'] == -1:
  135. raise ServiceException(
  136. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  137. elif devInfo['rst'] == 1:
  138. raise ServiceException(
  139. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  140. resultMode = devInfo['data'][-10:-2]
  141. if hexFl.lower() != resultMode.lower():
  142. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  143. #获取泡沫投币模式费率
  144. def get_pmskmsfl(self):
  145. data = '1F02000400000000'
  146. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  147. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  148. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  149. if devInfo['rst'] == -1:
  150. raise ServiceException(
  151. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  152. elif devInfo['rst'] == 1:
  153. raise ServiceException(
  154. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  155. fl = int(devInfo['data'][-10:-2],16)
  156. return fl
  157. #设置泡沫刷卡计费费率
  158. def set_pmskmsfl(self,fl):
  159. hexFl = fill_2_hexByte(hex(int(fl)), 8)
  160. data = '1F020004' + hexFl
  161. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  162. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  163. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  164. if devInfo['rst'] == -1:
  165. raise ServiceException(
  166. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  167. elif devInfo['rst'] == 1:
  168. raise ServiceException(
  169. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  170. resultMode = devInfo['data'][-10:-2]
  171. if hexFl.lower() != resultMode.lower():
  172. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  173. #获取泡沫投币模式费率
  174. def get_pmtbmsfl(self):
  175. data = '2002000400000000'
  176. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  177. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  178. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  179. if devInfo['rst'] == -1:
  180. raise ServiceException(
  181. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  182. elif devInfo['rst'] == 1:
  183. raise ServiceException(
  184. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  185. fl = int(devInfo['data'][-10:-2],16)
  186. return fl
  187. #设置泡沫刷卡计费费率
  188. def set_pmtbmsfl(self,fl):
  189. hexFl = fill_2_hexByte(hex(int(fl)), 8)
  190. data = '20020004' + hexFl
  191. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  192. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  193. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  194. if devInfo['rst'] == -1:
  195. raise ServiceException(
  196. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  197. elif devInfo['rst'] == 1:
  198. raise ServiceException(
  199. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  200. resultMode = devInfo['data'][-10:-2]
  201. if hexFl.lower() != resultMode.lower():
  202. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  203. #获取洗尘刷卡投币模式费率
  204. def get_xcskmsfl(self):
  205. data = '2102000400000000'
  206. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  207. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  208. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  209. if devInfo['rst'] == -1:
  210. raise ServiceException(
  211. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  212. elif devInfo['rst'] == 1:
  213. raise ServiceException(
  214. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  215. fl = int(devInfo['data'][-10:-2],16)
  216. return fl
  217. #设置吸尘刷卡计费费率
  218. def set_xcskmsfl(self,fl):
  219. hexFl = fill_2_hexByte(hex(int(fl)), 8)
  220. data = '21020004' + hexFl
  221. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  222. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  223. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  224. if devInfo['rst'] == -1:
  225. raise ServiceException(
  226. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  227. elif devInfo['rst'] == 1:
  228. raise ServiceException(
  229. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  230. resultMode = devInfo['data'][-10:-2]
  231. if hexFl.lower() != resultMode.lower():
  232. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  233. #获取洗尘投币投币模式费率
  234. def get_xctbmsfl(self):
  235. data = '2202000400000000'
  236. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  237. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  238. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  239. if devInfo['rst'] == -1:
  240. raise ServiceException(
  241. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  242. elif devInfo['rst'] == 1:
  243. raise ServiceException(
  244. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  245. fl = int(devInfo['data'][-10:-2],16)
  246. return fl
  247. #设置吸尘投币计费费率
  248. def set_xctbmsfl(self,fl):
  249. hexFl = fill_2_hexByte(hex(int(fl)), 8)
  250. data = '22020004' + hexFl
  251. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  252. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  253. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  254. if devInfo['rst'] == -1:
  255. raise ServiceException(
  256. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  257. elif devInfo['rst'] == 1:
  258. raise ServiceException(
  259. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  260. resultMode = devInfo['data'][-10:-2]
  261. if hexFl.lower() != resultMode.lower():
  262. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  263. #获取臭氧周期
  264. def get_cyzq(self):
  265. data = '1002000400000000'
  266. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  267. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  268. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  269. if devInfo['rst'] == -1:
  270. raise ServiceException(
  271. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  272. elif devInfo['rst'] == 1:
  273. raise ServiceException(
  274. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  275. fl = int(devInfo['data'][-10:-2],16)
  276. return fl
  277. #设置臭氧周期
  278. def set_cyzq(self,value):
  279. hexV = fill_2_hexByte(hex(int(value)), 8)
  280. data = '10020004' + hexV
  281. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  282. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  283. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  284. if devInfo['rst'] == -1:
  285. raise ServiceException(
  286. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  287. elif devInfo['rst'] == 1:
  288. raise ServiceException(
  289. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  290. resultMode = devInfo['data'][-10:-2]
  291. if hexV.lower() != resultMode.lower():
  292. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  293. #获取开灯时间
  294. def get_lightopening_time(self):
  295. data = '1102000400000000'
  296. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  297. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  298. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  299. if devInfo['rst'] == -1:
  300. raise ServiceException(
  301. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  302. elif devInfo['rst'] == 1:
  303. raise ServiceException(
  304. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  305. fl = int(devInfo['data'][-10:-2],16)
  306. return fl
  307. # 获取串口设备信息
  308. def get_machine_info(self):
  309. data = ''
  310. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  311. {'IMEI': self._device['devNo'], "funCode": '01', 'data': data})
  312. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  313. if devInfo['rst'] == -1:
  314. raise ServiceException(
  315. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  316. elif devInfo['rst'] == 1:
  317. raise ServiceException(
  318. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  319. return devInfo['data']
  320. #设置开灯时间
  321. def set_lightopening_time(self,value):
  322. hexV = fill_2_hexByte(hex(int(value)), 8)
  323. data = '11020004' + hexV
  324. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  325. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  326. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  327. if devInfo['rst'] == -1:
  328. raise ServiceException(
  329. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  330. elif devInfo['rst'] == 1:
  331. raise ServiceException(
  332. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  333. resultMode = devInfo['data'][-10:-2]
  334. if hexV.lower() != resultMode.lower():
  335. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  336. #获取关灯时间
  337. def get_lightclosing_time(self):
  338. data = '1202000400000000'
  339. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  340. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  341. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  342. if devInfo['rst'] == -1:
  343. raise ServiceException(
  344. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  345. elif devInfo['rst'] == 1:
  346. raise ServiceException(
  347. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  348. fl = int(devInfo['data'][-10:-2],16)
  349. return fl
  350. #设置关灯时间
  351. def set_lightclosing_time(self,value):
  352. hexV = fill_2_hexByte(hex(int(value)), 8)
  353. data = '12020004' + hexV
  354. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  355. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  356. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  357. if devInfo['rst'] == -1:
  358. raise ServiceException(
  359. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  360. elif devInfo['rst'] == 1:
  361. raise ServiceException(
  362. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  363. resultMode = devInfo['data'][-10:-2]
  364. if hexV.lower() != resultMode.lower():
  365. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  366. # 获取投币最低限额
  367. def get_coin_min_fee(self):
  368. data = '0A02000400000000'
  369. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  370. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  371. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  372. if devInfo['rst'] == -1:
  373. raise ServiceException(
  374. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  375. elif devInfo['rst'] == 1:
  376. raise ServiceException(
  377. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  378. fl = int(devInfo['data'][-10:-2], 16)
  379. return fl
  380. # 设置投币最低限额
  381. def set_coin_min_fee(self, value):
  382. hexV = fill_2_hexByte(hex(int(value)), 8)
  383. data = '0A020004' + hexV
  384. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  385. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  386. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  387. if devInfo['rst'] == -1:
  388. raise ServiceException(
  389. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  390. elif devInfo['rst'] == 1:
  391. raise ServiceException(
  392. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  393. resultMode = devInfo['data'][-10:-2]
  394. if hexV.lower() != resultMode.lower():
  395. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  396. #获取IC卡单次扣费金额
  397. def get_IC_koufei(self):
  398. data = '1402000400000000'
  399. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  400. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  401. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  402. if devInfo['rst'] == -1:
  403. raise ServiceException(
  404. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  405. elif devInfo['rst'] == 1:
  406. raise ServiceException(
  407. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  408. fl = int(devInfo['data'][-10:-2],16)
  409. return fl
  410. #设置IC卡单词扣费金额
  411. def set_IC_koufei(self,value):
  412. hexV = fill_2_hexByte(hex(int(value)), 8)
  413. data = '14020004' + hexV
  414. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  415. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  416. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  417. if devInfo['rst'] == -1:
  418. raise ServiceException(
  419. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  420. elif devInfo['rst'] == 1:
  421. raise ServiceException(
  422. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  423. resultMode = devInfo['data'][-10:-2]
  424. if hexV.lower() != resultMode.lower():
  425. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  426. #设置刷卡最低消费
  427. def set_card_min_consume(self, value):
  428. hexV = fill_2_hexByte(hex(int(value)), 8)
  429. data = '26020004' + hexV
  430. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  431. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  432. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  433. if devInfo['rst'] == -1:
  434. raise ServiceException(
  435. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  436. elif devInfo['rst'] == 1:
  437. raise ServiceException(
  438. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  439. resultMode = devInfo['data'][-10:-2]
  440. if hexV.lower() != resultMode.lower():
  441. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  442. def get_card_min_consume(self):
  443. data = '2602000400000000'
  444. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  445. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  446. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  447. if devInfo['rst'] == -1:
  448. raise ServiceException(
  449. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  450. elif devInfo['rst'] == 1:
  451. raise ServiceException(
  452. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  453. fl = int(devInfo['data'][-10:-2], 16)
  454. return fl
  455. #实体卡挂失
  456. def set_card_hangup(self, cardId):
  457. card = Card.objects.get(id = cardId)
  458. cardNo = '{:0>8s}'.format(card.cardNo)
  459. hexV = binascii.hexlify(cardNo)
  460. data = '0E030008' + hexV
  461. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  462. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  463. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  464. if devInfo['rst'] == -1:
  465. raise ServiceException(
  466. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  467. elif devInfo['rst'] == 1:
  468. raise ServiceException(
  469. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  470. resultMode = devInfo['data'][-18:-2]
  471. if hexV.lower() != resultMode.lower():
  472. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  473. #实体卡解挂
  474. def set_card_hangout(self, cardId):
  475. card = Card.objects.get(id = cardId)
  476. cardNo = '{:0>8s}'.format(card.cardNo)
  477. hexV = binascii.hexlify(cardNo)
  478. data = '0F030008' + hexV
  479. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  480. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  481. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  482. if devInfo['rst'] == -1:
  483. raise ServiceException(
  484. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  485. elif devInfo['rst'] == 1:
  486. raise ServiceException(
  487. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  488. resultMode = devInfo['data'][-18:-2]
  489. if hexV.lower() != resultMode.lower():
  490. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  491. def set_control_mode(self, funCode):
  492. hexV = '{:0>8X}'.format(funCode)
  493. data = '28020004' + hexV
  494. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  495. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  496. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  497. if devInfo['rst'] == -1:
  498. raise ServiceException(
  499. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  500. elif devInfo['rst'] == 1:
  501. raise ServiceException(
  502. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  503. def get_control_mode(self):
  504. data = '2802000400000000'
  505. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  506. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  507. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  508. if devInfo['rst'] == -1:
  509. raise ServiceException(
  510. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  511. elif devInfo['rst'] == 1:
  512. raise ServiceException(
  513. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  514. fl = int(devInfo['data'][-10:-2], 16)
  515. return fl
  516. def set_disinfect_mode_fee(self, value):
  517. hexV = fill_2_hexByte(hex(int(value)), 8)
  518. data = '23020004' + hexV
  519. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  520. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  521. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  522. if devInfo['rst'] == -1:
  523. raise ServiceException(
  524. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  525. elif devInfo['rst'] == 1:
  526. raise ServiceException(
  527. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  528. resultMode = devInfo['data'][-10:-2]
  529. if hexV.lower() != resultMode.lower():
  530. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  531. def get_disinfect_mode_fee(self):
  532. data = '2302000400000000'
  533. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  534. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  535. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  536. if devInfo['rst'] == -1:
  537. raise ServiceException(
  538. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  539. elif devInfo['rst'] == 1:
  540. raise ServiceException(
  541. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  542. fl = int(devInfo['data'][-10:-2], 16)
  543. return fl
  544. def set_water_unit_price(self, value):
  545. hexV = fill_2_hexByte(hex(int(value)), 8)
  546. data = '13020004' + hexV
  547. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  548. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  549. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  550. if devInfo['rst'] == -1:
  551. raise ServiceException(
  552. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  553. elif devInfo['rst'] == 1:
  554. raise ServiceException(
  555. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  556. resultMode = devInfo['data'][-10:-2]
  557. if hexV.lower() != resultMode.lower():
  558. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  559. def get_water_unit_price(self):
  560. data = '1302000400000000'
  561. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  562. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  563. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  564. if devInfo['rst'] == -1:
  565. raise ServiceException(
  566. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  567. elif devInfo['rst'] == 1:
  568. raise ServiceException(
  569. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  570. fl = int(devInfo['data'][-10:-2], 16)
  571. return fl
  572. def set_trade_exit_timeout(self, value):
  573. hexV = fill_2_hexByte(hex(int(value)), 8)
  574. data = '24020004' + hexV
  575. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  576. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  577. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  578. if devInfo['rst'] == -1:
  579. raise ServiceException(
  580. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  581. elif devInfo['rst'] == 1:
  582. raise ServiceException(
  583. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  584. resultMode = devInfo['data'][-10:-2]
  585. if hexV.lower() != resultMode.lower():
  586. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  587. def get_trade_exit_timeout(self):
  588. data = '2402000400000000'
  589. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  590. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  591. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  592. if devInfo['rst'] == -1:
  593. raise ServiceException(
  594. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  595. elif devInfo['rst'] == 1:
  596. raise ServiceException(
  597. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  598. fl = int(devInfo['data'][-10:-2], 16)
  599. return fl
  600. #给实体卡充值
  601. def recharge_card(self, cardNo, money, orderNo=None):
  602. try:
  603. hexV = fill_2_hexByte(hex(int(money * 10)), 8)
  604. data = '19020004' + hexV
  605. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  606. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  607. if devInfo['rst'] != 0:
  608. if devInfo['rst'] == ErrorCode.DEVICE_CONN_FAIL:
  609. return {
  610. 'result': ErrorCode.DEVICE_CONN_FAIL,
  611. 'description': u'当前设备正在玩命找网络,请您稍候再试'
  612. }, None
  613. elif devInfo['rst'] == ErrorCode.BOARD_UART_TIMEOUT:
  614. return {
  615. 'result': ErrorCode.BOARD_UART_TIMEOUT,
  616. 'description': u'当前设备忙,无响应,请您稍候再试'
  617. }, None
  618. else:
  619. return {
  620. 'result': devInfo['rst'],
  621. 'description': u'系统异常'
  622. }, None
  623. resultMode = devInfo['data'][-10:-2]
  624. if hexV.lower() != resultMode.lower():
  625. return {
  626. 'result': ErrorCode.IC_RECHARGE_FAIL,
  627. 'description': u'设置的结果和预期不符合,请您联系老板,进行检查哦'
  628. }, None
  629. return {
  630. 'result': ErrorCode.SUCCESS,
  631. 'description': ''
  632. }, None
  633. except Exception as e:
  634. logger.exception(e)
  635. return {
  636. 'result': ErrorCode.EXCEPTION,
  637. 'description': e.message
  638. }, None
  639. def get_coins_count(self):
  640. data = '1c02000400000000'
  641. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  642. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  643. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  644. if devInfo['rst'] == -1:
  645. raise ServiceException(
  646. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  647. elif devInfo['rst'] == 1:
  648. raise ServiceException(
  649. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  650. fl = int(devInfo['data'][-10:-2],16)
  651. return fl
  652. def set_coins_count(self,value):
  653. hexV = fill_2_hexByte(hex(int(value)), 8)
  654. data = '1c020004' + hexV
  655. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  656. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  657. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  658. if devInfo['rst'] == -1:
  659. raise ServiceException(
  660. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  661. elif devInfo['rst'] == 1:
  662. raise ServiceException(
  663. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  664. resultMode = devInfo['data'][-10:-2]
  665. if hexV.lower() != resultMode.lower():
  666. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您稍后再试哦'})
  667. def get_card_count(self):
  668. data = '1d02000400000000'
  669. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  670. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  671. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  672. if devInfo['rst'] == -1:
  673. raise ServiceException(
  674. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  675. elif devInfo['rst'] == 1:
  676. raise ServiceException(
  677. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  678. fl = int(devInfo['data'][-10:-2],16)
  679. return fl
  680. def set_card_count(self,value):
  681. hexV = fill_2_hexByte(hex(int(value)), 8)
  682. data = '1d020004' + hexV
  683. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  684. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  685. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  686. if devInfo['rst'] == -1:
  687. raise ServiceException(
  688. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  689. elif devInfo['rst'] == 1:
  690. raise ServiceException(
  691. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  692. resultMode = devInfo['data'][-10:-2]
  693. if hexV.lower() != resultMode.lower():
  694. raise ServiceException({'result': 2, 'description': u'设置的结果和预期不符合,请您检查是否已经把卡放到了合适的位置,或者卡是否正常,或者读卡器是否损坏哦'})
  695. def clear_dev_feecount(self):
  696. self.set_card_count(0)
  697. self.set_coins_count(0)
  698. def get_today_card_count(self):
  699. data = '0c02000400000000'
  700. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  701. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  702. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  703. if devInfo['rst'] == -1:
  704. raise ServiceException(
  705. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  706. elif devInfo['rst'] == 1:
  707. raise ServiceException(
  708. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  709. fl = int(devInfo['data'][-10:-2],16)
  710. return fl
  711. def get_today_coin_count(self):
  712. data = '0b02000400000000'
  713. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  714. {'IMEI': self._device['devNo'], "funCode": '05', 'data': data})
  715. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  716. if devInfo['rst'] == -1:
  717. raise ServiceException(
  718. {'result': 2, 'description': u'当前设备正在玩命找网络,请您稍候再试'})
  719. elif devInfo['rst'] == 1:
  720. raise ServiceException(
  721. {'result': 2, 'description': u'当前设备忙,无响应,请您稍候再试'})
  722. fl = int(devInfo['data'][-10:-2],16)
  723. return fl
  724. def analyze_event_data(self, data):
  725. resultDict = {}
  726. funCode = data[12:14]
  727. if funCode == '01':#状态
  728. cmd = data[-4:-2]
  729. if cmd == '00':
  730. return {'funCode': funCode, 'status': Const.DEV_WORK_STATUS_IDLE, 'cmd': cmd, 'isFaultClass': True}
  731. elif cmd == '01':
  732. return {'funCode': funCode, 'status': Const.DEV_WORK_STATUS_FAULT, 'statusInfo': u'缺货、缺液', 'cmd': cmd,
  733. 'isFaultClass': True}
  734. elif cmd == '02':
  735. return {'funCode': funCode, 'status': Const.DEV_WORK_STATUS_FAULT, 'statusInfo': u'缺货、缺液', 'cmd': cmd,
  736. 'isFaultClass': True}
  737. elif cmd == '04':
  738. return {'funCode': funCode, 'status': Const.DEV_WORK_STATUS_WORKING, 'statusInfo': u'工作中', 'cmd': cmd,
  739. 'isFaultClass': True}
  740. elif funCode == '08':
  741. useTime = int(data[-10:-2],16)
  742. minutes = int(useTime/60.0)
  743. return {'funCode':funCode,'status':Const.DEV_WORK_STATUS_WORKING,'useTime':minutes}
  744. elif funCode == '0B':
  745. count = int(data[-10:-2],16)
  746. return {'funCode':funCode,'coin':count}
  747. elif funCode == '0C':
  748. count = int(data[-10:-2],16)
  749. return {'funCode':funCode,'card':count}
  750. elif funCode == '0D':
  751. count = int(data[-10:-2],16)
  752. return {'funCode':funCode,'chargeCard':count}
  753. elif funCode == '13':
  754. count = int(data[-10:-2],16)
  755. return {'funCode':funCode,'showWater':count}
  756. elif funCode == '15':#卡信息上报
  757. money = int(data[20:24],16)/10.0
  758. uid = data[24:34]
  759. cardNoStr = data[34:50]
  760. cardNo = ''
  761. ii = 0
  762. for jj in range(8):
  763. strTemp = chr(int(cardNoStr[ii:ii+2],16))
  764. ii += 2
  765. cardNo += strTemp
  766. return {'funCode':funCode,'cardNo':'{:d}'.format(int(cardNo)),
  767. 'money':money,'uid':uid,'status':Const.DEV_WORK_STATUS_WORKING}
  768. elif funCode == '16':#刷卡消费
  769. uid = data[24:34]
  770. money = int(data[20:24],16)/10.0
  771. cardNoStr = data[34:50]
  772. cardNo = ''
  773. ii = 0
  774. for jj in range(8):
  775. strTemp = chr(int(cardNoStr[ii:ii+2],16))
  776. ii += 2
  777. cardNo += strTemp
  778. return {'funCode':funCode,'cardNo':'{:d}'.format(int(cardNo)),
  779. 'money':money,'uid':uid,'status':Const.DEV_WORK_STATUS_WORKING}
  780. elif funCode == '17':#充值
  781. uid = data[24:34]
  782. money = int(data[20:24],16)/10.0
  783. cardNoStr = data[34:50]
  784. cardNo = ''
  785. ii = 0
  786. for jj in range(8):
  787. strTemp = chr(int(cardNoStr[ii:ii+2],16))
  788. ii += 2
  789. cardNo += strTemp
  790. return {'funCode':funCode,'cardNo':'{:d}'.format(int(cardNo)),
  791. 'money':money,'uid':uid,'status':Const.DEV_WORK_STATUS_WORKING}
  792. elif funCode == '1B':#使用移动支付的洗车结束
  793. resultType = data[20:22]
  794. if resultType != '03':
  795. return resultDict
  796. sequanceNo = data[24:28]
  797. money = int(data[28:32],16)/10.0
  798. return {'funCode':funCode,'sequanceNo':sequanceNo,'money':money,'status':Const.DEV_WORK_STATUS_IDLE}
  799. elif funCode == '19' or funCode == '20':
  800. cardBalance = round((int(data[20:28], 16) * 0.1), 2)
  801. cardNoHex = data[28:38] # 卡号用了前四个bit 最后一个是校验
  802. cardNo = '{}'.format(int(self.reverse_hex(cardNoHex[:-2]), 16))
  803. occupyData = data[38:50]
  804. return {'funCode': funCode, 'cardNo': cardNo, 'cardBalance': cardBalance, 'occupyData': occupyData,
  805. 'data': data, 'cardNoHex': cardNoHex}
  806. return resultDict
  807. def get_dev_setting(self):
  808. billingModel = self.get_jfgzms()
  809. cardRates = self.get_qsskmsfl()
  810. coinRates = self.get_qstbmsfl()
  811. foamCardRates = self.get_pmskmsfl()
  812. foamCoinRates = self.get_pmtbmsfl()
  813. dustingCardRates = self.get_xcskmsfl()
  814. dustingCoinRates = self.get_xctbmsfl()
  815. cardOneTimeFee = self.get_IC_koufei()
  816. ozoneCycle = self.get_cyzq()
  817. lightTime = self.get_lightopening_time()
  818. offLightTime = self.get_lightclosing_time()
  819. swing_card_minfee = self.get_card_min_consume()
  820. return {'billingModel':billingModel,'cardRates':cardRates,'coinRates':coinRates,
  821. 'cardOneTimeFee':cardOneTimeFee,'ozoneCycle':ozoneCycle,'lightTime':lightTime,
  822. 'offLightTime':offLightTime,'foamCardRates':foamCardRates,'foamCoinRates':foamCoinRates,
  823. 'dustingCardRates':dustingCardRates,'dustingCoinRates':dustingCoinRates,
  824. 'swing_card_minfee':swing_card_minfee}
  825. def make_sequanceNo(self):
  826. nowTime = datetime.datetime.now()
  827. zeroTime = get_zero_time(nowTime)
  828. deltaMinutes = (nowTime - zeroTime).total_seconds()/60
  829. return fill_2_hexByte(hex(int(deltaMinutes)), 4)
  830. def stop(self,port=None):
  831. data = '2802000400000006'
  832. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  833. {'IMEI': self._device['devNo'], "funCode": '06', 'data': data})
  834. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  835. if devInfo['rst'] == -1:
  836. raise ServiceException({'result': 2, 'description': u'设备正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'})
  837. elif devInfo['rst'] == 1:
  838. raise ServiceException({'result': 2, 'description': u'设备正忙,无响应,您的金币还在,重试不需要重新付款,请您稍后再试哦'})
  839. #计算剩余时间,如果是按照次的方式,剩余时间为0
  840. ctrInfo = Device.get_dev_control_cache(self._device['devNo'])
  841. try:
  842. unit = ctrInfo.get('unit')
  843. needTime = ctrInfo.get('needTime')
  844. startTime = to_datetime(ctrInfo.get('startTime'))
  845. except Exception,e:
  846. devInfo.update({'remainder_time':0})
  847. return devInfo
  848. if unit == u'次':
  849. devInfo.update({'remainder_time':0})
  850. return devInfo
  851. nowTime = datetime.datetime.now()
  852. spendTime = (nowTime - startTime).total_seconds()/60
  853. remainderTime = needTime - spendTime if needTime > spendTime else 0
  854. devInfo.update({'remainder_time':remainderTime})
  855. return devInfo
  856. def calc_stop_back_coins(self,totalFee,remainderTime,totalTime):
  857. refundFee = round(totalFee * (float(remainderTime) / (totalTime)),2)
  858. if refundFee > totalFee:
  859. refundFee = totalFee
  860. if refundFee <= 0.0:
  861. refundFee = 0.00
  862. return refundFee
  863. def start_device(self, package, openId, attachParas):
  864. money = package['coins']
  865. needTime = package['time']
  866. unit = package['unit']
  867. price = package.get('price', 0)
  868. hexMoney = fill_2_hexByte(hex(int(money * 10)), 4)
  869. sequanceNo = self.make_sequanceNo()
  870. data = '1b0000060100' + sequanceNo + hexMoney
  871. devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.OPERATE_DEV_SYNC, payload = {
  872. 'IMEI': self._device['devNo'],
  873. "funCode": '06',
  874. 'data': data
  875. }, timeout = MQTT_TIMEOUT.START_DEVICE)
  876. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  877. if devInfo['rst'] == -1:
  878. raise ServiceException({'result': 2, 'description': u'设备正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'})
  879. elif devInfo['rst'] == 1:
  880. raise ServiceException({'result': 2, 'description': u'设备正忙,无响应,您的金币还在,重试不需要重新付款,请您稍后再试哦'})
  881. returnCode = devInfo['data'][-12:-10]
  882. if returnCode == '01':
  883. raise ServiceException({'result': 2, 'description': u'命令格式错误'})
  884. elif returnCode == '02':
  885. raise ServiceException({'result': 2, 'description': u'收到重复指令'})
  886. elif returnCode == '03':
  887. raise ServiceException({'result': 2, 'description': u'金额超出范围'})
  888. elif returnCode == '04':
  889. raise ServiceException({'result': 2, 'description': u'正在交易过程中,不允许接受扫码付款'})
  890. elif returnCode == '00':
  891. devInfo.update({'sequanceNo': sequanceNo})
  892. # 刷新状态
  893. newValue = {'startTime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  894. 'money': money, 'isStart': True,'coins':money,
  895. 'needTime':needTime,'unit':unit,
  896. 'refunded': False, 'openId': openId,
  897. 'price': price,
  898. 'vCardId':self._vcard_id, 'sequanceNo': sequanceNo}
  899. if 'linkedRechargeRecordId' in attachParas and attachParas.get('isQuickPay', False):
  900. linkedRechargeRecordId = str(attachParas['linkedRechargeRecordId'])
  901. rechargeRecord = RechargeRecord.objects(id=linkedRechargeRecordId).first()
  902. if rechargeRecord.isQuickPay is True:
  903. newValue.update({'rechargeRcdId': str(attachParas['linkedRechargeRecordId'])})
  904. else:
  905. pass
  906. Device.update_dev_control_cache(self._device['devNo'], newValue)
  907. return devInfo
  908. def get_device_function_by_key(self,keyName):
  909. if keyName == "swing_card_minfee" :
  910. return float(self.get_card_min_consume()) / 10
  911. elif keyName == "cardOneTimeFee":
  912. return float(self.get_IC_koufei()) / 10
  913. elif keyName == "coin_min_fee":
  914. return float(self.get_coin_min_fee()) / 10
  915. elif keyName == "billingModel":
  916. return self.get_jfgzms()
  917. elif keyName == "trade_exit_timeout":
  918. return self.get_trade_exit_timeout()
  919. elif keyName == "disinfect_mode_fee":
  920. return float(self.get_disinfect_mode_fee())
  921. elif keyName == "water_unit_price":
  922. return float(self.get_water_unit_price()) / 10
  923. elif keyName == "water_card_fee":
  924. return float(self.get_qsskmsfl())
  925. elif keyName == "water_coin_fee":
  926. return float(self.get_qstbmsfl())
  927. elif keyName == "ozoneCycle":
  928. return self.get_cyzq()
  929. elif keyName == "lightTime":
  930. return self.get_lightopening_time()
  931. elif keyName == "offLightTime":
  932. return self.get_lightclosing_time()
  933. elif keyName == "foam_card_fee":
  934. return float(self.get_pmskmsfl())
  935. elif keyName == "foam_coin_fee":
  936. return float(self.get_pmtbmsfl())
  937. elif keyName == "clean_card_fee":
  938. return float(self.get_xcskmsfl())
  939. elif keyName == "clean_coin_fee":
  940. return float(self.get_xctbmsfl())
  941. return None
  942. def press_down_key(self, keyName, value=None):
  943. if keyName == "swing_card_minfee" :
  944. self.set_card_min_consume(int(value * 10))
  945. elif keyName == "cardOneTimeFee":
  946. self.set_IC_koufei(int(value * 10))
  947. elif keyName == "billingModel":
  948. self.set_jfgzms(value)
  949. elif keyName == "trade_exit_timeout":
  950. self.set_trade_exit_timeout(value)
  951. elif keyName == "disinfect_mode_fee":
  952. self.set_disinfect_mode_fee(int(value))
  953. elif keyName == "water_unit_price":
  954. self.set_water_unit_price(int(value * 10))
  955. elif keyName == "water_card_fee":
  956. self.set_qsskmsfl(int(value))
  957. elif keyName == "water_coin_fee":
  958. self.set_qstbmsfl(int(value))
  959. elif keyName == "ozoneCycle":
  960. self.set_cyzq(value)
  961. elif keyName == "lightTime":
  962. self.set_lightopening_time(value)
  963. elif keyName == "offLightTime":
  964. self.set_lightclosing_time(value)
  965. elif keyName == "foam_card_fee":
  966. self.set_pmskmsfl(int(value))
  967. elif keyName == "foam_coin_fee":
  968. self.set_pmtbmsfl(int(value))
  969. elif keyName == "clean_card_fee":
  970. self.set_xcskmsfl(int(value))
  971. elif keyName == "clean_coin_fee":
  972. self.set_xctbmsfl(int(value))
  973. def set_device_function_param(self,request,lastSetConf):
  974. if request.POST.has_key('cardOneTimeFee'):
  975. self.set_IC_koufei(float(request.POST.get('cardOneTimeFee')) * 10)
  976. if request.POST.has_key('swing_card_minfee'):
  977. self.set_card_min_consume(float(request.POST.get('swing_card_minfee')) * 10)
  978. if request.POST.has_key('coin_min_fee'):
  979. self.set_coin_min_fee(float(request.POST.get('coin_min_fee')) * 10)
  980. if request.POST.has_key('water_unit_price'):
  981. self.set_water_unit_price(float(request.POST.get('water_unit_price')) * 10)
  982. def response_card_money(self, cardNo, balance, occupyData):
  983. data = '55AA000700131900000F'
  984. data += '{:0>8X}'.format(int(balance * 10)) # 单位 角
  985. data += cardNo
  986. data += occupyData
  987. devInfo = MessageSender.send(self.device, DeviceCmdCode.PASSTHROUGH_OPERATE_DEV_NO_RESPONSE,
  988. {'IMEI': self._device['devNo'], 'data': data, 'funCode':'07'})
  989. def response_card_change_sucess(self, cardNo, balance, occupyData):
  990. data = '55AA000800132000000F'
  991. data += '{:0>8X}'.format(int(balance * 10)) # 单位 角
  992. data += cardNo
  993. data += occupyData
  994. devInfo = MessageSender.send(self.device, DeviceCmdCode.PASSTHROUGH_OPERATE_DEV_NO_RESPONSE,
  995. {'IMEI': self._device['devNo'], 'data': data, 'funCode': '08'})
  996. @property
  997. def isHaveStopEvent(self):
  998. return True