BLE SDK FAQ

更新时间:2022-11-24 09:20:10下载pdf

本文档于 2021 年 8 月 24 日停止更新。 如果您想查看更新的内容,请参考 《TuyaOS》蓝牙设备接入

如何上报 DP 数据?

调用函数 tuya_ble_dp_data_report() 上报 DP 数据,DP 数据格式以及 BLE SDK 提供的其他 API 请参考 BLE SDK 说明

  • 涂鸦 IoT 平台是以 DP 的方式管理数据,任何设备产生的数据都需要抽象为 DP 的形式。一个完整的 DP 数据由以下四部分组成。

    • Dp_id:1个字节,在开发平台注册的 dp_id 序号。

    • Dp_type:1 个字节,DP 类型。

      #define DT_BOOL 1 //布尔类型;
      #define DT_VALUE 2 //数值类型,其范围在iot平台注册时指定;
      #define DT_STRING 3 //字符串类型;
      #define DT_ENUM 4 //枚举类型;
      #define DT_BITMAP 5 //位映射类型;
      
    • Dp_len:1 个字节或者两个字节,目前蓝牙仅支持一个字节,即单个 DP 数据最长 255 个字节。

    • Dp_data:数据,dp_len 个字节。

    更多详情,详情请参考 自定义功能

  • 该 DP 上报函数的参数 p_data 指向的数据必须以下表格式组装上报:

    DP 1的数据 ~ DP n的数据
    1 2 3 4~ ~ n n+1 n+2 n+3~
    Dp_id Dp_type Dp_len Dp_data ~ Dp_id Dp_type Dp_len Dp_data
  • 调用该函数时,参数 len 的最大长度为 TUYA_BLE_REPORT_MAX_DP_DATA_LEN,目前为255+3。

平台上申请的授权码,如何写入到固件内?

测试用的授权码写入示例(位于tuya_ble_app_demo.c中):

static const char auth_key_test[] = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
static const char device_id_test[] = "zzzzzzzzzzzzzzzz";

我可以更改 Demo 中的 PID 吗?在哪里修改?

Tuya BLE SDK Demo Project 的 PID 更改在tuya_ble_app_demo.h头文件中进行:

#define APP_PRODUCT_ID          "YourProductId"

更多详情,请参考 BLE SDK Demo 说明

授权码中的 Mac 需要写入吗?

需要写入,虽然目前使用自定义的 Mac 地址也可以工作,但是后续 BLE 设备接入规范会基于 Mac 地址管理注册设备。

Demo 代码中的 h_id 是什么,需要更改吗?

h_id 是 SDK 内部设备管理使用的,您无需更改 h_id

通过涂鸦上位机授权的流程是什么?

  • 从 PM 处拿到涂鸦工单和上位机授权 token,安装上位机产测工具。
  • 将设备和上位机通过 UART 连接好。
  • 点击上位机运行,即与设备交互,写入授权信息。
  • 授权所使用的固件版本和名称要与工单所绑定的一致,否则上位机无法验证通过。

更多详细步骤,请参考 产测工具介绍

在哪个地方能够接收到下发的 DP?

在 ID 为 TUYA_BLE_CB_EVT_DP_WRITE 的 CALL BACK EVENT 处接收处理 DP 数据,详情请参考 BLE SDK Demo 说明

例如,nRF52832 芯片可以在 Demo Project 的 tuya_ble_app_demo.c 源文件中进行查看:

