你好,
我创建了一个新的项目从模板sdk。我启用了dis配置文件。
在da14580_config.h上Undef CFG_NVDS并在app_myapplication_project .h上编辑APP_DEVICE_NAME。
运行应用程序,设备出现在android应用程序DSPS扫描搜索。
我在app_myapplication_project .h上看到的关于advertise字符串的定义如下:
#定义APP_ADV_DATA \ x07 \ x01 \ x03 \ x18“
#定义APP_ADV_DATA_LEN (0)
#定义APP_SCNRSP_DATA \ x02 \ xFF \ x00”
#定义APP_SCNRSP_DATA_LENGTH (0)
我不明白为什么APP_ADV_DATA_LEN和APP_SCNRSP_DATA_LENGTH被定义为0。在其他例子中,贬值是指数据字节的长度。
如果我修改值4和3,设备不会出现在DSPS搜索。为什么?
设备:
嗨guiseppe,
请放置有效的长度标志,并将数据类型更改为UUID服务声明值....例如,更改例如“\x07\x01\x03\x18”到“\x03\x03\xFA\x18”。
由于MT_dialog
现在它的工作原理。所以…
\ x03——长度
完整的16位服务类uuid列表
\ xFA \ x18 - ? ?
我在这个网站上看到的https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
对于设备信息,正确的代码是\x0A\x18?
和也……我不能自定义广告字符串?例如,如果我想只包括标志描述,为什么这个字符串(\x02\x01\x06)不工作(不出现在DSPS扫描)?
嗨,朱塞佩,
这只是一个随机的例子,您必须在广告字符串中放置一个有效的16位UUID,即您提到的设备信息代码。
flags字段根据外设的模式默认填充广告字符串,您可以使用像BlueLoupe这样的应用程序来读取广告字符串。如果您这样做,您将看到广告字符串的第一个字节是默认的\x02\x01\x06。然后你可以把你想要的数据放到广告字符串中。
由于MT_dialog
好的,我明白了。谢谢。
但是如果我自定义APP_SCNRSP_DATA,它就不起作用了。这是代码:
/ /这是好的!
#定义APP_ADV_DATA \ x03 \ x03 \ x15 \ x18“
#定义APP_ADV_DATA_LEN (4)
/ /不工作!
#定义APP_SCNRSP_DATA“\ x09 \ x09 \ x41 \ x41 \ x41 \ x41 \ x41 \ x41 \ x41 \ x41”
#定义APP_SCNRSP_DATA_LENGTH (10)
在哪里
\ x09——长度
完整的本地名
'A'字符ascii码
嗨,朱塞佩,
广告字符串是用设备名称自动填充的,您必须在扫描响应数据中放置额外的设备名称。如果你想让这个字符串工作,你不应该在app_adv_func的字符串中放置"\x09"标志。您可以通过注释将名称放在字符串中的代码部分来测试它。或者你可以使用制造商数据标志“\xFF”。
由于MT_dialog
你好,
关于"If you want this string to work you should not place the "\x09" flag in the string in the app_adv_func.",如果我们使用"\x09",它发生了什么?,为什么?
嗨yuhua64,
如果您使用\x09,您将在广告消息和响应消息中放置重复标志。堆栈不允许这样的事情发生。
由于MT_dialog
你好,
问题是扫描响应包。我确信APP_SCNRSP_DATA没有包含在advertise包中。蓝牙协议文档规定,扫描响应包可以由客户端要求一个特定的请求。
app_myproject_proj.c
//扫描响应数据
#如果(NVDS_SUPPORT)
如果(nvds_get (NVDS_TAG_APP_BLE_SCAN_RESP_DATA cmd - > info.host.scan_rsp_data_len,
cmd - > info.host.scan_rsp_data [0]) ! = NVDS_OK)
# endif / / (NVDS_SUPPORT)
{
cmd - > info.host。scan_rsp_data_len = APP_SCNRSP_DATA_LENGTH;
memcpy (cmd - > info.host。scan_rsp_data [0], APP_SCNRSP_DATA cmd - > info.host.scan_rsp_data_len);
}
当NVDS被禁用时,扫描响应数据总是包含在通告包中。
嗨,朱塞佩,
主动扫描时需要扫描响应包。它们不包含在广告包中,它们是对主机扫描请求的应答。在大多数情况下,扫描是主动的,因此在大多数情况下,扫描响应数据是由外设传输的。
由于MT_dialog
好的,谢谢
好,现在我试着添加一个“只读”特征。总三个特点。我将下面的代码添加到profile_task.c(我修改了SAMPLE128代码):
/ /特征3 : ////////////////////////////////////////////////////////////////////////////////
Status = attmdb_add_attribute(profile_env.profile_shdl,
ATT_UUID_128_LEN + 3, //数据大小= 19 (ATT_UUID_128_LEN + 3)
ATT_UUID_16_LEN, //声明类型ID的大小
(uint8_t*) &att_decl_char, // 0x2803为特征声明
PERM(RD, ENABLE), //权限
&(char_hdl) //特征声明的句柄
);
//添加特征值声明属性到数据库
Status = attmdb_add_attribute(profile_env.profile_shdl,
sizeof(uint8_t), //数据大小= 1字节
ATT_UUID_128_LEN,//自定义声明类型大小= 128bit
(uint8_t *) &profile_3_val。uuid, //特征值的uuid
烫(RD,启用),/ /权限
&(val_hdl) // value属性句柄
);
//保存特征3的句柄
memcpy (profile_3_char。attr_hdl &val_hdl, sizeof (uint16_t));
//设置特征值3的初始值
Status = attmdb_att_set_value(char_hdl, sizeof(profile_3_char), (uint8_t *)&profile_3_char);
我修改了GATT数据库数据大小:
nb_att_16 = 5;// 5 UUID16属性声明类型
nb_att_32 = 0;// 0 UUID32属性声明类型
nb_att_128 = 3;// 3 UUID128属性声明类型
状态= attmdb_add_service(&(profile_env.profile_shdl),
TASK_PROFILE,
nb_att_16,
nb_att_32,
nb_att_128,
78);//见下面的计算
// GATT数据库的总数据部分= 78数据字节:
// 16主服务声明
// + 19特征1的声明
// + 1特征1的值声明
// + 19特征2的声明
// + 1特征2的值声明
// + 2特性2的客户端配置声明
// + 19特征的声明
// + 1特性3的值声明
// = 78数据字节总数
它不工作。与设备连接后,只有前两个特征是可见的。
我认为GATT的数据大小是错误的。
如果我用nb_att_16=4和nb_att_128=2注释Characteristic 1的分类代码,则字符列表中出现3。
数据大小是正确的。
问题是特征描述符的声明,我把她放在特征描述符之后了。