⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rcv_process.c

📁 通过车载终端采集GPS数据
💻 C
字号:
#include "typedef.h"
#include "struct_def.h"
#include "string.h"
#include "common_function.h"
#include "Trans_process.h"
#include "Rcv_process.h"
#include "global.h" 
#include "message.h"
#include "centerinterface.h"
#include "menuprocess.h"
#include "photo.h"
#include "systemmanager.h"
#include "16c554.h"
extern PROTOCOL_SEND_BUFFER sbuf;
extern DWord serial_number;

/*消息合法性检验*/
Uchar verify_process(void)
{
    char *ptra;/*调试用*/
    char * ptr;
    Uchar  *pl;
    Word   chksum;
    Uchar rsync[4];
    Uchar sync[4] = "NJPT";
    unsigned int len = 0;
    ptra = sbuf.buf[5];/*调试用*/ ;
    if(udp_receive(&ptr) == 0)/*有无消息判断*/
    {
        return(0);
    }
    else
    {
        memcpy(rsync, ptr, 4);
        pl = (ptr+12);
        len = ((*(ptr+11))<<8)+(*(ptr+10));
        chksum = 0;
        while(len--)
        {
            chksum += *pl++;
        }
        if( (compare(rsync,sync,4)==0) && (*(ptr+9) == (Uchar)(chksum >> 8)) && (*(ptr+8) == (Uchar)chksum)  )/*同步判断与校验和判断*/
        {
            return(1);  
        }
        else
        {
            return(0);
        }    
    }
}

/*判断调度类型*/
void judge(Int8 *ptr,Uchar command_type)
{
    Uchar len;
    long msgNo;
    unsigned char tmp;
    
    len = *(ptr + 10);
    len = len - 20;
    msgNo = *((long*)(ptr+12));
    switch(command_type)
    {
        case 1:
            message_write(1, (ptr+32), len, msgNo);               
            break;
            
        case 4: 
                /*daily(ptr+33,len-1);*/
                message_write(3, ptr+33, len-1, msgNo);
                break;
                
        case 7: 
            /*alarm_judge((ptr+32),len-1);*/
            message_write(2, (ptr+33), len-1, msgNo);
            break;
                
        case 2:
        case 3:
        case 5: 
        case 6: 
            break;
                
        case 8:
            tmp = *(ptr + 32);
            if(tmp== '1')
            {
                tmp = RUN_NORMAL;
                set_work_state(&tmp);
            }
            else if( tmp == '3' )
            {
                tmp = RUN_NOTASK;
                set_work_state(&tmp);
            }

            if ((tmp >= '1') && (tmp <= '4'))
            {
                if (1 == is_saveswitchmode())
                   set_loginmsg_response(len, ptr+32, *(Word*)(ptr+6)); 
            }
            else
                set_loginmsg_response(len, ptr+32, *(Word*)(ptr+6));
            break;
            
        case 9:
            tmp = *(ptr + 32);
            if(tmp== '1')
                tmp = RUN_NORMAL;
            if( tmp=='2')
                tmp = RUN_NOTASK;
            
            set_work_state(&tmp);
            break;
            
        default:
            break; 
    }
    return;
}

/*应答消息处理*/
void res_process(Int8 *ptr)
{
    Uchar rtype;
    Uchar num[4];
    PROTOCOL_SEND_BUFFER * message_info;
    message_info = &sbuf;
    memcpy(num, (ptr+12),4);
    if (ptr[6] == 0x0c)
    {
        photo_setPacketState(ptr[18]-1);
    }
    else if(((rtype=*(ptr+7)) == (sbuf.buf[0][7]+0x40)) && (compare(num,&(sbuf.buf[0][12]),4) == 0))/*找出对应的请求消息*/
    {
        Byte msgLen, tmpLen, tmpValue;
        tmpValue = ptr[23];
        sbuf.valid[0] = 0;
        if (ptr[6] == 0x03)
        {
            if (tmpValue == 0xdd)
            {
                set_systemlandflag(); 
                     
                msgLen = ptr[10];
                if (msgLen >= 30)
                {
                    msgLen -= 12;
                    tmpLen = 0;
                    while (tmpLen <= (msgLen-18))
                    {
                        add_alarmOneZone(ptr+12+12+tmpLen);
                        tmpLen += 18;
                    }
                }
            }
        }
    }   
}

/*收到的请求消息处理*/
/*********************************************
*陈剑修改:添加远程程序更新处理;时间06-12-16
*********************************************/
void command_process(Int8 *ptr)
{
    Uchar command_type;
    unsigned int auto_time;    
    Uchar sync[4]="NJPT";
    Uchar rtype[2];
    Uchar update_type;
    Uchar re_value;
    Uchar send_block[2];
    Uchar mess_num[4];
    
    rtype[0] = *(ptr+7) + 0x40;
    rtype[1] = *(ptr+6);
    memcpy(mess_num,ptr+12,4);
    switch(rtype[1])/*选择对应的应答消息打包*/
    {
        case 1: res_direct_message(mess_num);
                command_type = *(ptr+31);
                judge(ptr,command_type);/*判断调度类型*/
                break;
        case 2: res_seeconfiguer_message(mess_num);
                
                auto_time = ptr[34] * 256 + ptr[33];
                set_keyArea_value(auto_time, ptr[32], ptr[35], ptr[36]);
             /*   set_auto_time( &auto_time );
                set_online_time( ptr+32 );
                set_arrive_meter( ptr+35 );
                set_left_meter( ptr+36 );*/
                break;
        case 3: res_seeposition_message(mess_num);
                break;
        case 4: res_seeterminal_message(mess_num);
                break;
        case 5: update_type = *(ptr + 16);
                memcpy(send_block,ptr+31,2);  
                if(*(ptr+30) == 0x01)
                {
                            res_update_message( mess_num, send_block, update_type, re_value = 0x06);
                        //    update_firmware(update_type, up_flag = 5, ptr);
                }
                else if(*(ptr+30) == 0x04)
                {
                            res_update_message( mess_num, send_block, update_type, re_value = 0x06);
                       //     update_firmware(update_type, up_flag = 4, ptr);
                }
                else
                {
                            res_update_message( mess_num, send_block, update_type, re_value = 0x15);
                }
                break;
        case 6: res_seeconfugure_message(mess_num);
            break;

        /*******add by cj******/
        case 7:
            res_update_program(ptr);
            break;
        /******end of add*****/
        case 0x0A: /*requir telephone list*/
            res_requir_telephone_list_message(mess_num);
            break;

        case 0x0B:  /*configure telephone list*/
            res_configure_telephone_list_message(mess_num);
            set_telephone_list(ptr+32);
            break;
        case 0x0e: /*photo request*/
            photostart_photo(mess_num);
            res_photo_message(mess_num);
            break;
        case 0x0f:/*photo stop*/
            res_photostop_message(mess_num);
            photo_stopphoto();
            break;
        default:return;
    }
    return;
}


/*接收处理*/
void serverRcv_process(void)
{
    char * ptr;
    Uchar rtype[2]; 
    if(verify_process()==0)
    {
        udp_start_receive();
    }
    else
    {
        udp_receive(&ptr);
        memcpy(rtype, (ptr+7), 1);
        if(rtype[0]==0x60)
        {
            res_process(ptr);
            udp_start_receive(); 
        }
        else if(rtype[0]==0x08)
        {
            command_process(ptr);
            udp_start_receive();            

        }
        else
        {
            udp_start_receive(); 
        }
    }
    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -