BLEシリアル変換ドングルを Snifferにする

nRF52832 を使用した BLE シリアル変換USBドングルのファームウェアを Nordic Semiconductor の nRF Sniffer v2 プログラムに書き換えてみた。


(2018年12月15日補足)

Nordic nRF Sniffer v2 のこの記事の執筆時よりも新しいバージョンがリリースされている。https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Sniffer からアクセス可能。

新しいバージョンの Snifferプログラムについては「nRF52832 USB ドングルの BLE Sniffer 化」で少し触れている。


ドングル自体はUS$10と安かった。しかし、ファームウェアの書き込みのための冶具などに費用と時間がかかったので、経済的にも時間的にもSnifferを得るという意味ではあまり良くなかった。ただ、時間をかけたこともあるので、備忘録として残しておく。

安価なBLE Packet Snifferが欲しいなら

備忘録に入る前に、安価な BLE Packet Sniffer が欲しい人へのアドバイスです。

この記事の執筆時点(2018年9月3日)で Nordic Semiconductor のチップを使った安価なBLE スニッファを入手する最良の方法は、後で記述するように新しいファームウェア(nRF Sniffer v2)が書き込まれたAdafruit Bluefruit LE Snifferを本家の Adafruit から購入することと思う。[スイッチサイエンスで販売されている Adafruit Bluefruit LE Sniffer も時間が経過すれば新しいファームウェアのものになると思われるので、スイッチサイエンスのWebで確認して欲しい。スイッチサイエンスで買えるなら海外から輸入するより送料も安く済み、早く届く。]

ファームウェアが nRF Sniffer v2 のAdafruit Bluefruit LE Sniffer なら、最近のWiresharkでパケットキャプチャできるので、Windowsだけでなく、MacOS や Linux でも BLE Sniffingできる(nRF Sniffer v2はマルチプラットフォーム対応と書いてある)。

背景

これまでに、次に示す記事で Nordic の BLE Sniffer を試してみた。

RedBearLab BLE Nano v2 をBLE Snifferとして利用する

RedBearLab BLE Nano v1.5 をBLE Snifferとして試す

ただ、BLE Nano v2 は別にUSBシリアル変換が必要なのが使いにくい。また、BLE Nano v1.5 はなぜかしらプログラムが消えることがあるようで、Snifferプログラムの書き込みを使う前にしないと動作しないことがあった。

BLE Nano 以外にUSBにつなぐだけで簡単に使えるコンパクトなものはないかと探してみた。

Snifferに使えそうなドングルもしくは小型ボード

ここでは (最近の)Wiresharkでパケットキャプチャが可能になる Nordic の nRF Sniffer v2 が使える nRF51, nRF52 シリーズのチップを使ったものだけを対象にしている。

BLEで良く使われているチップには Texas Instruments (TI) の CC25XX や CC26XX シリーズのチップもあり、TIから Sniffer プログラムも提供されている。しかし、Wiresharkが使えるファームウェアは CC26XX シリーズなど新しいシリーズでしか動作しないようで、入手が容易な CC2540 などを使ったドングルでは使えない。そこで、以下では、TIのチップを使ったものは対象にしていない。

Adafruit Bluefruit LE Sniffer

nRF51822を搭載している Bluefruit LE Sniffer – Bluetooth Low Energy (BLE 4.0) – nRF51822 – Firmware Version 2 は、AdafruitのWebの記述によれば2018年8月からファームウェアが新しく(nRF Sniffer v2に)なり、Wireshark v2.4.2以降 でも使えるようである。しかし、それ以前のものだとスニッファのバージョンが古く、Windows の Wireshark v1.10.x でしか動作しないなど制約が強い。

  • nRF Sniffer (v1)
    • https://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF-Sniffer
  • nRF-Sniffer-v2
    • https://www.nordicsemi.com/eng/nordic/Products/nRF-Sniffer/nRF-Sniffer-v2/65225

Adafruit Bluefruit LE Sniffer は、スイッチサイエンスで購入できるので入手もしやすいが、スイッチサイエンスの記述を見ると、執筆時点では、Windowsでしか動作しないとあり、書き込まれているSnifferファームウェアのバージョンが古い(nRF Sniffer v1)と思われる。

ファームウェアが新しくなれば、技適を取得したモジュールを使っているので電波法上の懸念を感じる人もいないであろうことから、これが一番のチョイスであろう。

