device name

请问要怎么修改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中读取名字,再广播出去,你要改可以在广播前把名字改了:)

QN_DEMO_AUTO 可以用了~~谢谢

所以现在是NVDS有名字才从NVDS读
改CFG_LOCAL_NAME是没用的??
那我要怎么清空NVDS
?
我想从程序直接控制DEVICE NAME

1.其实BLE完成初始化的条件并不是进入main函数的while(1)中(系统在调度了几个消息之后才完成的初始化,前几次进入while(1)时初始化都是没完成的),真正完成初始化并且可以运行是在打印BLE is Ready这句话的地方。那个地方你可以看到只要开启QN_DEMO_AUTO宏定义就可以上电广播了。
2.设备名默认从NVDS中写入,但是软件也可以修改,可以用app_gap_set_devname_req修改设备名。

我还是不太了解 我在广播前改名字

           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上的
另一个是我设定的
为啥会这样

另外修改设备名
是每次广播都要修改还是只修改一次就行?

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了。

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’
//}

这是我后来修改的
这样设备名就可以在程式里头定义
非常感谢安安

谢谢分享。。学习了