RedRatHub3.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. # coding=utf-8
  2. #
  3. # Simple Python test program to use the RedRatHub.
  4. #
  5. # Ethan Johnson, David Blight, Chris Dodge - RedRat Ltd.
  6. #
  7. import sys
  8. import time
  9. import socket
  10. from ssat_sdk.service import service_config
  11. from ssat_sdk.utils import LoggingUtil
  12. from ssat_sdk.utils.AbnormalClient import abnormal_client
  13. class RedRat3():
  14. # 构造函数
  15. def __init__(self):
  16. LoggingUtil.printLog("初始化RedRat3客户端")
  17. self.sock = socket.socket()
  18. self.socketOpen = False
  19. self.Port = service_config.ServiceConfig().getRedRatHubPort()
  20. self.deviceName = ""
  21. print u'\n\n\n \t\t Init RedRat3 \n\n\n'.encode('gbk')
  22. # self.__OpenSocket("127.0.0.1")
  23. # LoggingUtil.printLog("初始化RedRat3客户端")
  24. # LoggingUtil.printLog("初始化RedRat3客户端,完成")
  25. # 析构函数
  26. def __def__(self):
  27. print u'\n\n\n \t\t Close RedRat3 \n\n\n'.encode('gbk')
  28. self.__CloseSocket()
  29. # 打开连接
  30. def __OpenSocket(self, ip="127.0.0.1"):
  31. print "RedRatHub3.__OpenSocket,ip and port:", ip,self.Port
  32. try:
  33. status = self.sock.connect((ip, self.Port))
  34. self.socketOpen = True
  35. return status != 0
  36. except Exception, e:
  37. abnormal_client.sendAbnormal('RCU', str(e))
  38. self.socketOpen = False
  39. print u'\n\n\n \t\t Init RedRat3 Error \n\n\n'.encode('gbk')
  40. # LoggingUtil.printLog(u"连接RedRatHubCmd.exe服务端失败")
  41. print u"连接RedRatHubCmd.exe服务端失败"
  42. return False
  43. # 关闭链接
  44. def __CloseSocket(self):
  45. if self.socketOpen:
  46. self.sock.close()
  47. self.socketOpen = False
  48. else:
  49. print("\n\n\n \t\t Socket was to close.\n\n\n")
  50. # 发送消息
  51. def __ReadData(self, message):
  52. if not self.socketOpen:
  53. self.__CloseSocket()
  54. self.__OpenSocket()
  55. if not self.socketOpen:
  56. print("\tRedratHub3 Socket has not been opened. Call 'OpenSocket()' first.")
  57. return
  58. try:
  59. # Send message
  60. self.sock.settimeout(100)
  61. self.sock.send((message + '\n').encode())
  62. received = ""
  63. # Check response. This is either a single line, e.g. "OK\n", or a multi-line response with
  64. # '{' and '}' start/end delimiters.
  65. count = 0
  66. while True:
  67. count += 1
  68. # Receives data
  69. received += self.sock.recv(64).decode()
  70. if self.__CheckEOM(received):
  71. return received
  72. if count > 10:
  73. return received
  74. except Exception, e:
  75. abnormal_client.sendAbnormal('RCU', str(e))
  76. # 检查是否到消息末端
  77. def __CheckEOM(self, message):
  78. # Multi-line message
  79. if ('{' in message):
  80. return ('}' in message)
  81. # Single line message
  82. if ("\n" in message):
  83. return True
  84. # 添加信号数据集xml文件,相同数据集名称的将会被覆盖
  85. def addSignalDataSet(self, file):
  86. self.__ReadData('hubquery="add ir-file",file="' + file + '"')
  87. return
  88. # 加载信号数据集xml文件,将会删除以前所有加载过的xml文件
  89. def loadSignalDataSet(self, file):
  90. self.__ReadData('hubquery="load ir-file",file="' + file + '"')
  91. return
  92. # 返回遥控设备名称
  93. def getDeviceName(self):
  94. devs = self.__ReadData('hubquery="list redrats"')
  95. if devs is not None and devs.strip():
  96. devs = devs.split('\n')[1]
  97. self.deviceName = devs[devs.find('] ') + 2:]
  98. return self.deviceName
  99. return ""
  100. def getCurrentDeviceName(self):
  101. if not self.deviceName.strip():
  102. self.getDeviceName()
  103. return self.deviceName
  104. # 返回遥控键值数据文件名
  105. def getScriptName(self):
  106. list = self.__ReadData('hubquery="list datasets"')
  107. if list is not None and list.strip():
  108. list = list.lstrip('{\n')
  109. list = list.rstrip('\n}\n')
  110. return list.split('\n')
  111. return ""
  112. # 返回遥控键值数据文件中包含的所有按键名称
  113. def getKeyName(self):
  114. list = self.__ReadData(
  115. 'hubquery="list signals in dataset",dataset="' + self.getScriptName()[0] + '"')
  116. if list is not None and list.strip():
  117. list = list.lstrip('{\n')
  118. list = list.rstrip('\n}\n')
  119. return list.split('\n')
  120. return ""
  121. # 返回遥控键值对应的键名称
  122. def getKeyNumber(self):
  123. list = self.__ReadData(
  124. 'hubquery="list signals in dataset",dataset="' + self.getScriptName()[0] + '"')
  125. if list is not None and list.strip():
  126. list = list.lstrip('{\n')
  127. list = list.rstrip('\n}\n')
  128. return list.split('\n')
  129. return ""
  130. # 发送指定的按键;成功返回0,失败返回失败次数
  131. def sendKey(self, KeyName, Times=1, sleep_time=1):
  132. status = 0
  133. if not self.deviceName.strip():
  134. self.getDeviceName()
  135. while Times > 0:
  136. Times -= 1
  137. try:
  138. result = self.__ReadData(
  139. 'name="' + self.deviceName + '",dataset="' + self.getScriptName()[0] + '",signal="' + KeyName + '"')
  140. print "RedRatHub3.sendKey, result:",result
  141. except Exception, e:
  142. print u"执行按键:%s异常!error:%s" % (str(KeyName), str(e))
  143. result = ""
  144. time.sleep(sleep_time)
  145. if result != "OK":
  146. status += 1
  147. return status
  148. # 发送指定的按键(多个),所有按钮都发送成功返回0;失败返回失败次数
  149. def sendKeys(self, KeyNames, sleep_time=0.1):
  150. print "redRatHub3:sendKeys:", KeyNames, sleep_time
  151. status = 0
  152. for key in KeyNames:
  153. result = self.sendKey(key, sleep_time=sleep_time)
  154. if result != "OK":
  155. status += 1
  156. return status
  157. def sendrepeats(self, KeyName, repeats=2):
  158. status = 0
  159. if not self.deviceName.strip():
  160. self.getDeviceName()
  161. result = self.__ReadData('name="' + self.deviceName + '",dataset="' + self.getScriptName()[
  162. 0] + '",signal="' + KeyName + '",repeats="' + str(repeats) + '"')
  163. time.sleep(1)
  164. if result != "OK":
  165. status += 1
  166. return status
  167. def sendduration(self, KeyName, duration=1500, sleep_time=0.1):
  168. status = 0
  169. if not self.deviceName.strip():
  170. self.getDeviceName()
  171. result = self.__ReadData('name="' + self.deviceName + '",dataset="' + self.getScriptName()[
  172. 0] + '",signal="' + KeyName + '",duration="' + str(duration) + '"')
  173. time.sleep(sleep_time)
  174. if result != "OK":
  175. status += 1
  176. return status
  177. def sendrepeats2(self, KeyName, repeats=2, duration=1000):
  178. status = 0
  179. if not self.deviceName.strip():
  180. self.getDeviceName()
  181. result = self.__ReadData('name="' + self.deviceName + '",dataset="' + self.getScriptName()[
  182. 0] + '",signal="' + KeyName + '",repeats="' + str(repeats) + '",duration="' + str(duration) + '"')
  183. time.sleep(1)
  184. if result != "OK":
  185. status += 1
  186. return status
  187. # 关闭socket通讯
  188. def close(self):
  189. self.__CloseSocket()
  190. return
  191. # 单例模块;
  192. redrat3_singleton = RedRat3()
  193. if __name__ == "__main__":
  194. redrat = RedRat3()
  195. # 双击效果;
  196. keyList = redrat.getKeyName()
  197. print "keyList:",keyList
  198. redrat.sendKey('power')
  199. redrat.sendKey('home', 2, 0.1)
  200. # redrat.sendrepeats('home', 2)