This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2650:减少可发现的时间

Guru**** 2608135 points
Other Parts Discussed in Thread: CC2650

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/844196/cc2650-reducing-discoverable-time-in-ble-cc2650

器件型号:CC2650

大家好、在这里 、我已经声明了这种情况、以便发现180秒、但我希望减少到60秒、这是可能的? 请帮帮我

#define DEFAULT_DISCOVELOAD_MODE  GAP_ADTYPE_FLAGS_LIMITED (180秒)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了使其广播持续60秒、我建议您将 DEFAULT_DISCOVERAMED_MODE 定义为 GAP_ADTYPE_FLAGS_General、并启动一个在60秒后结束广播的计时器事件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的快速回复、我将 把 DEFAULT_DISCOVERAMED_MODE 定义为 GAP_ADTYPE_FLAGS_General、而不是限制计时器事件、而是如何启动计时器事件? 请帮帮我

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以在 simple_peripheral 示例中引用 Util_constructClock/Util_startClock/Util_stopClock、该示例展示了如何使用 periodicClock 创建计时器事件 SBP_PERiod_EVT。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai、

    非常感谢你耐心的答复,我对此有两点怀疑  

    1) 1)#define SBP_Periode_EVT            0x0004。 在该0x0004中、考虑什么?

    2) 2)#define SBP_PERIOD_EVT_PERIOD          5000.在这个5000中、在执行期间被视为5秒、我是否正确?

    3) Util_constructClock (&periodicClock、SimpleBLEPeripheral_clockHandler、SBP_PERIOD_EVT_PERIOD、0、false、SBP_PERIOD_EVT); 这个0被视为一个时钟周期、被视为一个单次触发定时器。 我们为什么将其视为零? 您能解释一下吗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    事件使用位标志、因此它可以是0x0001、0x0002、0x0004、……

    2.是的,你是对的。

    3.您可以参阅以下有关 Util_constructClock 原型中 clockPeriod 参数的注释。

    /*********
     *@fn     Util_constructClock
     *
     *@简要  初始化 TIRTOS 时钟实例。
     *
     *@param  pClock       -指向时钟实例结构的指针。
     *@param  clockCB      -时钟过期时的回调函数。
     *@param  clockDuration -时钟计时器的寿命、以毫秒为单位
     *@param  clockPeriod  -如果设置为0以外的值、则为第一个值
     *                         过期时间由时钟持续时间决定。  全部
     *                         后续的费用使用 clockPeriod 值。
     *@param  startFlag    - true 立即启动,false 等待。
     *@param  arg          -传递给回调函数的参数。
     *
     *@return Clock_handle -时钟实例的句柄。
     *
    Clock_handle Util_constructClock (Clock_Structt *pClock、
                                    Clock_funcPtr clockCB、
                                    uint32_t 时钟持续时间、
                                    uint32_t clockPeriod、
                                    uint8_t startFlag、
                                    阿尔格阿尔格)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的快速回复、很有趣、如果您想设置60秒、我们需要更改时钟 持续时间、 时钟周期、我是对的? 当我访问论坛时、我得到 clocl_tick 周期为10微秒、它是否正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    基本而言,如果您需要60秒的计时器事件,我们会将 ClockDuration (时钟持续时间)设置为60000,将 ClockPeriod (时钟周期)设置为0。

    2、是的、clock_tick 周期为10微秒。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回复、它将设置03、将在60秒后显示、但我要求60秒使其可发现。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我无法理解您的最新问题。 您能详细说明吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的响应、#define DEFAULT_DISCOVERAY_MODE           GAP_ADTYPE_FLAGS_LIMITED。 这会发现180秒、但我需要发现60秒、以便发现您能为我提供帮助吗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我曾建议您将 DEFAULT_DISCOVERABLE_MODE 定义为 GAP_ADTYPE_FLAGS_General、这将使 BLE 器件在默认情况下永久广播、并启动一个在60秒后停止广播的计时器事件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的耐心回答、我不知道如何  启动一个60秒后停止广播的计时器事件、您能帮助它更有帮助吗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否曾打算在 SimpleBLEPeripheral_init 中构建计时器、并让计时器事件在60秒后如 SimpleBLEPeripheral_taskFxn 中的 SBP_Periode_EVT?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回答、我没有尝试在简单的 BLE peripheral_init 中设置计时器我怎么设置计时器、您能帮我吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经告诉您、请参阅 simple_peripheral 示例中的 Util_constructClock/Util_startClock/Util_stopClock、其中介绍了如何使用 periodicClock 创建计时器事件 SBP_PERiod_EVT。 请尝试一下、如果您无法回答、请再次回答一个坚实的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回复、最后、我收到了、但我们在按下通知时仍在发送0x03、这一点令人怀疑。 但我只希望接收一次0x03、这是可能的吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于您连续发送0x03、那么您希望如何只接收一次? 您是否应该只发送一次以期望收到一个通知?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、santhosh、

    我已经为您提供了有关特征的一次性通知解决方案。 我已经在 CC2650 Launchpad 上测试了代码并工作正常。 您是为了学校项目还是为了工作而这样做? 如果您不熟悉此内容、我建议您浏览 simplelink Academy。 另请阅读文档

    -kel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Markel:

    感谢您的回复、毫无疑问、非常感谢您耐心的回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Markel:

    我不确定是否可以在不 发生周期性事件的情况下显示0x03?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否详细说明在不 发生周期性事件的情况下显示0x03的含义?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai、

    感谢您的回复、   

    1)  如果(事件和 SBP_Periode_EVT)此条件持续流动。

    2) 2)如果(检查通知是否启用)此条件应仅在通知启用时显示、这是可能的、因此在 IF 函数中、它应执行什么操作?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我无法使用您的伪代码理解您的问题。 您能否使用您的准确源代码来详细阐述您的问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="santhosh prem"]我怀疑是否可以在不 发生周期性事件的情况下显示0x03?

    我已经为您提供了相关代码。 再次来到这里。 我已经在 CC2650 LP 对此进行了测试、并且工作正常

    /*********
    *@fn SimplePeripheral_processCharValueChangeEvt
    *
    *@简要处理暂挂的简单配置文件特征值更改
    * 事件。
    *
    *@param paramID -已更改值的参数 ID。
    *
    *@返回无。
    */
    static void SimplePeripheral_processCharValueChangeEvt (uint8_t paramID)
    {
    uint8_t newValue;
    
    switch (paramID)
    {
    SIMPLEPROFILE_CHAR1案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR1、newValue);
    
    Display_Print1 (dispHandle、4、0、"Char 1:%d"、(uint16_t) newValue);
    中断;
    
    SIMPLEPROFILE_CHAR3案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、newValue);
    
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    newValue);
    
    Display_Print1 (dispHandle、4、0、"Char 3:%d"、(uint16_t) newValue);
    中断;
    
    默认值:
    //不应该到达这里!
    中断;
    }
    
    
    /*********
    *@fn SimplePeripheral_performPeriodicTask
    *
    *@brief 会执行周期性应用任务。 此函数被调用
    * 每5秒(SBP_PERIOD_EVT_PERIOD)。 在此示例中、
    * SimpleGATTProfile
    *中第三个特征的值 服务从配置文件中检索、然后复制到
    *中 第四个特征的值。
    *
    *@param 无。
    *
    *@返回无。
    //
    static void SimplePeripheral_performPeriodicTask (void)
    {
    #ifndef Feature_OAD_ONCHIP
    #if 0
    uint8_t valueToCopy;
    
    //如果
    (SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、&valueToCopy)= Success、则调用以检索配置文件中第三个特征的值
    
    //调用以设置配置文件中第四个特征的值。
    //请注意,如果已收到第四个特征的通知
    // GATT 客户端设备启用,然后将发送通知
    //每次调用此函数。
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    valueToCopy);
    }
    #endif
    #endif //!Feature_OAD_ONCHIP
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai、

    感谢您的回复、

    if (事件和 SBP_Periode_EVT)


    /Events &=~SBP_Periode_EVT;

    Util_startClock (周期时钟);

    //执行周期性应用任务
    SimpleBLEPeripheral_performPeriodicTask();

    当我们使用 LED 连接进行 nrf i 测试时、此条件在连接器件时在 LED 上持续流动。 但 我需要的是、即使我连接了器件、它也不应进入函数。 当我按下通知时、它应该转到 if condition 函数、它是可能的(中断)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于它在  SBP_Periode_EVT 中调用 Util_startClock,因此预计 SBP_Periode_EVT 会定期出现。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、santhosh、

    我还为您提供了代码,您只需注释掉 Util_startClock()即可。  

    -kel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Markel:

    感谢您的回复,是的,您已经说过,但这是另一个疑问,当我按下通知(未知特性4)时,它可以产生中断或事件以产生0x03输出,而不是这种情况

    if (事件和 SBP_Periode_EVT)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、santosh、

    使用原始的 simple_peripheral.c、对下面的 C 函数进行上述代码修改。 当您写入特征3时、特征4将只有一条通知。 完成修改后、请尝试它。

    SimplePeripheral_processCharValueChangeEvt()

    SimplePeripheral_performPeriodicTask()

    -kel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Markel:

    感谢您的回复、我无法理解您的说法? 请您解释一下

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、santhosh、

    在 simple_peripheral.c 中、执行以下修改。 在执行这些更改后、刷写程序。 启用特征通知4. 然后写入特性3。 特征4将有1条通知。 只需先执行此操作。  

    静态空 SimpleBLEPeripheral_processCharValueChangeEvt (uint8_t paramID)
    {
    #ifndef Feature_OAD_ONCHIP
    uint8_t newValue;
    
    switch (paramID)
    {
    SIMPLEPROFILE_CHAR1案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR1、newValue);
    
    Display_Print1 (dispHandle、4、0、"Char 1:%d"、(uint16_t) newValue);
    中断;
    
    SIMPLEPROFILE_CHAR3案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、newValue);
    
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    newValue);
    
    Display_Print1 (dispHandle、4、0、"Char 3:%d"、(uint16_t) newValue);
    中断;
    
    默认值:
    //不应该到达这里!
    break;
    }
    #endif //!feature_OAD_ONCHIP
    }
    
    /*********
    *@fn SimpleBLEPeripheral_performPeriodicTask
    *
    *@brief 会执行周期性应用任务。 此函数被调用
    * 每5秒(SBP_PERIOD_EVT_PERIOD)。 在此示例中、
    * SimpleGATTProfile
    *中第三个特征的值 服务从配置文件中检索、然后复制到
    *中 第四个特征的值。
    *
    *@param 无。
    *
    *@返回无。
    //
    静态空 SimpleBLEPeripheral_performPeriodicTask (void)
    {
    #ifndef Feature_OAD_ONCHIP
    #if 0
    uint8_t valueToCopy;
    
    //如果
    (SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、valueToCopy =
    )、则调用以检索配置文件中第三个特征的值
    //调用以设置配置文件中第四个特征的值。
    //请注意,如果已收到第四个特征的通知
    // GATT 客户端设备启用,然后将发送通知
    //每次调用此函数。
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    valueToCopy);
    }
    #endif
    #endif //!Feature_OAD_ONCHIP
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Markel:

    感谢您的耐心回答、我已经使用了特性1。但我怀疑、我何时在代码中按通知会发生什么情况? 请您向我解释一下

    if (通知启用时中断)//函数内应将什么设置为 true 条件  

    SimpleBLEPeripheral_performPeriodicTask();

    因此、只要我按下通知、就会转到该条件来打印0x03。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您正确地修改了代码,它将转至 SimpleBLEPeripheral_processCharValueChangeEvt()。 您为什么谈论的是特征1..

    在这里、写入特征是一件基本的事情、您会遇到困难。 我建议您参加 Simplelink Academy 的所有活动、为您提供基本的技术知识。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Markel:  

    非常感谢您的回复、首先、感谢您耐心的回复。

    我有一个新的疑问  

    当我按下未知特性4时、它位于简单外设中、我猜它会进入该代码

    if (Events & SBP_Periode_EVT)//if (Events & SBP_Periode_EVT)


    事件&=~SBP_Periode_EVT;

    Util_startClock (周期时钟);

    SimpleBLEPeripheral_performPeriodicTask();

    是否正确

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不这么认为。   触发 SBP_Period_EVT 的原因是您调用 Util_startClock (&periodicClock);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好  

    感谢您的回答、那么当我们按下未知特征4时、您可以在代码中的哪个位置说出它的回答? 代码中  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当您按下按钮时、它将启用/禁用"通知"。 它转到 simpleGATTprofile.c -> simpleProfile_WriteAttrCB()--> 案例 GATT_CLIENT_CHL_CFG_UUID:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、santhosh、

    当您按下"启用通知按钮"时、它将仅启用通知。 此外、在特性4处不会出现任何输出。

    每当您调用以下代码时、特征4处都会输出。  

    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    newValue);

    根据我向您共享的代码片段、当您使用应用程序写入特征3时、会发生写入特征4的情况。 您可以自行验证这一点 ,方法是在 SIMPLEPROFILE_CHAR3:的情况下放置一个断点。 在执行此操作之前、请将 Compiler Optimization (编译器优化)设置为 off (关闭)或0。

    静态空 SimpleBLEPeripheral_processCharValueChangeEvt (uint8_t paramID)
    {
    #ifndef Feature_OAD_ONCHIP
    uint8_t newValue;
    
    switch (paramID)
    {
    SIMPLEPROFILE_CHAR1案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR1、newValue);
    
    Display_Print1 (dispHandle、4、0、"Char 1:%d"、(uint16_t) newValue);
    中断;
    
    SIMPLEPROFILE_CHAR3案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、newValue);
    
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    newValue);
    
    Display_Print1 (dispHandle、4、0、"Char 3:%d"、(uint16_t) newValue);
    中断;
    
    默认值:
    //不应该到达这里!
    break;
    }
    #endif //!feature_OAD_ONCHIP
    } 

    从上面的代码片段中可以看到 ,SimpleBLEPeripheral_performPeriodicTask()的内容处于#if 0状态,这意味着它不会执行,所以请忘记这一点。

    -kel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    谢谢你、Kim 和 Markel、感谢你的解释、我从中得到了一些想法。

    案例 GATT_CLIENT_CHAR_CFG_UUID:

    状态= GATTServApp_ProcessCCCWriteReq (connHandle、pAttr、pValue、len、
    offset、GATT_CLIENT_CFG_NOTIY);

    uint8_t valueToCopy;
    if (SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、&valueToCopy)==成功)//if (SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、&valueToCopy)==成功)

    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    &valueToCopy);