Advertisement
Guest User

Untitled

a guest
Nov 10th, 2016
662
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.76 KB | None | 0 0
  1. #!/usr/bin/python3.5
  2.  
  3. from datetime import datetime
  4. from Crypto.Cipher import AES
  5. import time
  6. import random
  7. import socket
  8.  
  9. def discover(timeout=None):
  10. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  11. s.connect(('8.8.8.8', 53)) # connecting to a UDP address doesn't send packets
  12. local_ip_address = s.getsockname()[0]
  13. address = local_ip_address.split('.')
  14. cs = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  15. cs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  16. cs.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  17. cs.bind(('',0))
  18. port = cs.getsockname()[1]
  19. starttime = time.time()
  20.  
  21. devices = []
  22.  
  23. timezone = time.timezone/-3600
  24. packet = bytearray(0x30)
  25.  
  26. year = datetime.now().year
  27.  
  28. if timezone < 0:
  29. packet[0x08] = 0xff + timezone - 1
  30. packet[0x09] = 0xff
  31. packet[0x0a] = 0xff
  32. packet[0x0b] = 0xff
  33. else:
  34. packet[0x08] = int(timezone)
  35. packet[0x09] = 0
  36. packet[0x0a] = 0
  37. packet[0x0b] = 0
  38. packet[0x0c] = year & 0xff
  39. packet[0x0d] = year >> 8
  40. packet[0x0e] = datetime.now().minute
  41. packet[0x0f] = datetime.now().hour
  42. subyear = str(year)[2:]
  43. packet[0x10] = int(subyear)
  44. packet[0x11] = datetime.now().isoweekday()
  45. packet[0x12] = datetime.now().day
  46. packet[0x13] = datetime.now().month
  47. packet[0x18] = int(address[0])
  48. packet[0x19] = int(address[1])
  49. packet[0x1a] = int(address[2])
  50. packet[0x1b] = int(address[3])
  51. packet[0x1c] = port & 0xff
  52. packet[0x1d] = port >> 8
  53. packet[0x26] = 6
  54. checksum = 0xbeaf
  55.  
  56. for i in range(len(packet)):
  57. checksum += packet[i]
  58. checksum = checksum & 0xffff
  59. packet[0x20] = checksum & 0xff
  60. packet[0x21] = checksum >> 8
  61.  
  62. cs.sendto(packet, ('255.255.255.255', 80))
  63. if timeout is None:
  64. response = cs.recvfrom(1024)
  65. responsepacket = bytearray(response[0])
  66. host = response[1]
  67. mac = responsepacket[0x3a:0x40]
  68. return device(host=host, mac=mac)
  69. else:
  70. while (time.time() - starttime) < timeout:
  71. cs.settimeout(timeout - (time.time() - starttime))
  72. try:
  73. response = cs.recvfrom(1024)
  74. except socket.timeout:
  75. return devices
  76. responsepacket = bytearray(response[0])
  77. host = response[1]
  78. mac = responsepacket[0x3a:0x40]
  79. devices.append(device(host=host, mac=mac))
  80.  
  81. class device:
  82. def __init__(self, host, mac):
  83. self.host = host
  84. self.mac = mac
  85. self.count = random.randrange(0xffff)
  86. self.key = bytearray([0x09, 0x76, 0x28, 0x34, 0x3f, 0xe9, 0x9e, 0x23, 0x76, 0x5c, 0x15, 0x13, 0xac, 0xcf, 0x8b, 0x02])
  87. self.iv = bytearray([0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58])
  88. self.id = bytearray([0, 0, 0, 0])
  89. self.cs = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  90. self.cs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  91. self.cs.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  92. self.cs.bind(('',0))
  93.  
  94. def auth(self):
  95. payload = bytearray(0x50)
  96. payload[0x04] = 0x31
  97. payload[0x05] = 0x31
  98. payload[0x06] = 0x31
  99. payload[0x07] = 0x31
  100. payload[0x08] = 0x31
  101. payload[0x09] = 0x31
  102. payload[0x0a] = 0x31
  103. payload[0x0b] = 0x31
  104. payload[0x0c] = 0x31
  105. payload[0x0d] = 0x31
  106. payload[0x0e] = 0x31
  107. payload[0x0f] = 0x31
  108. payload[0x10] = 0x31
  109. payload[0x11] = 0x31
  110. payload[0x12] = 0x31
  111. payload[0x1e] = 0x01
  112. payload[0x2d] = 0x01
  113. payload[0x30] = ord('T')
  114. payload[0x31] = ord('e')
  115. payload[0x32] = ord('s')
  116. payload[0x33] = ord('t')
  117. payload[0x34] = ord(' ')
  118. payload[0x35] = ord(' ')
  119. payload[0x36] = ord('1')
  120.  
  121. response = self.send_packet(0x65, payload)
  122.  
  123. enc_payload = response[0x38:]
  124.  
  125. aes = AES.new(bytes(self.key), AES.MODE_CBC, bytes(self.iv))
  126. payload = aes.decrypt(bytes(enc_payload))
  127.  
  128. self.id = payload[0x00:0x04]
  129. self.key = payload[0x04:0x14]
  130.  
  131. def send_packet(self, command, payload):
  132. packet = bytearray(0x38)
  133. packet[0x00] = 0x5a
  134. packet[0x01] = 0xa5
  135. packet[0x02] = 0xaa
  136. packet[0x03] = 0x55
  137. packet[0x04] = 0x5a
  138. packet[0x05] = 0xa5
  139. packet[0x06] = 0xaa
  140. packet[0x07] = 0x55
  141. packet[0x24] = 0x2a
  142. packet[0x25] = 0x27
  143. packet[0x26] = command
  144. packet[0x28] = self.count & 0xff
  145. packet[0x29] = self.count >> 8
  146. packet[0x2a] = self.mac[0]
  147. packet[0x2b] = self.mac[1]
  148. packet[0x2c] = self.mac[2]
  149. packet[0x2d] = self.mac[3]
  150. packet[0x2e] = self.mac[4]
  151. packet[0x2f] = self.mac[5]
  152. packet[0x30] = self.id[0]
  153. packet[0x31] = self.id[1]
  154. packet[0x32] = self.id[2]
  155. packet[0x33] = self.id[3]
  156.  
  157. checksum = 0xbeaf
  158. for i in range(len(payload)):
  159. checksum += payload[i]
  160. checksum = checksum & 0xffff
  161.  
  162. aes = AES.new(bytes(self.key), AES.MODE_CBC, bytes(self.iv))
  163. payload = aes.encrypt(bytes(payload))
  164.  
  165. packet[0x34] = checksum & 0xff
  166. packet[0x35] = checksum >> 8
  167.  
  168. for i in range(len(payload)):
  169. packet.append(payload[i])
  170.  
  171. checksum = 0xbeaf
  172. for i in range(len(packet)):
  173. checksum += packet[i]
  174. checksum = checksum & 0xffff
  175. packet[0x20] = checksum & 0xff
  176. packet[0x21] = checksum >> 8
  177.  
  178. self.cs.sendto(packet, self.host)
  179. response = self.cs.recvfrom(1024)
  180. return response[0]
  181.  
  182. def send_data(self, data):
  183. packet = bytearray([0x02, 0x00, 0x00, 0x00])
  184. packet += data
  185. self.send_packet(0x6a, packet)
  186.  
  187. def enter_learning(self):
  188. packet = bytearray(16)
  189. packet[0] = 3
  190. self.send_packet(0x6a, packet)
  191.  
  192. def check_sensors(self):
  193. packet = bytearray(16)
  194. packet[0] = 1
  195. response = self.send_packet(0x6a, packet)
  196. err = response[0x22] | (response[0x23] << 8)
  197. if err == 0:
  198. data = {}
  199. aes = AES.new(bytes(self.key), AES.MODE_CBC, bytes(self.iv))
  200. payload = aes.decrypt(bytes(response[0x38:]))
  201. data['temperature'] = (payload[0x4] * 10 + payload[0x5]) / 10.0
  202. data['humidity'] = (payload[0x6] * 10 + payload[0x7]) / 10.0
  203. light = payload[0x8]
  204. if light == 0:
  205. data['light'] = 'dark'
  206. elif light == 1:
  207. data['light'] = 'dim'
  208. elif light == 2:
  209. data['light'] = 'normal'
  210. elif light == 3:
  211. data['light'] = 'bright'
  212. else:
  213. data['light'] = 'unknown'
  214. air_quality = payload[0x0a]
  215. if air_quality == 0:
  216. data['air_quality'] = 'excellent'
  217. elif air_quality == 1:
  218. data['air_quality'] = 'good'
  219. elif air_quality == 2:
  220. data['air_quality'] = 'normal'
  221. elif air_quality == 3:
  222. data['air_quality'] = 'bad'
  223. else:
  224. data['air_quality'] = 'unknown'
  225. noise = payload[0xc]
  226. if noise == 0:
  227. data['noise'] = 'quiet'
  228. elif noise == 1:
  229. data['noise'] = 'normal'
  230. elif noise == 2:
  231. data['noise'] = 'noisy'
  232. else:
  233. data['noise'] = 'unknown'
  234. return data
  235.  
  236. def check_temperature(self):
  237. packet = bytearray(16)
  238. packet[0] = 1
  239. response = self.send_packet(0x6a, packet)
  240. err = response[0x22] | (response[0x23] << 8)
  241. if err == 0:
  242. aes = AES.new(bytes(self.key), AES.MODE_CBC, bytes(self.iv))
  243. payload = aes.decrypt(bytes(response[0x38:]))
  244. temp = (payload[0x4] * 10 + payload[0x5]) / 10.0
  245. return temp
  246.  
  247. def check_data(self):
  248. packet = bytearray(16)
  249. packet[0] = 4
  250. response = self.send_packet(0x6a, packet)
  251. err = response[0x22] | (response[0x23] << 8)
  252. if err == 0:
  253. aes = AES.new(bytes(self.key), AES.MODE_CBC, bytes(self.iv))
  254. payload = aes.decrypt(bytes(response[0x38:]))
  255. return payload[0x04:]
  256.  
  257. class rm2(device):
  258. def __init__ (self):
  259. device.__init__(self, None, None)
  260.  
  261. def discover(self):
  262. dev = discover()
  263. self.host = dev.host
  264. self.mac = dev.mac
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement