蓝牙:经典:PBAP Shell

本文档介绍如何运行蓝牙经典 PBAP(电话簿访问配置文件)功能。 pbap 命令提供蓝牙经典 PBAP Shell 命令。

有两个子命令: pbap pce 和 pbap pse。

pbap pce 用于电话簿客户端设备(PCE)功能, pbap pse 用于电话簿服务器设备(PSE)功能。

命令

除 pbap pce sdp_reg、 pbap pse rfcomm_register 和 pbap pse l2cap_register 之外,所有命令都只能在建立 ACL 连接后使用。

pbap 命令:

uart:~$ pbap
pbap - Bluetooth pbap shell commands
Subcommands:
  alloc_buf                        : Alloc tx buffer
  release_buf                      : Free allocated tx buffer
  pce                              : Client sets
  pse                              : Server sets
  add_header_auth_challenge        : <password>
  add_header_auth_response         : <password>
  add_ap                           : add application param

pbap pce 命令:

uart:~$ pbap pce
pce - Client sets
Subcommands:
  sdp_reg                          : [none]
  sdp_discover                     : [none]
  connect_rfcomm                   : <channel>
  disconnect_rfcomm                : [none]
  connect_l2cap                    : <channel>
  disconnect_l2cap                 : [none]
  connect                          : <mopl>
  disconnect                       : [none]
  pull_pb                          : <name> [srmp]
  pull_vcard_listing               : <name> [srmp]
  pull_vcard_entry                 : <name> [srmp]
  set_phone_book                   : <Flags> [name]
  abort                            : [none]

pbap pse 命令:

uart:~$ pbap pse
pse - Server sets
Subcommands:
  rfcomm_register                  : [none]
  l2cap_register                   : [none]
  register                         : [none]
  connect_rsp                      : <mopl> <rsp: unauth,success,error> [rsp_code]
  disconnect_rsp                   : <rsp: success,error> [rsp_code]
  pull_phone_book_rsp              : <rsp: noerror, error> [rsp_code] [srmp]
  pull_vcard_listing_rsp           : <rsp: noerror, error> [rsp_code] [srmp]
  pull_vcard_entry_rsp             : <rsp: noerror, error> [rsp_code] [srmp]
  set_phone_book_rsp               : <rsp: success, error> [rsp_code]
  abort_rsp                        : <rsp: success, error> [rsp_code]

pbap add_ap (应用参数)命令:

uart:~$ pbap add_ap
add_ap - add application param
Subcommands:
  Order                            : <indexed/alphanumeric/phonetic>
  SearchValue                      : <text>
  SearchAttribute                  : <name/number/sound>
  MaxListCount                     : <0x0000-0xffff>
  ListStartOffset                  : <0x0000-0xffff>
  PropertySelector                 : <64 bits mask : bt_pbap_appl_param_property_mask>
  Format                           : <v2.1/v3.0>
  PhonebookSize                    : <0x0000-0xffff>
  NewMissedCalls                   : <0x00-0xff>
  PrimaryFolderVersion             : <16bytes>
  SecondaryFolderVersion           : <16bytes>
  vCardSelector                    : <64 bits mask : bt_pbap_appl_param_property_mask>
  DatabaseIdentifier               : <16bytes>
  vCardSelectorOperator            : <or/and>
  ResetNewMissedCalls              :
  PbapSupportedFeatures            : [supported features]

PBAP PCE SLC

pbap pce 子命令提供蓝牙经典中 PBAP PCE(电话簿客户端设备)的功能。

  1. 注册 PCE SDP:

uart:~$ pbap pce sdp_reg
  1. 发现 PSE SDP:

uart:~$ pbap pce sdp_discover
SDP PBAP data@0x2000d4a0 (len 54) hint 0 from remote XX:XX:XX:XX:XX:XX
PSE rfcomm channel param 0x0001
PSE l2cap psm param 0x0019
PSE feature param 0x00000019
  1. 通过 RFCOMM 连接到 PSE:

uart:~$ pbap pce connect_rfcomm 0x01
PBAP PCE rfcomm transport connected on 0x20005dd8
  1. 建立 OBEX 连接:

uart:~$ pbap alloc_buf
uart:~$ pbap pce connect 300
pbap connect result Success, mopl 256
Connection ID: 0x00000001
Processing successful connection...
Connection established successfully (no auth required)
  1. 断开与 PSE 的连接:

uart:~$ pbap pce disconnect
pbap disconnect result OK
PBAP PCE rfcomm transport disconnected

PBAP PSE SLC

pbap pse 子命令提供蓝牙经典中 PBAP PSE(电话簿服务器设备)的功能。

  1. 注册 PSE RFCOMM 服务器:

