BLE-NRF51822教程8-动态广播_PHP教程
BLE-NRF51822教程8-动态广播
本讲接收如何实现动态广播。
教程基于 9.0 sdk中的 Uart例子。
实现动态广播的方法是 广播->停止广播->修改参数->重启广播
所以我们通过一个定时器来周期性的 关闭广播然后再修改广播数据之后再开启广播。
Sdk 9.0中的广播搞了好几个模式,做的有点麻烦,所以我对他做了比较大的改动。
首先 在main.c中 中的advertising_init函数需要改动。
主要修改还添加了红色部分。将 flag 改为了GENERAL。后面又将广播超时设置为0从而实现无线广播。
去掉了根据广播模式来设置广播数据的函数以及对扫描响应数据的设置。
void advertising_init(void)
{
uint32_t err_code;
ble_advdata_t advdata;
ble_advdata_t scanrsp;
memset(&advdata,0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_FULL_NAME;
advdata.include_appearance = false;
advdata.flags =BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
staticble_advdata_manuf_data_t manuf_data;
staticuint8_t mydata = 0; //这里用的是静态数据
//这里做的动态广播就是每次调用这个函
//数,广播数据中的厂商定义字段都会加1
manuf_data.company_identifier= 0xffaa;
manuf_data.data.size= 1;
manuf_data.data.p_data= &mydata;
mydata++; //每次调用后加1
advdata.p_manuf_specific_data= &manuf_data;
err_code= ble_advdata_set(&advdata, NULL);
APP_ERROR_CHECK(err_code);
}
然后是启动广播函数。 Main 函数中用的是ble_advertising_start。
我们这里不用。直接实现一个自己的简单函数
void myadv_start(void){
ble_gap_adv_params_tadv_params;
adv_params.interval =1600; //这里广播间隔设置为 1s
adv_params.timeout = 0;//这里设置0和上面的flag配合实现无线广播
adv_params.type =BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.channel_mask.ch_37_off= 0;
adv_params.channel_mask.ch_38_off= 0;
adv_params.channel_mask.ch_39_off= 0;
adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.p_peer_addr= NULL;
adv_params.fp = BLE_GAP_ADV_FP_ANY;
adv_params.p_whitelist= NULL;
sd_ble_gap_adv_start(&adv_params);
}
之后我们做一个定时器。定时器的作用是以2s为周期 来关闭修改广播参数然后启动广播
在main 函数中做如下修改,创建一个 2s定时器 my_timer,并且开启它
int main(void)
{
uint32_t err_code;
bool erase_bonds;
uint8_t start_string[] = START_STRING;
app_timer_id_tmy_timer;
// Initialize.
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, false);
uart_init();
app_timer_create(&my_timer,APP_TIMER_MODE_REPEATED,
my_timer_handler);
buttons_leds_init(&erase_bonds);
ble_stack_init();
gap_params_init();
services_init();
advertising_init();
conn_params_init();
app_timer_start(my_timer,APP_TIMER_TICKS(2000,APP_TIMER_PRESCALER), NULL);
myadv_start(); //这里用的自己定义的启动广播函数
for (;;)
{
power_manage();
}
}
然后实现自己的定时器的溢出处理函数
void my_timer_handler(void *p_contex){
int i =50;
sd_ble_gap_adv_stop(); //关广播
advertising_init(); //修改厂商自定义字段中的数据
while(i--);
myadv_start(); //开启广播
}
这里做的动态广播是动态修改广播数据中的厂商自定义字段。每次调用
advertising_init 函数的时候厂商自定义字段的值都会递增。在advertising_init函数中有注释说明
到这里动态广播要做的事已经做完了。
不过在uart例子中还需要做一个改动,我们创建了一个自己的timer,不过uart例子中定义的 允许使用的最大的 timer数就是它已经使用的数量,所以我们再添加自己的timer会出错。
修改办法:找到main.c文件中的APP_TIMER_MAX_TIMERS宏将其增大1就可以了
之后烧录程序就能看到广播数据中的厂商自定义字段在动态改变了

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

最近几天,Ice Universe 不断披露有关 Galaxy S25 Ultra 的详细信息,人们普遍认为这款手机将是三星的下一款旗舰智能手机。除此之外,泄密者声称三星只计划升级一款相机

OnLeaks 现在与 Android Headlines 合作,首次展示了 Galaxy S25 Ultra,几天前,他试图从他的 X(以前的 Twitter)粉丝那里筹集到 4,000 美元以上的资金,但失败了。对于上下文,嵌入在 h 下面的渲染图像

除了发布两款新智能手机外,TCL 还发布了一款名为 NXTPAPER 14 的新 Android 平板电脑,其大屏幕尺寸是其卖点之一。 NXTPAPER 14 采用 TCL 标志性品牌哑光液晶面板 3.0 版本

Vivo Y300 Pro刚刚全面亮相,它是最薄的中端Android手机之一,配备大电池。准确来说,这款智能手机的厚度仅为 7.69 毫米,但配备了 6,500 mAh 的电池。这与最近推出的容量相同

三星尚未就何时更新其 Fan Edition (FE) 智能手机系列提供任何提示。目前来看,Galaxy S23 FE 仍然是该公司的最新版本,于 2023 年 10 月年初推出。

最近几天,Ice Universe 不断披露有关 Galaxy S25 Ultra 的详细信息,人们普遍认为这款手机将是三星的下一款旗舰智能手机。除此之外,泄密者声称三星只计划升级一款相机

Redmi Note 14 Pro Plus 现已正式成为去年 Redmi Note 13 Pro Plus 的直接后继产品(亚马逊售价 375 美元)。正如预期的那样,Redmi Note 14 Pro Plus与Redmi Note 14和Redmi Note 14 Pro一起成为Redmi Note 14系列的主角。李

OnePlus的姐妹品牌iQOO的2023-4年产品周期可能即将结束;尽管如此,该品牌已宣布 Z9 系列的开发尚未结束。它的最终版,也可能是最高端的 Turbo+ 变体刚刚按照预测发布。时间
