嗨,
我从模板SDK创建一个新项目。我启用了魔术档案。
undef cfg_nvds在da14580_config.h和app_myapplication_proj.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”
#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)
如果(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, ENABLE), //权限
&(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) // 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 DB数据大小:
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特征宣言3
// + 1特性3的值声明
// = 78数据字节总数
它不起作用。在与设备连接之后,仅可见前两个特性。
我认为GATT数据大小是错误的。
如果我用nb_att_16=4和nb_att_128=2注释Characteristic 1的分类代码,则字符列表中出现3。
数据大小是正确的。
问题是声明特征2描述符,我在特征3声明之后放了她。