From 9a9da5124f3a2b013a69ed56e1ce15908ee992e9 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Fri, 7 Sep 2018 01:30:55 +0800 Subject: [PATCH] [cli] support energy scan command (#3036) --- src/cli/README.md | 31 +++++++++++++++++++++++++- src/cli/cli.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++----- src/cli/cli.hpp | 2 ++ 3 files changed, 84 insertions(+), 6 deletions(-) diff --git a/src/cli/README.md b/src/cli/README.md index 4d86d18d7..e13c200db 100644 --- a/src/cli/README.md +++ b/src/cli/README.md @@ -64,7 +64,7 @@ OpenThread test scripts use the CLI to execute test cases. * [routerrole](#routerrole) * [routerselectionjitter](#routerselectionjitter) * [routerupgradethreshold](#routerupgradethreshold) -* [scan](#scan-channel) +* [scan](#scan) * [singleton](#singleton) * [state](#state) * [thread](#thread-start) @@ -1592,6 +1592,35 @@ Perform an IEEE 802.15.4 Active Scan. Done ``` +### scan energy \[duration\] + +Perform an IEEE 802.15.4 Energy Scan. + +* duration: The time in milliseconds to spend scanning each channel. + +```bash +> scan energy 10 +| Ch | RSSI | ++----+------+ +| 11 | -59 | +| 12 | -62 | +| 13 | -67 | +| 14 | -61 | +| 15 | -87 | +| 16 | -86 | +| 17 | -86 | +| 18 | -52 | +| 19 | -58 | +| 20 | -82 | +| 21 | -76 | +| 22 | -82 | +| 23 | -74 | +| 24 | -81 | +| 25 | -88 | +| 26 | -71 | +Done +``` + ### singleton Return true when there are no other nodes in the network, otherwise return false. diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index c6d6136c7..828522b3a 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -2570,17 +2570,45 @@ void Interpreter::ProcessScan(int argc, char *argv[]) { otError error = OT_ERROR_NONE; uint32_t scanChannels = 0; + uint16_t scanDuration = 0; + bool energyScan = false; long value; if (argc > 0) { - SuccessOrExit(error = ParseLong(argv[0], value)); - scanChannels = 1 << value; + if (strcmp(argv[0], "energy") == 0) + { + energyScan = true; + + if (argc > 1) + { + SuccessOrExit(error = ParseLong(argv[1], value)); + scanDuration = static_cast(value); + } + } + else + { + SuccessOrExit(error = ParseLong(argv[0], value)); + scanChannels = 1 << value; + } } - mServer->OutputFormat("| J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI |\r\n"); - mServer->OutputFormat("+---+------------------+------------------+------+------------------+----+-----+-----+\r\n"); - SuccessOrExit(error = otLinkActiveScan(mInstance, scanChannels, 0, &Interpreter::s_HandleActiveScanResult, this)); + if (energyScan) + { + mServer->OutputFormat("| Ch | RSSI |\r\n"); + mServer->OutputFormat("+----+------+\r\n"); + SuccessOrExit(error = otLinkEnergyScan(mInstance, scanChannels, scanDuration, + &Interpreter::s_HandleEnergyScanResult, this)); + } + else + { + mServer->OutputFormat( + "| J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI |\r\n"); + mServer->OutputFormat( + "+---+------------------+------------------+------+------------------+----+-----+-----+\r\n"); + SuccessOrExit(error = otLinkActiveScan(mInstance, scanChannels, scanDuration, + &Interpreter::s_HandleActiveScanResult, this)); + } return; @@ -2619,6 +2647,25 @@ exit: return; } +void OTCALL Interpreter::s_HandleEnergyScanResult(otEnergyScanResult *aResult, void *aContext) +{ + static_cast(aContext)->HandleEnergyScanResult(aResult); +} + +void Interpreter::HandleEnergyScanResult(otEnergyScanResult *aResult) +{ + if (aResult == NULL) + { + mServer->OutputFormat("Done\r\n"); + ExitNow(); + } + + mServer->OutputFormat("| %2d | %4d |\r\n", aResult->mChannel, aResult->mMaxRssi); + +exit: + return; +} + void Interpreter::ProcessSingleton(int argc, char *argv[]) { otError error = OT_ERROR_NONE; diff --git a/src/cli/cli.hpp b/src/cli/cli.hpp index d031033ca..dedcf714a 100644 --- a/src/cli/cli.hpp +++ b/src/cli/cli.hpp @@ -332,6 +332,7 @@ private: static void s_HandlePingTimer(Timer &aTimer); #endif static void OTCALL s_HandleActiveScanResult(otActiveScanResult *aResult, void *aContext); + static void OTCALL s_HandleEnergyScanResult(otEnergyScanResult *aResult, void *aContext); static void OTCALL s_HandleNetifStateChanged(otChangedFlags aFlags, void *aContext); #ifndef OTDLL static void s_HandleLinkPcapReceive(const otRadioFrame *aFrame, void *aContext); @@ -361,6 +362,7 @@ private: void HandlePingTimer(); #endif void HandleActiveScanResult(otActiveScanResult *aResult); + void HandleEnergyScanResult(otEnergyScanResult *aResult); #ifdef OTDLL void HandleNetifStateChanged(otInstance *aInstance, otChangedFlags aFlags); #else