手机动态修改设备名_第1页
手机动态修改设备名_第2页
手机动态修改设备名_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、动态修改设备名12013-2016 infor link tech copy right:本归讯联电子所有。本客户交流之用。如需,请注明出处。由于工程师水平有限,文档难免有所疏漏和错误,由此造成的损失,讯联电子不承担任何责任。商务合作请发邮件到 and。nRF51822 开发套件:http/mealDetail.htm?spm=2013.1.1000371.d9.rFJVAH&meal_id=114490501&item_num_id=37035490461&seller_id=1065873722013-2016 infor link tech copy right一拖多https烧录器:/

2、item.htm?_u=4a58thc48a&id=446228218781. 前言本介绍了在APP 端动态修改蓝牙设备名的方法。当跟APP 连接上,APP基于修改蓝牙设备的名称以后,重启蓝牙设备,可以发现设备名称已经被修改。本SDK9.0 下的BLE_APP_UART 修改,请注意烧录对应版本的协议栈。2. 动手环节原理概述:32013-2016 infor link tech copy rightNORDIC 的有关 BLE 的 DEMO 默认都会包含 Generic Acs 服务和 Generic Attribute服务,它们的UUID 分别是 0 x1800 和 0 x1801。有的

3、BLE app 可能显示不了名字,只显示这两个服务的 UUID。即一个工程中即使没有定义任何服务,烧写到板子上后,看到这两个服务。连接上也能动态修改设备名就是利用了第一个服务 Generic Acs。该服务为通用属性规范服务,为设备提供了一种确定信息的方式,包括设备名,外观特性,最开始的连接参数等。使用其中的设备名属性,来实现设备名的动态修改。连接上设备后这个服务下的设备名属性,然后通过这个属性写新的名字,设备这边判断发送过来的操作是不是对 GenericAcs 服务下的设备名属性的写操作。如果是就保存名字到 flash 中,并且更新设备名。这样当设备重启或者断开连接后这边再扫描就能看到新的设

4、备名字了。当然你也可以专门建立一个服务然后添加一个特征值用于修改设备名。接收发送过来的新名字然后修改。不过SDK 里面 Generic Ac服务,省事一点。s 服务中已经有了设备名属性,这里就直接用,不再去专门创建实现方法:因为本例程涉及到 flash 的请参面的)。,所以先添加 flash 相关的处理(关于flash的操作/添加 sys_evt 事件处理sic void sys_evt_dispatch(u32_t sys_evt)pstorage_sys_event_handler(sys_evt);/协议栈初始化中上面的派发函数sic void ble_stack_init(void)u

5、32_t err_code;/ Initialize SoftDevice. SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, NULL);/ Subscribe for BLE events.err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch); APP_ERROR_CHECK(err_code);/sys_evt 事件处理函数 ,flash 需要用到err_code = softdevice_sys_evt_handler_set(sys_evt_dispatch

6、);APP_ERROR_CHECK(err_code);42013-2016 infor link tech copy right初始化 flash,并且定义flash 操作完成后的回调函数,在 main.c 文件的最上面添加如下代码:/第一个字节存放的是标识符表示 flash 中的数据是否是有效的 name/device_name0=0 xAA 表示是有效 name,device_name1表示 name 的长度#define NAME_SIZE 32u8_t device_nameNAME_SIZE;pstorage_handle_t my_name_addr; /name 存放的 fla

7、sh 地址/flash 操作完成后的回调函数。并没有做什么有用的事,但是调函数所以这里需要定义flash 块的时候需要有回sic void my_cb(pstorage_handle_t* handle, 8_t32_t 8_t32_tu u uuop_code, result,* p_data,data_len)switch(op_code)case PSTORAGE_UPDATE_OP_CODE:if (result = NRF_SUCS)prf(update end);break;/定义 flash 初始化函数void my_flash_init(void)u32_t err_code;

8、pstorage_module_param_t param;/申请一个块 用来存放 name param.block_count = 1; param.block_size = NAME_SIZE; param.cb = my_cb;err_code = pstorage_init();prf(init err_code:%drn,err_code);err_code = pstorage_register(¶m, &my_name_addr);prf(registererr_code:%drn,err_code); /加载 flash 内容。后面会判断 name 是否有效,如果有效就

