【经验】桃芯科技提供网页版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 协议栈。
【经验】桃芯科技蓝牙5.1芯片ING918xx的SDK介绍及其hello 世界示例
INGCHIPS(桃芯科技)为客户提供易用的SDK,帮助客户便捷、高效地开发蓝牙产品。该SDK支持目前桃芯的ING918xx系列所有蓝牙5.1芯片。本文将介绍该SDK及其hello 世界的示例。
【经验】桃芯科技ING91881B蓝牙开发板基本操作介绍
桃芯科技支持蓝牙5.0、5.1的ING918X系列芯片,主要用于汽车,电网,医疗,定位,高端消费等泛工业场景。支持蓝牙5.3的ING916系列芯片覆盖消费场景,包括可穿戴,HID,ARVR,智能家居等等。本文介绍ING91881B开发板的一些基本操作。
【视频】桃芯科技BLE+UWB+NFC三合一汽车钥匙,完美解决10厘米安全定位
型号- ING91871B,ING91881B,ING91682C,ING91870C,ING91680C,ING91880C,ING91888A,ING91870CQ
ING91683C BLE5.3 SoC规格书
描述- 本资料介绍了ING91683C蓝牙低能耗(BLE5.3)系统单芯片(SoC)。该芯片符合蓝牙5.3规范,集成了调制解调器、链路层控制器和主机在内的内部BLE5.3 IP。它还集成高性能32位RISC微控制器、DSP和FPU、512KB闪存、低功耗PMU、丰富的外设和高性能低功耗BLE射频收发器。支持OTA和多启动选项,便于产品功能推广和升级。
型号- ING91683C
【应用】桃芯科技ING918X低功耗蓝牙SOC帮助客户实现智能烧烤探针实时温度上报需求,工温高达125℃
智能烧烤领域对BLE SOC的要求在于高温环境中的稳定性、低功耗等特性。桃芯科技ING918x系列芯片作为工规/车规级BLE SOC ,稳定工作温度高达125℃,并拥有优秀的功耗表现,完全可以cover客户应用。支持BLE5.0&BLE5.1全特性自研协议栈,集成了32位RISC MCU,16KB ROM,128KB RAM,512KB嵌入式eFlash和丰富的外设资源。
桃芯科技(INGCHIPS)BLE芯片选型表
型号- ING91871B,ING91881B,ING91682C,ING91680C,ING91870C,ING91880C,ING91888A,ING91870CQ
ING91682C BLE5.3 SoC规格书
描述- 本资料介绍了ING91682C蓝牙低能耗(BLE5.3)系统芯片(SoC)。该芯片符合蓝牙5.3规范,集成了Modem、链路层控制器和主机等内部BLE5.3 IP。它还集成高性能32位RISC微控制器、DSP和FPU、512KB闪存、低功耗PMU、丰富的外设和高性能低功耗BLE射频收发器。芯片支持OTA和多启动选项,便于产品功能推广和升级。
型号- ING91682C
【应用】桃芯科技蓝牙芯片ING9188助力电子全站仪,支持蓝牙5.0/5.1,实测最大传输距离可达370米
全站仪是建筑行业常用的一种工具,用于建筑测量,随着当前科技发展,目前已经从纯机械向电子化、自动化发展。本文介绍桃芯科技新出ING9188系列蓝牙芯片可实现实测最大传输距离370米,助力电子全站仪的设计和开发。
桃芯科技ING9XX系列蓝牙SoC用在APPLE Findmy Network Accessory
桃芯科技的ING9XX系列BLE芯片成功通过苹果授权的第三方机构进行的各项合规性验证,该系列芯片已经全面兼容Find My network accessory的功能要求,可为第三方硬件产品提供高效快速寻找丢失物品的低功耗蓝牙应用方案。
桃芯科技欢迎您参加世界智能网联汽车大会,将携低功耗蓝牙车规级SoC芯片及汽车数字车钥匙解决方案参展
桃芯科技是一家致力于车规级,工规级通信芯片的Fabless芯片设计公司。现阶段主要研发基于自主蓝牙协议栈的低功耗BLE5.0、5.1、5.3、5.4 SoC芯片。同时,可提供基于自研BLE芯片的完整参考设计方案。
ING91870CQ BLE5.1 SoC规格书
描述- 本资料介绍了ING91870CQ蓝牙低能耗(BLE5.1)系统芯片(SoC),该芯片符合AEC-Q100 Grade 2标准。ING91870CQ集成了Modem、链路层控制器和主机在内的内部BLE5.1 IP,并具备高性能32位RISC MCU、512KB嵌入式闪存、低功耗PMU、丰富的外设和高性能低功耗BLE射频收发器。支持多种IDE平台和编程语言,适用于智能汽车应用、极低功耗操作、精确定位、工业互联等多种场景。
型号- ING91870CQ
ING9187 BLE5.0 SoC规格书
描述- 本资料介绍了ING9187蓝牙低能耗(BLE5.0)系统单芯片(SoC),提供了将其集成到产品中的充分信息。ING9187是一款完全集成的BLE5.0规范SoC,包含调制解调器、链路层控制器和主机等内部BLE5.0 IP,并集成了高性能32位RISC微控制器、512KB嵌入式闪存、低功耗PMU、丰富的外设和高性能低功耗BLE射频收发器。
型号- ING91871B,ING91870C,ING9187
ING91680C BLE5.3 SoC规格书
描述- 本资料详细介绍了ING91680C蓝牙低功耗(BLE5.3)系统芯片(SoC)。该芯片符合蓝牙5.3规范,集成了INGCHIPS的BLE5.3 IP,包括调制解调器、链路层控制器和主机。它还集成了高性能32位RISC MCU、DSP和FPU、512KB闪存、低功耗PMU、丰富的外设和高效低功耗BLE射频收发器。芯片支持OTA和多种引导选项,便于产品功能推广和升级。
型号- ING91680A,ING91680C
电子商城
服务
Ignion可支持多协议、宽频段的物联网天线方案设计,协议:Wi-Fi、Bluetooth、UWB、Lora、Zigbee、2G、3G、4G、5G、CBRS、GNSS、GSM、LTE-M、NB-IoT等,频段范围:400MHz~10600MHz。
最小起订量: 2500 提交需求>
提供语音芯片、MP3芯片、录音芯片、音频蓝牙芯片等IC定制,语音时长:40秒~3小时(外挂flash),可以外挂TF卡或U盘扩容。
最小起订量: 1pcs 提交需求>
登录 | 立即注册
提交评论