对于研发和测试BLE来说,经常看到同名的设备,是极为不方便的,一大堆设备同时上电会让同事不知道哪一个设备才是自己真正想操作的目标。再说一下小米手环,家中有三支小米手环,打开设备搜索全是“MI”,都不知道连接哪一个,所以在开始使用的时候才要求用户去敲手环几下,当然这个体验也还算不错。但不管怎样,作为开发者,面对Office里一大堆的BLE设备,能够方便区分还是不错的。因此萌生让设备名称包含一个唯一的标识——MAC地址。比如笔者的电脑上显示这么多HXX,在调试时完全不知道该怎么选。

第一步先说如何更改设备名称

BLE中要更改名称是极为方便的,只需要更改扫描应答数据和GAP GATT NAME属性。以TI BLE STACK 1.4.0中的simpleBLEPeripheral工程为例来说,

修改的地方是:

simpleBLEPeripheral.c

static uint8 scanRspData[];

static uint8 advertData[];

第二步再说如何生成一个包含设备MAC地址的名称

每颗BLE的芯片都会有一个6字节的MAC地址,读到它并转化成ASCII字符,比如0x12 34 56 78 9a bc转换成“123456789ABC”,如果MAC地址全部写入设备名称,则显得太长,取后2字节地址,即字串“ABCD”即可。将设备名称的前辍连同地址字串写入扫描应答数据和GAP GATT NAME属性,设备运行时,我们再扫描就可以看到它的名称已经变了。

第三步来说实现

程序可以根据MAC地址生成一个自已唯一的名称,并在利用初始程序来修改步骤一提到的两处即可。下文的代码是生成动态名称的参考。在simpleBLEPeripheral.c文档的SimpleBLEPeripheral_Init()函数调用bleTask_BlePara()函数,同时注释掉该函数中以下调用。

//GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );

//GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );

// Set the GAP Characteristics

//GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );

参考代码:

/**************************************************************************************************

Filename:       simpleBLEOTAPatch.c

Editor:         Tome @ Newbit Studio

Revised:        $Date: 2015/8/11 11:20:02 +0800  $

Revision:       $Revision: 00001 $

Description:

History:

Notes:

**************************************************************************************************/

/**************************************************************************************************

// INCLUDES

**************************************************************************************************/

#include "bcomdef.h"

#include "OSAL.h"

#include "gatt.h"

#include "gatt_profile_uuid.h"

#include "hci.h"

#include "gap.h"

#include "gapgattserver.h"

#include "gattservapp.h"

#include "peripheral.h"

#include "osal_snv.h"

#include "simpleBLEOTAPatch.h"

/**************************************************************************************************

// TYPEDEF

**************************************************************************************************/

/**************************************************************************************************

// CONSTANTS

**************************************************************************************************/

#define DEVICE_NAME  "NB BOOT V3 ----"

#define DEVICE_NAME_WITH_HEADER  "xNB BOOT V3 ----*----*----*---"

#define DEVICE_NAME_PLACEHOLDER_IDX     0       //x is placeholder

/**************************************************************************************************

// GLOBAL VARIABLES

**************************************************************************************************/

/**************************************************************************************************

// LOCAL VERIABLE

**************************************************************************************************/

// GAP - SCAN RSP data (max size = 31 bytes)

static uint8 scanRspData[31];

// GAP - Advertisement data (max size = 31 bytes, though this is

// best kept short to conserve power while advertisting)

static uint8 advertData[31];

/**************************************************************************************************

// FUNCTIONS DECLERATION

**************************************************************************************************/

/**************************************************************************************************

// FUNCTIONS

**************************************************************************************************/

/**************************************************************************************************

* @fn      BleTask_ScanRspDataInit

*

* @brief

*

* @param   uint8 *dat

*

* @return  int

**************************************************************************************************/

int BleTask_ScanRspDataInit(uint8 *scanrsp)

{

uint8 dat[5] = {

GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,

LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),   // 100ms

HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),

LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),   // 1s

HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),

};

int len =

utilSerialization(scanrsp, 0, 5, dat);

dat[0] = GAP_ADTYPE_POWER_LEVEL;

dat[1] = 0;

len = utilSerialization(scanrsp, len, 2, dat);

return len;

}

/**************************************************************************************************

* @fn      bleTask_BlePara

*

* @brief

*

* @param   void

*

* @return  void

**************************************************************************************************/

void bleTask_BlePara(void)

{

int len = 0;

len = BleTask_ScanRspDataInit(scanRspData);

uint8 nvName[20];

uint8 rearNameLen = 4;

uint8 *pName;

if ( SUCCESS == osal_snv_read(NVID_USER_REARNAME, len, nvName) )

{

pName = nvName;

rearNameLen = osal_strlen((char *)nvName);

}

else

{

uint8 mac[6] = {1,2,3,4,5,6};

mac[5]=*(unsigned char *)(0x780E);

mac[4]=*(unsigned char *)(0x780F);

mac[3]=*(unsigned char *)(0x7810);

mac[2]=*(unsigned char *)(0x7811);

mac[1]=*(unsigned char *)(0x7812);

mac[0]=*(unsigned char *)(0x7813);

utilPrintMacAddress(mac, (char*)nvName);

pName = nvName+8;

rearNameLen = 4;

}

uint8 name[] = DEVICE_NAME_WITH_HEADER;

uint8* pFill = utilSearchChar2( name, '-');

uint8* pEnd = osal_memcpy(pFill, pName, rearNameLen);

uint8 length = pEnd-name;

//  uint8 length = sizeof(name);

//  name[length-5] = macString[8];

//  name[length-4] = macString[9];

//  name[length-3] = macString[10];

//  name[length-2] = macString[11];

name[DEVICE_NAME_PLACEHOLDER_IDX] = GAP_ADTYPE_LOCAL_NAME_COMPLETE;

len = utilSerialization(scanRspData, len, length, name);

// should remove the placeholder! and decrease the length

GGS_SetParameter( GGS_DEVICE_NAME_ATT, length-1, name+1 );

uint8 dat[10];

// advertise data

dat[0] = GAP_ADTYPE_FLAGS;

dat[1] = DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED;

len = utilSerialization(advertData, 0, 2, dat);

dat[0] = GAP_ADTYPE_16BIT_MORE;// some of the UUID's, but not all

dat[1] = LO_UINT16( DEVINFO_SERV_UUID );

dat[2] = HI_UINT16( DEVINFO_SERV_UUID );

dat[3] = LO_UINT16( 0xFEF9 );

dat[4] = HI_UINT16( 0xFEF9 );

len = utilSerialization(advertData, len , 5, dat);

GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );

GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );

}

/**************************************************************************************************

Copyright 2015 Newbit Studio All rights reserved.

**************************************************************************************************/

ble mac地址 协议_让BLE设备的名称包含MAC地址相关推荐

  1. 苹果mac休眠快捷键_强烈推荐 10 款免费的Mac 软件!(附下载地址)

    作者 |沉默王二 来源 |沉默王二 01.IINA IINA 是一款播放器软件,可以打开几乎所有格式的视频,如果 IINA 都打不开,那么其他软件注定也打不开. IINA 还提供了 Chrome 插件 ...

  2. python获取mac窗口坐标_[代码全屏查看]-Python3根据IP地址获取MAC地址

    [1].[代码] [Python]代码 #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import platform import ...

  3. mac iphone照片_如何在iPhone,iPad和Mac上禁用自动播放视频和实时照片

    mac iphone照片 Khamosh Pathak Khamosh Pathak Autoplaying videos and Live Photos can be nice to look at ...

  4. 隔离见证地址区别_科普:比特币钱包的隔离见证地址与普通地址有何区别?

    比特币钱包的隔离见证地址与普通地址有何区别?2017年7月21日,真正的扩容行动开始,全球比特币矿工开始锁定一个扩容软件升级.这次升级是基于比特币改进建议BIP91提出的「隔离见证」(Segregat ...

  5. java url地址不变_页面跳转后,浏览器地址栏地址保持不变

    有两个方法,一个使用JS实现,一个是用iframe实现. 首先是JS实现,废话就不多说了,上代码 function createXMLHttpRequest(){ if(window.XMLHttpR ...

  6. 物联协议整理——蓝牙BLE

    最近公司很多物联设备都使用BLE蓝牙和ZigBee通信,中间对设备功耗要求很高,补充下相关知识. 蓝牙协议栈 PHY层(Physical layer物理层).PHY层用来指定BLE所用的无线频段,调制 ...

  7. USB协议与Windows USB设备驱动程序笔记

    USB概述 USB主控制器负责数据处理,USB根集线器(ROOT HUB)提供一个连接USB主控制器与USB设备之间的接口和通路.USB集线器(USB HUB)可以对原有的USB端口在数量上进行扩展. ...

  8. mac搜索不到共享计算机,mac蓝牙搜索找不到设备怎么处理 Mac蓝牙设备连不上的解决方法有哪些...

    今天给大家带来mac蓝牙搜索找不到设备怎么处理,Mac蓝牙设备连不上的解决方法有哪些,让您轻松解决问题. mac蓝牙搜索找不到设备怎么办 Mac蓝牙设备连不上的原因解决方法.我们现在有很多人都在使用苹 ...

  9. 03-WIFI通讯获取Wifi名称及ip地址

    在上一小节中,笔者在介绍wifi通讯流程中介绍到,wifi通讯的本质就是由路由器(wifi芯片)担任局域网服务器来实现多个客户端之间的数据转发,所以第一步我们的服务器需要去监听局域网内的端口号,而要想 ...

最新文章

  1. Ubuntu代理上网软件cntlm
  2. sublime-text-3设置输入中文方法
  3. iOS8 【xcode6中添加pch全局引用文件】
  4. 你的代码是否按照高内聚、低耦合的原则来设计的?
  5. 线程的组成 java 1615387415
  6. php学习之----采集新浪头条新闻
  7. 网络尖兵技术分析及应对
  8. Hibernate中常见问题 No row with the given identifier exists问题
  9. top10开源docker开发工具
  10. Yahoo Web UIs——Java开发者丰富的Web UI
  11. C++11 继承构造函数与委托构造函数
  12. Django__WSGI
  13. 程序员所需要的数学知识都这里了
  14. 这家曾经的开源明星企业竟然生死未卜了
  15. 页面置换算法详解(10种)
  16. 61种u盘问题解决工具合集解决无法格式化,u盘写保护等问题。
  17. 有关公司治理的一些收获
  18. Excel画横坐标不均分的图表
  19. 各大网站的主题色RGB值,做icon专用
  20. Docker篇之镜像打标签tag

热门文章

  1. QtCreator-----Kits选项选择
  2. AR路由器通过web及代码实现公网用户使用公网地址访问内网服务器,同时内网用户实现通过公网地址访问内外那个服务器
  3. echarts二次渲染时宽高为0图表不显示
  4. 面试官:什么是责任链模式?
  5. Python自动化小米手环运动数据导出
  6. 解决 java.lang.RuntimeException: Method i in android.util.Log not mocked. See http://g.co/androidstudi
  7. Make the most of your 20s
  8. 不敢相信,技术栈,居然被P站秒了
  9. rest_framework学习之解析器(Parsers)
  10. 计算机专业毕业设计工作日志,计算机科学技术系毕业设计工作日志