static void tuya_cb_handler(tuya_ble_cb_evt_param_t* event)
{
	int16_t result = 0;
	switch (event->evt)
	{
	case TUYA_BLE_CB_EVT_CONNECTE_STATUS:
		TUYA_BLE_LOG_INFO("received tuya ble conncet status update event,current connect status = %d",event->connect_status);
		break;
	case TUYA_BLE_CB_EVT_DP_WRITE:
		dp_data_len = event->dp_write_data.data_len;
		memset(dp_data_array,0,sizeof(dp_data_array));
		memcpy(dp_data_array,event->dp_write_data.p_data,dp_data_len);		
		TUYA_BLE_LOG_HEXDUMP_DEBUG("received dp write data :",dp_data_array,dp_data_len);
		tuya_ble_dp_data_report(dp_data_array,dp_data_len);
		//custom_evt_1_send_test(dp_data_len);
		break;
	case TUYA_BLE_CB_EVT_DP_DATA_REPORT_RESPONSE:
		TUYA_BLE_LOG_INFO("received dp data report response result code =%d",event->dp_response_data.status);
		break;
	case TUYA_BLE_CB_EVT_DP_DATA_WTTH_TIME_REPORT_RESPONSE:
		TUYA_BLE_LOG_INFO("received dp data report response result code =%d",event->dp_response_data.status);
		break;
	case TUYA_BLE_CB_EVT_UNBOUND:
		
		TUYA_BLE_LOG_INFO("received unbound req");

		break;
	case TUYA_BLE_CB_EVT_ANOMALY_UNBOUND:
		
		TUYA_BLE_LOG_INFO("received anomaly unbound req");

		break;
	case TUYA_BLE_CB_EVT_DEVICE_RESET:
		
		TUYA_BLE_LOG_INFO("received device reset req");

		break;
	case TUYA_BLE_CB_EVT_DP_QUERY:
		TUYA_BLE_LOG_INFO("received TUYA_BLE_CB_EVT_DP_QUERY event");
		tuya_ble_dp_data_report(dp_data_array,dp_data_len);
		break;
	case TUYA_BLE_CB_EVT_OTA_DATA:
		tuya_ota_proc(event->ota_data.type,event->ota_data.p_data,event->ota_data.data_len);
		break;
	case TUYA_BLE_CB_EVT_NETWORK_INFO:
		TUYA_BLE_LOG_INFO("received net info : %s",event->network_data.p_data);
		tuya_ble_net_config_response(result);
		break;
	case TUYA_BLE_CB_EVT_WIFI_SSID:

		break;
	case TUYA_BLE_CB_EVT_TIME_STAMP:
		TUYA_BLE_LOG_INFO("received unix timestamp : %s ,time_zone : %d",event->timestamp_data.timestamp_string,event->timestamp_data.time_zone);
		break;
	case TUYA_BLE_CB_EVT_TIME_NORMAL:

		break;
	case TUYA_BLE_CB_EVT_DATA_PASSTHROUGH:
		TUYA_BLE_LOG_HEXDUMP_DEBUG("received ble passthrough data :",event->ble_passthrough_data.p_data,event->ble_passthrough_data.data_len);
		tuya_ble_data_passthrough(event->ble_passthrough_data.p_data,event->ble_passthrough_data.data_len);
		break;
	default:
		TUYA_BLE_LOG_WARNING("app_tuya_cb_queue msg: unknown event type 0x%04x",event->evt);
		break;
	}
}

对于广播间隔和连接间隔等参数需要修改,有什么规范吗?

涂鸦 BLE SDK 不负责不参与广播间隔和连接间隔的设置,您的应用程序需要根据产品功能和性能需求自定义广播和连接参数。

但是,iOS 系统对连接参数有一定的限制,如果不满足 iOS 的规范,设备在更新连接参数时会被拒绝,目前 iOS 要求的连接参数需满足以下要求:

  • Interval Min ≥ 15 ms (multiples of 15 ms)
  • Interval Min + 15 ms ≤ Interval Max (Interval Max == 15 ms is allowed)
  • Interval Max * (Slave Latency + 1) ≤ 2 seconds
  • Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout
  • Slave Latency ≤ 30
  • 2 seconds ≤ connSupervisionTimeout ≤ 6 seconds

广播间隔不宜超过 1 秒,要不然不容易被手机扫描发现连接。

如何进行固件 OTA 升级?

固件 OTA 升级步骤请参考 BLE SDK 说明BLE SDK Demo 说明

