【经验】桃芯科技提供网页版Log记录器可通过BLE蓝牙从空中抓取Trace数据
Trace对于分析协议栈流程问题非常重要。考虑到蓝牙设备的多样性,Trace数据的导出、记录由开发者在应用里实现。作为参考,桃芯科技SDK里提供了SWD、UART两种“有线”方式,Wizard能够自动生成相关代码(https://ingchips.gitee.io/user_guide/tutorial.html#common-functions-page)。在某些情况下,“有线”方式可能难以使用,得益于桃芯科技蓝牙soc芯片ING918xx EFlash的应用内编程(In-Application Programming,或称自编程,Self Programming)特性,可以先将Trace保存到Flash里(https://ingchips.gitee.io/blog/2021-12-04-sdk-6.7-new/#5-trace-到-flash-的使用方法),然后导出。
还有一条通道可以用来导出数据:BLE空口。本文介绍如何通过BLE从空中抓取Trace数据。针对本文提供的参考实现,桃芯科技提供了网页版Log记录器。(https://ingchips.gitee.io/web_apps/air_trace/index_cn.html)
说明:该功能相关代码将(或已)在版本8.0.0中发布,参考UART GATT Console示例。在版本发布之前,开发者可以按照需要将本文提供的方法加入已有的项目中。
注意:本方法仅用调试。强烈不建议在量产产品中保留此功能,以免泄露敏感信息。
目前存在的四种导出/记录Trace数据的方法总结如下:
总体思路
1.定义Trace服务,包含一个Trace Data特性(Characteristics);
2.实现Trace事件的回调,将数据写入一个环形缓冲区;
3.当缓冲区内数据积累到一定量时,通过Trace Data特性发送数据。
接口定义
我们将该功能跟GATT Profile做隔离,定义以下接口。
//初始化。
// msg_id 用于 `btstack_push_user_msg`
// req_thres 用于控制 `btstack_push_user_msg` 的调用时机
void trace_air_init(trace_air_t *ctx, uint32_t msg_id, uint8_t req_thres);
//当用于Trace的BLE连接建立时,使能;当连接断开时,禁用
// conn_handle为连接句柄
// value_handle为Trace Data的句柄
void trace_air_enable(trace_air_t *ctx, int enable, uint16_t conn_handle, uint16_t value_handle);
//在收到msg_id这条用户消息时,调用该函数发送Trace数据
void trace_air_send(trace_air_t *ctx);
//Trace事件的回调
uint32_t cb_trace_air(const platform_evt_trace_t *trace, trace_air_t *ctx);
具体实现
定义Trace Service
上下文信息
上下文信息的定义如下,主要包含环形缓冲区,句柄信息和状态:
typedef struct
{
// 环形缓冲区
uint8_t buffer[TRACE_BUFF_SIZE];
uint16_t write_next;
uint16_t read_next;
SemaphoreHandle_t mutex;
uint32_t msg_id;
uint16_t value_handle;
uint16_t conn_handle;
uint8_t req_thres;
uint8_t enabled:1;
uint8_t msg_sent:1; //防止重复调用btstack_push_user_msg
} trace_air_t;
cb_trace_air
cb_trace_air 与 trace.c 模块的 cb_trace_uart 相似,唯一需要注意的是需要丢弃用于Trace的BLE连接上的ACL数据:
uint32_t cb_trace_air(const platform_evt_trace_t *trace, trace_air_t *ctx)
{
#pragma pack (push, 1)
typedef struct
{
uint32_t A;
uint32_t B;
uint8_t id;
uint8_t tag;
} header_t;
if (trace->len1 == sizeof(header_t))
{
const header_t *p = (const header_t *)trace->data1;
if ((p->id == PLATFORM_TRACE_ID_HCI_ACL) && (p->tag == (ctx->conn_handle << 1)))
return 0;
}
#pragma pack (pop)
uint16_t next;
int free_size;
uint8_t use_mutex = !IS_IN_INTERRUPT();
if (use_mutex)
xSemaphoreTake(ctx->mutex, portMAX_DELAY);
next = ctx->write_next;
free_size = ctx->read_next - ctx->write_next;
if (free_size <= 0) free_size += TRACE_BUFF_SIZE;
if (free_size > 0) free_size--;
free_size -= trace->len1;
free_size -= trace->len2;
if (free_size < 0)
{
if (use_mutex)
xSemaphoreGive(ctx->mutex);
trace_air_send_req(ctx);
return 0;
}
next = trace_add_buffer(ctx->buffer, (const uint8_t *)trace->data1, trace->len1, next) & TRACE_BUFF_SIZE_MASK;
next = trace_add_buffer(ctx->buffer, (const uint8_t *)trace->data2, trace->len2, next) & TRACE_BUFF_SIZE_MASK;
ctx->write_next = next;
if (use_mutex) xSemaphoreGive(ctx->mutex);
if (free_size < ctx->req_thres)
trace_air_send_req(ctx);
return 0;
}
其中trace_air_send_req的参考实现如下:
static void trace_air_send_req(trace_air_t *ctx)
{
if ((0 == ctx->enabled) || ctx->msg_sent) return;
ctx->msg_sent = 1;
btstack_push_user_msg(ctx->msg_id, NULL, 0);
}
trace_air_send
trace_air_send 与 ring_buf.c 模块的 ring_buf_peek_data 类似:
static int peek_data(trace_air_t *ctx, uint8_t *data, int len, uint8_t has_more)
{
int r = 0;
int mtu = att_server_get_mtu(ctx->conn_handle) - 3;
uint8_t *p = data;
while (len)
{
int size = len > mtu ? mtu : len;
if (att_server_notify(ctx->conn_handle, ctx->value_handle, p, size))
{
break;
}
len -= size;
p += size;
r += size;
}
return r;
}
void trace_air_send(trace_air_t *ctx)
{
ctx->msg_sent = 0;
if (0 == ctx->enabled) return;
uint32_t read_next = ctx->read_next;
const uint32_t write_next = ctx->write_next;
while (read_next != write_next)
{
int cnt = read_next > write_next ? sizeof(ctx->buffer) - read_next : write_next - read_next;
int has_more = read_next > write_next ? 1 : 0;
int c = peek_data(ctx, ctx->buffer + read_next, cnt, has_more);
if (c < 1)
break;
read_next += c;
if (read_next >= sizeof(ctx->buffer)) read_next = 0;
}
ctx->read_next = read_next;
}
- |
- +1 赞 0
- 收藏
- 评论 0
本文由ll转载自桃芯科技官网,原文标题为:蓝牙开发零门槛之十一-通过 BLE 抓取 Trace,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
为ING916搭建Zephyr开发环境
对于ING916/ING918 的NoOS 软件包,可以使用 Zephyr OS作为实时内核。SDK v8.4.1 提供了完整的 Controller 接口,可以对接 Zephyr BLE Host 协议栈。这里桃芯科技将为ING916 搭建 Zephyr 开发环境。在这个环境下,开发者可以使用 Zephyr RTOS 及其 BLE 协议栈。
设计经验 发布时间 : 2024-09-09
【经验】桃芯科技蓝牙5.1芯片ING918xx的SDK介绍及其hello 世界示例
INGCHIPS(桃芯科技)为客户提供易用的SDK,帮助客户便捷、高效地开发蓝牙产品。该SDK支持目前桃芯的ING918xx系列所有蓝牙5.1芯片。本文将介绍该SDK及其hello 世界的示例。
设计经验 发布时间 : 2022-09-18
【经验】桃芯科技ING91881B蓝牙开发板基本操作介绍
桃芯科技支持蓝牙5.0、5.1的ING918X系列芯片,主要用于汽车,电网,医疗,定位,高端消费等泛工业场景。支持蓝牙5.3的ING916系列芯片覆盖消费场景,包括可穿戴,HID,ARVR,智能家居等等。本文介绍ING91881B开发板的一些基本操作。
设计经验 发布时间 : 2022-09-17
【视频】桃芯科技BLE+UWB+NFC三合一汽车钥匙,完美解决10厘米安全定位
型号- ING91871B,ING91881B,ING91682C,ING91870C,ING91680C,ING91880C,ING91888A,ING91870CQ
桃芯科技低功耗蓝牙(BLE SoC)选型表
桃芯科技提供低功耗蓝牙芯片(BLE SoC),车规级低功耗蓝牙芯片/工规级低功耗蓝牙芯片/消费级低功耗蓝牙芯片;通讯方式:BLE+2.4G;RAM:128KB,80KB;Flash:512KB
产品型号
|
品类
|
封装
|
尺寸(mm)
|
RAM(KB)
|
Flash(KB)
|
LE 1M
|
LE 2M
|
Long Range
|
ADV Extension
|
内部晶振(KHz)
|
GPIO Number
|
ADC Channel
|
通讯方式
|
规格分类
|
BLE协议
|
适用温度(℃)
|
主要接口
|
ING91870C
|
低功耗蓝牙芯片
|
QFN32
|
4.0mm*4.0mm*0.75mm,pitch=0.40mm
|
128KB
|
512KB
|
LE 1M
|
LE 2M
|
Long Range
|
ADV Extension
|
32KHz
|
13
|
2
|
BLE+2.4G
|
工规级蓝牙BLE
|
BLE 5.0
|
-40℃~125℃
|
IO MUX: Uart/I2C/SPI/PWM/GPIO
|
选型表 - 桃芯科技 立即选型
桃芯科技(INGCHIPS)BLE芯片选型表
描述- 桃芯科技是一家致力于高端物联网芯片国产化的芯片设计公司。现阶段主要研发基于自主蓝牙协议栈的低功耗BLE5.0、5.1、5.3 SoC芯片。同时,可提供基于自研BLE芯片的完整参考设计方案。支持蓝牙5.0、5.1的ING918X系列芯片,主要应用于汽车,电网,医疗,定位,高端消费等泛工业场景。支持蓝牙5.3的ING916系列芯片覆盖更多消费场景,包括可穿戴,Mesh,ESL,HID,AR,VR,智能家居等等。
型号- ING91871B,ING91881B,ING91682C,ING91870C,ING91680C,ING91880C,ING91888A,ING91870CQ
桃芯科技ING9XX系列蓝牙SoC用在APPLE Findmy Network Accessory
桃芯科技的ING9XX系列BLE芯片成功通过苹果授权的第三方机构进行的各项合规性验证,该系列芯片已经全面兼容Find My network accessory的功能要求,可为第三方硬件产品提供高效快速寻找丢失物品的低功耗蓝牙应用方案。
应用方案 发布时间 : 2024-04-22
【应用】桃芯科技ING918X低功耗蓝牙SOC帮助客户实现智能烧烤探针实时温度上报需求,工温高达125℃
智能烧烤领域对BLE SOC的要求在于高温环境中的稳定性、低功耗等特性。桃芯科技ING918x系列芯片作为工规/车规级BLE SOC ,稳定工作温度高达125℃,并拥有优秀的功耗表现,完全可以cover客户应用。支持BLE5.0&BLE5.1全特性自研协议栈,集成了32位RISC MCU,16KB ROM,128KB RAM,512KB嵌入式eFlash和丰富的外设资源。
应用方案 发布时间 : 2023-09-08
【应用】桃芯科技蓝牙芯片ING9188助力电子全站仪,支持蓝牙5.0/5.1,实测最大传输距离可达370米
全站仪是建筑行业常用的一种工具,用于建筑测量,随着当前科技发展,目前已经从纯机械向电子化、自动化发展。本文介绍桃芯科技新出ING9188系列蓝牙芯片可实现实测最大传输距离370米,助力电子全站仪的设计和开发。
应用方案 发布时间 : 2023-01-19
桃芯科技欢迎您参加世界智能网联汽车大会,将携低功耗蓝牙车规级SoC芯片及汽车数字车钥匙解决方案参展
桃芯科技是一家致力于车规级,工规级通信芯片的Fabless芯片设计公司。现阶段主要研发基于自主蓝牙协议栈的低功耗BLE5.0、5.1、5.3、5.4 SoC芯片。同时,可提供基于自研BLE芯片的完整参考设计方案。
原厂动态 发布时间 : 2023-09-22
桃芯科技携BLE5.3蓝牙芯片ING916X亮相“硬核中国芯领袖峰会“并获2022年度最佳通讯类芯片奖
2022年11月15日,桃芯科技携全新BLE5.3蓝牙芯片ING916X系列通信芯片在“硬核中国芯领袖峰会”上精彩亮相并荣获“2022年度最佳通讯类芯片”:配置浮点MCU,具有超低功耗、主从一体多连接,支持标准和非标AoA/AoD,超高吞吐率等特性。
原厂动态 发布时间 : 2022-12-21
INGCHIPS Announced Smarter, Cooler, Smaller ING918xx Series BLE5.1 SoC with Sensitivity Reaching 102dB@125kbps
INGCHIPS recently released series low-power Bluetooth 5.1 SoC, ING918xx. The ING918xx series of chips, based on the concept of smarter, low power and smaller, have better performance in terms of BLE5.1 features, RF characteristics, low power consumption and overall chip specifications against the international top products.
产品 发布时间 : 2023-09-01
【产品】桃芯科技新推国产车规级低功耗SoC芯片ING91870CQ,支持定位,主频达48MHz
ING91870CQ是桃芯科技新发布的一款车规级低功耗SoC芯片。该芯片历经9个月的可靠性测试,最终获得AEC-Q100的测试认证。ING91870CQ是一款32pin,QFN32 4x4的封装的BLE5.1SoC。
新产品 发布时间 : 2022-09-23
电子商城
服务
世强深圳实验室提供Robei EDA软件免费使用服务,与VCS、NC-Verilog、Modelsim等EDA工具无缝衔接,将IC设计高度抽象化,并精简到三个基本元素:模块、引脚、连接线,自动生成代码。点击预约,支持到场/视频直播使用,资深专家全程指导。
实验室地址: 深圳 提交需求>
提供蓝牙BLE芯片协议、蓝牙模块、蓝牙成品测试认证服务;测试内容分Host主机层,Controller控制器层,Profile应用层测试。支持到场/视频直播测试,资深专家全程指导。
实验室地址: 深圳 提交需求>
登录 | 立即注册
提交评论