zoukankan      html  css  js  c++  java
  • esp32使iOS 获取蓝牙外设的Mac地址

    原创文章,转发请注明链接和作者。(而且作者很懒,没有检查错别字)

    最近在做一个需要上下位机的项目,我负责的任务下位机,使用的主控芯片是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[6] = {0};//定义Mac地址存储空间
    esp_efuse_mac_get_default(mac_addr);//获取mac地址
    static esp_ble_adv_data_t adv_data;//定义广播用的结构体
    adv_data.manufacturer_len = 6; //填入Manufacture的长度 
    adv_data.p_manufacturer_data = mac_addr; //填入Manufacture的指针

    本文工作于1年多前完成,由于记忆缺失可能有部分疏漏 

     

    先编译好openwrt系统,此处不再赘述

    原本openwrt工程路径:./package/feeds/routing/batman-adv/。仔细查看会发现其实时一个链接到../../../../project/batman-advs/的软链接,也就时链接到./feeds/routing/batman-adv/。查看内部的Makefile,可以知道,其实在系统编译的时候openwrt将会从网络下载源码然后编译BATMAN.adv(下载路径为./dl/,里面有一个诸如batman-adv-xxxx.x.tar.gz的压缩包)。但是如果我们希望自己修改源码,则希望在本地编译自己的源码,而不是从网络下载。

    下面将展开具体实时步骤,编译过程中很有可能遇到奇怪的问题可以通过下面三步(大概),本人两次搭建环境编译BATMAN.adv都遇到了问题而且都是这么解决的:

    1. make clean
    2. 删除.config
    3. make menuconfig重新配置
    4. make

    注:为避免歧义将用“batman-adv”目录(有加粗)代指BATMAN.adv工程目录,具体用户是准备自己创建还是就在./feeds/routing/batman-adv/里面改自行决定。

    1、新建文件夹(可选/推荐)

      建议新建一个文件夹,而不是在./feeds/routing/batman-adv/里面乱改。

      将./package/feeds/routing/batman-adv/连接至./package/feeds/routing/batman-adv/文件夹。

      将./feeds/routing/batman-adv/里的东西全部复制到新建的文件夹。

      新建一个src文件夹。

      替换./package/feeds/routing/batman-adv/这个软链接为新的路径。

    2、将./dl/里面的BATMAN.adv源码包解压到batman-adv目录的src(推荐自己创建,方便管理)里面。

      源码大多在batman-adv/src/net/batman-adv/下,而batman-adv/patches/下的是补丁

    3、修改Makefile文件

      很遗憾,这里怎么修改我已经忘记了,在文末我将贴出我的Makefile供参考相关的可以查看openwrt官网。、

    4、配置中勾选BATMAN.adv

      BATMAN.adv的位置会给根据Makefile中填写的内容有所变化,默认在:Kernel modules ---> Network Support ---> kmod-batman-adv

    5、编译BATMAN.adv

      命令:make ./package/feeds/routing/batman-adv/compile V=s

      如果出现了奇奇怪怪的问题,可以尝试用上文提到的方法解决。

    6、获取安装包

      编译完成后里面会写XXX.ipk安装包的位置,例如:./bin/targets/ar71xx/nand/packages/kmod-batman-adv_4.9.172+0.0.0-7_mips_24kc.ipk。然后你就可以将这个安装包拷贝到路由器了。卸载路由器上之前的BATMAN.adv后,就可以在路由器运行 opkg install kmod-batman-adv_4.9.172+0.0.0-7_mips_24kc.ipk安装BATMAN.adv了。

     

    确认上述步骤没有问题后:

    7、用git命令应用batman-adv/patches/下的补丁。具体步骤自行搜索。

    8、在batman-adv/src/net/batman-adv/下添加新文件后,记得需要修改batman-adv/src/net/batman-adv/Makefile

     

    附件

    源码目录下的Makefile

    复制代码
    #
    # Copyright (C) 2010 OpenWrt.org
    #
    # This is free software, licensed under the GNU General Public License v2.
    # See /LICENSE for more information.
    #
    
    include $(TOPDIR)/rules.mk
    
    PKG_NAME:=batman-adv
    
    PKG_VERSION:=0.0.0
    PKG_RELEASE:=7
    
    PKG_LICENSE:=GPL-2.0
    PKG_EXTMOD_SUBDIRS=net/batman-adv
    
    STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h
    
    include $(INCLUDE_DIR)/kernel.mk
    include $(INCLUDE_DIR)/package.mk
    
    define KernelPackage/batman-adv
      MAINTAINER:=CuSO4Gem
      SUBMENU:=Other modules
      DEPENDS:=+KMOD_BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-crypto-crc32c +kmod-lib-crc32c +kmod-cfg80211 +kmod-ecdsa_support
      TITLE:=B.A.T.M.A.N. Adv S
      FILES:=$(PKG_BUILD_DIR)/net/batman-adv/batman-adv.$(LINUX_KMOD_SUFFIX)
      AUTOLOAD:=$(call AutoProbe,batman-adv)
    endef
    
    define KernelPackage/batman-adv/description
    B.A.T.M.A.N. advanced is a kernel module which allows to
    build layer 2 mesh networks. This package builds
    version $(PKG_VERSION) of the kernel module.
    endef
    
    define KernelPackage/batman-adv/config
        source "$(SOURCE)/Config.in"
    endef
    
    define Package/kmod-batman-adv/conffiles
    /etc/config/batman-adv
    endef
    
    PKG_EXTRA_KCONFIG:= \
        CONFIG_BATMAN_ADV=m \
        CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUG_LOG),y,n) \
        CONFIG_BATMAN_ADV_DEBUGFS=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUGFS),y,n) \
        CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_KMOD_BATMAN_ADV_BLA),y,n) \
        CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_KMOD_BATMAN_ADV_DAT),y,n) \
        CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),y,n) \
        CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_KMOD_BATMAN_ADV_NC),y,n) \
        CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_KMOD_BATMAN_ADV_BATMAN_V),y,n) \
    
    PKG_EXTRA_CFLAGS:= \
        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(PKG_EXTRA_KCONFIG)))) \
        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(PKG_EXTRA_KCONFIG)))) \
    
    NOSTDINC_FLAGS = \
        -I$(PKG_BUILD_DIR)/net/batman-adv \
        -I$(STAGING_DIR)/usr/include/mac80211-backport \
        -I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \
        -I$(STAGING_DIR)/usr/include/mac80211 \
        -I$(STAGING_DIR)/usr/include/mac80211/uapi \
        -I$(PKG_BUILD_DIR)/include/ \
        -include backport/backport.h \
        -include $(PKG_BUILD_DIR)/compat-hacks.h \
        -DBATADV_SOURCE_VERSION=\\\"openwrt-$(PKG_VERSION)-$(PKG_RELEASE)\\\"
    
    COMPAT_SOURCES = \
        $(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/core/skbuff.o,) \
        $(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/ipv4/igmp.o,) \
        $(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/ipv6/mcast_snoop.o,) \
    
    
    define Build/Compile
        +env "batman-adv-y=$(COMPAT_SOURCES)" \
        $(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \
            ARCH="$(LINUX_KARCH)" \
            CROSS_COMPILE="$(TARGET_CROSS)" \
            SUBDIRS="$(PKG_BUILD_DIR)/net/batman-adv" \
            $(PKG_EXTRA_KCONFIG) \
            EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS)" \
            NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \
            modules
    endef
    
    define Build/Prepare
        $(call Build/Prepare/Default)
        $(CP) ./files/compat-hacks.h $(PKG_BUILD_DIR)/
    endef
    
    define Build/Clean
            rm -rf $(BUILD_DIR)/$(PKG_NAME)/
    endef
    
    define KernelPackage/batman-adv/install
        $(INSTALL_DIR) $(1)/etc/config $(1)/etc/hotplug.d/net $(1)/etc/hotplug.d/iface $(1)/lib/batman-adv $(1)/usr/sbin $(1)/lib/netifd/proto
        $(INSTALL_DATA) ./files/etc/config/batman-adv $(1)/etc/config
        $(INSTALL_DATA) ./files/lib/batman-adv/config.sh $(1)/lib/batman-adv
        $(INSTALL_BIN) ./files/etc/hotplug.d/net/99-batman-adv $(1)/etc/hotplug.d/net
        $(INSTALL_BIN) ./files/lib/netifd/proto/batadv.sh $(1)/lib/netifd/proto
        $(INSTALL_BIN) ./files/lib/netifd/proto/batadv_vlan.sh $(1)/lib/netifd/proto
    endef
    
    $(eval $(call KernelPackage,batman-adv))
    复制代码

     

     
    标签: BATMAN.advopenwrt
    好文要顶 关注我 收藏该文  
    0
    0
     
     
     
    « 上一篇: BATMAN.adv IV 概述
    posted @ 2021-06-05 15:33  zornlink  阅读(0)  评论(0)  编辑  收藏  举报
  • 相关阅读:
    .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量
    ASP.NET Core技术研究-全面认识Web服务器Kestrel
    .NET Core技术研究-主机Host
    ASP.NET Core技术研究-探秘依赖注入框架
    ASP.NET Core技术研究-探秘Host主机启动过程
    .NET Core技术研究-中间件的由来和使用
    深入浅出腾讯BERT推理模型--TurboTransformers
    深入浅出PyTorch(算子篇)
    深入浅出Transformer
    生产者消费者问题总结
  • 原文地址:https://www.cnblogs.com/zornlink/p/11083079.html
Copyright © 2011-2022 走看看