解构蓝牙地址以及蓝牙MAC地址查询

现实场景中,经常会碰到“搜索到一个蓝牙地址,但是没有名称,无法确定是不是想连接的设备等问题?”,这个时候就想着,如果可以从地址信息中能解析出某些有用的信息,帮助我们筛选就好了。别急,还真是有可能的,让我们先来重新认识一下蓝牙地址的构成。
当然,这里介绍的是Bluetooth Address,即public address。并不针对BLE的random address。为什么呢?我们来慢慢看。

  1. 什么是Bluetooth Address(BD_ADDR)?

    了解过蓝牙基本知识的人,都知道Bluetooth Address是制造商分配给每个蓝牙设备的唯一48位标识符(和电脑的MAC地址一样)。它是用来唯一识别一个物理设备的标识,正常情况下,该地址需要向IEEE申请(其实是购买,呵呵!)。企业交钱,IEEE保证地址的唯一性,皆大欢喜。
    蓝牙地址通常显示为6个字节,以十六进制表示,用冒号分隔(示例- 00:11:22:33:FF:EE)。
    其中,蓝牙地址的upper part(即most-significant 24 bits)被称为Organizationally Unique Identifier (OUI)。它可以用来确定设备的制造商。OUI是由电气和电子工程师协会(IEEE) Assigned。
    另外,蓝牙设备地址还被用来在蓝牙设备之间的无线通信中确定跳频模式。

  2. Bluetooth Address Structure

    Bluetooth Address有三部分组成: NAP, UAP, LAP
    举例来说,如下图所示:
    在这里插入图片描述
    从图中可以看到,OUI包含NAP和UAP两部分。其中NAP(Non-significant Address Part)部分2字节,为OUI的前16位;NAP值,用于跳频同步帧。另外,UAP(Upper Address Part)1字节,包含剩余的8位OUI;UAP值,被用作为各种蓝牙规范算法中的种子。

除了OUI之外,剩余的3字节,为LAP(Lower Address Part), 这部分蓝牙地址由设备供应商自己分配。LAP值,作为每一个transmitted Frame中Access Code的一部分,来唯一地标识蓝牙设备。LAP和UAP构成蓝牙地址的重要地址部分(SAP)。

  1. 解决的问题

1) 从Bluetooth Address的构成来看,属于设备商自己定义的部分,只有LAP part,即最多只能定义2^24 = 16777216个设备地址?这似乎对于某些大厂,比如Aplle,HUAWEI来讲,不够用?怎么办?
目前看来,最主要的解决方式是,每家公司多申请一些OUI,比如Apple就申请了几十个之多,当然大厂不差钱,哈哈。(因为每申请一个,就要花费一份钱向IEEE购买)。
在这里插入图片描述
2) 怎样通过地址,查询到厂商的信息呢?
当然有很多途径,这里分享一个比较好用的网址,如下:
在这里插入图片描述
Click the “Lookup”, 然后就得到结果了:
在这里插入图片描述

3) 这一套不适合BLE的Random Address?

是的。因为Random Address的设备地址不是固定分配的,而是在设备启动后随机生成的,而且会根据一定的周期发生变化。它的出现正是为了规避Public address申请/维护成本高、复杂等问题的,当然主要是可以保证地址可变,更安全。所以,它并不遵从OUI这一套。

希望此文对你有帮助,感谢阅读

### 回答1: 下面是一个可以在 JavaScript 中截取快递行政区地址电话名称的示例代码: ``` const express = { name: "Express Delivery", address: "123 Main St, Anytown USA", phone: "123-456-7890", region: "North America" }; const name = express.name; const address = express.address; const phone = express.phone; const region = express.region; ``` 在这个例子中,我们使用了对象解构赋值来分别获取对象中的 `name`、`address`、`phone` 和 `region` 属性。你也可以使用普通的访问对象属性的方式来获取这些信息,如下所示: ``` const name = express.name; const address = express.address; const phone = express.phone; const region = express.region; ``` 请注意,上述代码假定已经有一个名为 `express` 的对象,并且该对象具有 `name`、`address`、`phone` 和 `region` 属性。如果你想要处理的是一个包含多个快递信息的数组,你可以使用 `Array.prototype.forEach()` 方法来遍历数组并获取每个快递的信息。 ``` const expressList = [ { name: "Express Delivery 1", address: "123 Main St, Anytown USA", phone: "123-456-7890", region: "North America" }, { name: "Express Delivery 2", address: "456 Main St, Anytown USA", phone: "123-456-7891", region: "North America" }, // ... ]; expressList.forEach(express => { const name = express.name; const address = express.address; const phone = express.phone; const region = express.region; // Do something with the express information... }); ``` ### 回答2: 在JavaScript中,可以使用字符串截取的方法来提取快递地址、行政区、电话和名称等信息。根据常见的地址格式,通常可以分为几个部分,如省份、城市、区/县、详细地址等。下面是一个简单示例来说明如何使用JavaScript截取快递地址及相关信息: 假设有一个完整的地址字符串如下:var address = "广东省广州市天河区科学大道123号 020-12345678 收件人:张三"; 首先,我们可以使用split()方法将字符串按空格分割成一个字符串数组: var addressArray = address.split(" "); 然后,我们可以根据数组的索引来获取地址中的不同部分: var province = addressArray[0]; // 广东省 var city = addressArray[1]; // 广州市 var district = addressArray[2]; // 天河区 var street = addressArray[3]; // 科学大道123号 var telephone = addressArray[4]; // 020-12345678 var recipient = addressArray[5]; // 收件人:张三 注意:以上代码假设地址中的各部分都是按照一定的顺序排列的。如果地址格式不一致,或者有特殊字符,可能需要根据具体情况进行一些适应性的处理。 总结起来,使用JavaScript的split()方法可以将地址字符串分割成一个字符串数组,然后可以根据数组的索引来提取地址中的各个部分,从而实现快递地址信息的截取。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值