8 #include <typedefs_defines_rtps.h>
11 FILE *ptr_in, *ptr_out;
14 /**********************************************************************************/
15 void conv_u32(uint32_t *x,uint8_t ef) {
16 #if __BYTE_ORDER == __LITTLE_ENDIAN
18 #elif __BYTE_ORDER == __BIG_ENDIAN
23 /**********************************************************************************/
24 void print_obj(void *obj) {
25 fprintf(ptr_out," (");
26 switch (bswap_32(*((uint32_t*)obj))) {
28 fprintf(ptr_out,"ManagedApplicaton or Manager");
30 case OID_WRITE_APPSELF:
31 fprintf(ptr_out,"Write appself");
34 fprintf(ptr_out,"Write app");
37 fprintf(ptr_out,"Read app");
40 fprintf(ptr_out,"Write mgr");
43 fprintf(ptr_out,"Read mgr");
46 fprintf(ptr_out,"Write publ");
49 fprintf(ptr_out,"Read publ");
52 fprintf(ptr_out,"Write subs");
55 fprintf(ptr_out,"Read subs");
58 fprintf(ptr_out,"unknown");
61 fprintf(ptr_out,")\n");
64 /**********************************************************************************/
65 void print_app(uint8_t app) {
67 case MANAGEDAPPLICATION:
68 fprintf(ptr_out,"(managed application)\n");
71 fprintf(ptr_out,"(manager)\n");
74 fprintf(ptr_out,"(unknown class)\n");
79 /**********************************************************************************/
80 void decode_parametr_sequence(uint8_t *msg) {
88 while(*((ParameterId*)msg)!=PID_SENTINEL) {
89 printf("id%d,len%d\n",*((ParameterId*)msg),*((ParameterLength*)(msg+2)));
90 if ((*((ParameterLength*)(msg+2)))==0) break;
91 switch(*(ParameterId*)msg) {
93 fprintf(ptr_out," PID_PAD :\n");
95 case PID_EXPIRATION_TIME:
96 ts=*((NtpTime*)(msg+4));
97 fprintf(ptr_out," PID_EXPIRATION_TIME : %u,%u\n",
98 ts.seconds,ts.fraction);
100 case PID_PERSISTENCE:
101 ts=*((NtpTime*)(msg+4));
102 fprintf(ptr_out," PID_PERSISTENCE : %u,%u\n",
103 ts.seconds,ts.fraction);
105 case PID_MINIMUM_SEPARATION:
106 ts=*((NtpTime*)(msg+4));
107 fprintf(ptr_out," PID_MINIMUM_SEPARATION : %u,%u\n",
108 ts.seconds,ts.fraction);
111 fprintf(ptr_out," PID_TOPIC :\n");
113 //len of message is also in message (first ulong)
114 l=(*(uint32_t*)(msg+4))+4;
119 fprintf(ptr_out," : ");
120 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
122 for(i=j;i<8;i++) fprintf(ptr_out," ");
125 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
126 fprintf(ptr_out,"\n");
130 fprintf(ptr_out," PID_STRENGTH : %u\n",
131 *(uint32_t*)(msg+4));
134 fprintf(ptr_out," PID_TYPE_NAME :\n");
136 //len of message is also in message (first ulong)
137 l=(*(uint32_t*)(msg+4))+4;
142 fprintf(ptr_out," : ");
143 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
145 for(i=j;i<8;i++) fprintf(ptr_out," ");
148 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
149 fprintf(ptr_out,"\n");
152 case PID_TYPE_CHECKSUM:
153 fprintf(ptr_out," PID_TYPE_CHECKSUM : %u\n",
154 *(TypeChecksum*)(msg+4));
156 case RTPS_PID_TYPE2_NAME:
157 fprintf(ptr_out," RTPS_PID_TYPE2_NAME :\n");
159 case RTPS_PID_TYPE2_CHECKSUM:
160 fprintf(ptr_out," RTPS_PID_TYPE2_CHECKSUM :\n");
162 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
163 fprintf(ptr_out," PID_MATATRAFFIC_MULTICAST_IPADDRESS : %u.%u.%u.%u\n",
164 msg[7],msg[6],msg[5],msg[4]);
166 case PID_APP_IPADDRESS:
167 fprintf(ptr_out," PID_APP_IPADDRESS : %u.%u.%u.%u\n",
168 msg[7],msg[6],msg[5],msg[4]);
170 case PID_METATRAFFIC_UNICAST_PORT:
171 fprintf(ptr_out," PID_METATRAFFIC_UNICAST_PORT : %u\n",
174 case PID_USERDATA_UNICAST_PORT:
175 fprintf(ptr_out," PID_USERDATA_UNICAST_PORT : %u\n",
178 case PID_EXPECTS_ACK:
179 fprintf(ptr_out," PID_EXPECTS_ACK : %u\n",
180 *(uint32_t*)(msg+4));
182 case PID_USERDATA_MULTICAST_IPADDRESS:
183 fprintf(ptr_out," PID_USERDATA_MULTICAST_IPADDRESS : %u.%u.%u.%u\n",
184 msg[7],msg[6],msg[5],msg[4]);
186 case PID_MANAGER_KEY:
187 fprintf(ptr_out," PID_MANAGER_KEY : 0x%02x%02x%02x%02x (%u.%u.%u.%u)\n",
188 msg[7],msg[6],msg[5],msg[4],msg[7],msg[6],msg[5],msg[4]);
190 case PID_SEND_QUEUE_SIZE:
191 fprintf(ptr_out," PID_SEND_QUEUE_SIZE : %u\n",
192 *(uint32_t*)(msg+4));
194 case PID_PROTOCOL_VERSION:
195 pv=*((ProtocolVersion*)(msg+4));
196 fprintf(ptr_out," PID_PROTOCOL_VERSION : %u.%u\n",
200 vid=*((VendorId*)(msg+4));
201 fprintf(ptr_out," PID_VENDOR_ID : %u.%u\n",
202 vid.major,vid.minor);
204 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
205 sn=*((SequenceNumber*)(msg+4));
206 fprintf(ptr_out," PID_VARGAPPS_SEQUENCE_NUMBER_LAST : %u\n",sn.low);
208 case PID_RECV_QUEUE_SIZE:
209 fprintf(ptr_out," PID_RECV_QUEUE_SIZE : %u\n",
210 *(uint32_t*)(msg+4));
212 case PID_RELIABILITY_OFFERED:
213 fprintf(ptr_out," PID_RELIABILITY_OFFERED : %u\n",
214 *(uint32_t*)(msg+4));
216 case PID_RELIABILITY_REQUESTED:
217 fprintf(ptr_out," PID_RELIABILITY_REQUESTED : %u\n",
218 *(uint32_t*)(msg+4));
221 fprintf(ptr_out," unknow paramerId : %d len : %d\n",
222 *((ParameterId*)msg),*((ParameterLength*)(msg+2)));
225 msg+=(*((ParameterLength*)(msg+2)))+4; /* next message */
227 msg+=(*((ParameterLength*)(msg+2)))+4; /* message end*/
231 /**********************************************************************************/
232 int decode_header(uint8_t *msg, unsigned len, MessageInterpret *mi) {
233 if (len<16) return -1; /* message is to small */
234 if (msg[0]!='R') return -2; /* header is invalid */
235 if (msg[1]!='T') return -2; /* header is invalid */
236 if (msg[2]!='P') return -2; /* header is invalid */
237 if (msg[3]!='S') return -2; /* header is invalid */
238 mi->sourceVersion=*((ProtocolVersion*)(msg+4)); /* ProtocolVersion */
239 mi->sourceVendorId=*((VendorId*)(msg+6)); /* Vendor Id */
240 mi->sourceHostId=*((HostId*)(msg+8)); /* Host Id */
241 mi->sourceAppId=*((AppId*)(msg+12)); /* App Id */
242 mi->haveTimestamp=0; /* false */
246 /**********************************************************************************/
247 int decode_submessage(uint8_t *msg, int ptr, MessageInterpret *mi) {
250 ObjectId roid,woid,oid;
251 SequenceNumber fsn,lsn,wsn;
258 switch ((SubmessageId)msg[ptr]) {
260 fprintf(ptr_out," PAD\n");
263 fprintf(ptr_out," VAR\n");
264 fprintf(ptr_out," h-bit : %d\n",(msg[ptr+1] & 8) ? 1:0);
265 fprintf(ptr_out," alive-bit : %d\n",(msg[ptr+1] & 4) ? 1:0);
266 fprintf(ptr_out," p-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
267 roid=*((ObjectId*)(msg+ptr+4));
268 fprintf(ptr_out," ObjectId : %d.%d.%d.%02x",
269 *(uint8_t*)&roid,*(((uint8_t*)&roid)+1),*(((uint8_t*)&roid)+2),*(((uint8_t*)&roid)+3));
271 woid=*((ObjectId*)(msg+ptr+8));
272 fprintf(ptr_out," ObjectId : %d.%d.%d.%02x",
273 *(uint8_t*)&woid,*(((uint8_t*)&woid)+1),*(((uint8_t*)&woid)+2),*(((uint8_t*)&woid)+3));
275 if (msg[ptr+1] & 8) {
276 hid=*((HostId*)(msg+ptr+12)); /* hostId */
277 aid=*((AppId*)(msg+ptr+16)); /* appId */
278 fprintf(ptr_out," HostId : %d.%d.%d.%d\n",
279 *(uint8_t*)&hid,*(((uint8_t*)&hid)+1),*(((uint8_t*)&hid)+2),*(((uint8_t*)&hid)+3));
280 fprintf(ptr_out," AppId : %d.%d.%d.%d ",
281 *(uint8_t*)&aid,*(((uint8_t*)&aid)+1),*(((uint8_t*)&aid)+2),*(((uint8_t*)&aid)+3));
282 print_app(*(((uint8_t*)&aid)+3));
285 oid=*((ObjectId*)(msg+ptr+12+ptr_off));
286 fprintf(ptr_out," ObjectId : %d.%d.%d.%02x",
287 *(uint8_t*)&oid,*(((uint8_t*)&oid)+1),*(((uint8_t*)&oid)+2),*(((uint8_t*)&oid)+3));
289 wsn=*((SequenceNumber*)(msg+ptr+16+ptr_off));
290 fprintf(ptr_out," sequenceNumber : %u\n",wsn.low);
291 if (msg[ptr+1] & 2) {
292 decode_parametr_sequence(msg+ptr+24+ptr_off);
296 fprintf(ptr_out," ISSUE\n");
297 roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
298 fsn=*((SequenceNumber*)(msg+ptr+12));
299 fprintf(ptr_out," p-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
300 fprintf(ptr_out," readerObjectId : %d.%d.%d.%02x",
301 *(uint8_t*)&roid,*(((uint8_t*)&roid)+1),*(((uint8_t*)&roid)+2),*(((uint8_t*)&roid)+3));
303 fprintf(ptr_out," writeObjectId : %d.%d.%d.%02x",
304 *(uint8_t*)&woid,*(((uint8_t*)&woid)+1),*(((uint8_t*)&woid)+2),*(((uint8_t*)&woid)+3));
306 fprintf(ptr_out," issueSeqNumber : %u\n",fsn.low);
308 if (msg[ptr+1] & 2) {
309 decode_parametr_sequence(k); /* after k is set to end of paramseq. */
311 // l=(*(unsigned*)(msg+ptr+2))-(k-(msg+ptr+20)+16);
312 //len of message is also in message (first ulong), internaly defined by RTI !!!
318 fprintf(ptr_out," : ");
319 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
321 for(i=j;i<8;i++) fprintf(ptr_out," ");
324 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
325 fprintf(ptr_out,"\n");
329 fprintf(ptr_out," ACK\n");
330 roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
331 fprintf(ptr_out," final-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
332 fprintf(ptr_out," readerObjectId : %d.%d.%d.%02x",
333 *(uint8_t*)&roid,*(((uint8_t*)&roid)+1),*(((uint8_t*)&roid)+2),*(((uint8_t*)&roid)+3));
335 fprintf(ptr_out," writeObjectId : %d.%d.%d.%02x",
336 *(uint8_t*)&woid,*(((uint8_t*)&woid)+1),*(((uint8_t*)&woid)+2),*(((uint8_t*)&woid)+3));
338 fprintf(ptr_out," bitmap : %u/%u:",*((uint32_t*)(msg+ptr+16)),
339 *((uint32_t*)(msg+ptr+20)));
340 for(i=0;i<msg[ptr+20]/8;) {
341 for(j=128;j!=0;j>>=1) fprintf(ptr_out,"%d",(msg[ptr+24+i] & j) ? 1:0);
342 fprintf(ptr_out," ");
343 if ((!(++i % 4)) && (i<msg[ptr+20]/8))
344 fprintf(ptr_out,"\n :");
346 fprintf(ptr_out,"\n");
349 fprintf(ptr_out," HEARTBEAT\n");
350 roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
351 fsn=*((SequenceNumber*)(msg+ptr+12));lsn=*((SequenceNumber*)(msg+ptr+20));
352 fprintf(ptr_out," final-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
353 fprintf(ptr_out," readerObjectId : %d.%d.%d.%02x",
354 *(uint8_t*)&roid,*(((uint8_t*)&roid)+1),*(((uint8_t*)&roid)+2),*(((uint8_t*)&roid)+3));
356 fprintf(ptr_out," writeObjectId : %d.%d.%d.%02x",
357 *(uint8_t*)&woid,*(((uint8_t*)&woid)+1),*(((uint8_t*)&woid)+2),*(((uint8_t*)&woid)+3));
359 fprintf(ptr_out," firstSeqNumber : %u\n",fsn.low);
360 fprintf(ptr_out," lastSeqNumber : %u\n",lsn.low);
363 fprintf(ptr_out," GAP\n");
364 roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
365 fsn=*((SequenceNumber*)(msg+ptr+12));
366 lsn=*((SequenceNumber*)(msg+ptr+20));
367 fprintf(ptr_out," readerObjectId : %d.%d.%d.%02x",
368 *(uint8_t*)&roid,*(((uint8_t*)&roid)+1),*(((uint8_t*)&roid)+2),*(((uint8_t*)&roid)+3));
370 fprintf(ptr_out," writeObjectId : %d.%d.%d.%02x",
371 *(uint8_t*)&woid,*(((uint8_t*)&woid)+1),*(((uint8_t*)&woid)+2),*(((uint8_t*)&woid)+3));
373 fprintf(ptr_out," firstSeqNumber : %u\n",fsn.low);
374 fprintf(ptr_out," bitmap : %u/%u:",lsn.low,
375 *((uint32_t*)(msg+ptr+28)));
376 for(i=0;i<(*((uint32_t*)(msg+ptr+28)));i++) {
377 l=((*(((uint32_t*)(msg+ptr+32))+i/32)) & (1<<(31-i%32))) ? 1:0;
378 fprintf(ptr_out,"%d",l);
380 fprintf(ptr_out,"\n");
383 fprintf(ptr_out," INFO_TS\n");
384 fprintf(ptr_out," i-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
385 if (!(msg[ptr+1]&2)) {
386 mi->timestamp=*((NtpTime*)(msg+ptr+4));
387 fprintf(ptr_out," ntpTimeStamp : %u,%u\n",
388 mi->timestamp.seconds,mi->timestamp.fraction);
392 fprintf(ptr_out," INFO_SRC\n");
395 fprintf(ptr_out," INFO_REPLY\n");
396 ipa=*((uint32_t*)(msg+ptr+4)); /* unicastReplyIPAddress */
397 port=*((uint32_t*)(msg+ptr+8)); /* unicastReplyPort */
398 fprintf(ptr_out," unicastReplyIPAddress : %d.%d.%d.%d\n",
399 *(uint8_t*)&ipa,*(((uint8_t*)&ipa)+1),*(((uint8_t*)&ipa)+2),*(((uint8_t*)&ipa)+3));
400 fprintf(ptr_out," unicastReplyPort : %u\n",port);
401 if (ipa!=IPADDRESS_INVALID) {
402 mi->unicastReplyIPAddress=ipa;
404 mi->unicastReplyPort=port;
405 if ((msg[ptr+1] & 0x02) !=0) {
406 ipa=*((uint32_t*)(msg+ptr+12)); /* multicastReplyIPAddress */
407 port=*((uint32_t*)(msg+ptr+16)); /* multicastReplyPort */
408 fprintf(ptr_out," multicastReplyIPAddress : %d.%d.%d.%d\n",
409 *(uint8_t*)&ipa,*(((uint8_t*)&ipa)+1),*(((uint8_t*)&ipa)+2),*(((uint8_t*)&ipa)+3));
410 fprintf(ptr_out," multicastReplyPort : %u\n",port);
411 mi->multicastReplyIPAddress=ipa;
412 mi->multicastReplyPort=port;
414 mi->multicastReplyIPAddress=IPADDRESS_INVALID;
415 mi->multicastReplyPort =PORT_INVALID;
419 fprintf(ptr_out," INFO_DST\n");
420 hid=*((HostId*)(msg+ptr+4)); /* hostId */
421 aid=*((AppId*)(msg+ptr+8)); /* appId */
422 fprintf(ptr_out," HostId : %d.%d.%d.%d\n",
423 *(uint8_t*)&hid,*(((uint8_t*)&hid)+1),*(((uint8_t*)&hid)+2),*(((uint8_t*)&hid)+3));
424 fprintf(ptr_out," AppId : %d.%d.%d.%d ",
425 *(uint8_t*)&aid,*(((uint8_t*)&aid)+1),*(((uint8_t*)&aid)+2),*(((uint8_t*)&aid)+3));
426 print_app(*(((uint8_t*)&aid)+3));
429 fprintf(ptr_out," undefined submessage code\n");
436 /**********************************************************************************/
437 int main(int argc, char * argv[]) {
438 uint8_t rtps_msg[16384],rtps_msg_c[3]={0,0,0};
439 unsigned rtps_msg_ptr=0,rtps_msg_len,rtps_submsg_cnt,submsg_len;
440 int err,c,no_lchar=1;
443 printf("-------------------------------------------------------------------------------\n");
444 printf(" RTPS messages decoder OCERA project \n");
446 printf("-------------------------------------------------------------------------------\n");
448 printf(" syntax : decode_msg 'filename to decode' 'output file'\n\n");
451 printf(" decode file : %s\n output file : %s\n\n",argv[1],argv[2]);
452 ptr_in = fopen(argv[1],"r"); /* open input file */
453 if (ferror(ptr_in)) {
454 printf(" unable to open %s\n",argv[1]);
456 ptr_out = fopen(argv[2],"w"); /* create output file */
457 if (ferror(ptr_out)) {
458 printf(" unable to create %s\n",argv[2]);
460 while ((c = fgetc(ptr_in)) !=EOF) { /* read one character */
461 if (((no_lchar==1) && (!isdigit(c))) || (no_lchar==0)) { /* outside RTPS line */
462 if (rtps_msg_ptr) { /* proc. data read data ? */
463 rtps_msg[rtps_msg_ptr]=0; /* end of rtps data */
464 rtps_msg_len=rtps_msg_ptr;rtps_msg_ptr=0;
465 printf(" message length : %d\n",rtps_msg_len);
466 /* decoded message - msg stored in rtps_msg, length msg in rtps_msg_len */
467 if ((err=decode_header(rtps_msg,rtps_msg_len,&mi))==0) {
468 fprintf(ptr_out,"message length : %d\n",rtps_msg_len);
469 fprintf(ptr_out," Header\n");
470 fprintf(ptr_out," protocol version : %d.%d \
471 \n vendorId : %d.%d \
472 \n hostId : %d.%d.%d.%d \
473 \n appId : %d.%d.%d.%d ",
474 mi.sourceVersion.major,mi.sourceVersion.minor,mi.sourceVendorId.major,
475 mi.sourceVendorId.minor,*(u_char*)&mi.sourceHostId,*(((u_char*)&mi.sourceHostId)+1),
476 *(((u_char*)&mi.sourceHostId)+2),*(((u_char*)&mi.sourceHostId)+3),*(((u_char*)&mi.sourceAppId)),
477 *(((u_char*)&mi.sourceAppId)+1),*(((u_char*)&mi.sourceAppId)+2),*(((u_char*)&mi.sourceAppId)+3));
478 print_app(*(((u_char*)&mi.sourceAppId)+3));
479 rtps_msg_ptr=16;rtps_submsg_cnt=1;
481 fprintf(ptr_out," Submessage : %d",rtps_submsg_cnt++);
482 if ((rtps_msg_ptr+3)<=rtps_msg_len) { /* len. submessage header is OK */
483 submsg_len=rtps_msg[rtps_msg_ptr+2]+rtps_msg[rtps_msg_ptr+3]*0x100;
484 fprintf(ptr_out," len : %d\n",submsg_len+4);
485 if ((submsg_len+rtps_msg_ptr+3)<=rtps_msg_len) {
486 /* decode submessage */
487 decode_submessage(rtps_msg,rtps_msg_ptr,&mi);
488 rtps_msg_ptr+=submsg_len+4;
489 } else rtps_msg_ptr=rtps_msg_len; /* submessage is too small */
491 rtps_msg_ptr=rtps_msg_len; /* submessage is too small */
492 fprintf(ptr_out,"\n");
494 } while (rtps_msg_ptr<rtps_msg_len);
496 fprintf(ptr_out,"invalid header - error code : %d\n",err);
501 if (c=='\n') no_lchar=1;
502 fputc(c,ptr_out); /* copy to output file */
504 if (no_lchar>1) { /* reading RTPS message*/
506 if (c=='\n') no_lchar=1;
508 if ((no_lchar>5) && (no_lchar<57)) { /* converted data from */
509 if ((rtps_msg_c[0]!=0) && (isxdigit(c))) { /* position 6 to 56 */
510 rtps_msg_c[1]=(uint8_t)c;
511 rtps_msg[rtps_msg_ptr++]=(uint8_t)strtol(rtps_msg_c,NULL,16);
514 if ((rtps_msg_c[0]==0) && (isxdigit(c))) rtps_msg_c[0]=(uint8_t)c;
519 if ((no_lchar==1) && (isxdigit(c))) no_lchar++; /* is begin RTPS line ? */