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;
设备返回 见:无数据指令结果