uart:~$ pbap pse rfcomm_register
RFCOMM server (channel 01) is registered
  1. 注册 PSE L2CAP 服务器:

uart:~$ pbap pse l2cap_register
L2cap server (psm 01) is registered
  1. 注册 PSE:

uart:~$ pbap pse register
  1. 接受 PCE 连接并响应:

uart:~$ pbap alloc_buf
uart:~$ pbap pse connect_rsp 300 success
pbap connect version 1, mopl 256
Connection established with authentication
  1. 断开与 PCE 的连接:

uart:~$ pbap alloc_buf
uart:~$ pbap pse disconnect_rsp success
pbap disconnect requested by pce

拉取电话簿

从 PSE 拉取完整电话簿:

uart:~$ pbap alloc_buf
uart:~$ pbap pce pull_pb "telecom/pb"
pbap pull phonebook result Continue
Application Parameters (length: 2):
  PhonebookSize: 0x0002 (2)

=========body=========
BEGIN:VCARD
VERSION:2.1
FN;CHARSET=UTF-8:descvs
N;CHARSET=UTF-8:descvs
END:VCARD
=========body=========

please send pull cmd again
uart:~$ pbap pce pull_pb "telecom/pb"
pbap pull phonebook result Success
Application Parameters (length: 2):
  PhonebookSize: 0x0002 (2)

=========body=========
BEGIN:VCARD
VERSION:2.1
FN;CHARSET=UTF-8:descvs
N;CHARSET=UTF-8:descvs
END:VCARD
=========body=========

拉取 vCard 列表

拉取 vCard 列表以发现联系人:

uart:~$ pbap alloc_buf
uart:~$ pbap add_ap MaxListCount 0x0005
uart:~$ pbap add_ap ListStartOffset 0x0000
uart:~$ pbap pce pull_vcard_listing "telecom/pb"
pbap pull vcard_listing result Continue
Application Parameters (length: 6):
  MaxListCount: 0x0005 (5)
  ListStartOffset: 0x0000 (0)

=========body=========
<?xml version="1.0"?><!DOCTYPE vcard-listing SYSTEM "vcard-listing.dtd">
<vCard-listing version="1.0"><card handle="1.vcf" name="qwe"/>
<card handle="2.vcf" name="qwe"/>
=========body=========

please send pull cmd again
uart:~$ pbap pce pull_vcard_listing "telecom/pb"
pbap pull vcard_listing result Success
=========body=========
<card handle="1.vcf" name="qwe"/><card handle="2.vcf" name="qwe"/>
/<vCard-listing>
=========body=========

拉取 vCard 条目

拉取特定的 vCard 条目:

uart:~$ pbap alloc_buf
uart:~$ pbap add_ap Format v2.1
uart:~$ pbap pce pull_vcard_entry "telecom/pb/1.vcf"
pbap pull vcard_entry result Continue
Application Parameters (length: 1):
  Format: 0x00 (vCard 2.1)

=========body=========
BEGIN:VCARD
VERSION:2.1
FN:
N:
TEL;X-0:1155
=========body=========

uart:~$ pbap pce pull_vcard_entry "telecom/pb/1.vcf"
pbap pull vcard_entry result Success

=========body=========
X-IRMC-CALL-DATETIME;DIALED:20220913T110607
END:VCARD
=========body=========

设置电话簿

更改当前电话簿目录:

uart:~$ pbap alloc_buf
uart:~$ pbap pce set_phone_book 0x02 "telecom"
PBAP set phonebook result OK

uart:~$ pbap alloc_buf
uart:~$ pbap pce set_phone_book 0x02 "pb"
PBAP set phonebook result OK

uart:~$ pbap alloc_buf
uart:~$ pbap pce set_phone_book 0x02
PBAP set phonebook result OK

中止操作

中止正在进行的操作:

uart:~$ pbap pce abort
abort success.

身份验证

PBAP 可以使用 OBEX 身份验证来实现安全连接。身份验证过程涉及质询-响应机制。

带身份验证质询的 PCE:

uart:~$ pbap alloc_buf
uart:~$ pbap add_header_auth_challenge "password123"
uart:~$ pbap pce connect 255
pbap connect result Unauthorized, mopl 255
PSE requires authentication
Action required:
  1. Allocate new tx_buf (pbap alloc_buf)
  2. Add auth_response header (pbap add_header_auth_response <password>)
  3. Add original auth_challenge header (pbap add_header_auth_challenge <password>)
  4. Re-send connect request (pbap pce connect <mopl>)

uart:~$ pbap alloc_buf
uart:~$ pbap add_header_auth_response "password123"
uart:~$ pbap add_header_auth_challenge "password123"
uart:~$ pbap pce connect 255
pbap connect result Success, mopl 255
Connection ID: 0x00000001
Authentication verified successfully
Connection established with authentication