最近在做一个需要上下位机的项目,我负责的任务下位机,使用的主控芯片是esp32。这个项目中有一项是需要手机扫描二维码然后连接作为esp32的蓝牙。二维码中包含了mac地址信息,在手机扫描周围设备的时候通过mac地址筛选出目标设备,然后建立连接。在安卓系统上进展顺利,但是在ios上的时候,这个过程遇到的问题,ios中无法直接获取蓝牙的mac地址。写上位机的负责人发给了我一个链接https://www.jianshu.com/p/1d6a8fc8134f。这个解决方案虽然不是esp32的,但是了解了原理之后还是可以在esp32上实现。

主要原理是在ble广播自己的时候会有一个广播内容中包含很多项,其中有一想就是该产品的制造商(Manufacture)信息,而ios是可以获取这一项内容的。所以,我们可以把mac地址填入这一项,然后ios就可以通过读取制造商信息顺利的识别不同设备了。具体的步骤如下:

1、获取mac地址

2、将mac地址填入"制造商(Manufacture)"项中

一、关于获取mac地址

这里我暂时没有找到获取蓝牙mac地址的方法,但是因为暴露mac地址的目的是为了区分设备,所以只要选择一个不重复的mac地址就好了。这里,选择使用了设备的mac地址。eFuse模块中存在设备的mac地址,具体可以参考https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-reference/system/efuse.html。相关的例程可以参考esp-idf/examples/system/base_mac_address。

结论:

esp_err_t esp_efuse_mac_get_default(uint8_t* mac);函数可以获取设备的mac地址,其中mac地址是6位。

二 、mac地址填入"制造商(Manufacture)"项

esp_ble_adv_data_t结构体中有一项是p_manufacturer_data为"制造商(Manufacture)"项的指针,manufacturer_len"制造商(Manufacture)"项的长度。对这两项幅值可以就可以在广播的是将"制造商(Manufacture)"项广播出去。
 
涉及到的语句如下。使用对代码进行相应的修改。
static uint8_t mac_addr[] = {};//定义Mac地址存储空间
esp_efuse_mac_get_default(mac_addr);//获取mac地址
static esp_ble_adv_data_t adv_data;//定义广播用的结构体
adv_data.manufacturer_len = ; //填入Manufacture的长度 
adv_data.p_manufacturer_data = mac_addr; //填入Manufacture的指针

esp32使iOS 获取蓝牙外设的Mac地址的更多相关文章

  1. iOS 获取设备信息,mac地址,IP地址,设备名称

    #import "DeviceInfoUtil.h" #import "GlobleData.h" #import "sys/utsname.h&qu ...

  2. iOS 获取WIFI SSID及MAC地址

    NSString *ssid = @"Not Found"; NSString *macIp = @"Not Found"; CFArrayRef myArra ...

  3. Delphi获取本机的MAC地址

    Delphi获取本机的MAC地址: uses   NB30; function GetAdaPterInfo(lana: Char): string; var   Adapter: TAdapterS ...

  4. ASP.NET获取客户端IP及MAC地址

    朋友最近问如何获取客户端IP及MAC地址,一直想把这段给整理一下,契机来了:下边分为了C#后台获取的方法和前台Javascript(调用ActiveX)获取的方法,大家如果有好的方法一起讨论撒O(∩_ ...

  5. Java获取主板序列号、MAC地址、CPU序列号工具类

    import java.io.File; import java.io.FileWriter; import java.io.BufferedReader; import java.io.IOExce ...

  6. 如何获取公网IP的mac地址

    如何获取远程IP的mac地址 思路分析 由于java本身没有相关的jar包进行获取,所以这里介绍从其他的方面进行入手和实践 使用的工具对比: tcpdump tshark pcap4j 都可以达到抓包 ...

  7. JAVA获取本机的MAC地址

    /** * 获取本机的Mac地址 * @return */ public String getMac() { InetAddress ia; byte[] mac = null; try { // 获 ...

  8. iOS 作为蓝牙外设广播信息

    苹果蓝牙后台的限制,原本广播会有两个段分别是localName和serviceUUID这两块,但现在后台广播时,是不发送在这两段的 手机app可以作为一个蓝牙外设端来模拟外设硬件,但广播包里的数据只能 ...

  9. iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理) 2

    1.创建中心设备,并设置代理 一般情况下,手机是中心设备,蓝牙设备是外围设备. self.centralManager = [[CBCentralManager alloc] initWithDele ...

随机推荐

  1. nyoj_283_对称排序_201312051155

    对称排序 时间限制:1000 ms  |           内存限制:65535 KB 难度:1   描述 In your job at Albatross Circus Management (y ...

  2. 洛谷——P2347 砝码称重

    https://www.luogu.org/problem/show?pid=2347#sub 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输 ...

  3. PHP array_count_values()

    定义和用法 array_count_values() 函数用于统计数组中所有值出现的次数. 本函数返回一个数组,其元素的键(索引)是原数组的值,元素的值是该值在原数组中出现的次数. 语法 array_ ...

  4. MySQL批量SQL插入各种性能优化

    对于一些数据量较大的系统.数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此.优化数据库插入性能是非常有意义的 ...

  5. SolrCloud 分布式集群部署步骤

    https://segmentfault.com/a/1190000000595712 SolrCloud 分布式集群部署步骤 solr solrcloud zookeeper apache-tomc ...

  6. 线段树+离线 hdu5654 xiaoxin and his watermelon candy

    传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...

  7. Mac safari 下iframe的hash取不到BUG

    RT http://192.168.1.66/salaryl#abc 这样的链接是取不到hash的, 需要在最后加上斜杠,如下:http://192.168.1.66/salaryl/#abc fuc ...

  8. Catalan数(卡特兰数)

    Catalan数(卡特兰数) 卡特兰数:规定h(0)=1,而h(1)=1,h(2)=2,h(3)=5,h(4)=14,h(5)=42,h(6)=132,h(7)=429,h(8)=1430,h(9)= ...

  9. hdu1704——floyd

    Problem Description there are N ACMers in HDU team.ZJPCPC Sunny Cup 2007 is coming, and lcy want to ...

  10. 解析HTML文件

    #!/usr/bin/env python3 # -*- coding: UTF-8 -*- from bs4 import BeautifulSoup import operator import ...