roslibjs icon indicating copy to clipboard operation
roslibjs copied to clipboard

TCP messages can be split

Open megawac opened this issue 10 years ago • 2 comments

When using the TCP extension the node will sometimes crash when 2 messages happen to be sent on the same line.

Not sure where or how this should be fixed but I'd say this is a critical bug if TCP is to be supported

Example leading up to the crash

var ros = new ROS.Ros({
    port: argv.port || 7781 // port of ROS bridge server TCP
});

var gps = ros.Topic({
    name: "/navsat/rx"
});
gps.subscribe(console.log.bind(console));

{ header: 
   { stamp: { secs: 1415043944, nsecs: 918030280 },
     frame_id: 'navsat',
     seq: 132434 },
  sentence: '$GPVTG,,,,,,,,,N*30' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 12028613 },
     frame_id: 'navsat',
     seq: 132435 },
  sentence: '$GPGGA,193816.30,,,,,0,00,9.9,,,,,,*61' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 17374196 },
     frame_id: 'navsat',
     seq: 132436 },
  sentence: '$GPGSA,,1,,,,,,,,,,,,,,,*5F' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 17374196 },
     frame_id: 'navsat',
     seq: 132437 },
  sentence: '$GPVTG,,,,,,,,,N*30' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 112016118 },
     frame_id: 'navsat',
     seq: 132438 },
  sentence: '$GPGGA,193816.40,,,,,0,00,9.9,,,,,,*66' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 117606777 },
     frame_id: 'navsat',
     seq: 132439 },
  sentence: '$GPGSA,,1,,,,,,,,,,,,,,,*5F' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 117606777 },
     frame_id: 'navsat',
     seq: 132440 },
  sentence: '$GPVTG,,,,,,,,,N*30' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 212994747 },
     frame_id: 'navsat',
     seq: 132441 },
  sentence: '$GPGGA,193816.50,,,,,0,00,9.9,,,,,,*67' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 219985786 },
     frame_id: 'navsat',
     seq: 132442 },
  sentence: '$GPGSA,,1,,,,,,,,,,,,,,,*5F' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 219985786 },
     frame_id: 'navsat',
     seq: 132443 },
  sentence: '$GPVTG,,,,,,,,,N*30' }
{ header: 
   { stamp: { secs: 1415043945, nsecs: 311877291 },
     frame_id: 'navsat',
     seq: 132444 },
  sentence: '$GPGGA,193816.60,,,,,0,00,9.9,,,,,,*64' }

undefined:1
32445}, "sentence": "$GPGSA,,1,,,,,,,,,,,,,,,*5F"}, "op": "publish"}{"topic": 
                                                                    ^
SyntaxError: Unexpected token {
    at Object.parse (native)
    at Socket.onMessage (/home/administrator/catkin_ws/src/es_kf_pose/node_modules/roslibjs/src/core/SocketAdapter.js:104:23)
    at Socket.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:764:14)
    at Socket.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:426:10)
    at emitReadable (_stream_readable.js:422:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)
    at TCP.onread (net.js:528:21)

I'll make a pr later today to have Travis run the TCP tests

megawac avatar Nov 03 '14 19:11 megawac

Just to be certain: You mean the roslibjs node crashes, not the rosbridge_server, right? I guess the simplest thing would be to change https://github.com/RobotWebTools/rosbridge_suite/blob/develop/rosbridge_server/scripts/rosbridge_tcp.py#L108 to

self.request.send(message+'\n')

I don't think messages in rosbridge_suite should end with a newline by default, but I suspect not.

T045T avatar Nov 05 '14 10:11 T045T

Yeah, the node connected to rosbridge will crash on JSON parsing, as it will sometime receive 2 messages (or message parts) in the same TCP message

megawac avatar Nov 05 '14 15:11 megawac