diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp index 077f6cb..926d781 100644 --- a/src/device/DeviceManager.cpp +++ b/src/device/DeviceManager.cpp @@ -91,7 +91,7 @@ void DeviceManager::initDevice() emit initializeFinished(); return; } - dmsmq_init(); + dmsmq_init(0); // empty scan connect(EventCenter::Default(), &EventCenter::RequestEmptyScan, [=](QObject* sender, QObject* detail) diff --git a/src/device/dms_mq.h b/src/device/dms_mq.h index 770b281..2cded94 100644 --- a/src/device/dms_mq.h +++ b/src/device/dms_mq.h @@ -1,6 +1,8 @@ #ifndef _DMS_MQ_H_ #define _DMS_MQ_H_ +#define MAX_MQBLK_NO 5 + enum{ MQERR_DISCONNECT = -1, MQERR_FULL = -2, @@ -12,8 +14,8 @@ enum{ MQERR_THDERR = -8, }; -//初始化DMS的MQ序列 -int dmsmq_init( void ); +//初始化DMS的MQ序列 with_debug = 0, 不启用MQ的Debug日志, 1 启用MQ的debug日志 +int dmsmq_init( int with_debug ); //接收DMS的MQ序列,阻塞方式。 // srvid 服务ID diff --git a/src/device/libdms_mq.cpp b/src/device/libdms_mq.cpp index 93a2124..a903e8f 100644 --- a/src/device/libdms_mq.cpp +++ b/src/device/libdms_mq.cpp @@ -2,11 +2,16 @@ #include #include #include +#include +#include +#include #include #include #include #include +#include +#include #include "dms_mq.h" @@ -55,13 +60,92 @@ typedef struct{ pthread_t pid = 0; +int fd_mqlog = -1; + +int mqlog( const char *fmt, ... ) +{ + if( fd_mqlog < 0 ){ + return -1; + } + + char buf[ 4096 ] = { 0x00 }; + int len = 0; + + struct timespec time; + struct tm now; + struct timeval tv; + clock_gettime(CLOCK_REALTIME, &time); + localtime_r(&time.tv_sec, &now); + gettimeofday( &tv, NULL ); + len = sprintf( buf, "\nGUI : %04d-%02d-%02d %02d:%02d:%02d.%03d :: ", + now.tm_year + 1900, now.tm_mon + 1, now.tm_mday, + now.tm_hour, now.tm_min, now.tm_sec, ( int )( tv.tv_usec / 1000 ) ); + + va_list args; + va_start(args, fmt); + len += vsprintf( buf + len, fmt, args ); + va_end( args ); + + write( fd_mqlog, ( void* )buf, len ); + + + return 0; +} + + +int mqlogx( uint8_t *data, int dlen, const char *fmt, ... ) +{ + if( fd_mqlog < 0 ){ + return -1; + } + + char buf[ 4096 ] = { 0x00 }; + int len = 0; + + struct timespec time; + struct tm now; + struct timeval tv; + clock_gettime(CLOCK_REALTIME, &time); + localtime_r(&time.tv_sec, &now); + gettimeofday( &tv, NULL ); + len = sprintf( buf, "\nGUI : %04d-%02d-%02d %02d:%02d:%02d.%03d :: ", + now.tm_year + 1900, now.tm_mon + 1, now.tm_mday, + now.tm_hour, now.tm_min, now.tm_sec, ( int )( tv.tv_usec / 1000 ) ); + + va_list args; + va_start(args, fmt); + len += vsprintf( buf + len, fmt, args ); + va_end( args ); + + len += sprintf( buf + len, "ASCII Dump : " ); + for( int idx = 0; idx < dlen; idx++ ){ + if( data[ idx ] >= 0x20 && data[ idx ] <= 0x7E ) + len += sprintf( buf + len, "%c", data[ idx ] ); + else + len += sprintf( buf + len, " " ); + } + + len += sprintf( buf + len, "\nHEX Dump: " ); + for( int idx = 0; idx < dlen; idx++ ){ + len += sprintf( buf + len, "%02X ", data[ idx ] ); + } + len += sprintf( buf + len, "\n" ); + + write( fd_mqlog, ( void* )buf, len ); + + return 0; +} + + + + void *fn_heart( void *arg ) { uint32_t cnt = 0; for( ; ; ){ cnt++; - dmsmq_send( USRV_HEARTBEAT, ACT_HB_BEAT, ( uint8_t* )( &cnt ), sizeof( cnt ) ); + // dmsmq_send( USRV_HEARTBEAT, ACT_HB_BEAT, ( uint8_t* )( &cnt ), sizeof( cnt ) ); // printf( "GUI Run cnt = %d\r", cnt ); // fflush( stdout ); sleep( 1 ); @@ -69,11 +153,22 @@ void *fn_heart( void *arg ) } //初始化DMS的MQ序列 -int dmsmq_init( void ) +int dmsmq_init( int with_debug ) { + if( with_debug ){ + system( "touch /mnt/mqlog_gui.log; chmod 777 /mnt/mqlog_gui.log" ); + fd_mqlog = open( "/mnt/mqlog_gui.log", O_RDWR | O_APPEND ); + if( fd_mqlog < 0 ){ + printf( "\n\nGUI fd_mqlog open failed....\n\n" ); + }else{ + printf( "\n\nGUI fd_mqlog open success....\n\n" ); + } + } + msgid_c2s = msgget( ( key_t)MSG_C2S, IPC_CREAT | 0600 ); if( msgid_c2s == -1 ){ perror( "Msgid C2S create error" ); + mqlog( "Msgid C2S create error" ); return MQERR_NOMSGID; } printf( "MSGID C2S = %d\n", msgid_c2s ); @@ -81,6 +176,7 @@ int dmsmq_init( void ) msgid_s2c = msgget( ( key_t)MSG_S2C, IPC_CREAT | 0600 ); if( msgid_s2c == -1 ){ perror( "Msgid S2C create error" ); + mqlog( "Msgid S2C create error" ); return MQERR_NOMSGID; } printf( "MSGID S2C = %d\n", msgid_s2c ); @@ -116,6 +212,7 @@ int dmsmq_init( void ) } } + // FIXME 创建心跳线程监测状态 printf( "Start to create heartbeat thread.\n" ); if( pid == 0 ){ if( pthread_create( &pid, NULL, fn_heart, NULL ) < 0 ){ @@ -174,25 +271,36 @@ int dmsmq_recv( int *srvid, int *actid, uint8_t *data ) if( ret == -1 ){ printf( "msgrecv error! msgid_s2c = %d\n", msgid_s2c ); perror( "MSGRECV : " ); + mqlog( "MQ Recv Error %d\n", ret ); msgid_s2c = msgget( ( key_t)MSG_S2C, IPC_CREAT | 0600 ); if( msgid_s2c == -1 ){ perror( "Msgid C2S create error" ); + mqlog( "Msgid C2S create error\n" ); return MQERR_NOMSGID; } printf( "MSGID S2C = %d\n", msgid_s2c ); + mqlog( "MSGID S2C = %d\n", msgid_s2c ); return MQERR_LOSTMSG; } // hexdump( mbuf->data, ret, "mbuf->data hexdump: " ); - - if( ret < sizeof( prot_dbg_t ) ) + if( ret < 1024 ) + mqlogx( mbuf->data, ret, "MQ RX [ %d - %d ][ %d ] : \n", mbuf->data[ 1 ], mbuf->data[ 2 ], ret ); + else + mqlog( "MQ RX data size is out of range [ %d ]...\n", ret ); + + if( ret < sizeof( prot_dbg_t ) ){ + mqlog( "MQ RX data len too small! [ %d ]\n", ret ); return MQERR_PACKERR; + } prot_dbg_t *prot = ( prot_dbg_t* )( mbuf->data ); int head = prot->head; int tail = ( mbuf->data )[ ret - 1 ]; - if( head != DBG_HEAD || tail != DBG_TAIL ) + if( head != DBG_HEAD || tail != DBG_TAIL ){ + mqlog( "MQ RX head or tail error!\n" ); return MQERR_PACKERR; + } *srvid = prot->srvid; *actid = prot->actid; if( prot->len > 0 ) @@ -207,7 +315,6 @@ int dmsmq_recv( int *srvid, int *actid, uint8_t *data ) // data 发送数据指针 // len 发送数据长度 // 返回值 0 成功,< 0 异常信息 - int dmsmq_send( int srvid, int actid, uint8_t *data, int len ) { uint8_t buf[ 4096 ] = { 0x00 }; @@ -227,14 +334,17 @@ int dmsmq_send( int srvid, int actid, uint8_t *data, int len ) struct msqid_ds mds; if( msgctl( msgid_c2s, MSG_STAT, &mds ) < 0 ){ perror( "Get mq info failed..." ); + mqlog( "MQ TX : Get mq info failed...\n" ); return MQERR_MSGCTL_FAILED; } - if( mds.msg_qnum > 2 ){ + if( mds.msg_qnum > MAX_MQBLK_NO ){ printf( "MQ Blocked!\n" ); + mqlog( "MQ TX : MQ Blocked!\n" ); return MQERR_BLOCKED; } - int trytime = 1; + mqlogx( mbuf->data, dlen, "MQ TX [ %d - %d ] [ %d ] : \n", srvid, actid, dlen ); + int trytime = 2; while( trytime-- >= 0 ){ // printf( "mbuf type : %d, data : %s, dlen = %d\n", mbuf->type, mbuf->data + 5, dlen ); // printf( "mbuf type : %d, dlen = %d [ %d ]\n", mbuf->type, dlen, len ); @@ -243,9 +353,11 @@ int dmsmq_send( int srvid, int actid, uint8_t *data, int len ) // printf( "[%d / %d ]mbuf type : %d, data : %s, dlen = %d\n", trytime, msgid_c2s, mbuf->type, mbuf->data + 5, dlen ); // printf( "Error no : %d ", errno ); perror( "msgsnd error!" ); - msgid_c2s = msgget( ( key_t)MSG_S2C, IPC_CREAT | 0600 ); + mqlog( "MQ TX msgsnd error!" ); + msgid_c2s = msgget( ( key_t)MSG_C2S, IPC_CREAT | 0600 ); if( msgid_c2s < 0 ){ perror( "Msgid S2C create error" ); + mqlog( "MQ TX Msgid S2C create error\n" ); usleep( 10 * 1000 ); continue; } @@ -256,14 +368,13 @@ int dmsmq_send( int srvid, int actid, uint8_t *data, int len ) } if( trytime < 0 ){ + mqlog( "MQ TX failed...\n" ); return MQERR_DISCONNECT; } return 0; } - - int dmsmq_sendx( int srvid, int actid, uint8_t *data, int len ) { uint8_t buf[ 4096 ] = { 0x00 }; @@ -281,8 +392,6 @@ int dmsmq_sendx( int srvid, int actid, uint8_t *data, int len ) ( mbuf->data )[ len + 5 ] = DBG_TAIL; dlen = 5 + len + 1; - - struct msqid_ds mds; if( msgctl( msgid_c2s, MSG_STAT, &mds ) < 0 ){ perror( "Get mq info failed..." );