ブログ

Armadillo-640:BT/THオプションモジュール+pc-ble-driverでアドバタイジングパケットのPDUを表示

at_kazutaka.bito
2023年5月29日 9時52分

Armadillo-640+ BT/THオプションモジュール「OP-A600-BTTHMOD-00」+pc-ble-driverで
アドバタイジングパケットのPDUを表示する方法です。

備考)BT機能を使用する方法としては、bluezpc-ble-driverがあります。
bluezを使う方法は、下記マニュアルを参照ください。
Armadillo-640 製品マニュアル「18.7. Armadillo-600シリーズ BT/THオプションモジュール」「18.7.8. 動作確認」
ここでは、下記Howtoで紹介されているpc-ble-driverを使います。
Armadillo-640 + BT/THオプションモジュール + pc-ble-driver スキャンサンプル

1. Armadillo-640+BT/THオプションモジュール(OP-A600-BTTHMOD-00)の準備

Armadillo-640:BT/THオプションモジュール(OP-A600-BTTHMOD-00)を使用する準備(手順まとめ)の手順を実施します。

2. pc-ble-driver用ファームウェアの書き込み

上記手順1で準備した Armadillo-640+BT/THオプションモジュール(OP-A600-BTTHMOD-00)を
インターネットに接続可能なネットワークに接続して起動します。
下記コマンドで、pc-ble-driver用ファームウェアを書き込みます。

root@armadillo:~# wget https://download.atmark-techno.com/sample/a640-ble-longrange-howto/firmware.tar.gz
root@armadillo:~# tar xf firmware.tar.gz
root@armadillo:~# cd firmware
root@armadillo:~/firmware# openocd -f interface/imx6-armadillo-640-con9.cfg -c \
"transport select swd; set WORKAREASIZE 10; adapter_nsrst_delay 100; \
adapter_nsrst_assert_width 100; source [find target/nrf52.cfg]" -c \
"init; targets; halt;" -c "nrf51 mass_erase" -c "flash write_image \
connectivity_1.0.0_usb_with_s140_6.1.1.hex 0; reset halt; targets; verify_image \
connectivity_1.0.0_usb_with_s140_6.1.1.hex 0; reset run; targets; exit"
root@armadillo:~/firmware# cd

3. pc-ble-driverの準備

ATDEにpc-ble-driverをビルドする環境を構築します。
注)pc-ble-driverのビルドは、Armadilloではなく、ATDE上で行います。以下、手順3,手順4はATDE上で実施します。

atmark@atde8:~$ sudo dpkg --add-architecture armhf
atmark@atde8:~$ sudo apt update && sudo apt upgrade -y
atmark@atde8:~$ sudo apt install -y g++-arm-linux-gnueabihf libasio-dev libudev-dev libudev-dev:armhf
atmark@atde8:~$ git clone https://github.com/atmark-techno/pc-ble-driver.git -b armadillo

4. pc-ble-driverのスキャンサンプル(scan_sample)の改変

スキャンサンプル(scan_sample)のソースコード(pc-ble-driver/examples/scan_sample/main.c)の
on_adv_reportに、下記コメントで挟んだ行を追加します。
/**** print advdata: begin ****/
/**** print advdata: end ****/

改変したpc-ble-driver/examples/scan_sample/main.cのon_adv_reportの抜粋

static void on_adv_report(const ble_gap_evt_t * const p_ble_gap_evt)
{
    int8_t rssi_value = 0;
    uint32_t err_code;
    uint8_t  str[STRING_BUFFER_SIZE] = {0};
    char  name[STRING_BUFFER_SIZE] = {0};
    data_t dev_name;

    // Log the Bluetooth device address of advertisement packet received.
    ble_address_to_string_convert(p_ble_gap_evt->params.adv_report.peer_addr, str);
    memcpy(peer_addr, str, STRING_BUFFER_SIZE);
    rssi_value = p_ble_gap_evt->params.adv_report.rssi;
    if(find_adv_name(&p_ble_gap_evt->params.adv_report, &dev_name))
    {
            strncpy(name, (char *)dev_name.p_data, dev_name.data_len);
            name[dev_name.data_len] = '\0';
    }
    else
    {
            strcpy(name, "unknown");
    }
    printf("device address: 0x%s, RSSI: %d device name: %s\n",
           str,
           rssi_value,
           name);

/**** print advdata: begin ****/
    printf("PDU: ");
    for (int i = 0; i < p_ble_gap_evt->params.adv_report.data.len; i++)
    {
        printf("%02X", p_ble_gap_evt->params.adv_report.data.p_data[i]);
        printf(" ");
    }
    printf("\n\n");
/**** print advdata: end ****/

    err_code = sd_ble_gap_scan_start(m_adapter, NULL, &m_adv_report_buffer);

    if (err_code != NRF_SUCCESS)
    {
        printf("Scan start failed with error code: %d\n", err_code);
        fflush(stdout);
    }
}

ビルドします。

atmark@atde8:~$ cd pc-ble-driver/at_build
atmark@atde8:~/pc-ble-driver/at_build$ make dist-clean && make CROSS_COMPILE=arm-linux-gnueabihf-

ビルドにより、pc-ble-driver/at_buildディレクトリにscan_sampleという実行ファイルが生成されます。
このscan_sampleをArmadillo-640に置きます。

5. pc-ble-driverのスキャンサンプル(scan_sample)の実行

5.1 scan_sampleに実行権限を付ける

Armadillo-640に置いたscan_sampleに実行権限を付けます。

root@armadillo:~# chmod +x scan_sample
5.2 scan_sampleを実行

scan_sampleを実行する際、1M PHYか、Coded PHYを指定できます。
(下記コマンド例は、scan_sampleが/rootディレクトリにある場合です。)

1M PHYの場合のコマンド例

root@armadillo:~# stdbuf -oL /root/scan_sample -p 1m -s /dev/ttyACM0

Coded PHYの場合のコマンド例

root@armadillo:~# stdbuf -oL /root/scan_sample -p coded -s /dev/ttyACM0

補足)上記例の"stdbuf -oL"は、標準出力のバッファを行単位にするためのものです。

このscan_sampleを実行すると、下記のコマンド実行例のようにスキャンされたデバイス情報(device address: ...)に続いて、
"PDU: "の後ろに、PDUが表示されます。

コマンド実行例(1M PHYを指定した場合)

root@armadillo:~# stdbuf -oL /root/scan_sample -p 1m -s /dev/ttyACM0
phy: 1M_PHY
Serial port used: /dev/ttyACM0
Baud rate used: 1000000
Info: Successfully opened /dev/ttyACM0. Baud rate: 1000000. Flow control: none. Parity: none.
device address: 0x3222113F7B77, RSSI: -55 device name: BLECAST_BL
PDU: 02 01 05 07 FF 99 99 20 00 0D 00 0C 09 42 4C 45 43 41 53 54 5F 42 4C 00

備考)BT/THオプションモジュールのファームウェアを、標準のBT用ファームウェアに戻す場合

BT/THオプションモジュールのファームウェアを、上記手順で書き込んだpc-ble-driver用ファームウェアから
標準のBT用ファームウェアに戻す場合、以下のコマンドを実行します。

root@armadillo:~# apt reinstall firmware-at-bt