Объяснение
В настоящее время я пытаюсь управлять умным удлинителем с помощью скрипта Python. Для этого я использую соединение TCP с модулем сокета. Примерно в 75% случаев я получаю ответ / данные, которые я искал, и все работает отлично. Тем не менее, примерно в 25% случаев ответ обрезается на той же длине, 1024 байта. Это не имеет никакого смысла для меня, поскольку мой размер буфера на самом деле установлен в 2048 байт. Скорость, с которой я жду между использованием recv (), похоже, тоже не влияет / не вызывает это. Хотя TCP является потоком байтов, все еще возможно, что это может быть связано с фрагментацией пакета?
Код
Основной код
ip='192.168.0.62'
port=9999
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_tcp.connect((ip, port))
sock_tcp.send(encrypt('{"system":{"get_sysinfo":{}}}'))
data = sock_tcp.recv(2048)
sock_tcp.close()
print len(data) #On succesful runs output is 1221, on unsuccesful runs it is 1024
rec = decrypt(data[4:])
print str(rec) #See output below
Функция шифрования
def encrypt(string):
key = 171
result = pack('>I', len(string))
for i in string:
a = key ^ ord(i)
key = a
result += chr(a)
return result
Функция дешифрования
def decrypt(string):
key = 171
result = ""
for i in string:
a = key ^ ord(i)
key = ord(i)
result += chr(a)
return result
выход
Сама строка, которую я получаю. Это, скорее всего, не актуально, но я подумал, что все равно включу. Это значение переменной rec.
Требуемый и обычный выход
Полный желаемый вывод
{"system": {"get_sysinfo": {"sw_ver": "1.0.6 Build 180627
Rel.081000" , "hw_ver": "1,0", "модель": "HS300 (США)", "DeviceId": "80067B24A755F99C4D6C1807455E09F91AB7B2AA", "oemId": "5C9E6254BEBAED63B2B6102966D24C17", "HWID": "34C41AA028022D0CCEA5E678E8547C54", "RSSI ": -60," longitude_i ": - 1222955" latitude_i ": 379078," псевдоним ":" TP-LINK_Power
Strip_4F01" , "mic_type": "IOT.SMARTPLUGSWITCH", "особенность": "ТИМ: В", "макинтош": "B0: BE: 76: 12: 4F: 01", "обновление": 0, "led_off" : 0, "дети": [{ "ID": "80067B24A755F99C4D6C1807455E09F91AB7B2AA00", "состояние": 0, "Alias": "CezHeat", "on_time": 0, "next_action": { "тип": - 1}} , { "идентификатор": "80067B24A755F99C4D6C1807455E09F91AB7B2AA01", "состояние": 1, "псевдоним": "CezUVB", "on_time": 191208, "next_action": { "тип": - 1}}, { "идентификатор":» 80067B24A755F99C4D6C1807455E09F91AB7B2AA02" , "состояние": 1, "псевдоним": "CyanHeat", "on_time": 191208, "next_action": { "тип": - 1}}, { "идентификатор": "80067B24A755F99C4D6C1807455E09F91AB7B2AA03", "состояние": 1, "псевдоним": "ZanderHeat", "on_time": 191208, "next_action": { "тип": - 1}}, { "идентификатор": "80067B24A755F99C4D6C1807455E09F91AB7B2AA04", "состояние": 1, "псевдоним":» CairoHeat», "on_time": 191208, "next_action": { "тип": - 1}}, { "идентификатор": "80067B24A755F99C4D6C1807455E09F91AB7B2AA05", "состояние": 1, "псевдоним": "KodaMister", "on_time": 191208, "next_action": { "тип": - 1}}], "child_num": 6, "err_code": 0}}} * * тысяча тридцать девять
Ненормальный и более редкий выход
Отрезать вывод
{"system": {"get_sysinfo": {"sw_ver": "1.0.6 Build 180627
Rel.081000" , "hw_ver": "1,0", "модель": "HS300 (США)", "DeviceId": "80067B24A755F99C4D6C1807455E09F91AB7B2AA", "oemId": "5C9E6254BEBAED63B2B6102966D24C17", "HWID": "34C41AA028022D0CCEA5E678E8547C54", "RSSI ": -59," longitude_i ": - 1222955" latitude_i ": 379078," псевдоним ":" TP-LINK_Power
Strip_4F01" , "mic_type": "IOT.SMARTPLUGSWITCH", "особенность": "ТИМ: В", "макинтош": "B0: BE: 76: 12: 4F: 01", "обновление": 0, "led_off" : 0, "дети": [{ "ID": "80067B24A755F99C4D6C1807455E09F91AB7B2AA00", "состояние": 0, "Alias": "CezHeat", "on_time": 0, "next_action": { "тип": - 1}} , { "идентификатор": "80067B24A755F99C4D6C1807455E09F91AB7B2AA01", "состояние": 1, "псевдоним": "CezUVB", "on_time": 191207, "next_action": { "тип": - 1}}, { "идентификатор":» 80067B24A755F99C4D6C1807455E09F91AB7B2AA02" , "состояние": 1, "псевдоним": "CyanHeat", "on_time": 191207, "next_action": { "тип": - 1}}, { "идентификатор": "80067B24A755F99C4D6C1807455E09F91AB7B2AA03", "состояние": 1, "псевдоним": "ZanderHeat", "on_time": 191207, "next_action": { "тип": - 1}}, { "идентификатор": "80067B24A755F99C4D6C1807455E09F91AB7B2AA04", "состояние": 1, "псевдоним":» CairoHeat "" на
Заключение
Если бы кто-нибудь мог предоставить мне решение или объяснение, почему вывод / поток отключается, это было бы очень ценно. Я использовал много кода из этого открытого модуля . Я также хочу понять, как все это работает, поэтому, если бы вы могли объяснить немного больше, я был бы очень признателен.