ffl86
July 29, 2015, 6:40am
1
请问要怎么修改DEVICE NAME(不用NVDS configurator)
我直接修改#define CFG_LOCAL_NAME “FireBLE HRPS”
是无效的
只能透过NVDS configurator才行
另外我要一上电就可以广播
是要怎么做?
我是这样用的
while(1)
{
ke_schedule();
if(adv_F)
{
adv_F = 0;
// start adv
app_gap_adv_start_req(GAP_GEN_DISCOVERABLE|GAP_UND_CONNECTABLE,
app_env.adv_data, app_set_adv_data(GAP_GEN_DISCOVERABLE),
app_env.scanrsp_data, app_set_scan_rsp_data(app_get_local_service_flag()),
GAP_ADV_FAST_INTV1, GAP_ADV_FAST_INTV2);
}
这是正确的方式吗?
不用这么麻烦,在app_config.h里面有个宏定义“QN_DEMO_AUTO”打开就行了,一上电就广播,改名字的话,程序首先会从NVDS读取名字是不是空,如果是空的才会用这里的CFG_LOCAL_NAME的名字的;否则从直接从NVDS中读取名字,再广播出去,你要改可以在广播前把名字改了:)
ffl86
July 29, 2015, 9:52am
3
QN_DEMO_AUTO 可以用了~~谢谢
所以现在是NVDS有名字才从NVDS读
改CFG_LOCAL_NAME是没用的??
那我要怎么清空NVDS
?
我想从程序直接控制DEVICE NAME
user3
July 30, 2015, 1:34am
4
1.其实BLE完成初始化的条件并不是进入main函数的while(1)中(系统在调度了几个消息之后才完成的初始化,前几次进入while(1)时初始化都是没完成的),真正完成初始化并且可以运行是在打印BLE is Ready这句话的地方。那个地方你可以看到只要开启QN_DEMO_AUTO宏定义就可以上电广播了。
2.设备名默认从NVDS中写入,但是软件也可以修改,可以用app_gap_set_devname_req修改设备名。
ffl86
July 31, 2015, 10:08am
5
我还是不太了解 我在广播前改名字
app_gap_set_devname_req("asd123",6);
app_gap_adv_start_req(GAP_GEN_DISCOVERABLE|GAP_UND_CONNECTABLE,
app_env.adv_data, app_set_adv_data(GAP_GEN_DISCOVERABLE),
app_env.scanrsp_data, app_set_scan_rsp_data(app_get_local_service_flag()),
GAP_ADV_FAST_INTV1, GAP_ADV_FAST_INTV2);
但LIGHTBLUE上名字会有2个
一个是NVDS上的
另一个是我设定的
为啥会这样
另外修改设备名
是每次广播都要修改还是只修改一次就行?
user3
August 3, 2015, 3:47am
6
ffl86 发表于 2015-7-31 18:08
我还是不太了解 我在广播前改名字
app_gap_set_devname_req("asd123",6);
#if (BLE_PERIPHERAL)
uint8_t app_set_adv_data(uint16_t disc_mode)
{
uint8_t len;
/* "\x02\x01\x0?\x08\x08NXP BLE" */
// Advertising data, BLE only, general discovery mode and short device name
app_env.adv_data[0] = 0x02;
app_env.adv_data[1] = GAP_AD_TYPE_FLAGS;
if (GAP_GEN_DISCOVERABLE == (disc_mode & GAP_GEN_DISCOVERABLE))
{
/// Mode in general discoverable
app_env.adv_data[2] = 0x06;
}
else if (GAP_LIM_DISCOVERABLE == (disc_mode & GAP_LIM_DISCOVERABLE))
{
/// Mode in limited discoverable
app_env.adv_data[2] = 0x05;
}
else
{
/// Mode in non-discoverable
app_env.adv_data[2] = 0x04;
}
#if (defined(CFG_EACI))
app_env.adv_data[3] = device_name.namelen + 1;
app_env.adv_data[4] = 0x09;
memcpy((char *)&app_env.adv_data[5], device_name.name, device_name.namelen);
len = 5 + device_name.namelen;
#else
nvds_tag_len_t name_length = 31 - 5; // The maximum length of Advertising data is 31 Octets
if (NVDS_OK != nvds_get(NVDS_TAG_DEVICE_NAME, &name_length, &app_env.adv_data[5]))
{
// NVDS is empty, use default name
name_length = strlen(QN_LOCAL_NAME);
strcpy((char *)&app_env.adv_data[5], QN_LOCAL_NAME);
}
else
{
name_length--; // Discard '\0'
}
app_env.adv_data[3] = name_length + 1;
app_env.adv_data[4] = GAP_AD_TYPE_SHORTENED_NAME;
len = 5 + name_length;
#endif
这就是一切秘密。1.此函数设置广播信息内容,广播中有设备名字段,首选广播NVDS中的设备名,如果设备名,NVDS为空,那么广播软件设置的QN_LOCAL_NAME(其实你自己搜一下QN_LOCAL_NAME调用 的地方就很轻松发现这一段信息.)
2.设备名:设备名一般存放在NVDS中,具体的设置你如果看不到,那么久说明是封装到内核了,也不用纠结为何看不到,他就在NVDS中,你改了,它自然就变了,如果NVDS为空,那么会默认为Quintic BLE或者NXP BLE,不服可以找原厂修改。
3.如果你非要用软件指定,参考广播内容设定,取消NVDS读取,直接利用app_gap_set_devname_req函数指定设备名,然后将QN_LOACL_NAME广播出去,那么设备名和广播中的设备名都会是QN_LOCAL_NAME了。
ffl86
August 12, 2015, 11:47am
7
nvds_tag_len_t name_length = 31 - 5; // The maximum length of Advertising data is 31 Octets
//if (NVDS_OK != nvds_get(NVDS_TAG_DEVICE_NAME, &name_length, &app_env.adv_data[5]))
//{
// NVDS is empty, use default name
name_length = strlen(QN_LOCAL_NAME);
strcpy((char *)&app_env.adv_data[5], QN_LOCAL_NAME);
// }
//else
//{
// name_length–; // Discard ‘\0’
//}
这是我后来修改的
这样设备名就可以在程式里头定义
非常感谢安安