你好,
我从模板SDK创建一个新项目。我启用了魔术档案。
undef cfg_nvds在da14580_config.h和app_myapplication_proj.h上编辑app_device_name。
运行应用程序,设备显示在Android应用程序DSPS扫描搜索上。
关于我在app_myapplication_proj.h上看到的广告字符串这个定义:
#define app_adv_data“\ x07 \ x01 \ x03 \ x18”
#define app_adv_data_len(0)
#define app_scnrsp_data“\ x02 \ xff \ x00”
#define app_scnrsp_data_length(0)
我不明白为什么app_adv_data_len和app_scnrsp_data_length y dimined wite 0.在其他示例中,de值是数据级别的lenght。
如果我修改4和3的值,则设备上不会显示DSPS搜索。为什么?
设备:
嗨guiseppe,
请放置有效的长度标志,并将数据类型更改为UUID服务声明值....例如更改“\ x07 \ x01 \ x03 \ x18”到“\ x03 \ x03 \ xfa \ x18”。
谢谢mt_dialog.
现在它有效。所以...
\ x03 - 长度
\ x03 - 完整列表16位服务类UUIDS
\ xfa \ x18 - ????
我在这个网站上看到了https://developer.bluetooth.org/gatt/services/pages/serviceshome.aspx.
对于设备信息,正确的代码是\ x0a \ x18?
而且......我无法自定义广告字符串?例如,如果我想要仅包含标志描述,为什么此字符串(\ x02 \ x01 \ x06)不起作用(未显示在DSPS扫描中)?
嗨Giuseppe,
这只是一个随机的例子,您必须在广告字符串中放置有效的16位UUID,您提到的设备信息代码。
根据外设模式,标志字段默认填充广告字符串,您可以使用像BLUELUPE等应用程序以读取广告字符串。如果您这样做,您将看到广告字符串具有的第一个字节是默认\ x02 \ x01 \ x06。然后,您可以将您想要的数据放在广告字符串中。
谢谢mt_dialog.
是的,我理解。谢谢。
但如果我自定义app_scnrsp_data,它就不工作。这是代码:
//没关系!
#define app_adv_data“\ x03 \ x03 \ x15 \ x18”
#define app_adv_data_len(4)
//不起作用!
#define app_scnrsp_data“\ x09 \ x09 \ x41 \ x41 \ x41 \ x41 \ x41 \ x41 \ x41 \ x41”
#define app_scnrsp_data_length(10)
在哪里
\ x09 - 长度
\ x09 - 完成本地名称
\ x41 - 'a'charcater ascii代码
嗨Giuseppe,
广告字符串通过设备名称填充自动,您必须在扫描响应数据中放置额外的设备名称。如果您希望使用此字符串工作,则不应将“\ x09”标志放在App_adv_func中的字符串中。您可以通过评论将名称放在字符串中的代码的一部分来测试它。或者您可以使用制造商数据标志“\ XFF”。
谢谢mt_dialog.
你好,
关于“如果您希望使用此字符串工作,则不应将”\ x09“标志放在app_adv_func中的字符串中。”,如果我们使用“\ x09”,则会发生什么?为什么?
嗨yuhua64,
如果您使用\ x09,则您将在广告消息和响应消息中放置重复标志。堆栈不允许这样的事情。
谢谢mt_dialog.
你好,
问题是扫描响应数据包。我相信,App_scnrsp_data不包括在广告数据包中。蓝牙协议文档指定客户端可以通过具有特定请求的客户端需要扫描响应数据包。
app_myproject_proj.c.
//扫描响应数据
#if(nvds_support)
if(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禁用扫描响应数据始终包含在通告数据包中。
嗨Giuseppe,
主动扫描需要扫描响应数据包。它们不包含在广告数据包中,它们是对主机的扫描请求的回复。在大多数情况下,在大多数情况下,扫描处于活动状态,扫描响应数据由外围设备传输。
谢谢mt_dialog.
好,谢谢
好的,现在我尝试添加一个“只读”特征。总三个特征。我在下面添加了profile_task.c的代码(我修改了示例128代码):
//特征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,启用),//权限
&(char_hdl)//处理特征声明
);
//将特征值声明属性添加到数据库
status = attmdb_add_attribute(profile_env.profile_shdl,
sizeof(uint8_t),// data size = 1字节
ATT_UUID_128_LEN,//自定义声明类型= 128位的大小
(uint8_t *)&profile_3_val.uuid,// uuid的特征值
perm(rd,启用),//权限
&(val_hdl)//句柄到值属性
);
//存储特征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 DB数据大小:
nb_att_16 = 5;// 5 UUID16属性声明类型
nb_att_32 = 0;// 0 UUID32属性声明类型
nb_att_128 = 3;// 3 UUID128属性声明类型
status = 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特征宣言3
// 1个价值表明特征3
// = 78数据字节总数
它不起作用。在与设备连接之后,仅可见前两个特性。
我认为GATT数据大小是错误的。
如果我用nb_att_16 = 4和nb_att_128 = 2显示列表中的特征1分解代码。
数据大小是对的。
问题是声明特征2描述符,我在特征3声明之后放了她。