对于研发和测试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地址的更多相关文章

  1. IP地址、计算机名称、MAC地址如何获取

    以下的操作都在“命令提示窗口”中操作. 已知IP,如何获得计算机名称 方法(1): 使用ping -i ip地址 例如已知地址为192.168.1.168. 那么使用ping -i 192.168.1 ...

  2. java 获取计算机名称, ip, mac地址

    写在前面 通常所说查询本机mac地址是以以太网为准的, 也就是网线那个口..这种描述略捞. 但是通过java的getHostAddress获取ip以及getHardwareAddress()方法获取m ...

  3. 获取Android设备无线和以太网MAC地址

    package com.raycloud.wolf.blogformac; import android.net.wifi.WifiManager; import android.support.v7 ...

  4. BLE获取iphone mac地址的方法--【原创】

    本人用的BLE是TIcc2541,1.3.2协议栈 1.首先要说明的是,iphone手机将信息保护了,BLE设备读到的iphone地址是随机的,每次连接都会不同 2.下面我就具体说明如何查看手机的ma ...

  5. 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层

    这篇文章主要是来做(da)推(guang)介(gao)的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,后面会 ...

  6. esp32使iOS 获取蓝牙外设的Mac地址

    最近在做一个需要上下位机的项目,我负责的任务下位机,使用的主控芯片是esp32.这个项目中有一项是需要手机扫描二维码然后连接作为esp32的蓝牙.二维码中包含了mac地址信息,在手机扫描周围设备的时候 ...

  7. Linux下读取默认MAC地址

    导读MAC(Media Access Control,介质访问控制)计算机通过它来定义并识别网络设备的位置.在嵌入式linux学习中不可避免也会遇到MAC,本文主要描述了如何通过操作OTP来读取嵌入式 ...

  8. 怎么查询局域网内全部电脑IP和mac地址等信息?

    在局域网内查询在线主机的IP一般比较简单,但局域网内全部电脑的IP怎么才能够查到呢?查询到IP后我还要知道对方的一些详细信息(如MAC地址.电脑名称等)该怎么查询呢??? 工具/原料 Windows ...

  9. 怎么查询局域网内全部电脑IP和mac地址..

    在局域网内查询在线主机的IP一般比较简单,但局域网内全部电脑的IP怎么才能够查到呢?查询到IP后我还要知道对方的一些详细信息(如MAC地址.电脑名称等)该怎么查询呢??? 工具/原料 Windows ...

随机推荐

  1. 分享一个Maven的架构,以及在Maven配置中的注意事项

    Maven作为一个十分流行的项目管理工具,在我们的项目变得逐渐复杂的时候,可以有效的降低项目管理难度. 聚合工程就是当项目到达一定规模时,十分有效的管理子项目和模块的方法. 首先介绍一下,在大型项目中 ...

  2. lesson - 11 正则表达式

    正则就是有一定规律的字符串,有几个特殊符号很关键(. * + ? | ),我们平时不仅可以用命令行工具grep/sed/awk去引用正则,而且还可以把正则嵌入在nginx.apache.甚至php.p ...

  3. 1.QT开发第一个程序

    Ubuntu16.04安装QT5.8.0:http://www.cnblogs.com/dotnetcrazy/p/6725945.html QT5.8支持中文输入法(附带老版本的解决+不理想的情况解 ...

  4. Python的range函数详细用法

    1. >>> range(1,5)  #代表从1到5(不包含5) [1, 2, 3, 4]>>> 2. >>> range(1,5,2) #代表从 ...

  5. eclipse在debug模式下总是自动进入到ThreadPoolExecutor类中

    当我们将web项目发布到tomcat服务器中,并且以debug模式启动的时候,总是自动跳转到 ThreadPoolExecutor 类中,如下: 解决办法 在eclipse中点击Window-> ...

  6. K:线性表的实现—链表

    单链表的概念:  采用链式存储方式存储的线性表称之为链表,链表中每个节点包含存放数据元素的值的数据域和存放指向逻辑上相邻节点的指针域.若一个节点中只包含一个指针域,则称此链表为单链表. 单链表的特点: ...

  7. Java并发之底层实现原理学习笔记

    本篇博文将介绍java并发底层的实现原理,我们知道java实现的并发操作最后肯定是由我们的CPU完成的,中间经历了将java源码编译成.class文件,然后进行加载,然后虚拟机执行引擎进行执行,解释为 ...

  8. 房上的猫:JavaDoc注释

    //这是一个注释 /*   *这是一个演示程序   */ /**    *@这是JavaDoc注释.   */ JavaDoc注释 背景: javadoc是Sun公司提供的一个技术,它从程序源代码中抽 ...

  9. Python+selenium+eclipse+pydev自动化测试环境搭建

    一.        安装python 1.下载安装python 可访问python的官方网站:http://www.Python.prg找到下载页面下载需要的版本,可下载python2.x或者pyth ...

  10. 在VSCode中编辑HTML文档时,在Dom标签上写style属性时智能提示的问题

    首先在VSCode中打开一个HTML文件 然后点右下角的“选择语言模式” 然后点击配置HTML语言的基础设置 然后在打开的界面中(右侧) 输入如下代码 { "editor.quickSugg ...