Radio Configuration Data Format

There are many different cases where the radio configuration data is passed between components. For example, upon registration for a Cognitive Engine, the Cognitive Radio Shell needs to pass the data from the Radio Configuration file to the Cognitive Engine, so it can initialize itself accordingly. In the same manner, the SML must pass this information between the Cognitive Radio Shell and a Cognitive Engine.

We have defined a structured protocol for sending this information between components. We provide this definition to provide interoperability and portability for our system.

The Radio Configuration Data contains the information regarding the parameters and goals of the radio system. It holds the available transmission parameters, observable parameters, and specific utilities and target values for these utilities. In addition, where available the configuration data includes the ranges of the parameter values, the minimum and maximum values, and even the step sizes. This information completely describes the cognitive radio system. Below is an example XML Radio Configuration file that contains this information.

<engine name="myengine">

<!-- utilities : QoS metrics -->
<utilities>
<utility name="throughput" units="kbps" goal="max" target="125" />
<utility name="spectral_efficiency" units="b/s/Hz" goal="max" />
<utility name="log10_ber" units="none" goal="min" target="-3" />
</utilities>

<!-- radio parameters -->
<parameters>
<parameter name="mod_scheme" min="1" max="4" step="1">
<!-- BPSK, QPSK, 8-PSK, 16-QAM -->
<affect utility="throughput" relationship="improve" />
<affect utility="spectral_efficiency" relationship="improve" />
<affect utility="log10_ber" relationship="degrade" />
</parameter>
<parameter name="tx_power" units="dBm" min="-30.0" max="0.0" step="0.1">
<affect utility="log10_ber" relationship="improve"/>
</parameter>
</parameters>

<!-- link/channel observations -->
<observables>
<observable name="SNR">
<affect utility="log10_ber" relationship="improve" />
</observable>
</observables>
</engine>

In order for this information to be passed between components we have defined the order in which the parameters and the specific parameter values are transmitted and received. The high level group order is as follows:

  1. Radio Utilities (goals)
  2. Transmission Parameters (knobs)
  3. Observable Parameters (meters)

Before sending any specific information about a single group parameters, the number of parameters is sent, followed by the parameters and their values themselves. Below is a more specific order of items that are sent.

  1. Number of Radio Utilities to be sent.
  2. (loop starts)Utility Name
  3. Unit of Measurement
  4. Utility Goal
  5. Target Value(loop ends)

Utilities are followed by the transmission parameters.

  1. Number of Transmission Parameters to be sent.
  2. (loop 1 starts)Transmission Parameter Name
  3. Unit of Measurement
  4. Minimum Value
  5. Maximum Value
  6. Step Size
  7. Number of Utilities that this parameter affects
    1. (loop 2 starts)Utility Name
    2. Relationship with Utility(loop 2 ends)(loop 1 ends)

Transmission Parameters are followed by the observable parameters information.

  1. Number of Observable Parameters to be sent.
  2. (loop 1 starts)Observable Parameter Name
  3. Number of Utilities that this parameter affects
    1. (loop 2 starts)Utility Name
    2. Relationship with Utility(loop 2 ends)(loop 1 ends)

Below is a sample of C++ code that implements the SendRadioConfigurationData? function inside our Cognitive Radio Shell reference implementation:

    // Radio Utilities
// Send Number of Utilities
sprintf(counter,"%d",radio_info->numUtilities);
SendMessage(socketfd,counter);

// Begin sending Radio Utility data
for(i = 0; i < radio_info->numUtilities; i++) {
SendMessage(socketfd, u[i].name.c_str());
SendMessage(socketfd, u[i].units.c_str());
SendMessage(socketfd, u[i].goal.c_str());
sprintf(var,"%f", u[i].target);
SendMessage(socketfd,var);
}

// Transmission Parameters
// Send Number of Transmission Parameters
sprintf(counter,"%i",radio_info->numParameters);
SendMessage(socketfd,counter);

// Begin sending Transmission Parameter data
for(i = 0; i < radio_info->numParameters; i++) {
SendMessage(socketfd,p[i].name.c_str());
SendMessage(socketfd,p[i].units.c_str());
sprintf(var,"%f",p[i].min);
SendMessage(socketfd,var);
sprintf(var,"%f",p[i].max);
SendMessage(socketfd,var);
sprintf(var,"%f",p[i].step);
SendMessage(socketfd,var);

sprintf(counter,"%i",p[i].numAffects);
SendMessage(socketfd,counter);
for(j = 0; j < p[i].numAffects; j++) {
SendMessage(socketfd,p[i].affection_list[j].u->name.c_str());
SendMessage(socketfd,p[i].affection_list[j].relation.c_str());
}
}

// Radio Observables
// Send Number of Observable Parameters
sprintf(counter,"%i",radio_info->numObservables);
SendMessage(socketfd,counter);

// Begin sending Radio Observable Data
for(i = 0; i < radio_info->numObservables; i++) {
SendMessage(socketfd,o[i].name.c_str());

sprintf(counter,"%i",o[i].numAffects);
SendMessage(socketfd,counter);
for(j = 0; j < o[i].numAffects; j++) {
SendMessage(socketfd,o[i].affection_list[j].u->name.c_str());
SendMessage(socketfd,o[i].affection_list[j].relation.c_str());
}
}





注:Radio Configuration Data Format(原文出处,翻译整理仅供参考!)