利用RTIDDS发送图像数据,发送端分为多包发送,接收端进行数据整合并显示到label上

//包头
/*========================================================================================================
* 结构定义:RE_ReqGetRadarDetectTargetInfo_t
* 用    途:雷达分包数包头信息
* 消息类型:
* 备    注:
========================================================================================================*/
struct ImagePackageHeader_t
{
    unsigned long uTransPackageSize; //当前包大小

    unsigned long uDataSize; //数据总大小

    unsigned long uDataPackageNum; //数据被分成包的个数

    unsigned long uDataPackageCurrIndex; //数据包当前的帧号

    unsigned long uDataPackageOffset; //数据包在整个数据中的偏移
    
    unsigned long lImageWidth;    // 图像宽
    
    unsigned long lImageHeight;    // 图像高 
};

/*========================================================================================================
* 结构定义:RE_ReqRadarImageDataInfo_t
* 用    途:获取当前雷达仿真目标图像
* 消息类型:
* 备    注:
========================================================================================================*/
    struct RE_ReqRadarImageDataInfo_t
    {
        long lPlatformID;    // 来自哪个平台探测的目标
        ImagePackageHeader_t stImagePackageHeader; //发送包头的信息
        sequence<octet,IMAGE_SEQUENCE_MAX_LENGTH> seqImageDatas;
    };


// 发送图像
{

    const unsigned int nDDSMaxSize = 20000; //定义DDS一次最大发送多少数据 

    QScreen * pScreenshot = QGuiApplication::primaryScreen();
    HWND hRadarWindow = FindWindowA(NULL, "Ondulus Radar Display");
    if(NULL == hRadarWindow)
    {
        printf("Find Radar Window handle Errno !");
        return false;
    }

    QPixmap mRadarWindowImage = pScreenshot->grabWindow(WId(hRadarWindow)); //保存雷达窗口的图像

    mRadarWindowImage = mRadarWindowImage.copy(143, 140, mRadarWindowImage.width() - 285, mRadarWindowImage.height() - 280);

    pstDetectTargetInfo = TS_Data::RE_ReqRadarImageDataInfo_tTypeSupport::create_data();

    pstDetectTargetInfo->seqImageDatas.maximum(TS_Data::IMAGE_SEQUENCE_MAX_LENGTH);
      
    //发送图像数据
    QBuffer qtbuffer;
    qtbuffer.open(QIODevice::ReadWrite);
    mRadarWindowImage.save(&qtbuffer, "jpg");
    int nDataLength = qtbuffer.data().size();//图片Byte大小,即表示图片大小
    const char * wDataBuffer = qtbuffer.data().data(); //将QByteArray数据类型转换
    int nPacketNum = 0; //该图片一共分了多少个包发送
    int nlastPaketSize = 0;//最后一个包的大小
    nPacketNum = nDataLength / nDDSMaxSize;//nDDSMaxSize定义一个包的大小
    nlastPaketSize = nDataLength % nDDSMaxSize;//最后一个包的大小
    int nCurrentPacketIndex = 0;//当前包的ID

    if(nlastPaketSize != 0)//如果最后一个包不是空,
        nPacketNum = nPacketNum + 1;//总包数+1,即数据不满也算一个包

    PackageHeader packageHead;//定义一个包头,方便接收的时候区分
    packageHead.uDataSize = nDataLength;//数据总大小
    packageHead.uDataPackageNum = nPacketNum;//图片被分成几个包发送

    while(nCurrentPacketIndex < nPacketNum)//当前包的ID小于总的包数,说明没传完数据,即可以继续传
    {
        char wFrameBuffer[1024 * 100];

        memset(wFrameBuffer, 0, 1024 * 100);//清零

        if(nCurrentPacketIndex < (nPacketNum - 1))//数据量够nDDSMaxSize的长度,也就是此时不是发的最后一个包
        {
            packageHead.uTransPackageSize = nDDSMaxSize;//当前包大小
            packageHead.uDataPackageCurrIndex = nCurrentPacketIndex + 1;//当前包ID默认是0,+1使开始ID为1
            packageHead.uDataPackageOffset = nCurrentPacketIndex * nDDSMaxSize;//偏移量
            memcpy(wFrameBuffer, wDataBuffer + packageHead.uDataPackageOffset, nDDSMaxSize);//将数据部分赋值给容器

            //发送数据 数据保存在wFrameBuffer中
            pstDetectTargetInfo->seqImageDatas.ensure_length(packageHead.uTransPackageSize, TS_Data::IMAGE_SEQUENCE_MAX_LENGTH);

            DDS_Octet*  pContBuff = pstDetectTargetInfo->seqImageDatas.get_contiguous_buffer();

            for(int i = 0; i < packageHead.uTransPackageSize; i++)
                pContBuff[i] = wFrameBuffer[i];

            nCurrentPacketIndex++;

            pstDetectTargetInfo->stImagePackageHeader.uDataSize = nDataLength;
            pstDetectTargetInfo->stImagePackageHeader.uTransPackageSize = packageHead.uTransPackageSize;
            pstDetectTargetInfo->stImagePackageHeader.uDataPackageCurrIndex = packageHead.uDataPackageCurrIndex;
            pstDetectTargetInfo->stImagePackageHeader.uDataPackageOffset = packageHead.uDataPackageOffset;
            pstDetectTargetInfo->stImagePackageHeader.uDataPackageNum = packageHead.uDataPackageNum;
            pstDetectTargetInfo->stImagePackageHeader.lImageHeight = mRadarWindowImage.height();
            pstDetectTargetInfo->stImagePackageHeader.lImageWidth = mRadarWindowImage.width();

            m_opubReqSendRadarCurImageInfo.SendData(pstDetectTargetInfo);

        }
        //这个部分发送的是最后一个包,有可能是不够一个包长度的
        else
        {
            //当前包大小(最后一个包的大小)包头大小?+?剩余数据的大小
            packageHead.uTransPackageSize = nDataLength - nCurrentPacketIndex * nDDSMaxSize;
            //数据包当前的帧号
            packageHead.uDataPackageCurrIndex = nCurrentPacketIndex + 1;
            //数据包在整个数据中的偏移
            packageHead.uDataPackageOffset = nCurrentPacketIndex * nDDSMaxSize;
            //memcpy(wFrameBuffer, &packageHead, sizeof(PackageHeader));//将包头赋值给char*
            //将数据体的一个包的长度赋值给cahr*
            memcpy(wFrameBuffer, wDataBuffer + packageHead.uDataPackageOffset, nDataLength - nCurrentPacketIndex * nDDSMaxSize);

            pstDetectTargetInfo->seqImageDatas.ensure_length(packageHead.uTransPackageSize , TS_Data::IMAGE_SEQUENCE_MAX_LENGTH);

            DDS_Octet*  pContBuff = pstDetectTargetInfo->seqImageDatas.get_contiguous_buffer();

            for(int i = 0; i < packageHead.uTransPackageSize; i++)
                pContBuff[i] = wFrameBuffer[i];
            
            nCurrentPacketIndex++;

            pstDetectTargetInfo->stImagePackageHeader.uDataSize = nDataLength;
            pstDetectTargetInfo->stImagePackageHeader.uTransPackageSize = packageHead.uTransPackageSize;
            pstDetectTargetInfo->stImagePackageHeader.uDataPackageCurrIndex = packageHead.uDataPackageCurrIndex;
            pstDetectTargetInfo->stImagePackageHeader.uDataPackageOffset = packageHead.uDataPackageOffset;
            pstDetectTargetInfo->stImagePackageHeader.uDataPackageNum = packageHead.uDataPackageNum;
            pstDetectTargetInfo->stImagePackageHeader.lImageHeight = mRadarWindowImage.height();
            pstDetectTargetInfo->stImagePackageHeader.lImageWidth = mRadarWindowImage.width();

            m_opubReqSendRadarCurImageInfo.SendData(pstDetectTargetInfo);

        }
    }

    TS_Data::RE_ReqRadarImageDataInfo_tTypeSupport::delete_data(pstDetectTargetInfo);

    return true;

}
    
