NB SCAN (Neighbour Scan) は、近隣のノードを探索する目的で使用します。
探索を行うノードは、応答要求の同報通信を行います。これに周囲のノードが応え、応答のあったノードの一覧を報告します。探索されたノードは LQI の順にソートされます。
単純ネットのみ利用可能。
比較的通信が安定し、通信量も少ない条件では探索の成功率が高くなりますが、条件が悪化すると全く探索できなくなる場合もあります。
条件の悪い場所では、存在を知らせるべきノードが定期的に同報通信によるビーコンパケットを送信し、探索側がこのビーコンを受信しながら近隣ノードの存在を確認する実装を行います。
探索する側はToCoNet_USE_MOD_NBSCANを、探索される側はToCoNet_USE_MOD_NBSCAN_SLAVEを定義しておく。
// define modules
#define ToCoNet_USE_MOD_NBSCAN
#define ToCoNet_USE_MOD_NBSCAN_SLAVE
// includes
#include "ToCoNet.h"
#include "ToCoNet_mod_prototype.h"近隣探索を開始します。
uint8 ToCoNet_NbScan_bStart (uint32 u32ChMask, uint16 u16Dur_ms)
| 型 | 名前 | 詳細 |
|---|---|---|
| uint32 | u32ChMask | 探索するチャネルマスク(ch16のみなら 1UL<<16 を指定、ch16,17なら 1UL<<16|1UL<<17 を指定) |
| uint16 | u16Dur_ms | 各チャネルの探索時間。おおむね 50ms 以上を推奨値とします。 |
| 型 | 詳細 |
|---|---|
| boot_t | TRUE なら要求は受け付けられ、FALSE なら要求は受け付けられなかった。 |
特定アドレスのノードを見つける目的で、近隣探索を開始します。
uint8 ToCoNet_NbScan_bStartToFindAddr (uint32 u32ChMask, uint32 u32Addr)
同じチャネルのノードが存在するかは、MAC Ack 付きのパケット送信を試みれば確認できますが、ノードのチャネルの設定が不明である場合に利用します。
| 型 | 名前 | 詳細 |
|---|---|---|
uint32 |
u32ChMask |
探索するチャネルマスク(ch16のみなら 1UL<<16 を指定、ch16,17なら 1UL<<16\|1UL<<17 を指定) |
uint32 |
u32Addr |
探索するノードのロングアドレス。 |
| 型 | 詳細 |
|---|---|
boot_t |
TRUE なら要求は受け付けられ、FALSE なら要求は受け付けられなかった。 |
結果は cbToCoNet_vNwkEvent() より E_EVENT_TOCONET_NWK_SCAN_COMPLETE イベントにて報告されます。イベント引数には tsToCoNet_NbScan_Result 構造体へのアドレスが指定されます。
pu8Result の値
| [0] | 計測されたチャネル数 [N]。 |
|---|---|
| [1] | 計測された一番若い番号のチャネルレベル。 |
| [2] | 次に若いチャネルレベル。 |
| … [N] | Nまで続く。 |
レベルは 0..255 の値を取り、0 が最弱、255が最強となる。値が高いほどノイズの多いチャネルとなります。
近隣探索の結果を格納する構造体。
uint8 |
u8found |
見つかった数。 |
|---|---|---|
uint8 |
u8scanMode |
探索方法。 |
uint8 |
u8IdxLqiSort |
LQI に順に並べたときのsScanResultのインデックス |
tsToCoNet_NbScan_Entitiy |
sScanResult[NBSCAN_MAXLIST] |
探索されたノード情報 |
| ビットマスク | 解説 |
|---|---|
TOCONET_NBSCAN_NORMAL_MASK |
ToCoNet_EnergyScan_bStart()による探索 |
TOCONET_NBSCAN_QUICK_EXTADDR_MASK |
ToCoNet_NbScan_bStartToFindAddr()による探索 |
近隣探索で発見された各ノードの情報を格納した構造体。
| 型 | 名前 | 解説 |
|---|---|---|
uint32 |
u32addr |
ロングアドレス。 |
uint16 |
u16addr |
ショートアドレス。 |
uint8 |
u8ch |
発見されたノードの設定されたチャネル。 |
uint8 |
u8lqi |
発見されたノードのLQI。 |
uint8 |
bFound |
探索に成功した場合は TRUE、失敗した場合は FALSE。 |
// define modules
#define ToCoNet_USE_MOD_NBSCAN
#define ToCoNet_USE_MOD_NBSCAN_SLAVE
// includes
#include "ToCoNet.h"
#include "ToCoNet_mod_prototype.h"
void cbToCoNet_vNwkEvent(teEvent eEvent, uint32 u32arg) {
int i;
switch(eEvent) {
case E_EVENT_TOCONET_NWK_START:
break;
case E_EVENT_TOCONET_NWK_SCAN_COMPLETE:
_C {
tsToCoNet_NbScan_Result *pNbsc = (tsToCoNet_NbScan_Result *)u32arg;
if (pNbsc->u8scanMode & TOCONET_NBSCAN_NORMAL_MASK) { // 通常探索による結果
// 全チャネルスキャン結果
for(i = 0; i < pNbsc->u8found; i++) { // 見つかった数
// LQI 順に取り出す
tsToCoNet_NbScan_Entitiy *pEnt =
&pNbsc->sScanResult[pNbsc->u8IdxLqiSort[i]];
if (pEnt->bFound) {
// エントリが見つかった
// pEnt->u8ch(チャネル),
// pEnt->u32addr(ロングアドレス),
// pEnt->u16addr(ショートアドレス),
// pEnt->u8lqi(LQI値)
}
}
} else if (pNbsc->u8scanMode & TOCONET_NBSCAN_QUICK_EXTADDR_MASK) { // アドレス指定探索の結果
if(pNbSc->u8found) {
tsToCoNet_NbScan_Entitiy *pEnt = &pNbsc->sScanResult[0];
// 見つかった場合は一つだけなので最初の要素を取り出す。
// pEnt->u8ch,
// pEnt->u8lqi(LQI値)
} else {
// 見つからなかった
}
}
}
break;