7 #include <typedefs_defines_rtps.h>
10 FILE *ptr_in, *ptr_out;
13 /**********************************************************************************/
14 void conv_u32(u_int32_t *x,u_int8_t ef) {
15 #if __BYTE_ORDER == __LITTLE_ENDIAN
17 #elif __BYTE_ORDER == __BIG_ENDIAN
22 /**********************************************************************************/
23 void print_obj(void *obj) {
24 fprintf(ptr_out," (");
25 switch (bswap_32(*((u_int32_t*)obj))) {
27 fprintf(ptr_out,"ManagedApplicaton or Manager");
29 case OID_WRITE_APPSELF:
30 fprintf(ptr_out,"Write appself");
33 fprintf(ptr_out,"Write app");
36 fprintf(ptr_out,"Read app");
39 fprintf(ptr_out,"Write mgr");
42 fprintf(ptr_out,"Read mgr");
45 fprintf(ptr_out,"Write publ");
48 fprintf(ptr_out,"Read publ");
51 fprintf(ptr_out,"Write subs");
54 fprintf(ptr_out,"Read subs");
57 fprintf(ptr_out,"unknown");
60 fprintf(ptr_out,")\n");
63 /**********************************************************************************/
64 void print_app(u_int8_t app) {
66 case MANAGEDAPPLICATION:
67 fprintf(ptr_out,"(managed application)\n");
70 fprintf(ptr_out,"(manager)\n");
73 fprintf(ptr_out,"(unknown class)\n");
78 /**********************************************************************************/
79 void decode_parametr_sequence(u_int8_t *msg) {
87 while(*((ParameterId*)msg)!=PID_SENTINEL) {
88 printf("id%d,len%d\n",*((ParameterId*)msg),*((ParameterLength*)(msg+2)));
89 if ((*((ParameterLength*)(msg+2)))==0) break;
90 switch(*(ParameterId*)msg) {
92 fprintf(ptr_out," PID_PAD :\n");
94 case PID_EXPIRATION_TIME:
95 ts=*((NtpTime*)(msg+4));
96 fprintf(ptr_out," PID_EXPIRATION_TIME : %u,%u\n",
97 ts.seconds,ts.fraction);
100 ts=*((NtpTime*)(msg+4));
101 fprintf(ptr_out," PID_PERSISTENCE : %u,%u\n",
102 ts.seconds,ts.fraction);
104 case PID_MINIMUM_SEPARATION:
105 ts=*((NtpTime*)(msg+4));
106 fprintf(ptr_out," PID_MINIMUM_SEPARATION : %u,%u\n",
107 ts.seconds,ts.fraction);
110 fprintf(ptr_out," PID_TOPIC :\n");
112 //len of message is also in message (first ulong)
113 l=(*(u_int32_t*)(msg+4))+4;
118 fprintf(ptr_out," : ");
119 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
121 for(i=j;i<8;i++) fprintf(ptr_out," ");
124 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
125 fprintf(ptr_out,"\n");
129 fprintf(ptr_out," PID_STRENGTH : %u\n",
130 *(u_int32_t*)(msg+4));
133 fprintf(ptr_out," PID_TYPE_NAME :\n");
135 //len of message is also in message (first ulong)
136 l=(*(u_int32_t*)(msg+4))+4;
141 fprintf(ptr_out," : ");
142 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
144 for(i=j;i<8;i++) fprintf(ptr_out," ");
147 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
148 fprintf(ptr_out,"\n");
151 case PID_TYPE_CHECKSUM:
152 fprintf(ptr_out," PID_TYPE_CHECKSUM : %u\n",
153 *(TypeChecksum*)(msg+4));
155 case RTPS_PID_TYPE2_NAME:
156 fprintf(ptr_out," RTPS_PID_TYPE2_NAME :\n");
158 case RTPS_PID_TYPE2_CHECKSUM:
159 fprintf(ptr_out," RTPS_PID_TYPE2_CHECKSUM :\n");
161 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
162 fprintf(ptr_out," PID_MATATRAFFIC_MULTICAST_IPADDRESS : %u.%u.%u.%u\n",
163 msg[7],msg[6],msg[5],msg[4]);
165 case PID_APP_IPADDRESS:
166 fprintf(ptr_out," PID_APP_IPADDRESS : %u.%u.%u.%u\n",
167 msg[7],msg[6],msg[5],msg[4]);
169 case PID_METATRAFFIC_UNICAST_PORT:
170 fprintf(ptr_out," PID_METATRAFFIC_UNICAST_PORT : %u\n",
173 case PID_USERDATA_UNICAST_PORT:
174 fprintf(ptr_out," PID_USERDATA_UNICAST_PORT : %u\n",
177 case PID_EXPECTS_ACK:
178 fprintf(ptr_out," PID_EXPECTS_ACK : %u\n",
179 *(u_int32_t*)(msg+4));
181 case PID_USERDATA_MULTICAST_IPADDRESS:
182 fprintf(ptr_out," PID_USERDATA_MULTICAST_IPADDRESS : %u.%u.%u.%u\n",
183 msg[7],msg[6],msg[5],msg[4]);
185 case PID_MANAGER_KEY:
186 fprintf(ptr_out," PID_MANAGER_KEY : 0x%02x%02x%02x%02x (%u.%u.%u.%u)\n",
187 msg[7],msg[6],msg[5],msg[4],msg[7],msg[6],msg[5],msg[4]);
189 case PID_SEND_QUEUE_SIZE:
190 fprintf(ptr_out," PID_SEND_QUEUE_SIZE : %u\n",
191 *(u_int32_t*)(msg+4));
193 case PID_PROTOCOL_VERSION:
194 pv=*((ProtocolVersion*)(msg+4));
195 fprintf(ptr_out," PID_PROTOCOL_VERSION : %u.%u\n",
199 vid=*((VendorId*)(msg+4));
200 fprintf(ptr_out," PID_VENDOR_ID : %u.%u\n",
201 vid.major,vid.minor);
203 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
204 sn=*((SequenceNumber*)(msg+4));
205 fprintf(ptr_out," PID_VARGAPPS_SEQUENCE_NUMBER_LAST : %u\n",sn.low);
207 case PID_RECV_QUEUE_SIZE:
208 fprintf(ptr_out," PID_RECV_QUEUE_SIZE : %u\n",
209 *(u_int32_t*)(msg+4));
211 case PID_RELIABILITY_OFFERED:
212 fprintf(ptr_out," PID_RELIABILITY_OFFERED : %u\n",
213 *(u_int32_t*)(msg+4));
215 case PID_RELIABILITY_REQUESTED:
216 fprintf(ptr_out," PID_RELIABILITY_REQUESTED : %u\n",
217 *(u_int32_t*)(msg+4));
220 fprintf(ptr_out," unknow paramerId : %d len : %d\n",
221 *((ParameterId*)msg),*((ParameterLength*)(msg+2)));
224 msg+=(*((ParameterLength*)(msg+2)))+4; /* next message */
226 msg+=(*((ParameterLength*)(msg+2)))+4; /* message end*/
230 /**********************************************************************************/
231 int decode_header(u_int8_t *msg, unsigned len, MessageInterpret *mi) {
232 if (len<16) return -1; /* message is to small */
233 if (msg[0]!='R') return -2; /* header is invalid */
234 if (msg[1]!='T') return -2; /* header is invalid */
235 if (msg[2]!='P') return -2; /* header is invalid */
236 if (msg[3]!='S') return -2; /* header is invalid */
237 mi->sourceVersion=*((ProtocolVersion*)(msg+4)); /* ProtocolVersion */
238 mi->sourceVendorId=*((VendorId*)(msg+6)); /* Vendor Id */
239 mi->sourceHostId=*((HostId*)(msg+8)); /* Host Id */
240 mi->sourceAppId=*((AppId*)(msg+12)); /* App Id */
241 mi->haveTimestamp=0; /* false */
245 /**********************************************************************************/
246 int decode_submessage(u_int8_t *msg, int ptr, MessageInterpret *mi) {
249 ObjectId roid,woid,oid;
250 SequenceNumber fsn,lsn,wsn;
257 switch ((SubmessageId)msg[ptr]) {
259 fprintf(ptr_out," PAD\n");
262 fprintf(ptr_out," VAR\n");
263 fprintf(ptr_out," h-bit : %d\n",(msg[ptr+1] & 8) ? 1:0);
264 fprintf(ptr_out," alive-bit : %d\n",(msg[ptr+1] & 4) ? 1:0);
265 fprintf(ptr_out," p-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
266 roid=*((ObjectId*)(msg+ptr+4));
267 fprintf(ptr_out," ObjectId : %d.%d.%d.%02x",
268 *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
270 woid=*((ObjectId*)(msg+ptr+8));
271 fprintf(ptr_out," ObjectId : %d.%d.%d.%02x",
272 *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
274 if (msg[ptr+1] & 8) {
275 hid=*((HostId*)(msg+ptr+12)); /* hostId */
276 aid=*((AppId*)(msg+ptr+16)); /* appId */
277 fprintf(ptr_out," HostId : %d.%d.%d.%d\n",
278 *(u_int8_t*)&hid,*(((u_int8_t*)&hid)+1),*(((u_int8_t*)&hid)+2),*(((u_int8_t*)&hid)+3));
279 fprintf(ptr_out," AppId : %d.%d.%d.%d ",
280 *(u_int8_t*)&aid,*(((u_int8_t*)&aid)+1),*(((u_int8_t*)&aid)+2),*(((u_int8_t*)&aid)+3));
281 print_app(*(((u_int8_t*)&aid)+3));
284 oid=*((ObjectId*)(msg+ptr+12+ptr_off));
285 fprintf(ptr_out," ObjectId : %d.%d.%d.%02x",
286 *(u_int8_t*)&oid,*(((u_int8_t*)&oid)+1),*(((u_int8_t*)&oid)+2),*(((u_int8_t*)&oid)+3));
288 wsn=*((SequenceNumber*)(msg+ptr+16+ptr_off));
289 fprintf(ptr_out," sequenceNumber : %u\n",wsn.low);
290 if (msg[ptr+1] & 2) {
291 decode_parametr_sequence(msg+ptr+24+ptr_off);
295 fprintf(ptr_out," ISSUE\n");
296 roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
297 fsn=*((SequenceNumber*)(msg+ptr+12));
298 fprintf(ptr_out," p-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
299 fprintf(ptr_out," readerObjectId : %d.%d.%d.%02x",
300 *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
302 fprintf(ptr_out," writeObjectId : %d.%d.%d.%02x",
303 *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
305 fprintf(ptr_out," issueSeqNumber : %u\n",fsn.low);
307 if (msg[ptr+1] & 2) {
308 decode_parametr_sequence(k); /* after k is set to end of paramseq. */
310 // l=(*(unsigned*)(msg+ptr+2))-(k-(msg+ptr+20)+16);
311 //len of message is also in message (first ulong), internaly defined by RTI !!!
312 l=(*(u_int32_t*)k)+4;
317 fprintf(ptr_out," : ");
318 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
320 for(i=j;i<8;i++) fprintf(ptr_out," ");
323 for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
324 fprintf(ptr_out,"\n");
328 fprintf(ptr_out," ACK\n");
329 roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
330 fprintf(ptr_out," final-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
331 fprintf(ptr_out," readerObjectId : %d.%d.%d.%02x",
332 *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
334 fprintf(ptr_out," writeObjectId : %d.%d.%d.%02x",
335 *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
337 fprintf(ptr_out," bitmap : %u/%u:",*((u_int32_t*)(msg+ptr+16)),
338 *((u_int32_t*)(msg+ptr+20)));
339 for(i=0;i<msg[ptr+20]/8;) {
340 for(j=128;j!=0;j>>=1) fprintf(ptr_out,"%d",(msg[ptr+24+i] & j) ? 1:0);
341 fprintf(ptr_out," ");
342 if ((!(++i % 4)) && (i<msg[ptr+20]/8))
343 fprintf(ptr_out,"\n :");
345 fprintf(ptr_out,"\n");
348 fprintf(ptr_out," HEARTBEAT\n");
349 roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
350 fsn=*((SequenceNumber*)(msg+ptr+12));lsn=*((SequenceNumber*)(msg+ptr+20));
351 fprintf(ptr_out," final-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
352 fprintf(ptr_out," readerObjectId : %d.%d.%d.%02x",
353 *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
355 fprintf(ptr_out," writeObjectId : %d.%d.%d.%02x",
356 *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
358 fprintf(ptr_out," firstSeqNumber : %u\n",fsn.low);
359 fprintf(ptr_out," lastSeqNumber : %u\n",lsn.low);
362 fprintf(ptr_out," GAP\n");
363 roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
364 fsn=*((SequenceNumber*)(msg+ptr+12));
365 lsn=*((SequenceNumber*)(msg+ptr+20));
366 fprintf(ptr_out," readerObjectId : %d.%d.%d.%02x",
367 *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
369 fprintf(ptr_out," writeObjectId : %d.%d.%d.%02x",
370 *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
372 fprintf(ptr_out," firstSeqNumber : %u\n",fsn.low);
373 fprintf(ptr_out," bitmap : %u/%u:",lsn.low,
374 *((u_int32_t*)(msg+ptr+28)));
375 for(i=0;i<(*((u_int32_t*)(msg+ptr+28)));i++) {
376 l=((*(((u_int32_t*)(msg+ptr+32))+i/32)) & (1<<(31-i%32))) ? 1:0;
377 fprintf(ptr_out,"%d",l);
379 fprintf(ptr_out,"\n");
382 fprintf(ptr_out," INFO_TS\n");
383 fprintf(ptr_out," i-bit : %d\n",(msg[ptr+1] & 2) ? 1:0);
384 if (!(msg[ptr+1]&2)) {
385 mi->timestamp=*((NtpTime*)(msg+ptr+4));
386 fprintf(ptr_out," ntpTimeStamp : %u,%u\n",
387 mi->timestamp.seconds,mi->timestamp.fraction);
391 fprintf(ptr_out," INFO_SRC\n");
394 fprintf(ptr_out," INFO_REPLY\n");
395 ipa=*((u_int32_t*)(msg+ptr+4)); /* unicastReplyIPAddress */
396 port=*((u_int32_t*)(msg+ptr+8)); /* unicastReplyPort */
397 fprintf(ptr_out," unicastReplyIPAddress : %d.%d.%d.%d\n",
398 *(u_int8_t*)&ipa,*(((u_int8_t*)&ipa)+1),*(((u_int8_t*)&ipa)+2),*(((u_int8_t*)&ipa)+3));
399 fprintf(ptr_out," unicastReplyPort : %u\n",port);
400 if (ipa!=IPADDRESS_INVALID) {
401 mi->unicastReplyIPAddress=ipa;
403 mi->unicastReplyPort=port;
404 if ((msg[ptr+1] & 0x02) !=0) {
405 ipa=*((u_int32_t*)(msg+ptr+12)); /* multicastReplyIPAddress */
406 port=*((u_int32_t*)(msg+ptr+16)); /* multicastReplyPort */
407 fprintf(ptr_out," multicastReplyIPAddress : %d.%d.%d.%d\n",
408 *(u_int8_t*)&ipa,*(((u_int8_t*)&ipa)+1),*(((u_int8_t*)&ipa)+2),*(((u_int8_t*)&ipa)+3));
409 fprintf(ptr_out," multicastReplyPort : %u\n",port);
410 mi->multicastReplyIPAddress=ipa;
411 mi->multicastReplyPort=port;
413 mi->multicastReplyIPAddress=IPADDRESS_INVALID;
414 mi->multicastReplyPort =PORT_INVALID;
418 fprintf(ptr_out," INFO_DST\n");
419 hid=*((HostId*)(msg+ptr+4)); /* hostId */
420 aid=*((AppId*)(msg+ptr+8)); /* appId */
421 fprintf(ptr_out," HostId : %d.%d.%d.%d\n",
422 *(u_int8_t*)&hid,*(((u_int8_t*)&hid)+1),*(((u_int8_t*)&hid)+2),*(((u_int8_t*)&hid)+3));
423 fprintf(ptr_out," AppId : %d.%d.%d.%d ",
424 *(u_int8_t*)&aid,*(((u_int8_t*)&aid)+1),*(((u_int8_t*)&aid)+2),*(((u_int8_t*)&aid)+3));
425 print_app(*(((u_int8_t*)&aid)+3));
428 fprintf(ptr_out," undefined submessage code\n");
435 /**********************************************************************************/
436 int main(int argc, char * argv[]) {
437 u_int8_t rtps_msg[16384],rtps_msg_c[3]={0,0,0};
438 unsigned rtps_msg_ptr=0,rtps_msg_len,rtps_submsg_cnt,submsg_len;
439 int err,c,no_lchar=1;
442 printf("-------------------------------------------------------------------------------\n");
443 printf(" RTPS messages decoder OCERA project \n");
445 printf("-------------------------------------------------------------------------------\n");
447 printf(" syntax : decode_msg 'filename to decode' 'output file'\n\n");
450 printf(" decode file : %s\n output file : %s\n\n",argv[1],argv[2]);
451 ptr_in = fopen(argv[1],"r"); /* open input file */
452 if (ferror(ptr_in)) {
453 printf(" unable to open %s\n",argv[1]);
455 ptr_out = fopen(argv[2],"w"); /* create output file */
456 if (ferror(ptr_out)) {
457 printf(" unable to create %s\n",argv[2]);
459 while ((c = fgetc(ptr_in)) !=EOF) { /* read one character */
460 if (((no_lchar==1) && (!isdigit(c))) || (no_lchar==0)) { /* outside RTPS line */
461 if (rtps_msg_ptr) { /* proc. data read data ? */
462 rtps_msg[rtps_msg_ptr]=0; /* end of rtps data */
463 rtps_msg_len=rtps_msg_ptr;rtps_msg_ptr=0;
464 printf(" message length : %d\n",rtps_msg_len);
465 /* decoded message - msg stored in rtps_msg, length msg in rtps_msg_len */
466 if ((err=decode_header(rtps_msg,rtps_msg_len,&mi))==0) {
467 fprintf(ptr_out,"message length : %d\n",rtps_msg_len);
468 fprintf(ptr_out," Header\n");
469 fprintf(ptr_out," protocol version : %d.%d \
470 \n vendorId : %d.%d \
471 \n hostId : %d.%d.%d.%d \
472 \n appId : %d.%d.%d.%d ",
473 mi.sourceVersion.major,mi.sourceVersion.minor,mi.sourceVendorId.major,
474 mi.sourceVendorId.minor,*(u_char*)&mi.sourceHostId,*(((u_char*)&mi.sourceHostId)+1),
475 *(((u_char*)&mi.sourceHostId)+2),*(((u_char*)&mi.sourceHostId)+3),*(((u_char*)&mi.sourceAppId)),
476 *(((u_char*)&mi.sourceAppId)+1),*(((u_char*)&mi.sourceAppId)+2),*(((u_char*)&mi.sourceAppId)+3));
477 print_app(*(((u_char*)&mi.sourceAppId)+3));
478 rtps_msg_ptr=16;rtps_submsg_cnt=1;
480 fprintf(ptr_out," Submessage : %d",rtps_submsg_cnt++);
481 if ((rtps_msg_ptr+3)<=rtps_msg_len) { /* len. submessage header is OK */
482 submsg_len=rtps_msg[rtps_msg_ptr+2]+rtps_msg[rtps_msg_ptr+3]*0x100;
483 fprintf(ptr_out," len : %d\n",submsg_len+4);
484 if ((submsg_len+rtps_msg_ptr+3)<=rtps_msg_len) {
485 /* decode submessage */
486 decode_submessage(rtps_msg,rtps_msg_ptr,&mi);
487 rtps_msg_ptr+=submsg_len+4;
488 } else rtps_msg_ptr=rtps_msg_len; /* submessage is too small */
490 rtps_msg_ptr=rtps_msg_len; /* submessage is too small */
491 fprintf(ptr_out,"\n");
493 } while (rtps_msg_ptr<rtps_msg_len);
495 fprintf(ptr_out,"invalid header - error code : %d\n",err);
500 if (c=='\n') no_lchar=1;
501 fputc(c,ptr_out); /* copy to output file */
503 if (no_lchar>1) { /* reading RTPS message*/
505 if (c=='\n') no_lchar=1;
507 if ((no_lchar>5) && (no_lchar<57)) { /* converted data from */
508 if ((rtps_msg_c[0]!=0) && (isxdigit(c))) { /* position 6 to 56 */
509 rtps_msg_c[1]=(u_int8_t)c;
510 rtps_msg[rtps_msg_ptr++]=(u_int8_t)strtol(rtps_msg_c,NULL,16);
513 if ((rtps_msg_c[0]==0) && (isxdigit(c))) rtps_msg_c[0]=(u_int8_t)c;
518 if ((no_lchar==1) && (isxdigit(c))) no_lchar++; /* is begin RTPS line ? */