QTcpSocket:解码接收到的数据
Posted
技术标签:
【中文标题】QTcpSocket:解码接收到的数据【英文标题】:QTcpSocket: decoding received data 【发布时间】:2019-05-22 19:24:01 【问题描述】:我需要对从 Universal Robot UR5 服务器接收到的数据进行解码。收到的数据如下。有人可以帮助我使用 Qt5 c++ 解码此消息吗?
\x00\x00\x04T@\xE2\xB2\xB8\xD4\xFD\xF3\xB6@\t\"\xD0\xE5`A\x8A\xBF\xF9\"\xD0\xE5`A\x88?\xF9\"\xD0\xE5`A\x89@\x12\xD9\x16\x87+\x02\f@\x12\xD9\x16\x87+\x02\f@\t\"\xD0\xE5`A\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xBB\xE0""f\xD1\x1B\xE1\x95\x8B\xBF\xF5\xB6\x18\xBE\xB0YA\xBF\xF5\xB8\x9E\xE6\xCB\xD9\xBC\xBF\xC4^\\\xFC^\x81i\xBE\xEE@\x01\xF2\xD7\b\x05\x00\x00\x00\x00\x00\x00\x00\x00\xBC\x19\xE2""B\x00\x00\x00\x00\xC0""1!\xAF\x86w&m\xC0""1#\xAD""b\x1C\xD9\xCE\xBF\xF7\xB5\xA6.\xF4Tz\xBF!\x9B\x1B\xF6\x80\xFFP\x00\x00\x00\x00\x00\x00\x00\x00@\t\"\xD0\xE0\x00\x00\x00\xBF\xF9\"\xD0\xD1\x10\xB4`?\xF9\"\xD0\xE0\x00\x00\x00@\x12\xD9\x16\x80\x00\x00\x00@\x12\xD9\x16\x80\x00\x00\x00@\t\"\xD0\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xBB\xE0""f\xD1 \x00\x00\x00\xBF\xF5\xB6\x18\xC0\x00\x00\x00\xBF\xF5\xB8\x9E\xE0\x00\x00\x00\xBF\xC4^]\x00\x00\x00\x00\xBE\xEE@\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xBB\xE0""f\xD1 \x00\x00\x00\xBF\xF5\xB6\x18\xC0\x00\x00\x00\xBF\xF5\xB8\x9E\xE0\x00\x00\x00\xBF\xC4^]\x00\x00\x00\x00\xBE\xEE@\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xDF(\xD4\xDE\xE9Z\x10?\xBB\xF7\xD1N%*9?\xD0\xC2\xE6\xB9\x87\x1C\xE1@\x01\xC4\xB7+\x83\x8B\xD2@\x01\xC4\xB7\x14\xE4\x1D\xCA>\x93q]e!\xED\xD8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\xAE\x18\xA0\x85\x9A\xCB'>\x8B\r\xC1""E\x1F\x9C\x06>\xAC\xB0\xAA\xDB\xDFm,\xBEkF\xDE""b\x8D\xBCQ>\x95\xADv\x92\xF8(\xF5\xBD\xE3\xFC\x04\x11\xC6\xD3\x19?\xDF(\xD4\xA9\xCF\xAD\x8C?\xBB\xF7\xD2\x15\x90\xF0\xA6?\xD0\xC2\xE6\xCB\xBC]O@\x01\xC4\xB7""6\x1C\xF6\x04@\x01\xC4\xB7\x1F\x7F\xE0M>\x97\x96""3\x90\xB0*\xE2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00@D\x00\x00\x00\x00\x00\x00?\xC1\xF0g\x05\xC8\x96\xDD@ \x00\x00\x00\x00\x00\x00@\x1C\x00\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00@o\xA0\x00\x00\x00\x00\x00?\xF0\x00\x00\x00\x00\x00\x00@\x13\xB8\xAA\x9D\x1AX\xAE@\x14k\xD0*\xDC-\xAE@\x15\xAEW\xC1q\x0E\xBC@\f\xDBv7\x18'\xDA@\x0B\x03t\x19\x01\xE5?\xF1\x05\x92*d
这适用于下面的 python 代码。但我需要在 Qt5 c++ 中执行此操作。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
s.connect((HOST, PORT_30003))
time.sleep(1.00)
print ""
packet_1 = s.recv(4)
packet_2 = s.recv(8)
packet_3 = s.recv(48)
packet_4 = s.recv(48)
packet_5 = s.recv(48)
packet_6 = s.recv(48)
packet_7 = s.recv(48)
#reading current joint values from 48 bytes
packet_18 = s.recv(8)
packet_18 = packet_18.encode("hex") #convert the data from \x hex notation to plain hex
q1 = str(packet_18)
q1 = struct.unpack('!d', packet_18.decode('hex'))[0]
print "q1 = ", q1 * 180/3.1416
packet_19 = s.recv(8)
packet_19 = packet_19.encode("hex") #convert the data from \x hex notation to plain hex
q2 = str(packet_19)
q2 = struct.unpack('!d', packet_19.decode('hex'))[0]
print "q2 = ", q2 * 180/3.1416
packet_20 = s.recv(8)
packet_20 = packet_20.encode("hex") #convert the data from \x hex notation to plain hex
q3 = str(packet_20)
q3 = struct.unpack('!d', packet_20.decode('hex'))[0]
print "q3 = ", q3 * 180/3.1416
packet_21 = s.recv(8)
packet_21 = packet_21.encode("hex") #convert the data from \x hex notation to plain hex
q4 = str(packet_21)
q4 = struct.unpack('!d', packet_21.decode('hex'))[0]
print "q4 = ", q4 * 180/3.1416
packet_22 = s.recv(8)
packet_22 = packet_22.encode("hex") #convert the data from \x hex notation to plain hex
q5 = str(packet_22)
q5 = struct.unpack('!d', packet_22.decode('hex'))[0]
print "q5 = ", q5 * 180/3.1416
packet_23 = s.recv(8)
packet_23 = packet_23.encode("hex") #convert the data from \x hex notation to plain hex
q6 = str(packet_23)
q6 = struct.unpack('!d', packet_23.decode('hex'))[0]
print "q6 = ", q6 * 180/3.1416
【问题讨论】:
有没有办法复制服务器? 服务器是 Universal Robot 的机器人模拟器软件。我不知道有什么方法可以复制它。但模拟器可以从以下链接下载:link @eyllanesc 链接为:link 假设我下载了软件并执行了它,我还需要做什么才能使用你的脚本? 如果你有一台windows机器,模拟器应该在VMware player上运行,因为它是基于linux的。而你只需要连接虚拟机对应的IP和30003端口即可。主屏幕上会出现3个机器人模拟器软件UR3、UR5和UR10,你只需要运行其中一个就可以运行脚本了. 【参考方案1】:我可以使用下面的代码自己解码数据:
// joint values
double q1 = 0, q2=0, q3=0, q4=0, q5=0, q6=0;
// pose values
double x = 0, y=0, z=0, rX=0, rY=0, rZ=0;
QByteArray array;
array = p_socket->readAll();
// decoding length data
int length = 0;
memcpy(&length, array.constData(), 4);
length = qToBigEndian(length);
qDebug() << length;
int byteLength = 8;
// decoding joint 1 value
QByteArray jointArray1 = array.mid(252,byteLength).toHex();
long long currentJointPosition1=jointArray1.toLongLong(0,16);
q1 = reinterpret_cast<double&>(currentJointPosition1);
// decoding joint 2 value
QByteArray jointArray2 = array.mid(252+1*byteLength,byteLength).toHex();
long long currentJointPosition2=jointArray2.toLongLong(0,16);
q2 = reinterpret_cast<double&>(currentJointPosition2);
【讨论】:
以上是关于QTcpSocket:解码接收到的数据的主要内容,如果未能解决你的问题,请参考以下文章