解释
我目前正在尝试使用 python 脚本控制智能电源板。为了实现这一点,我使用了带有套接字模块的 TCP 连接。大约 75% 的情况下,我会得到我正在寻找的响应/数据,并且一切都运行良好。然而,大约 25% 的情况下,响应会以完全相同的长度(1024 字节)被截断。这对我来说没有任何意义,因为我的缓冲区大小实际上设置为 2048 字节。我在使用 recv() 之间等待的速度似乎也没有影响/导致这一点。尽管 TCP 是字节流,但这是否仍然可能与数据包碎片有关?
Code
主要代码
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
Output
我收到的字符串本身。它很可能不相关,但我想无论如何我都会包含它。这是变量rec 的值。
所需的常规输出
完全所需的输出
{“system”:{“get_sysinfo”:{“sw_ver”:“1.0.6 内部版本 180627
Rel.081000","hw_ver":"1.0","型号":"HS300(美国)","deviceId":"80067B24A755F99C4D6C1807455E09F91AB7B2AA","oemId":"5C9E6254BEBAED63B2B6102966D24C17", “hwId”:“34C41AA028022D0CCEA5E678E8547C54”,“rssi ":-60,"longitude_i":-1222955,"latitude_i":379078,"alias":"TP-LINK_Power
Strip_4F01","mic_type":"IOT.SMARTPLUGSWITCH","feature":"TIM:ENE","mac":"B0:BE:76:12:4F:01","更新":0,"led_off" :0,"children":[{"id":"80067B24A755F99C4D6C1807455E09F91AB7B2AA00","state":0,"alias":"CezHeat","on_time":0,"next_action":{"type":-1}} ,{"id":"80067B24A755F99C4D6C1807455E09F91AB7B2AA01","state":1,"alias":"CezUVB","on_time":191208,"next_action":{"type":-1}},{"id":" 80067B24A755F99C4D6C1807455E09F91AB7B2AA02","state":1,"alias":"CyanHeat","on_time":191208,"next_action":{"type":-1}},{"id":"80067B24A755F99C4D6C18074 55E09F91AB7B2AA03","状态": 1、“别名”:“ZanderHeat”、“on_time”:191208、“next_action”:{“type”:-1}}、{“id”:“80067B24A755F99C4D6C1807455E09F91AB7B2AA04”、“state”:1、“alias”:“ CairoHeat","on_time":191208,"next_action":{"type":-1}},{"id":"80067B24A755F99C4D6C1807455E09F91AB7B2AA05","state":1,"alias":"KodaMister","on_time": 191208,"next_action":{"type":-1}}],"child_num":6,"err_code":0}}}
异常且罕见的输出
切断输出
{“system”:{“get_sysinfo”:{“sw_ver”:“1.0.6 内部版本 180627
Rel.081000","hw_ver":"1.0","型号":"HS300(美国)","deviceId":"80067B24A755F99C4D6C1807455E09F91AB7B2AA","oemId":"5C9E6254BEBAED63B2B6102966D24C17", “hwId”:“34C41AA028022D0CCEA5E678E8547C54”,“rssi ":-59,"longitude_i":-1222955,"latitude_i":379078,"alias":"TP-LINK_Power
Strip_4F01","mic_type":"IOT.SMARTPLUGSWITCH","feature":"TIM:ENE","mac":"B0:BE:76:12:4F:01","更新":0,"led_off" :0,"children":[{"id":"80067B24A755F99C4D6C1807455E09F91AB7B2AA00","state":0,"alias":"CezHeat","on_time":0,"next_action":{"type":-1}} ,{"id":"80067B24A755F99C4D6C1807455E09F91AB7B2AA01","state":1,"alias":"CezUVB","on_time":191207,"next_action":{"type":-1}},{"id":" 80067B24A755F99C4D6C1807455E09F91AB7B2AA02","state":1,"alias":"CyanHeat","on_time":191207,"next_action":{"type":-1}},{"id":"80067B24A755F99C4D6C18074 55E09F91AB7B2AA03","状态": 1、“别名”:“ZanderHeat”、“on_time”:191207、“next_action”:{“type”:-1}}、{“id”:“80067B24A755F99C4D6C1807455E09F91AB7B2AA04”、“state”:1、“alias”:“开罗热火","上
结论
如果有人能为我提供有关输出/流为何被切断的解决方案或解释,我将不胜感激。我使用了这个开源的很多代码module https://github.com/softScheck/tplink-smartplug/blob/master/tplink_smartplug.py。我也希望更多地了解这一切是如何运作的,所以如果你能解释更多一点,我将非常感激。