// 接收图像
    if ( 0 == stRadarImageData.stImagePackageHeader.uDataSize )
        return false;

    PackageHeader  stPackageHead;
    stPackageHead.uTransPackageSize = stRadarImageData.stImagePackageHeader.uTransPackageSize;
    stPackageHead.uDataSize = stRadarImageData.stImagePackageHeader.uDataSize;
    stPackageHead.uDataPackageNum = stRadarImageData.stImagePackageHeader.uDataPackageNum;
    stPackageHead.uDataPackageCurrIndex = stRadarImageData.stImagePackageHeader.uDataPackageCurrIndex;
    stPackageHead.uDataPackageOffset = stRadarImageData.stImagePackageHeader.uDataPackageOffset;

    QByteArray data((char *)stRadarImageData.seqImageDatas.get_contiguous_buffer(), stRadarImageData.seqImageDatas.length());
    static int iNum = 1;
    static uint uiSize = 0;

    if ( stPackageHead.uDataPackageCurrIndex == iNum )//判断是否是第几个包
    {
        iNum++;
        uiSize += stPackageHead.uTransPackageSize;
        //如果当前包数据超过1024*100,说明数据过大,不是需要的数据
        if ( uiSize > 1024 * 100 )
        {
            iNum = 1;
            uiSize = 0;
            return false;
        }
        //如果当前包数据偏移量超过1024*100,说明数据过大,不是需要的数据
        if ( stPackageHead.uDataPackageOffset > 1024 * 100 )
        {
            stPackageHead.uDataPackageOffset = 0;
            iNum = 1;
            uiSize = 0;
            return false;
        }
        memcpy(s_wImageFramBuff + stPackageHead.uDataPackageOffset, data.data(), stPackageHead.uTransPackageSize);//将数据部分赋值到数据容器里
    }
    else
    {
        iNum = 1;
        uiSize = 0;

        memset(s_wImageFramBuff, 0, sizeof(char) * 1024 * 100);
        return false;
    }

    if ( (stPackageHead.uDataPackageNum == stPackageHead.uDataPackageCurrIndex) && (uiSize == stPackageHead.uDataSize) )
    {

        QByteArray RadarImagedata(s_wImageFramBuff, stPackageHead.uDataSize);
        static QImage image;
        image.loadFromData(RadarImagedata, "jpg");

        IteractController::s_pRadarImage = &image;

        iNum = 1;
        uiSize = 0;
        memset(s_wImageFramBuff, 0, sizeof(char) * 1024 * 100);
        return true;
    }
    return true;

 

posted @ 2020-04-25 13:55  骄傲到自负  阅读(984)  评论(0)    收藏  举报