基于 QN9080 OOB 功能实现(上)

  • 概述

相信大家在使用平板时,有一些常用的键盘都是能够直接触碰连接的,即直接通过磁吸装上之后蓝牙就能直接连接上了设备,不用通过手动操作蓝牙就能使用了。其中使用到的技术就是 OOB(Out Of Band),即带外通信,通常是使用 NFC 的方式来交换连接配对信息,下面我们来简单的介绍一下如果实现通过手机刷 NTAG 直接与 QN9080 连接。

  • 协议内容分析

首先我们来分析一下需要在 NTAG 中写入什么样的数据,才能让手机设备识别到并且直接连接设备。在 NXP 的应用文档 AN13587 中有介绍到 NFC 数据的传输是使用 NFC Data Exchange Format(NDEF),其中格式是由 NFC Forum 来进行制定的,相关的说明文档可以在官网中https://nfc-forum.org/购买,这个文档并不是免费的,所以这边并不能详细的跟大家讲解,只能通过 NXP 的应用文档来跟大家分析一下。其中 NDEF 数据类型可以分为三种:默认数据;传统配对;安全连接

下图为一个最基本的 NDEF 中的类型:

首先我们来展开 NXP 文档中给出的默认 NDEF 数据:

NDFE Record Header

0xD2,

在这个头部数据中,可以拆分为:

MB = 1b,ME = 1b,CF = 0b,SR = 1b,IL = 0b,TNF = 010b

其中 MB(Massage Begin)跟 ME(Massage End) 都是 1,说明只有这一个 NFC Record,并且 CF(Chunk Flag)为0即没有分块,SR(Short Record)说明payload 的长度限制在 255 Byte 以内;TNF(Type Name Format)为2,说明 payload 的数据类型为 MIME(Multipurpose Internet Mail Extensions),遵循 RFC2046规范

官网(https://www.rfc-editor.org/rfc/rfc2046)。

Record Type Length

0x20,

这个指示了Record Type Name 的长度为 32 Bytes

Payload Length

0x15,

这里指示Record Type Name 后面的 Payload 数据长度为 21 Bytes

Record Type Name

0x61,0x70,0x70,0x6c,0x69,0x63,0x61,0x74,

0x69,0x6F,0x6E,0x2F,0x76,0x6E,0x64,0x2E,

0x62,0x6C,0x75,0x65,0x74,0x6F,0x6F,0x74,

0x68,0x2E,0x6C,0x65,0x2E,0x6F,0x6F,0x62,

这里就是上面 MIME 的具体数据,转换为 Ascii 之后如下:

application/vnd.bluetooth.le.oob

下面关于 BLE 部分的 Type 定义如下

LE Bluetooth Device Address Length

0x08,

LE Bluetooth Device Address data type

0x1B,

Bluetooth Device Address

0xC6,0xC5,0xC4,0xC3,0xC2,0xC1,0x00,

其中最后一位表示是地址类型是 public device address,前面 6 Byte 为 Address,注意 NDEF 是使用小端格式,所以这里实际的地址是 C1:C2:C3:C4:C5:C6

LE Role Length

0x02,

LE Role date type

0x1C,

LE Role: Only peripheral role capabilities

0x02,

Local Name length

0x08,

Local Name data type

0x09,

这里中 Local Name 定义与蓝牙核心规范中的定义一致,其中0x09 表示这个 Local Name 为 Ad Complete Local Name

Local Name Ascii

0x46,0x53,0x4C,0x5F,0x51,0x50,0x50

这里为需要连接的 BLE 设备广播名称的 ASCII 码。

关于安全部分的 Types 定义如下:


以下传统配对拓展部分

Security Manager TK value length

0x17,

Security Manager TK value data type

0x10,

Security Manager TK value

0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F

以下为安全连接的数据拓展部分

Secure Connection Confirmation value length

0x11,

Secure Connection Confirmation value data type

0x22,

Secure Connection Confirmation value

0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F

Secure Connection Random value length

0x11,

Secure Connection Random value data type

0x23,

Secure Connection Random value

0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F

以上是对于一个简单默认 NDEF 数据的解析,后续的传统连接以及安全连接的 NDEF 数据类型就是在原有的默认分别加上 LTK 的数据交换内容或者是安全连接时的确认值以及随机值。实际上相当于将 BLE 在连接配对时需要交换的数据密钥数据都放在 NFC 中进行交换。我们将这些数据写进去之后,将 Device打开蓝牙广播,这时我们用手机 NFC 读取 Ntag 时,手机就会弹出连接 BLE 设备的请求。如下图所示:

使用手机上的NFC读取软件读到的 NTAG 数据如下:

  • 总结

在本篇中,简单的介绍了如何在 NTAG 中写入 BLE Device 的相关数据,让手机通过 NFC 读取直接进行连接,从而减少中间人攻击(MITM)的风险。本文只是简单的分析了 NFC 中的数据内容,在后续中会再给大家介绍 Device 中相关配置,敬请期待。

  • 参考资料

[1]《Core_v5.3》

[2]《AN13587——QN9090 OOB Pairing using NTAG》

[3]《SDK_2_2_6_QN908XCDK》

[4]《NFCForum-AD-BTSSP-1.3》

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论