loader-logo

How To Connect Chanalyzer To Cisco CleanAir

Learn how to use Chanalyzer for spectrum analysis with Cisco CleanAir APs to gather the spectrum data.

Animated sequence from Chanalyzer

One of my favorite things about Wi-Fi is visualizing the invisible with a spectrum analyzer. I like to use Metageek’s Chanalyzer to do this. But you need to have the dBx adapter with you to start seeing the spectrum.

Another way to get detailed spectrum data is to use a configured Cisco CleanAir AP. Chanalyzer has an accessory to connect to a CleanAir AP to view this spectrum data.

The best part of using a CleanAir AP is being able to do it remotely. That’s right, doing spectrum analysis from your seat several miles, even hundreds of miles, away from the source.

Granted, the view of the spectrum is from the APs perspective but it sure beats flying out there. It works great in a pinch.
Please Note: Spectrum Expert Connect is not supported on Cisco Aironet 1810 OEAP, 1810W, 1830, 1850, 2800, and 3800 Series APs.
The obvious requirement here is CleanAir must be enabled on the AP.

You can connect to an AP that is actively serving clients but you will only be able to see the spectrum from its operating channel. If the AP is serving clients on channel 36, then you will only see the spectrum of that channel.

In this post I am using a Cisco Aironet 3502i.

You may be familiar with Local mode which tunnels the user traffic back to the controller. This mode only shows you spectrum on the serving channel.

Monitor mode will scan for interferers on all channels but will not serve any clients.

SE-Connect is the mode we want to use to connect Chanalyzer to a CleanAir AP. This mode also doesn’t serve clients but will provide you the spectrum data you seek.

Connecting Chanalyzer To CleanAir

From the Monitor page, click on Wireless.

Selecting Wireless in the Cisco WLC

From the list of APs, click on the one that will be used for Spectrum Expert.

List of access points on Cisco WLC

From the General tab of the AP, click the dropdown for AP Mode and select SE-Connect. Click Apply.

Changing the AP mode to SE-Connect

The AP will reboot into SE-Connect mode. Get coffee. It isn’t kidding about a few minutes.

When the AP reconnects to the controller, navigate to the General tab and copy the Network Spectrum Interface (NSI) Key. This will be used to authenticate the AP in Chanalyzer.

The NSI key for the Cisco AP

Open Chanalyzer.

Please Note: You must have a license to the CleanAir Accessory to connect Chanalyzer to an AP.

Click on CleanAir from the top menu and click on Connect to a CleanAir AP.

Connecting Chanalyzer to CleanAir

Type in the IP address of the AP, the NSI Key you copied from the Cisco WLC, and give it a name. Then click Connect.

Entering details of the CleanAir AP

Chanalyzer will establish a connection to the Spectrum Expert enabled AP.

Once connected you will see the panes populate with colors.

Spectrum view from Chanalyzer

Because we are using a Cisco AP in SE-Connect mode, we are able to see a double rainbow. That is both 2.4 GHz and 5 GHz views at the same time.

Interferers are detected using Cisco CleanAir signatures. By selecting one of the interferers it will be displayed in the density view pane. Another useful view is the Utilization graph to identify congested channels.


2 thoughts on “How To Connect Chanalyzer To Cisco CleanAir”

  1. Aboo Nader says:

    thanks a lot

Leave a Reply to Rowell Dionicio Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.


