让BLE设备的名称包含MAC地址
对于研发和测试BLE来说,经常看到同名的设备,是极为不方便的,一大堆设备同时上电会让同事不知道哪一个设备才是自己真正想操作的目标。再说一下小米手环,家中有三支小米手环,打开设备搜索全是“MI”,都不知道连接哪一个,所以在开始使用的时候才要求用户去敲手环几下,当然这个体验也还算不错。但不管怎样,作为开发者,面对Office里一大堆的BLE设备,能够方便区分还是不错的。因此萌生让设备名称包含一个唯一的标识——MAC地址。比如笔者的电脑上显示这么多HXX,在调试时完全不知道该怎么选。
.png)
第一步先说如何更改设备名称
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地址的更多相关文章
- IP地址、计算机名称、MAC地址如何获取
以下的操作都在“命令提示窗口”中操作. 已知IP,如何获得计算机名称 方法(1): 使用ping -i ip地址 例如已知地址为192.168.1.168. 那么使用ping -i 192.168.1 ...
- java 获取计算机名称, ip, mac地址
写在前面 通常所说查询本机mac地址是以以太网为准的, 也就是网线那个口..这种描述略捞. 但是通过java的getHostAddress获取ip以及getHardwareAddress()方法获取m ...
- 获取Android设备无线和以太网MAC地址
package com.raycloud.wolf.blogformac; import android.net.wifi.WifiManager; import android.support.v7 ...
- BLE获取iphone mac地址的方法--【原创】
本人用的BLE是TIcc2541,1.3.2协议栈 1.首先要说明的是,iphone手机将信息保护了,BLE设备读到的iphone地址是随机的,每次连接都会不同 2.下面我就具体说明如何查看手机的ma ...
- 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层
这篇文章主要是来做(da)推(guang)介(gao)的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,后面会 ...
- esp32使iOS 获取蓝牙外设的Mac地址
最近在做一个需要上下位机的项目,我负责的任务下位机,使用的主控芯片是esp32.这个项目中有一项是需要手机扫描二维码然后连接作为esp32的蓝牙.二维码中包含了mac地址信息,在手机扫描周围设备的时候 ...
- Linux下读取默认MAC地址
导读MAC(Media Access Control,介质访问控制)计算机通过它来定义并识别网络设备的位置.在嵌入式linux学习中不可避免也会遇到MAC,本文主要描述了如何通过操作OTP来读取嵌入式 ...
- 怎么查询局域网内全部电脑IP和mac地址等信息?
在局域网内查询在线主机的IP一般比较简单,但局域网内全部电脑的IP怎么才能够查到呢?查询到IP后我还要知道对方的一些详细信息(如MAC地址.电脑名称等)该怎么查询呢??? 工具/原料 Windows ...
- 怎么查询局域网内全部电脑IP和mac地址..
在局域网内查询在线主机的IP一般比较简单,但局域网内全部电脑的IP怎么才能够查到呢?查询到IP后我还要知道对方的一些详细信息(如MAC地址.电脑名称等)该怎么查询呢??? 工具/原料 Windows ...
随机推荐
- Xamarin android SwipeRefreshLayout入门实例
android SwipeRefreshLayout 是实现的效果就是上滑下拉刷新ListView 获取其他控件数据.基本上每个App都有这种效果.Google提供了一个官方的刷新控件SwipeRef ...
- 地理信息系统公开课计划 前言I
对,就是地理信息系统(GIS),不是遥感RS,也不是编程,纯粹的地理信息系统. 地理信息系统=数学+物理+计算机+地理的烧脑组合. 但凡能知道.了解地理信息系统的人,基本上都不会是非知识分子,我就不矫 ...
- php-fpm开机启动
php-fpm开机自动启动脚本 网上有各种版本的php-fpm开机自动启动脚本, 其实你编译后源目录已经生成自动脚本.不用做任何修改即用. cp {php-5.3.x-source-dir}/sapi ...
- html5 canvas画布尺寸与显示尺寸
我在用canvas制作画板时,遇到了绘图位置和鼠标位置不一致的问题,所以今天查阅了一下资料,解决了这个问题. canvas绘图原理 在Canvas元素的内部存在一个名为2d渲染环境(2d rederi ...
- DNS 域名系统的简介
一.DNS域名系统简介 1.网络中为了区别各个主机,必须为每台主机分配一个唯一的地址, 这个地址即称为“IP 地址.但这些数字难以记忆, 所以采用“域名” 的方式来取代这些数字. 2.当某台主机要与其 ...
- Kotlin——最详细的抽象类(abstract)、内部类(嵌套类)详解
如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索QQ群号:497071402 进入正题 在前面几个章节中,详 ...
- Django--admin源码流程
admin.py from django.contrib import admin from . import models """ 通过原生的django admi ...
- 【漏洞分析】dedecms有前提前台任意用户密码修改
0x00 前言 早上浏览sec-news,发现锦行信息安全发布了一篇文章<[漏洞分析] 织梦前台任意用户密码修改>,看完之后就想着自己复现一下. 该漏洞的精髓是php的弱类型比较,'0. ...
- IntelliJ IDEA运行项目成功后,无法访问Tomcat主页
问题 初次使用IntelliJ IDEA,但今天在运行项目启动Tomcat后,发现无法访问Tomcat首页,出现404错误:输入http://localhost:8080时无法访问Tomcat首页,但 ...
- 【次小生成树】bzoj1977 [BeiJing2010组队]次小生成树 Tree
Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一 ...