嗨,对话,
在您的sample128项目中,我在app_adv_函数中将设备名手动设置为“12345”。我还将NVDS中的设备名称设置为“abc”,同时取消定义CFG_NVDS。在这种情况下,我认为BLE堆栈将不再使用NVD。
但是,我发现在LightBlue应用程序中,只有在扫描模式下(当我们可以看到设备列表时),设备名称显示为我所期望的(“12345”)。一旦我通过应用程序连接到设备,设备名称更改为NVDS中的值(“abc”)。如果我将设备与iOS配对,则配对列表中的设备名称也是“abc”,即NVDS值。我认为NVDS中的设备名称存储在任何情况下都不应该出现,因为我已经定义了CFG_NVDS。
我的问题是:
1.为什么有时设备名称是我在app_adv_func中设置的值,有时它是NVDS中的值存储,即使我没有定义CFG_NVDS。
2.如果我想动态地设置设备名称(通过I2C事件),我如何维护统一的设备名称?
非常感谢,期待你的回复。
顺致敬意,
问题更新:
在BLE init函数之前的BLE stack之前的main_func中,我更改了NVDS中的设备名称。现在,设备名可以像我预期的那样工作了。
但我遇到了一个新问题:
我在我的应用程序中生成了可解析的私有随机地址和安全模式1级3。如果我只把一台设备和我的iPhone配对,一切都没问题。但是如果我对第二台设备进行了配对,我的第一台设备甚至不会出现在LightBlue app的设备列表中。如果我在iOS设置中删除了第二台设备的配对信息,那么第一台设备将会再次出现在列表中。
您认为这个问题是否也与某些NVDS值有关?我确信这两个设备的IRK不同,因为我在app_configuration_func中手动设置了两个不同的值。
非常感谢,
嗨的产品
你能再说一遍你的目标吗?你希望看到什么样的行为。
以上描述是基于您所做的更改。
如果你能澄清你的最终目标,那么我们可以提出一些修改建议。
谢谢,
TR_DIALOG
嗨TR_Dialog,
非常感谢您的回复。首先,我所有的代码都基于您的sample128项目。
1.我取消定义CFG_NVDS并在app_adv_func中设置设备名称。当我尝试在Light Blue app for iOS下发现设备时,设备名称显示为我在app_adv_func中设置的值。但是在我连接到设备后,设备名称更改为NVDS中的值。iOS配对设备列表中的设备名称与NVDS设备名称相同。
我通过在BLE堆栈初始化之前在NVDS中设置设备名解决了这个问题,但我真的很好奇,为什么即使我没有定义CFG_NVDS, NVDS中的设备名存储仍然显示在某些地方。
2.我使用生成的可解析的私人随机地址和安全模式1级3在我的应用程序。我把两个设备和同一个iPhone配对,每个设备都有一个唯一的IRK和设备名称。我可以在iOS配对设备列表中看到两个配对设备。但在我配对了第二个设备后,第一个设备将显示为第二个设备的名称。我在NVDS中更改了设备地址,一切都是正确的。
从我观察到的一切,我很想知道:
1为什么即使在我取消定义CFG\U NVDS之后,BLE仍然在NVDS中使用信息。
2.在app_adv_func和NVDS数据节中设置广告数据有什么区别?
3.生成的可解析私有随机地址是否基于NVDS中的设备地址值?
如有需要,请随时与我联系。
非常感谢,等待您的回复。
嗨的产品:
谢谢你描述你的修改。由此,我推断你的目标如下:
-你想改变广告中的设备名称在两个不同的图像加载到两个不同的设备?这就是你想要达到的目标吗?如果这是你的目标,你只需要修改nvds.c中的NVDS_TAG_DEVICE_NAME字段
不定义CFG_NVDS的需要是什么?
谢谢,
TR_DIALOG
嗨TR_Dialog,
我未定义CFG_NVDS的原因是我想通过另一个处理器通过I2C总线设置BLE参数(设备名,IRK…)。
因此,首先,我让程序在main_func上等待I2C集设备名包。之后,我将设备名称存储在缓冲区中,并使用缓冲区日期在app_adv_func和app_configuration_func中设置设备名称和IRK。因为我从缓冲区获取设备名,而不是从NVDS,所以我禁用CFG_NVDS。
这样,在我将DA连接到iPhone之前,设备名称会显示缓冲区值。但在我将DA连接到iPhone后,设备名称将更改为NVDS中的值。我很困惑为什么我的设备显示为两个不同的名称,在app_adv_func中设置设备名称和在NVDS中设置设备名称有什么区别。
我通过在BLE堆栈初始化之前根据缓冲区数据在NVDS中设置设备名称来解决这个问题。但是我仍然想知道为什么在我未定义CFG_NVDS时,仍然使用存储在NVDS中的设备名,以及NVDS中的信息是什么时候使用的。
后来,我发现如果我将两台设备配对到同一台iPhone上,iOS会将第一台设备视为第二台(后一台配对设备)。我相信他们每个人都有一个独特的IRK。后者,在BLE堆栈初始化之前,我根据I2C包更改NVDS中的设备地址值并解决问题。我认为这里的原因是,即使我使用了一个私有的可解析随机地址和未定义的CFG_NVD,BLE堆栈仍然会根据NVD中的信息生成可解析的随机地址。
同样,在我认为完全禁用NVDS的情况下,我通过改变NVDS中的值来解决这两个问题。我想问的问题是:
1.为什么NVDS中的日期在我未定义的CFG_NVDS中仍然被使用。
2.当使用NVDS中存储的设备名和app_adv_func中设置的设备时?为什么如果NVDS中的设备名与我在app_adv_func中设置的不同,我可以在连接建立之前和之后得到相同设备的两个不同的名称。
3.生成的可解析私有随机地址是否与NVDS中的设备地址存储相关?要扩展此问题,何时使用NVDS中的数据存储?
我讲清楚了吗?
非常感谢。
您好对话框:
我修改字段dA14580为Dialog_14580。现在我面临着场的长度问题。如何增加这个字段的长度,以便我们可以有更长的Name。
在nvds.c
DEVICE_NAME_TAG_LEN
嗨的产品:
您能否澄清以下评论:“这样,在我将DA连接到iPhone之前,设备名称会显示缓冲区值。但在我将DA连接到iPhone之后,设备名称会更改为NVDS中的值。”。广告上有吗?我可以说,在app_adv_func中,无论你用什么名字,都会出现在广告中。如果您通过以下顺序看到设备名称更改,请告诉我:广告->连接->断开连接->广告。设备名称不应通过此序列进行转换。
回答您的一个问题:BLE堆栈在重置时通过custom_nvds_get_func检索参数。
你能发布你的函数app\u adv\u func的代码吗?
此外,您可能需要查看以下文档:http://support.dialog-semiconductor.com/system/files/resources/AN-B-022_DA14580_Resolvable_private_address_guidelines.pdf
谢谢,
TR_DIALOG
嗨TR_Dialog,
如果你使用浅蓝色的应用程序,你会看到设备名称更改后,我连接到设备。连接后,您还可以发现TOP显示的Device名称与广告包不同。请将app_adv_func中的设备名称与NVDS中的值设置为不同的值。undefine NVDS,看看你是否会得到和我一样的结果。
我的app_adv_func:
void app_adv_func(结构gapm_start_advision_cmd*cmd)
{
/ /开始广告。填补GAPM_START_ADVERTISE_CMD消息
//设备名称长度
uint8设备名称长度;
int8设备名称可用空间;
uint8_t设备名称_temp_buf[64];
uint8_t manufacture_date [10];
cmd - > op。代码= GAPM_ADV_UNDIRECT;
cmd - > op。addr_src = GAPM_GEN_RSLV_ADDR; / * GAPM_GEN_STATIC_RND_ADDR; * / / / GAPM_PUBLIC_ADDR;
cmd->op.renew_dur=15000;
cmd->intv_min=APP_ADV_INT_min;
cmd->intv_max=APP_ADV_INT_max;
cmd - > channel_map = APP_ADV_CHMAP;
cmd - > info.host。模式= GAP_GEN_DISCOVERABLE;
/*-----------------------------------------------------------------------------------
*设置广告数据和扫描响应数据
*---------------------------------------------------------------------------------*/
cmd->info.host.adv_data_len=APP_adv_data_MAX_SIZE;
cmd - > info.host。scan_rsp_data_len = APP_SCAN_RESP_DATA_MAX_SIZE;
# ifdef HAS_WHITE_LIST
如果(white_list_written)
cmd->info.host.adv\u filt\u policy=adv\u ALLOW\u SCAN\u WLST\u CON\u WLST;
其他的
cmd - > info.host。adv_filt_policy = ADV_ALLOW_SCAN_ANY_CON_ANY;
#否则
cmd - > info.host。adv_filt_policy = ADV_ALLOW_SCAN_ANY_CON_ANY;
#恩迪夫
//cmd->info.host.adv\u filt\u policy=adv\u ALLOW\u SCAN\u ANY\u CON\u ANY;
/ /广告数据
#如果(NVDS\U支持)
如果(nvds)获取(nvds标签应用程序数据和cmd->info.host.ADV数据),
cmd - > info.host.adv_data [0]) ! = NVDS_OK)
# endif / / (NVDS_SUPPORT)
{
/ / GPIO_SetActive (GPIO_PORT_1 GPIO_PIN_0);
cmd->info.host.adv_data_len=10;
memcpy (&manufacture_date [0], " \ x09 \ xff ", 2);
Memcpy (&manufacture_date[0] + 2, &bb_device_name[0] + 4,8);
memcpy (cmd - > info.host。adv_data [0], &manufacture_date [0], cmd - > info.host.adv_data_len);
}
//扫描响应数据
#如果(NVDS\U支持)
如果(nvds\u获取(nvds\u标签\u应用程序\u文件\u扫描\u响应数据,&cmd->info.host.SCAN\u rsp\u数据),
&cmd->info.host.scan\u rsp\u data[0])!=NVDS\u OK)
# endif / / (NVDS_SUPPORT)
{
cmd - > info.host。scan_rsp_data_len = APP_SCNRSP_DATA_LENGTH;
memcpy(&cmd->info.host.scan\u rsp\u data[0],APP\u SCNRSP\u data,cmd->info.host.scan\u rsp\u data\u len);
}
//获取广告数据中的剩余空间- 2字节用于名称长度/标志
device\u name\u avail\u space=APP\u ADV\u DATA\u MAX\u SIZE-cmd->info.host.ADV\u DATA\u len-2;
//检查数据是否可以添加到Advertising数据中
If (device_name_avail_space > 0)
{
//获取要添加到广告数据中的设备名称(默认或NVDS)
/*#如果(NVDS\U支持)
设备名称长度=NVDS设备名称;
if (nvds_get(NVDS_TAG_DEVICE_NAME, &device_name_length, &device_name_temp_buf[0])) != NVDS_OK
# endif / / (NVDS_SUPPORT)
{
//获取默认设备名称(如果空间不足,则没有名称)
设备名称长度=strlen(应用设备名称);
memcpy (&device_name_temp_buf [0], APP_DEVICE_NAME device_name_length);
}
*/
device_name_length = BB_DEVICENAME_SIZE;
memcpy (&device_name_temp_buf [0], bb_device_name BB_DEVICENAME_SIZE);
//memcpy(设备名称和温度,bfob01234567),12);
如果(device_name_length > 0)
{
//检查可用空间
设备名称长度=co最小值(设备名称长度、设备名称可用空间);
//填充长度
cmd->info.host.adv_data[cmd->info.host.adv_data\u len]=设备名称\u长度+1;
//填充设备名称标志
cmd - > info.host.adv_data [cmd - > info.host。Adv_data_len + 1] = '\x09';
//复制设备名
memcpy(&cmd->info.host.adv_data[cmd->info.host.adv_data_len+2]、设备名称温度、设备名称长度);
//更新广告数据长度
cmd - > info.host。Adv_data_len += (device_name_length + 2); / /设备长度
}
}
返回;
}
谢谢!
嗨的产品:
有一件事我想指出的是,你在淡蓝色iPhone上看到的设备名称不一定是DA14580正在播出的设备名称。Ios确实缓存了一些信息,因此存在差异。为了解决这个问题,我总是在开发代码时使用Front Line进行嗅探。
我会审查你的app_adv_func并提供反馈。你有机会看一下文件吗:http://support.dialog-semiconductor.com/system/files/resources/AN-B-022_DA14580_Resolvable_private_address_guidelines.pdf
谢谢,
TR_DIALOG
嗨TR_DIALOG,
我知道在iOS中有一些特殊的BLE策略,但在我连接设备后,设备名称似乎以浅蓝色显示,将始终保持与NVDS中的一个存储相同。
此外,我将Sample128项目更改为AN-B-022,我认为可解析的随机地址对单个设备很有效:每次设备将显示为一个不同的地址,iOS可以在配对后重新连接它。但如果我同时打开两台设备并将两台设备与同一部iPhone配对。IPhone会将两者视为后一种配对。
后来,我在NVDS中更改了设备。在那之后,我的iPhone可以毫无错误地区分这两款设备。
同样,我猜即使我没有定义CFG_NVDS并在那些app_xxx函数中设置我自己的BLE设置,BLE仍然使用NVDS中的信息存储。所以,我真的想和你们的人检查一下,看看我是否配置错了什么,以及BLE堆栈是如何利用NVDS的。
谢谢!
你好
.NVDS_TAG_APP_BLE_SCAN_RESP_DATA = " xxx "
#定义APP_SCNRSP_DATA“xxx”
它们之间的关系和区别是什么?
谢谢你!
当您能够成功读取扫描响应数据时,将使用NVDS_标签_应用程序_BLE_scan_RESP_数据。如果出现问题,则使用APP_SCNRSP_数据。
如果(nvds\u获取(nvds\u标签\u应用程序\u文件\u扫描\u响应数据,&cmd->info.host.SCAN\u rsp\u数据),
&cmd->info.host.scan\u rsp\u data[0])!=NVDS\u OK)
{
cmd - > info.host。scan_rsp_data_len = APP_SCNRSP_DATA_LENGTH;
memcpy(&cmd->info.host.scan\u rsp\u data[0],APP\u SCNRSP\u data,cmd->info.host.scan\u rsp\u data\u len);
}
谢谢你,summer20100514
我有一个连接da14580的应用程序,当uuid包含在扫描响应数据中,应用程序将显示设备,我可以连接,
我更改了应用程序SCNRSP_数据,应用程序工作正常,
我改变了nvds。c中的响应数据,从app中我看不到设备,
这意味着nvds_get总是不行,当它可以时,为什么要在两个不同的地方定义?
你在nvds.c中的响应数据设置一定有问题,你可以检查它的格式和长度。
谢谢您的回复!
代码是:
#定义APP_SCNRSP_DATA " \ x11 \ x06 \ xDE \ x12 \ xA5 \ x98 \ x1A \ x03 \ x34 \ xF7 \ xAB \ xA8 \ x95 \ xA2 \ x80 \ x29 \ x70 \ xB0”
.NVDS_TAG_APP_BLE_SCAN_RESP_DATA = " \ x09 \ xFF \ x00 \ x60 \ x52 \ x57 \ x2D \×\ x4C \ x45”,
.SCAN_RESP_DATA_TAG_LEN = 10,
为什么app扫描,da14580总是响应数据从APP_SCNRSP_DATA,但dev名称总是从nvds.c?
当使用NVDS_TAG_APP_BLE_SCAN_RESP_DATA时,为什么使用“\x”?