[gravityforms id=16 title=false description=false]
<script type="text/javascript">if(!gform){document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0});var gform={domLoaded:!1,scriptsLoaded:!1,initializeOnLoaded:function(o){gform.domLoaded&&gform.scriptsLoaded?o():!gform.domLoaded&&gform.scriptsLoaded?window.addEventListener("DOMContentLoaded",o):document.addEventListener("gform_main_scripts_loaded",o)},hooks:{action:{},filter:{}},addAction:function(o,n,r,t){gform.addHook("action",o,n,r,t)},addFilter:function(o,n,r,t){gform.addHook("filter",o,n,r,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,n){gform.removeHook("action",o,n)},removeFilter:function(o,n,r){gform.removeHook("filter",o,n,r)},addHook:function(o,n,r,t,i){null==gform.hooks[o][n]&&(gform.hooks[o][n]=[]);var e=gform.hooks[o][n];null==i&&(i=n+"_"+e.length),null==t&&(t=10),gform.hooks[o][n].push({tag:i,callable:r,priority:t})},doHook:function(o,n,r){if(r=Array.prototype.slice.call(r,1),null!=gform.hooks[o][n]){var t,i=gform.hooks[o][n];i.sort(function(o,n){return o.priority-n.priority});for(var e=0;e<i.length;e++)"function"!=typeof(t=i[e].callable)&&(t=window[t]),"action"==o?t.apply(null,r):r[0]=t.apply(null,r)}if("filter"==o)return r[0]},removeHook:function(o,n,r,t){if(null!=gform.hooks[o][n])for(var i=gform.hooks[o][n],e=i.length-1;0<=e;e--)null!=t&&t!=i[e].tag||null!=r&&r!=i[e].priority||i.splice(e,1)}}}</script> <div class='gf_browser_unknown gform_wrapper gravity-theme' id='gform_wrapper_16' ><form method='post' enctype='multipart/form-data' id='gform_16' action='/chanalyzer-cisco-cleanair/?replytocom=1278' > <div class='gform_body gform-body'><div id='gform_fields_16' class='gform_fields top_label form_sublabel_below description_below'><fieldset id="field_16_1" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" ><legend class='gfield_label gfield_label_before_complex' >Name<span class="gfield_required"><span class="gfield_required gfield_required_text">(Required)</span></span></legend><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name no_last_name no_suffix gf_name_has_1 ginput_container_name' id='input_16_1'> <span id='input_16_1_3_container' class='name_first' > <input type='text' name='input_1.3' id='input_16_1_3' value='' aria-label='First name' aria-required='true' placeholder='First Name' /> <label for='input_16_1_3' >First</label> </span> </div></fieldset><div id="field_16_2" class="gfield gfield--width-full gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" ><label class='gfield_label' for='input_16_2' >Email<span class="gfield_required"><span class="gfield_required gfield_required_text">(Required)</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_2' id='input_16_2' type='text' value='' class='large' placeholder='Business email address' aria-required="true" aria-invalid="false" /> </div></div><fieldset id="field_16_3" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" ><legend class='gfield_label gfield_label_before_complex' >Consent<span class="gfield_required"><span class="gfield_required gfield_required_text">(Required)</span></span></legend><div class='ginput_container ginput_container_checkbox'><div class='gfield_checkbox' id='input_16_3'><div class='gchoice gchoice_16_3_1'> <input class='gfield-choice-input' name='input_3.1' type='checkbox' value='I consent to the processing and sharing with partners of the personal data that I provide Packet 6 for this activity in accordance with and as described in the &lt;a href=&quot;https://packet6.com/privacy-policy&quot; target=&quot;_new&quot;&gt;Privacy Policy&lt;/a&gt;' id='choice_16_3_1' /> <label for='choice_16_3_1' id='label_16_3_1'>I consent to the processing and sharing with partners of the personal data that I provide Packet 6 for this activity in accordance with and as described in the <a href="https://packet6.com/privacy-policy" target="_new">Privacy Policy</a></label> </div></div></div></fieldset><div id="field_16_4" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" ><label class='gfield_label' for='input_16_4' >Email</label><div class='ginput_container'><input name='input_4' id='input_16_4' type='text' value='' /></div><div class='gfield_description' id='gfield_description_16_4'>This field is for validation purposes and should be left unchanged.</div></div></div></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_16' class='gform_button button' value='Get the report' onclick='if(window["gf_submitting_16"]){return false;} window["gf_submitting_16"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_16"]){return false;} window["gf_submitting_16"]=true; jQuery("#gform_16").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_16' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='16' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_16' value='WyJbXSIsImY4MGVlNTA5MGVjMWYzYzU5NzUyOGFhOWE3ZGFiMzRlIl0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_16' id='gform_target_page_number_16' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_16' id='gform_source_page_number_16' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div>