下载
中文
注册

样例代码

/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2012-2020. All rights reserved.
 * Description:
 * Author: huawei
 * Create: 2020-10-01
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>

#include "ascend_hal.h"

/* **************************************** */
/* 取值范围 [1-96]:                         */
/* 一个 device 最多支持 96 个 session 通道,*/
/* 创建 client 时,建议传参小于等于 96      */
/* **************************************** */
#define MAX_SESSION_NUM 96

/* ************************************************************** */
/* 0:阻塞死等,如果收发通道阻塞则会等待通道空闲,死等。          */
/* 1:不阻塞,如果收发通道阻塞则不发送数据,立马返回。            */
/* 2:阻塞直到超时,如果收发通道阻塞则会等待通道空闲,直到超时。  */
/* 建议使用“2”,用户可根据实际数据发送情况选择重发或者丢弃。    */
/* ************************************************************** */
#define HDC_WAIT_TIMEOUT 2

/* ************************************************* */
/* 单位 ms;用户根据业务设置合适的收发通道超时时间值 */
/* ************************************************* */
#define HDC_SEND_RECV_WAIT_TIME 100

#define HDC_SEND_RECV_DATA_LEN 256
#define HDC_DST_PATH_LEN 256
#define HDC_CHANGE_FRAME_SIZE_TO_KB 1024

#define HDC_ERROR(fmt, ...) printf("Line: %04d. %s]" fmt "\n",  __LINE__, __func__, ## __VA_ARGS__)
#define HDC_INFO(fmt, ...) printf("[Line: %04d. %s]" fmt "\n",  __LINE__, __func__, ## __VA_ARGS__)

void usage()
{
    printf("--------------------------------------------------------------------------------------\n");
    printf( "normal channel, usage:\n"
    "\t./hdc_demo 0 server/client(1/0) dev_id(0~64) server_type(14) size(KB) loop_times \n");
    printf( "fast channel, usage:\n"
    "\t./hdc_demo 1 server/client(1/0) dev_id(0~64) server_type(14) size(KB) loop_times \n");
    printf( "send file channel, usage:\n"
    "\t./hdc_demo 2 dev_id(0~64) file \n");
    printf("--------------------------------------------------------------------------------------\n");
    printf( "normal channel, examples:\n"
    "\tserver:./hdc_demo 0 1 0 14 64 10\n"
    "\tclient:./hdc_demo 0 0 0 14 64 10\n");
    printf( "fast channel, examples:\n"
    "\tserver:./hdc_demo 1 1 0 14 64 10\n"
    "\tclient:./hdc_demo 1 0 0 14 64 10\n");
    printf( "send file channel, examples:\n"
    "\t./hdc_demo 2 0 /home/examples.txt \n");
    printf("--------------------------------------------------------------------------------------\n");
}

