了解更多常见问题教程

3个职位/0个新职位
最后一篇文章
亚当·斯特罗兹
离线
最后一次见到:16小时1分钟前
已加入:2020-05-22 07:54
定向广告

你好,

我试图在Da14531芯片上运行直接广告,但我看不到它在工作,下面是我添加的代码(基于空的\u外围\u模板):

static const struct default\u app\u operations user\u default\u app\u operations={.default\u operation\u adv=user\u advised\u operation,};void user\u advanced\u operation(void){app\u easy\u gap\u directed\u advanced\u start(0)//0和1的结果相同}

我试着重新开始做广告,把这部分代码添加到app\u direct\u adversed\u complete fun中。

... 部分用户\ app \ callbacks.app \ on \ u adv \ u direct \ u complete=app \ u direct \ u advertive \ u complete。。。void app_direct_advanced_complete(const uint8_t x){app_easy_gap_directed_advanced_start(0);}

我用BLE sniffer应用程序检查adv包,我还尝试用中央实现应用程序和其他DA14531来发现我的设备。
如果我在app\u direct\u advertive\u complete中插入断点,x variable的值为0x45(表示超时错误)。
我有两个问题:
如果我必须在电话上看到包(在BLE sniffer应用程序中),如果我在user\u adv\u conf结构的.peer\u addr文件中输入了一个错误的中心地址?

如何检查广告是否工作(我只有一个开发工具包USB板)?

设备:
PM\U对话框
Online
最后一次见到:6分57秒前
工作人员
已加入:2018-02-08 11:03
嗨,亚当·斯特罗兹,

嗨,亚当·斯特罗兹,

谢谢你的问题。在回答你的问题之前,我想首先强调一下,直接广告是为了建立快速的联系。根据蓝牙LE规范,如果您知道中心BD地址,您可以直接进行广告。

请注意,如果您使用移动电话作为中央设备,移动电话通常使用随机的BD地址,这意味着BD地址将不断变化,因此,您将无法知道它。只有在中央使用公共BD地址并且每次都不改变的情况下,才可以进行定向广告。

Central的BD地址应该添加到user\u config.h头文件中user\u adv\u config结构的.peer\u addr\u类型中。然后,app\u easy\u gap\u directed\u advertive\u start()API应该在user\u app\u adv\u start()中使用,并具有上面提到的正确的BD address to字段。在直接广告中,PDU仅包括设备的BD地址。

下面是一个演示高占空比定向广告的快速示例。请在SDK6.0.14的ble\u app\u外围示例中遵循此步骤。

SDK位置:6.0.14.1114\projects\target\u apps\ble\u examples\ble\u app\u peripheral\Keil\u 5

1.使用以下用户\u app \u adv \u start()。从user\u peripheral.c文件中删除app\u adv\u data\u update\u timer\u并注释掉app\u add\u ad\u struct()。

void user\u app\u adv\u start(void){struct gapm\u start\u advised\u cmd*cmd;cmd=app\u easy\u gap\u directed\u advertise\u get\u active(0);应用程序\u简单\u差距\u定向\u广告\u开始(0);}

2,如果运行它,将发生NMI。要避免NMI,您有两个选择:

A] 当定向广告超时时,将设备置于睡眠模式。为此,您应该在app\u easy\u gap\u directed\u advertized\u start(0)之后添加arch\u set\u extended\u sleep(false)。如果它仍在激活模式下工作,它将等待中断,WDOG将超时,并发生NMI。

B)使用。app_on_adv_direct_complete = user_app_adv_direct_complete in order to restart adverting. ( same as undirected advertising)

void user_app_adv_direct_complete(uint8_t status){if(status==GAP_ERR_TIMEOUT){user_app_adv_start();}}

3.定向广告超时时,状态为GAP\u ERR\u TIMEOUT(=0x45)。

Of course, you should add the proper BD address in user_adv_config struct

定向广告有两种模式:高占空比和低占空比

一] 高占空比:广告将持续约1.28秒(广告间隔为1.25毫秒)。如果没有中央连接到外围设备,则会发生超时。

二} 低占空比:外设将使用user\u config.h中定义的adv interval永久播发。

在这两种情况下,BLE sniffer都可以用来捕获ADV\u DIRECT\u IND广告包。

谢谢,下午好

亚当·斯特罗兹
离线
最后一次见到:16小时1分钟前
已加入:2020-05-22 07:54
你好,

你好,

我测试了你写给我的东西:

在DA14531模块上,我启动BLE central app,在config下面(我使用PUBLIC BD Addres仅用于测试目的):

#define SCAN_FILTER (SCAN_FILTER_NONE) #define CONNECT_TO_PERIPHERAL (0) #define CFG_NVDS_TAG_BD_ADDRESS {0x01, 0x00, 0x70, 0xCA, 0xEA, 0x80} #define USER_CFG_ADDRESS_MODE APP_CFG_ADDR_PUB

在DA14531(USB开发工具包)上,我启动了ble\u app\u外围设备(使用您写给我的设置):

#define CFG_NVDS_TAG_BD_ADDRESS {0x03, 0x00, 0x70, 0xCA, 0xEA, 0x80} #define USER_CFG_ADDRESS_MODE APP_CFG_ADDR_PUB void user_app_adv_start(void) { struct gapm_start_advertise_cmd* cmd; cmd = app_easy_gap_directed_advertise_get_active(0); app_easy_gap_directed_advertise_start(0); } void user_app_adv_direct_complete(uint8_t status) { if (status == GAP_ERR_TIMEOUT) { user_app_adv_start(); } }

但不幸的是,我在终端上看不到任何东西(我只看到其他设备),在BLE sniffer中,我也看不到来自DA14531(usbdevkit)的任何数据包。