RedRatHub4.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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 RedRat4():
  14. # 构造函数
  15. def __init__(self):
  16. LoggingUtil.printLog("初始化RedRat4客户端")
  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("初始化RedRat4客户端 完成")
  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 "RedRatHub4.__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. # print "RedRatHub3.__ReadData, message:",message
  53. if not self.socketOpen:
  54. self.__CloseSocket()
  55. self.__OpenSocket()
  56. if not self.socketOpen:
  57. print("\tRedratHub4 Socket has not been opened. Call 'OpenSocket()' first.")
  58. return
  59. try:
  60. # Send message
  61. self.sock.settimeout(100)
  62. self.sock.send((message + '\n').encode())
  63. received = ""
  64. # Check response. This is either a single line, e.g. "OK\n", or a multi-line response with
  65. # '{' and '}' start/end delimiters.
  66. count = 0
  67. while True:
  68. count += 1
  69. # Receives data
  70. received += self.sock.recv(64).decode()
  71. if self.__CheckEOM(received):
  72. return received
  73. if count > 10:
  74. return received
  75. except Exception, e:
  76. abnormal_client.sendAbnormal('RCU', str(e))
  77. # 检查是否到消息末端
  78. def __CheckEOM(self, message):
  79. # Multi-line message
  80. if ('{' in message):
  81. return ('}' in message)
  82. # Single line message
  83. if ("\n" in message):
  84. return True
  85. # 添加信号数据集xml文件,相同数据集名称的将会被覆盖
  86. def addSignalDataSet(self, file):
  87. self.__ReadData('hubquery="add ir-file",file="' + file + '"')
  88. return
  89. # 加载信号数据集xml文件,将会删除以前所有加载过的xml文件
  90. def loadSignalDataSet(self, file):
  91. self.__ReadData('hubquery="load ir-file",file="' + file + '"')
  92. return
  93. # 返回遥控设备名称
  94. def getDeviceName(self):
  95. devs = self.__ReadData('hubquery="list redrats"')
  96. if devs is not None and devs.strip():
  97. devs = devs.split('\n')[1]
  98. # print "getDeviceName,devs:",devs
  99. index1 = devs.find('] ') + 2
  100. index2 = devs.find('(connected)') - 1
  101. if index2 < 0:
  102. index2 = None
  103. self.deviceName = devs[index1:index2]
  104. return self.deviceName
  105. return ""
  106. def getCurrentDeviceName(self):
  107. if not self.deviceName.strip():
  108. self.getDeviceName()
  109. return self.deviceName
  110. # 返回遥控键值数据文件名
  111. def getScriptName(self):
  112. list = self.__ReadData('hubquery="list datasets"')
  113. if list is not None and list.strip():
  114. list = list.lstrip('{\n')
  115. list = list.rstrip('\n}\n')
  116. return list.split('\n')
  117. return ""
  118. # 返回遥控键值数据文件中包含的所有按键名称
  119. def getKeyName(self):
  120. list = self.__ReadData(
  121. 'hubquery="list signals in dataset",dataset="' + self.getScriptName()[0] + '"')
  122. if list is not None and list.strip():
  123. list = list.lstrip('{\n')
  124. list = list.rstrip('\n}\n')
  125. return list.split('\n')
  126. return ""
  127. # 返回遥控键值对应的键名称
  128. def getKeyNumber(self):
  129. list = self.__ReadData(
  130. 'hubquery="list signals in dataset",dataset="' + self.getScriptName()[0] + '"')
  131. if list is not None and list.strip():
  132. list = list.lstrip('{\n')
  133. list = list.rstrip('\n}\n')
  134. return list.split('\n')
  135. return ""
  136. # 发送指定的按键;成功返回0,失败返回失败次数
  137. def sendKey(self, KeyName, Times=1, sleep_time=1):
  138. status = 0
  139. if not self.deviceName.strip():
  140. self.getDeviceName()
  141. while Times > 0:
  142. Times -= 1
  143. try:
  144. result = self.__ReadData(
  145. 'name="' + self.deviceName + '",dataset="' + self.getScriptName()[0] + '",signal="' + KeyName + '"')
  146. print "RedRatHub4.sendKey:%s, result:%s"%(KeyName,result)
  147. except Exception, e:
  148. print u"执行按键:%s异常!error:%s" % (str(KeyName), str(e))
  149. result = ""
  150. time.sleep(sleep_time)
  151. if result != "OK":
  152. status += 1
  153. return status
  154. # 发送指定的按键(多个),所有按钮都发送成功返回0;失败返回失败次数
  155. def sendKeys(self, KeyNames, sleep_time=0.1):
  156. print "RedRatHub4:sendKeys:", KeyNames, sleep_time
  157. status = 0
  158. for key in KeyNames:
  159. result = self.sendKey(key, sleep_time=sleep_time)
  160. if result != "OK":
  161. status += 1
  162. return status
  163. def sendrepeats(self, KeyName, repeats=2):
  164. status = 0
  165. if not self.deviceName.strip():
  166. self.getDeviceName()
  167. result = self.__ReadData('name="' + self.deviceName + '",dataset="' + self.getScriptName()[
  168. 0] + '",signal="' + KeyName + '",repeats="' + str(repeats) + '"')
  169. time.sleep(1)
  170. if result != "OK":
  171. status += 1
  172. return status
  173. def sendduration(self, KeyName, duration=1500, sleep_time=0.1):
  174. status = 0
  175. if not self.deviceName.strip():
  176. self.getDeviceName()
  177. result = self.__ReadData('name="' + self.deviceName + '",dataset="' + self.getScriptName()[
  178. 0] + '",signal="' + KeyName + '",duration="' + str(duration) + '"')
  179. time.sleep(sleep_time)
  180. if result != "OK":
  181. status += 1
  182. return status
  183. def sendrepeats2(self, KeyName, repeats=2, duration=1000):
  184. status = 0
  185. if not self.deviceName.strip():
  186. self.getDeviceName()
  187. result = self.__ReadData('name="' + self.deviceName + '",dataset="' + self.getScriptName()[
  188. 0] + '",signal="' + KeyName + '",repeats="' + str(repeats) + '",duration="' + str(duration) + '"')
  189. time.sleep(1)
  190. if result != "OK":
  191. status += 1
  192. return status
  193. # 关闭socket通讯
  194. def close(self):
  195. self.__CloseSocket()
  196. return
  197. # 单例模块;
  198. redrat4_singleton = RedRat4()
  199. if __name__ == "__main__":
  200. redrat = RedRat4()
  201. # 双击效果;
  202. keyList = redrat.getKeyName()
  203. print "keyList:",keyList
  204. # redrat.sendKey('power')
  205. # redrat.sendKey('home', 2, 0.1)
  206. # redrat.sendrepeats('home', 2)