如何用C语言实现合并蓝牙HCI日志?

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语言源码”获取~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT狼~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值