こんにちは、
私は iMX91-FRDM ボード上の BLE コネクティビティに取り組んでいます。BLE チップは ( IW610 ) です。私の目標は、Gatt-Client を実装することです。
初期段階では特定の BLE デバイスに接続しようとしています。以下はその C コードです。
#define OCF_LE_EXT_CREATE_CONN 0x0043
int hci_connect( uint8_t *pMacAddr )
{
le_ext_create_conn_cp cp;
int ret;
memset( (& cp), (0x00), sizeof(cp) );
cp.filter_policy = (0x00); //// do not filter
cp.own_addr_type = (0x00); //// THIS device has a Random MAC address
cp.peer_addr_type = (0x01); //// peer has a Random MAC
cp.peer_addr.b[0] = (pMacAddr[0]);
cp.peer_addr.b[1] = (pMacAddr[1]);
cp.peer_addr.b[2] = (pMacAddr[2]);
cp.peer_addr.b[3] = (pMacAddr[3]);
cp.peer_addr.b[4] = (pMacAddr[4]);
cp.peer_addr.b[5] = (pMacAddr[5]);
cp.initiating_phys = (0x01); //// 01-->1M PHY
cp.scan_interval = (0x0060); //// time between scans (x 0.625) => 60mS
cp.scan_window = (0x0060); //// scan duration (x 0.625) => 60mS
cp.conn_interval_min = (0x0050); //// connection interval MIN => 50mS
cp.conn_interval_max = (0x00A0); //// connectino interval MAX => 100mS
cp.conn_latency = (0x0000); //// connecion latency => 0mS
cp.supervision_timeout = (0x03E8); //(0x0190); //// supervision timeout => 250mS
cp.min_ce_length = (0x0000); //// 0
cp.max_ce_length = (0x0000); //// 0
ret = send_hci_command( m_hci_device, OGF_LE_CTL, OCF_LE_EXT_CREATE_CONN, (uint8_t *)(& cp), sizeof(cp) );
if ((0x00) != ret) {
printf("-------- !!!! hci_connect() ---- %02x-%04x ", OGF_LE_CTL, OCF_LE_EXT_CREATE_CONN);
printf(" ---- FAIL(0x%02x)\r\n", ret);
return (0);
}
printf("@@@@@@@@ hci_connect() ---- %02x-%04x ", OGF_LE_CTL, OCF_LE_EXT_CREATE_CONN);
printf(" ---- OK(0x%02x)\r\n", ret);
return (1);
}
........
bdaddr_t bdaddr;
uint16_t handle;
str2ba("CC:CD:C5:BA:7B:71", &bdaddr);
int status = hci_le_add_white_list(m_hci_device, &bdaddr, 0, 1000); // 0 = public, 1 = random
if (status == 0x00)
printf("Device added to white list\n");
else
printf("Failed, status: 0x%02x\n", status);
scanEnabParm.enable = (0x00); //// enable == true
printf("Set Scan-DISABLE Parameters.\n");
if (! send_hci_command( m_hci_device, 0x08, 0x0042, (uint8_t *)(& scanEnabParm), sizeof(scanEnabParm) )) {
printf("\nSet Scan-Disable Parameters command failed.\n");
}
sleep(2);
if (! hci_connect(m_con_addr)) {
printf("*Error- hci_connect() - FAILED \n");
return (0);
}
ただし、接続は完全には成功していません。以下はその hcidump です。
コードを実行すると、以下の応答が返されます。
HCI送信失敗: 入出力エラー
以下のコマンドは検出されません:
HCIコマンド: 不明 (0x08|0x0043) plen 26
0000: 00 01 01 71 7b ba c5 cd cc 01 60 00 60 00 50 00 ...q{.....`.`.P.
0010: a0 00 00 00 e8 03 00 00 00 00 …………
> HCIイベント情報: コマンドステータス (0x0f) plen 4
不明 (0x08|0x0043) ステータス 0x00 ncmd 1
< HCIコマンド: LEデバイスを承認リストに追加 (0x08|0x0011) plen 7
0000: 00 71 7b ba c5 cd cc .q{....
> HCIイベント情報: コマンド完了 (0x0e) plen 4
LE デバイスを承認リストに追加 (0x08|0x0011) ncmd 1
ステータス 0x00
< HCIコマンド: 不明 (0x08|0x0042) plen 6
0000: 00 01 00 00 00 00 ……
> HCIイベント情報: コマンド完了 (0x0e) plen 4
不明 (0x08|0x0042) ncmd 1
0000: 00 。
< HCIコマンド: 不明 (0x08|0x0043) plen 26
0000: 00 01 01 71 7b ba c5 cd cc 01 60 00 60 00 50 00 ...q{.....`.`.P.
0010: a0 00 00 00 e8 03 00 00 00 00 …………
> HCIイベント情報: コマンドステータス (0x0f) plen 4
不明 (0x08|0x0043) ステータス 0x00 ncmd 1
> HCI イベント情報: LE メタ イベント情報 (0x3e) プレン 31
接続リクエスト
0000: 00 80 00 00 01 71 7b バ c5 cd cc 00 00 00 00 00 .....q{.........
0010: 00 00 00 00 00 00 00 9c 00 00 00 e8 03 01 ..............
< HCI コマンド: LE リモート使用機能の読み取り (0x08|0x0016) plen 2
0000: 80 00 ..
> HCI イベント情報: LE メタ イベント情報 (0x3e) プレン 4
コマンド完了
0000: 80 00 01 ...
> HCIイベント情報: コマンドステータス (0x0f) plen 4
LE リモート使用機能読み取り (0x08|0x0016) ステータス 0x00 ncmd 1
> ACLデータ: ハンドル128フラグ0x02 dlen 7
ATT: MTU要求 (0x02)
クライアント RX MTU 245
> HCI イベント情報: LE メタ イベント情報 (0x3e) プレン 11
お問い合わせ完了
0000: 80 00 f9 00 48 08 f9 00 48 08 ……はぁ……はぁ。
> HCI イベント情報: LE メタ イベント情報 (0x3e) プレン 12
LE リモート読み取り使用機能完了
ステータス 0x00 ハンドル 128
機能: 0x25 0x41 0x00 0x00 0x00 0x00 0x00 0x00
< ACLデータ: ハンドル128フラグ0x00 dlen 7
ATT: MTU要求 (0x02)
クライアント rx mtu 517
< ACLデータ: ハンドル128フラグ0x00 dlen 7
ATT: MTU応答 (0x03)
サーバー rx mtu 517
> HCIイベント情報: 完了したパケットの数 (0x13) plen 5
128パケットを処理する1
> ACLデータ: ハンドル128フラグ0x02 dlen 7
ATT: MTU応答 (0x03)
サーバー RX MTU 245
< ACLデータ: ハンドル128 フラグ 0x00 dlen 11
ATT: タイプによる読み取り要求 (0x08)
開始 0x0001、終了 0xffff
タイプUUID 0x2b3a
> HCIイベント情報: 完了したパケットの数 (0x13) plen 5
128パケットを処理する1
> HCIイベント情報: 完了したパケットの数 (0x13) plen 5
128パケットを処理する1
> ACLデータ: ハンドル128フラグ0x02 dlen9
ATT: エラー (0x01)
エラー: 属性が見つかりません (10)
ハンドル 0x0001 のタイプ要求 (0x08) による読み取り
< ACLデータ: ハンドル128 フラグ 0x00 dlen 11
ATT: グループによる読み取り要求 (0x10)
開始 0x0001、終了 0xffff
タイプUUID 0x2800
> HCIイベント情報: 完了したパケットの数 (0x13) plen 5
128パケットを処理する1
> ACLデータ: ハンドル128フラグ0x02 dlen 24
ATT: グループ応答による読み取り (0x11)
属性ハンドル 0x0001、終了グループハンドル 0x0009
値 0x00 0x18
属性ハンドル 0x000a、終了グループハンドル 0x000d
値 0x01 0x18
属性ハンドル 0x000e、終了グループハンドル 0x001a
値 0x0a 0x18
< ACLデータ: ハンドル128 フラグ 0x00 dlen 11
ATT: グループによる読み取り要求 (0x10)
開始 0x001b、終了 0xffff
タイプUUID 0x2800
> HCIイベント情報: 完了したパケットの数 (0x13) plen 5
128パケットを処理する1
> ACLデータ: ハンドル128 フラグ 0x02 dlen 86
ATT: グループ応答による読み取り (0x11)
属性ハンドル 0x001b、終了グループハンドル 0x002f
値 0x66 0x9a 0x0c 0x20 0x00 0x08 0x12 0xab 0xea 0x11 0x78 0x6f 0x40 0x1b 0xc9 0xed
属性ハンドル 0x0030、終了グループハンドル 0x003e
値 0x66 0x9a 0x0c 0x20 0x00 0x08 0xf4 0xbd 0xe6 0x11 0x42 0x5b 0x90 0x82 0xea 0x18
属性ハンドル 0x003f、終了グループハンドル 0x0053
値 0x66 0x9a 0x0c 0x20 0x00 0x08 0xf4 0xbd 0xe6 0x11 0xcc 0x8b 0x50 0x10 0x58 0x4b
属性ハンドル 0x0054、終了グループハンドル 0xffff
値 0x9e 0xca 0xdc 0x24 0x0e 0xe5 0xa9 0xe0 0x93 0xf3 0xa3 0xb5 0x01 0x00 0x40 0x6e
< ACLデータ: ハンドル128フラグ0x00 dlen 9
ATT: 書き込み要求 (0x12)
0x000dの値を処理する 0x02 0x00
> HCIイベント情報: 完了したパケットの数 (0x13) plen 5
128パケットを処理する1
> ACLデータ: ハンドル128フラグ0x02 dlen5
ATT: 書き込み応答 (0x13)
< ACLデータ: ハンドル128フラグ0x00 dlen 7
ATT: 読み取り要求 (0x0a)
ハンドル 0x0003
> HCIイベント情報: 完了したパケットの数 (0x13) plen 5
128パケットを処理する1
> HCI イベント情報: LE メタ イベント情報 (0x3e) プレン 11
お問い合わせ完了
0000: 80 00 f9 00 48 08 f9 00 48 08 ……はぁ……はぁ。
> HCI イベント情報: LE メタ イベント情報 (0x3e) プレン 6
認証完了
0000: 00 80 00 02 02 .....
> ACLデータ: ハンドル128フラグ0x02 dlen16
ATT: 読み取り応答 (0x0b)
0000: 53 42 44 2d 44 43 20 54 4f 4f 4c SBD-DCツール
< ACLデータ: ハンドル128フラグ0x00 dlen 7
ATT: 読み取り要求 (0x0a)
ハンドル 0x0005
> HCIイベント情報: 完了したパケットの数 (0x13) plen 5
128パケットを処理する1
> ACLデータ: ハンドル128フラグ0x02 dlen 7
ATT: 読み取り応答 (0x0b)
0000: c0 03 ..
> HCIイベント情報: 切断完了 (0x05) plen 4
ステータス 0x00 ハンドル 128 理由 0x13
理由: リモートユーザーが接続を終了しました
こんにちは、
ご確認いただきありがとうございます。
- BluetoothCTを使用したテストのターミナル出力全体を共有してください
- btmon -w file.pcapを使用してテストした HCI ログ ファイルを共有してください。
- 接続しようとしている BT デバイスの詳細を教えてください。IW610 がセントラルとして動作していると理解しています。ペリフェラルの GATT プロファイルを共有してください。
よろしくお願いいたします。
ダニエル。
こんにちは、
私の返信は以下をご覧ください。
1.
root@imx91frdm:~# cat /etc/os-release
ID=fsl-imx-xwayland
NAME="NXP i.MX リリース ディストリビューション"
VERSION="6.6-スカースギャップ (スカースギャップ)"
バージョンID=6.6-スカースギャップ
VERSION_CODENAME="スカースギャップ"
PRETTY_NAME="NXP i.MX リリース ディストリビューション 6.6-scarthgap (scarthgap)"
CPE_NAME="cpe:/o:openembedded:fsl-imx-xwayland:6.6-scarthgap"
ルート@imx91frdm:~# uname -a
Linux imx91frdm 6.6.36-lts-next-ge3c30730af75 #1 SMP PREEMPT 水曜日 9月 4 08:22:45 UTC 2024 aarch64 GNU/Linux
2.
root@imx91frdm:~# bluetoothctl
hci0 new_settings: 電源付きボンディング可能 le secure-conn cis-セントラル cis-ペリフェラル
エージェント登録済み
[CHG] コントローラ B8:F4:4F:E0:53:A4 ペアリング可能: はい
[Bluetooth] # バージョン
バージョン5.72
[ブルートゥース] #
3.
bluetoothctl から接続を試みましたが、正常に接続されません。ACL ログは hcidump -X で表示されます。BLE デバイスからの応答が表示されます。また、モバイル上の nRF Connect アプリを使用して BLE デバイスを正常に接続できました。
こんにちは、
以下の情報についてご協力をお願いします。
1. 使用している OS のバージョンは何ですか?
2. 使用しているワイヤレス ドライバのバージョンは何ですか?
3. 問題を再現するために、bluetoothctl などの BlueZ ツールを既に試しましたか?
よろしくお願いいたします。
ダニエル。