int normal_channel_client(int devid, int type, int size, int count)
{
    struct drvHdcMsg *pMsg = NULL;
    HDC_SESSION Session = NULL;
    HDC_CLIENT client = NULL;
    char *buffer = NULL;
    int recv_cnt;
    int ret;

    ret = drvHdcClientCreate(&client, MAX_SESSION_NUM, type, 0);
    if (ret) {
        HDC_ERROR("drvHdcClientCreate failed, ret = %d", ret);
        return -1;
    }

    buffer = (char *)malloc(size);
    if (!buffer) {
        HDC_ERROR("malloc failed, ret = %d", ret);
        goto OUT;
    }

    while (count--) {
        ret = drvHdcSessionConnect(0, devid, client, &Session);
        if (ret) {
            HDC_ERROR("drvHdcSessionConnect failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcSetSessionReference(Session);
        if (ret) {
            HDC_ERROR("drvHdcSetSessionReference failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcAllocMsg(Session, &pMsg, 1);
        if (ret) {
            HDC_ERROR("drvHdcAllocMsg failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = halHdcRecv(Session, pMsg, size, 0, &recv_cnt, 0);
        if (ret) {
            HDC_ERROR("halHdcRecv failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcReuseMsg(pMsg);
        if (ret) {
            HDC_ERROR("drvHdcReuseMsg failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcAddMsgBuffer(pMsg, buffer, size);
        if (ret) {
            HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = halHdcSend(Session, pMsg, 0, 0);
        if (ret) {
            HDC_ERROR("halHdcSend failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcFreeMsg(pMsg);
        if (ret) {
            HDC_ERROR("drvHdcFreeMsg failed, ret : %d, count : %d", ret, count);
            break;
        }
        pMsg = NULL;

        ret = drvHdcSessionClose(Session);
        if (ret) {
            HDC_ERROR("drvHdcSessionClose failed, ret : %d, count : %d", ret, count);
            break;
        }
        Session = NULL;
    }

OUT:
    if (pMsg != NULL) {
        drvHdcFreeMsg(pMsg);
    }

    if (Session != NULL) {
        drvHdcSessionClose(Session);
    }

    if (buffer != NULL) {
        free(buffer);
    }

    if (client != NULL) {
        drvHdcClientDestroy(client);
    }

    return ret;
}

int normal_channel_server(int devid, int type, int size, int count)
{
    struct drvHdcMsg *pMsg = NULL;
    HDC_SESSION Session = NULL;
    HDC_SERVER server = NULL;
    char *buffer = NULL;
    int recv_len;
    int ret;

    ret = drvHdcServerCreate(devid, type, &server);
    if (ret) {
        HDC_ERROR("drvHdcServerCreate failed, ret = %d", ret);
        return -1;
    }

    buffer = (char *)malloc(size);
    if (!buffer) {
        HDC_ERROR("malloc failed, ret = %d", ret);
        goto OUT;
    }

    while (count--) {
        ret = drvHdcSessionAccept(server, &Session);
        if (ret) {
            HDC_ERROR("drvHdcSessionAccept failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcSetSessionReference(Session);
        if (ret) {
            HDC_ERROR("drvHdcSetSessionReference failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcAllocMsg(Session, &pMsg, 1);
        if (ret) {
            HDC_ERROR("drvHdcAllocMsg failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcAddMsgBuffer(pMsg, buffer, size);
        if (ret) {
            HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = halHdcSend(Session, pMsg, 0, 0);
        if (ret) {
            HDC_ERROR("halHdcSend failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcReuseMsg(pMsg);
        if (ret) {
            HDC_ERROR("drvHdcReuseMsg failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = halHdcRecv(Session, pMsg, size, 0, &recv_len, 0);
        if (ret) {
            if (ret != DRV_ERROR_SOCKET_CLOSE)
                HDC_ERROR("halHdcRecv failed, ret : %d, count : %d", ret, count);
            break;
        }

        ret = drvHdcFreeMsg(pMsg);
        if (ret) {
            HDC_ERROR("drvHdcFreeMsg failed, ret : %d, count : %d", ret, count);
            break;
        }
        pMsg = NULL;

        ret = drvHdcSessionClose(Session);
        if (ret) {
            HDC_ERROR("drvHdcSessionClose failed, ret : %d, count : %d", ret, count);
            break;
        }
        Session = NULL;
    }

OUT:
    if (pMsg != NULL) {
        drvHdcFreeMsg(pMsg);
    }

    if (Session != NULL) {
        drvHdcSessionClose(Session);
    }

    if (buffer != NULL) {
        free(buffer);
    }

    if (server != NULL) {
        drvHdcServerDestroy(server);
    }

    return ret;
}

int normal_channel_test(int argc, char *argv[], void (*usage)(void))
{
    int server_type;
    int frame_size;
    int device_id;
    int loop_cnt;
    int mode;

    if (argc < 7) {
        usage();
        return -1;
    }

    mode = atoi(argv[2]); /* server or client */
    device_id = atoi(argv[3]);
    server_type = atoi(argv[4]);
    frame_size = atoi(argv[5]) * HDC_CHANGE_FRAME_SIZE_TO_KB; /* 将用户入参 frame 大小转化为 KB */
    loop_cnt = atoi(argv[6]);

    if (mode) {
        return normal_channel_server(device_id, server_type, frame_size, loop_cnt);
    } else {
        return normal_channel_client(device_id, server_type, frame_size, loop_cnt);
    }
}

int fast_channel_client(int devid, int type, int size, int count)
{
    unsigned long hostsendDataBuf;
    unsigned long hostrecvDataBuf;
    unsigned long hostsendCtrlBuf;
    unsigned long hostrecvCtrlBuf;
    struct drvHdcFastSendMsg smsg;
    struct drvHdcFastRecvMsg rmsg;
    struct drvHdcMsg  *pMsg = NULL;
    HDC_SESSION session = NULL;
    HDC_CLIENT client = NULL;
    void *sendDataBuf = NULL;
    void *recvDataBuf = NULL;
    void *sendCtrlBuf = NULL;
    void *recvCtrlBuf = NULL;
    char *sendbuffer = NULL;
    char *pBuf = NULL;
    int recvBufCount;
    int datalen;
    int ctrllen;
    int bufLen;
    int ret;

    ret = drvHdcClientCreate(&client, MAX_SESSION_NUM, type, 0);
    if (ret) {
        HDC_ERROR("drvHdcClientCreate failed, ret = %d", ret);
        goto _uninit;
    }

    ret = drvHdcSessionConnect(0, devid, client, &session);
    if (ret) {
        HDC_ERROR("drvHdcSessionConnect failed, ret : %d\n", ret);
        goto _destroy;
    }

    ret = drvHdcSetSessionReference(session);
    if (ret) {
        HDC_ERROR("drvHdcSetSessionReference failed, ret : %d\n", ret);
        goto _close;
    }

    ret = drvHdcAllocMsg(session, &pMsg, 1);
    if (ret) {
        HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret);
        goto _close;
    }

    sendbuffer = malloc(HDC_SEND_RECV_DATA_LEN);
    if (sendbuffer == NULL) {
        HDC_ERROR("malloc fail.\n");
        goto _free;
    }

    datalen = size;
    ctrllen = HDC_CHANGE_FRAME_SIZE_TO_KB; /*  */

    /* 快速通道申请 buffer准备 */
    sendDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_DATA, NULL, 0, datalen, devid, 0);
    recvDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_DATA, NULL, 0, datalen, devid, 0);
    sendCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_CTRL, NULL, 0, ctrllen, devid, 0);
    recvCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_CTRL, NULL, 0, ctrllen, devid, 0);
    if (!sendDataBuf || !recvDataBuf || !sendCtrlBuf || !recvCtrlBuf) {
        HDC_ERROR("drvHdcMallocEx failed, %p,%p,%p,%p\n",
            sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf);
        goto _free;
    }

    HDC_INFO("native fast channel info : datalen %d, ctrllen %d,  %p,%p,%p,%p",
        datalen, ctrllen, sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf);

    *(((unsigned long *)sendbuffer) + 0) = (unsigned long)sendDataBuf;
    *(((unsigned long *)sendbuffer) + 1) = (unsigned long)recvDataBuf;
    *(((unsigned long *)sendbuffer) + 2) = (unsigned long)sendCtrlBuf;
    *(((unsigned long *)sendbuffer) + 3) = (unsigned long)recvCtrlBuf;
    *(((unsigned long *)sendbuffer) + 4) = datalen;
    *(((unsigned long *)sendbuffer) + 5) = ctrllen;

    ret = drvHdcAddMsgBuffer(pMsg, sendbuffer, HDC_SEND_RECV_DATA_LEN);
    if (ret) {
        HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d\n", ret);
        goto _free;
    }

    /* 发送本端 快速通道的 buffer信息给到对端 */
    ret = halHdcSend(session, pMsg, 0, 0);
    if (ret) {
        HDC_ERROR("halHdcSend failed, ret : %d\n", ret);
        goto _free;
    }

    ret = drvHdcReuseMsg(pMsg);
    if (ret) {
        HDC_ERROR("drvHdcReuseMsg failed, ret : %d\n", ret);
        goto _free;
    }

    ret = halHdcRecv(session, pMsg, HDC_SEND_RECV_DATA_LEN, 0, &recvBufCount, 0);
    if (ret) {
        HDC_ERROR("halHdcRecv failed, ret : %d\n", ret);
        goto _free;
    }

    ret = drvHdcGetMsgBuffer(pMsg, 0, &pBuf, &bufLen);
    if (ret) {
        HDC_ERROR("drvHdcGetMsgBuffer failed, ret : %d\n", ret);
        goto _free;
    }

    /* 获取对端快速通道信息 */
    hostsendDataBuf = *(((unsigned long *)pBuf) + 0);
    hostrecvDataBuf = *(((unsigned long *)pBuf) + 1);
    hostsendCtrlBuf = *(((unsigned long *)pBuf) + 2);
    hostrecvCtrlBuf = *(((unsigned long *)pBuf) + 3);
    datalen = (int)(*(((unsigned long *)pBuf) + 4));
    ctrllen = (int)(*(((unsigned long *)pBuf) + 5));

    HDC_INFO("remote fast channel info : datalen %d, ctrllen %d,  %lx,%lx,%lx,%lx",
        datalen, ctrllen, hostsendDataBuf, hostrecvDataBuf, hostsendCtrlBuf, hostrecvCtrlBuf);

    drvHdcFreeMsg(pMsg);
    pMsg = NULL;
    free(sendbuffer);
    sendbuffer = NULL;

    while (count--) {
        smsg.srcDataAddr = (unsigned long long)sendDataBuf;
        smsg.dstDataAddr = hostrecvDataBuf; /* 对端的接收buffer */
        smsg.srcCtrlAddr = (unsigned long long)sendCtrlBuf;
        smsg.dstCtrlAddr = hostrecvCtrlBuf; /* 对端的接收buffer */

        smsg.dataLen = datalen;
        smsg.ctrlLen = ctrllen;

        /* 用户可根据实际数据发送情况选择重发或者丢弃;参数使用参考具体接口描述 */
        ret = halHdcFastSend(session, smsg, HDC_WAIT_TIMEOUT, HDC_SEND_RECV_WAIT_TIME);
        if (ret) {
            HDC_ERROR("halHdcFastSend failed, ret : %d\n", ret);
            break;
        }

        ret = halHdcFastRecv(session, &rmsg, 0, 0);
        if (ret) {
            HDC_ERROR("halHdcFastRecv failed, ret : %d\n", ret);
            break;
        }
    }

    HDC_INFO("fast channel time delay client finish");

_free:
    if (sendbuffer) {
        free(sendbuffer);
    }

    if (sendDataBuf) {
        drvHdcFreeEx(HDC_MEM_TYPE_TX_DATA, sendDataBuf);
    }

    if (recvDataBuf) {
        drvHdcFreeEx(HDC_MEM_TYPE_RX_DATA, recvDataBuf);
    }

    if (sendCtrlBuf) {
        drvHdcFreeEx(HDC_MEM_TYPE_TX_CTRL, sendCtrlBuf);
    }

    if (recvCtrlBuf) {
        drvHdcFreeEx(HDC_MEM_TYPE_RX_CTRL, recvCtrlBuf);
    }

    if (pMsg) {
        drvHdcFreeMsg(pMsg);
    }

    sendbuffer = NULL;
    sendDataBuf = NULL;
    recvDataBuf = NULL;
    sendCtrlBuf = NULL;
    recvCtrlBuf = NULL;
    pMsg = NULL;
_close:
    drvHdcSessionClose(session);
_destroy:
    drvHdcClientDestroy(client);
_uninit:
    return ret;
}

int fast_channel_server(int devid, int type, int size, int count)
{
    unsigned long hostsendDataBuf;
    unsigned long hostrecvDataBuf;
    unsigned long hostsendCtrlBuf;
    unsigned long hostrecvCtrlBuf;
    struct drvHdcFastSendMsg smsg;
    struct drvHdcFastRecvMsg rmsg;
    struct drvHdcMsg *pMsg = NULL;
    HDC_SESSION session = NULL;
    HDC_SERVER server = NULL;
    void *sendDataBuf = NULL;
    void *recvDataBuf = NULL;
    void *sendCtrlBuf = NULL;
    void *recvCtrlBuf = NULL;
    char *sendbuffer = NULL;
    char *pBuf = NULL;
    int recvBufCount;
    int datalen;
    int ctrllen;
    int bufLen;
    int ret;

    ret = drvHdcServerCreate(devid, type, &server);
    if (ret) {
        HDC_ERROR("drvHdcServerCreate failed, ret = %d\n", ret);
        goto _uninit;
    }

    ret = drvHdcSessionAccept(server, &session);
    if (ret) {
        HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret);
        goto _destroy;
    }

    ret = drvHdcSetSessionReference(session);
    if (ret) {
        HDC_ERROR("drvHdcSetSessionReference failed, ret : %d\n", ret);
        goto _close;
    }

    ret = drvHdcAllocMsg(session, &pMsg, 1);
    if (ret) {
        HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret);
        goto _close;
    }

    ret = halHdcRecv(session, pMsg, HDC_SEND_RECV_DATA_LEN, 0, &recvBufCount, 0);
    if (ret) {
        HDC_ERROR("halHdcRecv failed, ret : %d\n", ret);
        goto _free;
    }

    ret = drvHdcGetMsgBuffer(pMsg, 0, &pBuf, &bufLen);
    if (ret) {
        HDC_ERROR("drvHdcGetMsgBuffer failed, ret : %d\n", ret);
        goto _free;
    }

    /* 获取对端快速通道信息 */
    hostsendDataBuf = *(((unsigned long *)pBuf) + 0);
    hostrecvDataBuf = *(((unsigned long *)pBuf) + 1);
    hostsendCtrlBuf = *(((unsigned long *)pBuf) + 2);
    hostrecvCtrlBuf = *(((unsigned long *)pBuf) + 3);
    datalen = (int)(*(((unsigned long *)pBuf) + 4));
    ctrllen = (int)(*(((unsigned long *)pBuf) + 5));

    HDC_INFO("remote fast channel info : datalen %d, ctrllen %d,  %lx,%lx,%lx,%lx",
        datalen, ctrllen, hostsendDataBuf, hostrecvDataBuf, hostsendCtrlBuf, hostrecvCtrlBuf);

    /* 快速通道申请 buffer准备 */
    sendDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_DATA, NULL, 0, datalen, devid, 0);
    recvDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_DATA, NULL, 0, datalen, devid, 0);
    sendCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_CTRL, NULL, 0, ctrllen, devid, 0);
    recvCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_CTRL, NULL, 0, ctrllen, devid, 0);
    if (!sendDataBuf || !recvDataBuf || !sendCtrlBuf || !recvCtrlBuf) {
        HDC_ERROR("drvHdcMallocEx failed, %p,%p,%p,%p\n",
            sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf);
        goto _free;
    }

    sendbuffer = malloc(HDC_SEND_RECV_DATA_LEN);
    if (!sendbuffer) {
        HDC_ERROR("malloc fail.\n");
        goto _free;
    }

    *(((unsigned long *)sendbuffer) + 0) = (unsigned long)sendDataBuf;
    *(((unsigned long *)sendbuffer) + 1) = (unsigned long)recvDataBuf;
    *(((unsigned long *)sendbuffer) + 2) = (unsigned long)sendCtrlBuf;
    *(((unsigned long *)sendbuffer) + 3) = (unsigned long)recvCtrlBuf;
    *(((unsigned long *)sendbuffer) + 4) = datalen;
    *(((unsigned long *)sendbuffer) + 5) = ctrllen;

    HDC_INFO("native fast channel info : datalen %d, ctrllen %d,  %p,%p,%p,%p",
        datalen, ctrllen, sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf);

    ret = drvHdcReuseMsg(pMsg);
    if (ret) {
        HDC_ERROR("drvHdcReuseMsg failed, ret : %d\n", ret);
        goto _free;
    }

    ret = drvHdcAddMsgBuffer(pMsg, sendbuffer, HDC_SEND_RECV_DATA_LEN);
    if (ret) {
        HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d\n", ret);
        goto _free;
    }

    /* 发送本端的  快速通道的 buffer信息给到对端 */
    ret = halHdcSend(session, pMsg, 0, 0);
    if (ret) {
        HDC_ERROR("halHdcSend failed, ret : %d\n", ret);
        goto _free;
    }

    drvHdcFreeMsg(pMsg);
    pMsg = NULL;
    free(sendbuffer);
    sendbuffer = NULL;

    while (count--) {
        ret = halHdcFastRecv(session, &rmsg, 0, 0);
        if (ret) {
            HDC_ERROR("halHdcFastRecv failed, ret : %d\n", ret);
            break;
        }

        smsg.srcDataAddr = (unsigned long long)sendDataBuf;
        smsg.dstDataAddr = hostrecvDataBuf; /* 对端的接收buffer */
        smsg.srcCtrlAddr = (unsigned long long)sendCtrlBuf;
        smsg.dstCtrlAddr = hostrecvCtrlBuf; /* 对端的接收buffer */
        smsg.dataLen = datalen;
        smsg.ctrlLen = ctrllen;

        /* 用户可根据实际数据发送情况选择重发或者丢弃;参数使用参考具体接口描述 */
        ret = halHdcFastSend(session, smsg, HDC_WAIT_TIMEOUT, HDC_SEND_RECV_WAIT_TIME);
        if (ret) {
            HDC_ERROR("halHdcFastSend failed, ret : %d\n", ret);
            break;
        }
    }

    HDC_INFO("fast channel time delay server finish");

_free:
    if (sendbuffer) {
        free(sendbuffer);
    }

    if (sendDataBuf) {
        drvHdcFreeEx(HDC_MEM_TYPE_TX_DATA, sendDataBuf);
    }

    if (recvDataBuf) {
        drvHdcFreeEx(HDC_MEM_TYPE_RX_DATA, recvDataBuf);
    }

    if (sendCtrlBuf) {
        drvHdcFreeEx(HDC_MEM_TYPE_TX_CTRL, sendCtrlBuf);
    }

    if (recvCtrlBuf) {
        drvHdcFreeEx(HDC_MEM_TYPE_RX_CTRL, recvCtrlBuf);
    }

    if (pMsg) {
        drvHdcFreeMsg(pMsg);
    }

    sendbuffer = NULL;
    sendDataBuf = NULL;
    recvDataBuf = NULL;
    sendCtrlBuf = NULL;
    recvCtrlBuf = NULL;
    pMsg = NULL;
_close:
    drvHdcSessionClose(session);
_destroy:
    drvHdcServerDestroy(server);
_uninit:
    return ret;
}

int fast_channel_test(int argc, char *argv[], void (*usage)(void))
{
    int server_type;
    int frame_size;
    int device_id;
    int loop_cnt;
    int mode;

    if (argc < 7) {
        usage();  
        return -1;
    }

    mode = atoi(argv[2]); /* server or client */
    device_id = atoi(argv[3]);
    server_type = atoi(argv[4]);
    frame_size = atoi(argv[5]) * HDC_CHANGE_FRAME_SIZE_TO_KB; /* 将用户入参 frame 大小转化为 KB */
    loop_cnt = atoi(argv[6]);

    if (mode) {
        return fast_channel_server(device_id, server_type, frame_size, loop_cnt);
    } else {
        return fast_channel_client(device_id, server_type, frame_size, loop_cnt);
    }
}

int hdc_send_file_to_device(int argc, char *argv[], void (*usage)(void))
{
    char dst_path[HDC_DST_PATH_LEN] = {0};
    char *file = NULL;
    int devid;
    int ret;

    if (argc < 4) {
        usage();
        return -1;
    }

    devid = atoi(argv[2]);
    file = argv[3];

    ret = drvHdcGetTrustedBasePath(0, devid, dst_path, HDC_DST_PATH_LEN);
    if (ret) {
        HDC_ERROR("drvHdcGetTrustedBasePath failed, ret : %d\n", ret);
        return -1;
    }

    ret = drvHdcSendFile(0, devid, file, dst_path, NULL);
    if (ret) {
        HDC_ERROR("drvHdcSendFile failed, ret : %d\n", ret);
        return -1;
    }

    HDC_INFO("send file success, dst path : %s", dst_path);

    return 0;
}

int main(int argc, char *argv[])
{
    int op_type;
    int ret = -1;

    if (argc < 2) {
        usage();
        return -1;
    }

    op_type = atoi(argv[1]);
    switch (op_type) {
        case 0:
            ret = normal_channel_test(argc, argv, usage);
            break;
        case 1:
            ret = fast_channel_test(argc, argv, usage);
            break;
        case 2:
            ret = hdc_send_file_to_device(argc, argv, usage);
            break;
        default:
            usage();
            break;
    }

    HDC_INFO("Test finish. ret = %d", ret);
    return ret;
}
参见样例编译编译成可执行文件后(例如可执行文件的名字为hdc_demo),你可以通过./hdc_demo -h命令查看输入参数的详细含义,其中:
  • “server/client(1/0)”:当前执行此程序的机器为服务端的话,则配置为“1”,客户端,则为“0”。
  • “server_type”的详细含义请参见drvHdcServiceType
  • “size”:指传送的数据的大小,单位KB。
  • “loop_times”:指收发超时次数。