すぐに新しいバージョンのスニッファが書き込まれたものが欲しい場合には、本家のAdafruitから直接購入することができる。また、いずれはスイッチサイエンスで販売されているものも新しいバージョンのものになると思われる。

本家 Adafruitの記述によれば、古いバージョンのものでもファームウェアを書き換えれば nRF Sniffer v2 で使えるようだ。ファームウェア書き換えの冶具があれば、書き換え自体は後で示すようにそれほど面倒ではない。

Adafruit Feather nRF52 Bluefruit LE – nRF52832

ファームウェアの書き換えをするつもりなら Adafruit Feather nRF52 Bluefruit LE も使えるのではないかと思う。ただし、ファームウェアを nRF Snifferに書き換えると Arduino としては使えなくなるので、再度 Arduino で使おうと思ったらブートローダーやBLE用のSoftDeviceの書き込みが必要になる。逆に言えば、SnifferとしてもArduinoとしても使えると言える。これも技適を取得したモジュールを使っている。

実際には入手していないので、試しておらず、動作の確認はできていない。上記の通りでなければ、申し訳ないとは思いますが、責任はとれません。

April Brother ABSniffer USB Dongle 528

[2018年10月5日補足 ABSniffer USB Dongle 528 のファームウェアを nRF Sniffer v2 に書き換える で試して、Snifferとして使えることを確認した。]

中国の April Brother ABSniffer USB Dongle 528 が、 Sniffer 用に使えるドングルと思われる

このドングルはATコマンドで操作するようになっており、その記述によれば、Snifferとしてアドバタイジング・パケット を受信した後に、スキャン・リクエスト(SCAN_REQ) パケットを送って情報を取得するアクティブスキャンの機能があり、アクティブスキャンに設定すれば電波を発信する。デフォルトは受信するだけのパッシブスキャンなので積極的に設定を変更しなければ発信はしない。(当然ながら)技適は取得していないので、デフォルトで使わず、アクティブスキャンを有効にしてしまうかもしれない人(?)は日本国内では使えないだろう。

nRF Sniffer v2 が想定している以下に示すシリアルUSB変換チップ(CP2104)との結線になっているので、ファームウェアとしてnRF Sniffer v2 を書き込めば Wireshark でBLEパケットキャプチャできそうである。

NRF52832 CP2104
P0.06 TXD RXD
P0.08 RXD TXD

入手して試しているわけではなく、Adafruit Feather nRF52 Bluefruit LEと同様にファームウェアを書き換えてうまく動作するか確認していない

USBに接続するデバイスとしてはケースがついており使いやすそうではある。

holyiot Nordic nRF52832 BLE dongle

SnifferにできそうなBLEドングルとして、Aliexpress の holyiot Store に nRF52832 BLE dongle があった。

https://www.aliexpress.com/item/Nordic-nRF52832-BLE-dongle-bluetooth-4-0-bluetooth-5-0-for-computer/32863522593.html

説明が不十分でそもそもこれで何ができるのかよく分からないが(BLEでシリアル通信を行うものだろうと思う)、Webに載っている不鮮明な回路図を見ると、シリアルUSB変換チップ CP2104 があり、それと nRF52832 との結線も nRF Sniffer v2 が想定しているものと同じのように見える。

そこで、これを購入してファームウェアを nRF Sniffer v2 にしてスニッファとして試してみることにした。冒頭にも書いたようにこのドングル自体はUS$10程度と安価であったが、それのファームウェアを書き換えるための冶具に時間と費用が必要であった。

いわゆる技適に関して

今回はNordicが提供している nRF Snifferプログラムをファームウェアとして書き込む。

Snifferは観測を行うものであり、電波を発する必要はなく、また自ら電波を発したら、その間受信ができず、コリジョンを発生させる可能性があり観測を妨害することになる。つまりSnifferは受信のみを行わなければ本来の機能を果たせない。

電波を送信しない、受信のみをする機器は法律の定めるところの「無線局」には該当しない。技適は無線局に対するものなので、電波を送信する能力があっても使わないようにしていれば、技適を取得していない場合でも法律には触れない。

アマチュア無線の無線機を受信のみに使う場合の注意が総務省の以下のURLに示されている。「容易に電波が発射できないように処置」することは求められているようだが、送信能力がある無線機を受信にだけ使用することは禁止されていない。今回のSnifferについて言えばファームウェアを書き換えているので、容易に電波を発射することはできない。

