1.前言
因为最近负责的是蓝牙相关的项目,难免和HCI日志打交道,很多时候由于测试经常开关蓝牙,导致手机端生成的HCI比较零散,有个时候就需要用ellisys打开几份日志,不免有些麻烦。之前的blog不是有用C语言实现批量修改文件类型嘛,所以这次就想着能不能用C语言写个合并HCI日志的程序。结果,哈哈,花了周日整整一天,才完成了,尴尬,中间确实犯了不少的低级错误。
2.HCI日志文件简单介绍
HCI日志即蓝牙的Host层与Control层之间信息交互记录。通过HCI日志可以看出两个蓝牙设备之间互相发送的指令,一般用于定位蓝牙控制过程中发生的异常问题;
我们实现合并HCI日志首先需要了解的就是它的文件结构:即包含了文件头File Header及其包记录Packet recored的格式的一般信息。
为什么ellisys能识别并且打开HCI日志,首先依靠的就是File Header。
File Header包含三个部分:
Identification Pattern(8 byte):就是特定的十六进制数据0x62 0x74 0x73 0x6e 0x6f 0x6f 0x70 0x0,以NULL结尾,所以它的Ascii的值为” btsnoop”;
Version Number(4 Byte):暂时为1;
Datalink Type(4 Byte):基本都是以H4方式存储,因此值为1002,由于是大端存储,所以它的16进制即为0x000003EA。
以16进制文件格式打开HCI日志文件会发现最开始的16个字节都是上面的文件头:
然后就是Packet record,由于和我们C语言编写关系不大,我就只贴出它的包结构,而不对每个进行讲解啦~
3.C语言实现
好了,看到这里不知道大家对于合并HCI日志有没有思路了(反正笔者看到这里可就想到啦)。
我们需要: “第一个HCI日志的 (File Header + Packet record) + 之后HCI日志的Packet record” 。
核心的代码如下:
int main(void)
{
unsigned char flag = 0;
int i = 0;
if ((fTarget = fopen("All_Btsnoop.log", "wb"))==NULL) {
printf("Target file cannot be created!");
return 0;
}
if ((fHandle = _findfirst("*btsnoop*", &fileinfo)) == -1L) {
printf("当前目录下没有HCI文件\n");
system("pause");
return 0;
} else {
do {
if(flag == 0) {
if((fsource = fopen(fileinfo.name, "rb")) == NULL) {
printf("Fail to open file!\n");
system("pause");
}
if(!IsSnoopFile(fsource)) {
printf("存在虽然是btsnoop文件名但不是HCI日志!\n");
fclose(fsource);
continue;
} else {
fseek(fsource, 0, SEEK_SET);
}
if(IsSuccessWriteToTargetFile(fsource)) {
fclose(fsource);
flag=1;
} else {
printf("失败!未成功读取文件到末尾!\n");
return 0;
}
} else {
if((fsource = fopen(fileinfo.name, "rb")) == NULL) {
printf("Fail to open file!\n");
system("pause");
}
if(!IsSnoopFile(fsource)) {
printf("存在虽然是btsnoop文件名但不是HCI日志!\n");
fclose(fsource);
continue;
}
if(IsSuccessWriteToTargetFile(fsource)) {
fclose(fsource);
} else {
printf("失败!未成功读取文件到末尾!\n");
return 0;
}
}
}while(_findnext(fHandle, &fileinfo) == 0);
}
fclose(fTarget);
return 1;
}
4.使用方法
将源码生成的可执行文件(exe)文件放入需要合并的HCI日志的目录下,双击即可;
5.完整源码获取
完整源码中还包括必要的注释,需要学习的同学可以通过如下两个途径获取:
1.下载我的资源:https://download.csdn.net/download/weixin_46582567/86720864
2.关注我们的公众号“脑补空间”,发送“HCI日志合并C语言源码”获取~