USB协议

1.操作文件扫描

文件扫描按以下顺序(因安卓文件权限问题,文件可能需要映射到app私有目录)

*/udisk/*/vsfile

*/usb/*/vsfile

/storage/*/vsfile

/mnt/*/vsfile

2.数据传输

2.1 打开文件

设备检测到文件被打开,准备写入实时流

int fd =open(filepath,"w+")

2.2 读取线程

帧头

enum packet_type{
    CMD = 0,
    VIDEO = 1,
    VOICE = 2
};

typedef struct packet {
    unsigned char type; // 帧类型 packet_type
    int length; // 帧内容长度(不包含帧头)
    int index; // 帧序号,递增
} USB_FRAME_PACKET;

备注:

帧头数据固定512字节,其于补0(部分设备有限制),帧内容跟在帧头之后 app读到帧间隔 10ms

3.指令

指令定义

typedef struct cmd{
    unsigned char Type;     /*0 app->device ,1 device->app*/
    unsigned char bRequest; /*指令类型*/
    short wValue; // 指令值
    short wIndex; // 指令操作index(如分页获取文件列表)
    short wLength; // 指令长度(不包含指令头)
} USB_CMD_PACKET;

指令说明 指令内容放在USB_CMD_PACKET之后(sizeof(USB_CMD_PACKET)) 指令总长度为512字节倍数,至少512字节,不足补0

app发送指令 app封装USB_CMD_PACKET并写入描述符 fd

设备返回 (至少512字节,不足补0) USB_FRAME_PACKET(512) + USB_CMD_PACKET(512+) 等待读取指令结果并判定指令结果bRequest是否与写入指令一致

无数据指令通用返回结果

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 1;
    packet->bRequest = bRequest; // 与app发送给设备一致
    packet->wValue = 1/0 ;

3.0 获取设备信息 (bRequest 0x11)

app发送获取设备信息指令

app发送

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 0;
    packet->bRequest = 0x11;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回

    byte[] data = new byte[0x0c];
    // 预览分辨率宽度
    data[0] = (byte) (width & 0xff);
    data[1] = (byte) (width >> 8 & 0xff);

    // 预览分辨率宽度
    data[2] = (byte) (height & 0xff);
    data[3] = (byte) (height >> 8 & 0xff);

    // 编码格式 0 mjpeg, 1 h264, 2 h265
    data[4] = (byte) (codec & 0xff);

    // 回放方式 0 指令, 1 u盘盘符
    data[5] = (byte) (hour & 0xff);

    memset(cmdbuffer, 0, CMD_DATA_LEN);
    int length = data.length;
    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 0;
    packet->bRequest = 0x11;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = length;

3.1 同步时间(bRequest 0x1c)

app发送当前时间到记录仪

    byte[] data = new byte[0x0c];
    data[0] = (byte) (year & 0xff);
    data[1] = (byte) (year >> 8 & 0xff);

    data[2] = (byte) (month & 0xff);
    data[3] = (byte) (month >> 8 & 0xff);

    data[4] = (byte) (day & 0xff);
    data[5] = (byte) (day >> 8 & 0xff);

    data[6] = (byte) (hour & 0xff);
    data[7] = (byte) (hour >> 8 & 0xff);

    data[8] = (byte) (minute & 0xff);
    data[9] = (byte) (minute >> 8 & 0xff);

    data[10] = (byte) (sencond & 0xff);
    data[11] = (byte) (sencond >> 8 & 0xff);

    memset(cmdbuffer, 0, CMD_DATA_LEN);
    int length = 0x0c;
    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 0;
    packet->bRequest = 0x1c;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = length;

设备返回 见:无数据指令结果

3.2 获取所有状态(bRequest 0x55)

定时获取设备状态

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 0;
    packet->bRequest = 0x55;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    char *data = NULL;
    memset(data, 0, 4);
    packet->Type = 1;
    packet->bRequest = 0x55;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = 0x04;

备注 data[0] 0/1 录音状态 data[1] 0/1 tf卡状态 data[2] 0/1 录像状态 data[3] 0/1 加锁状态

3.3 开启录制(bRequest 0x15)

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 1;
    packet->bRequest = 0x15;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回 见:无数据指令结果

3.4 关闭录制(bRequest 0x16)

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 0;
    packet->bRequest = 0x16;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回 见:无数据指令结果

3.5 开/关录音(bRequest 0x17)

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 1;
    packet->bRequest = 0x17;
    packet->uiValue = 0/1; // 0 关闭录音 1 开启录音
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回 见:无数据指令结果

3.6 格式化存储卡(bRequest 0x18)

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 1;
    packet->bRequest = 0x18;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回 见:无数据指令结果

3.7 获取版本号(bRequest 0x49)

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 0;
    packet->bRequest = 0x49;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    char *data = NULL;
    memset(data, 0, 0x0f);
    // 版本号字符串
    packet->Type = 0;

    packet->bRequest = 0x49;
    packet->uiValue = 0;
    packet->uiIndex = 0;
    packet->wLength = 0x0f;

data: 版本号字符串

3.8 图像上下翻转(bRequest 0x45)

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 1;
    packet->bRequest = 0x45;
    packet->uiValue = 0/1; // 0 不翻转 1 翻转
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回 见:无数据指令结果

3.9 图像左右翻转(bRequest 0x46)

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 1;
    packet->bRequest = 0x46;
    packet->uiValue = 0/1; // 0 不翻转 1 翻转
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回 见:无数据指令结果

3.10 加/解锁(bRequest 0x48)

app发送数据

    USB_CMD_PACKET packet = (USB_CMD_PACKET) cmdbuffer;
    packet->Type = 1;
    packet->bRequest = 0x48;
    packet->uiValue = 0/1; // 0 解锁 1 加锁
    packet->uiIndex = 0;
    packet->wLength = 0;

设备返回 见:无数据指令结果

Copyright © 智阳软件 2023修订时间: 2023-12-25 19:56:07

results matching ""

    No results matching ""