对于研发和测试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. 利用generator自动生成model(实体)、dao(接口)、mapper(映射)

    1 在MySQL数据库中创建相应的表 /* Navicat MySQL Data Transfer Source Server : 虚拟机_zeus01 Source Server Version : ...

  2. 腾讯云主机 MySQL 远程访问配置方法

    使用腾讯云主机安装 MySQL 之后,需要通过以下步骤进行配置以实现远程访问,主要分为两大部分 一.服务器端口配置 1.如果你的云主机配置了安全组,如果没有配置安全组就可以直接跳过“步骤1”的操作,否 ...

  3. 【Tomcat】重新打war包

    Extract war in tomcat/webapps #!/bin/bash #----------------------------------------------- # FileNam ...

  4. 深入理解 React JS 中的 setState

    此文主要探讨了 React JS 中的 setState 背后的机制,供深入学习 React 研究之用. 在课程 React.js入门基础与案例开发 中,有些同学会发现 React JS 中的 set ...

  5. Tomcat 组件介绍

    用了好长时间tomcat,但是其实自己只是反复听了这个名字,对Tomcat并不了解 1.Tomcat组件 Catalina Coyote Jasper Cluster 2.组件介绍 Tomcat Co ...

  6. leetcode — word-break

    import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Source : https://oj.l ...

  7. vue 自定义组件 v-model双向绑定、 父子组件同步通信

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  8. [Micropython]发光二极管制作炫彩跑马灯

       先甩锅 做完后才发现最后一个灯坏了,就坏了一个灯也不好意思去找淘宝店家,大家视频凑合着看把.不过并不影响实验效果.因为这个发光二极管白天不是很明显 晚上炫彩效果就能出来了.本次实验用的是8个灯珠 ...

  9. js 判断值为Array or Object的方法

    ①obj instanceof Array / Object ②Array.prototype.isPrototypeOf(obj) ③Object.prototype.toString.call(o ...

  10. vue2.0 实现导航守卫(路由守卫)

    路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards). 导航守卫 ...