9、会用改 name /否则使用默认 nameerr_code = pstorage_load(device_name, &my_name_addr, NAME_SIZE, 0);prf(load err_code:%drn,err_code);52013-2016 infor link tech copy right然后将该 flash 初始化函数放到 main 函数中main(void)u32_t err_code;bool erase_bonds;u8_tstart_string = START_STRING;/ Initialize.APP_TIMER_INIT(APP_TIMER_PRE

10、SCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, false);uart_init();/添加 flash 初始化,因为用到了打印需要放到 uart_init 函数之后/因为 gap_params_init 函数中会判断使用 flash 中的名字还是默认名字/所以需要放到该函数之前 my_flash_init();buttons_leds_init(&erase_bonds);ble_stack_init(); gap_params_init();servi_init(); advertising_init();conn_params

11、_init();prf(%srn,start_string);err_code = ble_advertising_start(BLE_ADV_MODE_FAST); APP_ERROR_CHECK(err_code);/ Enter main loop. for (;)er_manage();然后修改 main 函数中调用的 gap_params_init 函数。该函数中判断数中加载的 flash 内容是否是有效 name,是就使用不是就用默认 name.my_flash_init函sic void gap_params_init(void)u32_t err_code; ble_gap_c

12、onn_params_tgap_conn_params; ble_gap_conn_sec_mode_t sec_mode;BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);/flash 数据有效则使用 flash 中的名字62013-2016 infor link tech copy rightif ( device_name0 = 0 xaa ) /有效 使用新名字/device_name1为名字长度prf(update namern);err_code = sd_ble_gap_device_name_set(&sec_mode,(const u8_t

13、*) device_name+2,device_name1);elseprf(default namern);err_code = sd_ble_gap_device_name_set(&sec_mode,(const u8_t *) DEVICE_NAME,strlen(DEVICE_NAME);APP_ERROR_CHECK(err_code);memset(&gap_conn_params, 0, sizeof(gap_conn_params);gap_conn_params.min_conn_ gap_conn_params.max_conn_erval = MIN_CONN_erva

14、l = MAX_CONN_ERVAL;ERVAL;关于 flash 中的内容添加完了,然后是处理处理函数:发送过来的新名字。定义事件sic void name_change(ble_evt_t * p_ble_evt)ble_gatts_evt_write_t * p_evt_write = &p_ble_evt-evt.gatts_evt.params.write;/通过 UUID 来判断事件是不是写 Generic Acs 服务中的名字属性 if(p_evt_write-context.char_uuid.uuid =BLE_UUID_GAP_CHARACTERISTIC_DEVICE_N

15、AME) & (p_ble_evt-header.evt_id = BLE_GATTS_EVT_WRITE)prf(name change rn);device_name0 = 0 xaa; device_name1 = p_evt_write-len;memcpy(device_name+2, p_evt_write-data, p_evt_write-len); pstorage_update(&my_name_addr, device_name, NAME_SIZE, 0 );72013-2016 infor link tech copy right然后再将这个事件处理函数加到事件派发函

16、数 ble_evt_dispatch 中。 ic void ble_evt_dispatch(ble_evt_t * p_ble_evt)sname_change(p_ble_evt);ble_conn_params_on_ble_evt(p_ble_evt); ble_nus_on_ble_evt(&m_nus, p_ble_evt); on_ble_evt(p_ble_evt); ble_advertising_on_ble_evt(p_ble_evt);bsp_btn_ble_on_ble_evt(p_ble_evt);到这里基本实现了修改设备名。不过连接上修改名字后断开然后点击扫描发现

17、名字并未更新,需要复位一下硬件设备才能看到设备名字变了。修改事件派发函数 ble_evt_dispatch/因为该函数是在下面定义的,这里使用到,所以要 void advertising_init(void);一下sic void ble_evt_dispatch(ble_evt_t * p_ble_evt)name_change(p_ble_evt);/添加代码,在断开连接事件后初始化广播数据if ( p_ble_evt-header.evt_id = BLE_GAP_EVT_DISCONNECTED ) advertising_init();ble_conn_params_on_ble_evt(p_ble_evt); ble_nus_on_ble_evt(&m_nus, p_ble_evt); on_ble_evt(p_ble_ev

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论