对于涂鸦 BLE SDK Demo Project 来说,在涂鸦 IoT 平台配置 OTA 升级的大致步骤为:

  1. 修改 tuya_ble_app_demo.h 里的固件版本号,例如原来是1.0可以改为1.1 ,如下所示。

    // 固件版本
    #define TY_APP_VER_NUM       0x0101
    #define TY_APP_VER_STR	     "1.1" 	
    
  2. 编译固件生成OTA文件(bin 或者 HEX 根据芯片平台而定)。

  3. 涂鸦 IoT 平台产品管理页面,找到您开发的蓝牙产品,在 产品配置 > 固件升级 页面进行固件 OTA 升级配置。

    说明:如果是涂鸦固件或者 OEM PID,不支持新增固件版本,因此无法自定义 OTA 升级的固件版本。但固件有升级时,会给您推送升级包供您验证。

    BLE SDK FAQ

  4. 单击 设置 进入固件升级配置页面,在右上角单击 新增固件版本,然后根据页面引导上传新固件。

  5. 固件版本管理 页面,单击 常用白名单管理,然后根据页面引导新增白名单设备进行升级测试。

BLE SDK 的传输速度如何?

BLE 协议的传输速度取决于产品 App 设置的连接间隔参数以及所用蓝牙芯片的处理能力。目前,涂鸦 BLE SDK 采用的 GATT MTU 大小为 20 字节。

以 nRF52832 平台的涂鸦 BLE SDK Demo Project 为例,GATT MTU 大小为 20 字节,连接间隔为 30 ms 时,OTA 的传输速率大约为 2KB/S。

我有大量数据需要发送,怎么可以提高传输效率?

您可以尽可能每条上报指令发送多个 DP 数据,目前 DP 上报函数最多可以发送258字节数据(包含 DP 数据头)。

DP 上报函数的参数 p_data 指向的数据必须以下表格式组装上报:

DP 1的数据 ~ DP n的数据
1 2 3 4~ ~ n n+1 n+2 n+3~
Dp_id Dp_type Dp_len Dp_data ~ Dp_id Dp_type Dp_len Dp_data

调用该函数时,参数 len 的最大长度为 TUYA_BLE_REPORT_MAX_DP_DATA_LEN(目前为255+3)。

bootloader 需要我自己来写吗?

  • 如果您选用的蓝牙芯片型号,有对应的涂鸦 BLE SDK Demo 示例,则建议您基于该 Demo Project 开发。

  • 如果没有,则需要用户自己移植涂鸦 BLE SDK 以及编写 bootloader 和固件 OTA 相关代码,bootloader 的编写要考虑固件验证,防止非法固件写入运行。

BLE SDK 会占用多少资源?

配置不同 Tuya BLE SDK 占用资源也不同,默认配置下占用 RAM 4K 左右,ROM 14k 左右(不包括 port 和 application 相关文件占用)。

为什么设备无法被涂鸦智能 App 搜索到?

请检查广播数据是否正确。如果是您自行移植 SDK 开发的产品,请确认移植的广播相关的接口是否有问题,PID 和授权信息是否设置正确。

  • adv data

    广播数据段描述 类型 说明
    设备 LE 物理连接标识 0x01 长度:0x02
    类型:0x01
    数据:0x06
    Service UUID 0x02 长度:0x03
    类型:0x02
    数据:0xA201
    Service Data 0x16 长度:0x0C 或者 0x14
    类型:0x16
    数据:0x01, 0xA2, type (0-pid,1-product_key)PID或者product_key (8 或者 16 字节)

    内容示例(8字节PID): 02 01 05 03 02 01 A2 0C 16 01 A2 00 00 00 00 00 00 00 00 00

  • scan response data

    广播数据段描述 类型 说明
    Complete Local Name 0x09 长度:0x03 类型:0x09 数据:0x54,0x59
    厂商自定义数据 0xff 长度:0x19
    类型:0xff
    数据 :COMPANY ID:0x07D0
    FLAG:0x00
    协议版本:0x03
    加密方式:0x00
    通信能力:0x0000
    保留字段:0x00
    ID 字段: 16 个字节或 6 字节

    内容示例(未绑定):03 09 54 59 19 FF D0 07 00 0300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

涂鸦 BLE SDK 对功耗有什么影响?

按照 BLE SDK 说明 正确移植 SDK 的话,涂鸦 BLE SDK 是不会影响蓝牙芯片原有功耗架构的。

一般影响功耗的因素有:

  • 是否开启低功耗模式(sleep)
  • 低功耗模式下是否关闭外设
  • 蓝牙广播间隔
  • 蓝牙连接间隔