2019/08/31

[nordic][zephyr]Advertisingするチャネルを制御したいが、わからんかった

わからんかったシリーズだ。

 

ZephyrでBLEの簡単なことはできるようになったのだが、どんな感じで無線が飛んでいるのか見てみたいときもあるだろう。

そういうときはパケットスニファが便利だ。
私はTIのスニファを使っているのだが、接続後の無線を見たい場合は、チャネルを選んでAdvertisingから接続を待ち受けている。
そして、別のチャネルで接続開始された場合は切断して、またやり直す。

と、非常に効率が悪い。
もっといいやり方もあるのかもしれんのだが、使いこなせていない。

 

それで、私はAdvertisingするチャネルを制限させる、という方法を使っていた。

hiro99ma blog: [nrf51]特定CHへのAdvertisingを止める(デバッグ)
https://hiro99ma.blogspot.com/2015/11/nrf51chadvertising.html

ZephyrとはいえNordicの部分はNordicがサポートしているようなので、同じような手法が使えるんではなかろうか。


上記の記事は、S110 SoftDevice v8.0.0のときだった。
もう4年も前のことで、手元にあったS132(SDK15)を見てみると、ch_37_off、みたいなメンバがいなくなっていた。

今は配列になっているようだ。

typedef uint8_t ble_gap_ch_mask_t[5];

8bit * 5 = 40ということで、1bitが1chを指しているようである。
[0]のbit0がch0と同じなのかな?

 

 

zephyrのv2.0.0-rc1をchannel_maskでgrepすると、残念ながらたくさん出てきた。
さらに残念なことに、たぶん全部PPI関係のようだ。

あきらめて「37」で検索すると、これはこれでたくさん出てくる。。。
が、ようやくそれっぽいものを見つけた。

modules/lib/openthread/third_party/NordicSemiconductor/softdevice/s140/headers/ble_gap.h

なんだ、nRF SDKと同じファイル名ではないか。。。
そしてchannel_maskだったので、単にさっき見逃しただけのようである。


しかし・・・もともとnRF SDKでもchannel_maskはユーザアプリから触れる変数ではなかった。
ble_advertising_start()ならアクセスできるので、そこを書き換えていたのだ。

そして、もっと根本的な問題として、このファイルは使われているのだろうか?というものがある。
openthreadとなっているけど、zephyrのGitHubではなく、west updateで取得したものなのだ。

channel_maskを持っているble_gap_adv_params_tでgrepしたが、そのヘッダファイルしか出てこなかった。
残念だ。。。

 

ならば、advertisingの開始辺りを見てみればよいかと思ったが、よくわからん。
nRF SDKだとGAPだったのだが、subsys/bluetooth/host/hci_core.cあたりにあるようだ。
たぶんset_advertise_enable()だと思っている。あるいは手前のbt_le_adv_start_internal()か。

 

だが、ソースをぱっと見ても追えそうな気がしなかった。
残念だが、今回はあきらめよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。