無線機を使っている皆さんへ
www.soumu.go.jp/soutsu/kanto/re/syuchi/musenkishiyouminasama.pdf

ドングルを分解する

まず、ドングルを分解してみた。構造がわからなかったこともあり、壊さないと分解できなかった。

基板

nRF52832 のファームウェアの書き込みには、SWDインタフェースを用いる必要がある。

SWDパッド

ファームウェア書き込みに利用するSWDインタフェースのパッドがholyiotのサイトの図によれば次のようになっている。元のサイトの図は不鮮明でわかりづらく判読に困った。

パッドの位置が一直線上に並んでおらず、また、間隔も2.54mmよりも狭かった。

このため、ブレイクアウトボードのテスト用冶具で使ったjigでは対応できない。

専用の治具の作成が必要であることがわかった。

パッドとピンを接触させるための治具

基板のSWDパッドにpogoピン(スプリングコネクタ)をあてて、圧力をかけることで導通が行われるように fixture tool を利用する。

Aliexpressで、Universal PCB Testing Rack で検索して見つかった最も安価なジグと何種類かの pogo ピンの詰め合わせセットを購入した。

届いたテスト用治具にはpogoピンを固定する基板のようなものは附属しておらず、自作する必要があることがわかった。

最初は、1.27mm間隔のユニバーサル基板を使ってボードを作成しようかと思ったが、測ってみると穴とパッドの位置がうまくあわない。

そこで、3Dプリンタでpogoピンを支えるボードを作成することにした。

pogoピンを支えるボード

パッドの間隔が狭いので1mmのpogoピンを使うとピン自体が接触してしまう。そこで、細い直径0.5mm の pogoピンを最初は使おうかと思ったが、手元の3Dプリンタでは、1mmの穴をうまく作ることができず、1.5mmの指定でやっと穴ができるという状態であった。

しかたがないので、穴は1.5mmとし、直径0.75mmの pogo ピンを接着剤などで後から固定することにした。

次のような板状の支持具を3Dプリンタで作成した。

これの小さな穴に pogo ピンを通して、固定をした。

pogoピンのボード穴での固定

固定にはグルーガンを使うことも考えたが、高温になると3Dプリンタで作成したボードが熱で溶けたり、曲がってしまうことが心配になった。

そこで、「液体プラスチック接着剤」のような名前(商品名としてはBONDICなど)で販売されているUVレジン(?)をつけて紫外線LEDで照射して固めるようにしてみた。数秒で固まった。瞬間接着剤と異なり、紫外線を照射しなければ固まらないので、pogoピンの向きなどを調整する際には、UVレジンの方が便利だと思った。もっとも、紫外線が当たらないところは固まらないので、接合面だけに接着剤をつけて固めるような目的には合わない。当然のことながら用途によって何が良いかは変わるということになる。

使ったUVレジンと紫外線LEDのセットはAliexpress で UV Light Repair Pen などで検索したものを送料込みで US$2以下で買ったが、1回注文して届いたものはレジンの液漏れがひどく使いものにならなかった。もう一度、別のストアで同じ価格帯のものを買ったら問題のないものが届いた。Aliexpressで送料を安くしようとすると配送に時間がかかったり、トラブルがあることもあるので、国内配送で買えるものを使った方が良さそうである。

次は作成したものを横からみた場合。

次は、ピン先が伸縮する側から見た場合。左右のプラスチックネジは、パッドとピンを接触させるための治具に固定するため。

pogo ピンとケーブルの半田付け

pogo ピンにケーブルをはんだ付けした。

nRF52832基板と pogo ピンの接続

固定するための冶具(Universal PCB Testing Rack)の下の台座部分に少し柔らかめのものを置き(身近にあるものとして裏面に接着マットが付いているブレッドボードを裏面が上向きになるように置いた)、その上にnRF52832基板を載せ、pogoピンの先が基板のパッドに当たるように位置を調整し、冶具のバーを動かして上から圧力をかけるようにして、接続を行った。

多数の部品のテストを効率よく行う必要があるわけではないので、今回のような単発でのファームウェア書き込みでは上記のような方法で十分だと思う。たくさんの同種の基板にファームウェア書き込むなら、基板の位置を固定するための冶具も作った方が良いであろう。

JTAGとの接続

ファームウェアを書き込むために、次のようにパソコンと接続をした。

パソコン - <USB> – [J-Link – JTAG/SWD] – <ソケット変換> – [pogoピンを使った治具] – nRF52832を利用した基板

チップへの書き込みについての詳細はこの記事の主題から離れているので省略する。備忘録として失敗談だけ書いておく。

最初、JTAG/SWD と 治具をつなぐためにソケット変換ボードを使っていて、深く考えずにSWDはソケット変換ボードにあるコネクタの4ピンソケットの端子に接続すれば良いと思っていて(この端子の順序に合わせたために、pogo ピンとケーブルのつなぎ方が単純でなくなっていた)、VREFと記載があるピンをnRF52832のSWDインタフェースのVDDに接続していたが、誤りであった。VDDに正しく電源が供給されていなかったために、この後に説明するnRFgo StudioでnRF52832 の状態を取得できなかった。

その後、VREFの電圧を測ったら1.4Vくらいしかなく、VDDではないことにやっと気がついた(VREFという名称からもっと早くわかりそうなものだったが…)。JTAG/SWDの正しいVDDピンから3.3VをnRF52832のSWDインタフェースのVDDに供給するようにしたら正常に動作するようになった。

nRF Sniffer v2 の書き込み

(2018年12月15日補足)

Nordic nRF Sniffer v2 の新しいバージョンがリリースされている。

https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Sniffer からアクセス可能。

新しいバージョンの Snifferプログラムについては「nRF52832 USB ドングルの BLE Sniffer 化」で少し触れている。

以下は以前のバージョンの記述のままである。

nRFgo Studio

SWDを通しての書き込みには GUIインタフェースで操作ができる nRFgo Studio を利用した。

Nordic SemiconductorのWebからダウンロードして、インストールした。

https://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRFgo-Studio

初期状態

Bootloader とSoftDevice S132が書き込まれているのがわかる。

アプリケーションも書き込まれているようだが何かは不明。

この状態から、nRF Sniffer v2 を書き込もうとしたらエラーとなった。

一旦、ブートローダーからソフトデバイスまですべてを Erase All で消す必要があった。

消去したあとに、nRF Sniffer v2 を書き込むことで正常に書き込むことができた。

USBドングル用ケースの作成

分解したUSBドングルに入っていた基板は薄く、また基板上に表面実装された部品などがあるために、そのままではUSB Aタイプのメスの口に入れても緩く、ボードの接点とUSBコネクタの接点がうまく接触しない。

そこで、3Dプリンタを使って、ボードと組み合わせてUSBドングルとして使えるようにするケースを作成した。

とりあえず使えれば良いので、見栄えにこだわらず次のようなものを作成した。

3Dプリンタで作成したケースとボードを並べると次の通り。

組み立てると次のようになる。この状態でUSB Aタイプのメスの端子に挿入して動作するようになった。

Wiresharkでの動作確認

RedBearLab BLE Nano v1.5 をBLE Snifferとして試す に書いたWiresharkで動作させたところ、BLEパケットがキャプチャされることを確認した。

ただ、キャプチャをストップさせてからスタートしようとしてもエラーがでたりすることがあった。また、ストップ、スタートを繰り返したらWiresharkそのものが終了したりした。

それでも、Wiresharkを起動し直してからスタートをするということを繰り返し試せばキャプチャされるので、一応使えるように思う。エラーが出たりする原因が Wireshark側にあるのか、nRF Sniffer にあるのか、それとも他の部分にあるのかは切り分けしていない。

ちなみに、ケースに小さな穴を開けて基板についているLEDがケースの外から見えるようにしたが、USBに接続した時も、Sniffer として使っている時にも点灯することはなかった。SnifferプログラムではLEDにつながっているピンの制御などはしていないということであろう。

最初の方にも書いたように対象のUSBドングルは安価であるが、治具やケースの作成などに手間と時間が非常にかかった。BLE Nano v2 をスニッファとして使うことができてから(2018年7月)今回の作成に必要な部品などを集め始めたが、タイミングが悪かった。始めるのが1か月遅く、新しいバージョンのスニッファが書き込まれたAdafruit Bluefruit LE Sniffer が販売されていることがわかっていれば、このようなことはする必要がなく、Adafruitから輸入すればよかった。