AT+CSQ语法
命令解释:检查网络信号强度
命令格式:AT+CSQ<CR>
命令返回:+CSQ: **, ## 其中:
-
-
-
-
- **应在 0 到 31 之间(99表示无信号),数值越大表明信号质量越好;
- ##为误码率,值在 0 到 99 之间。否则应检查天线或 SIM 卡是否正确安装
-
-
-
测试结果:AT+CSQ<CR>
+CSQ: 31, 99
计算公式:信号强度 = -113dBm + (rssi * 2)
通过AT+CSQ指令获取GPRS模块信号强度
如下图所示:
信号格数与信号强度的关系
手机格数与手机接收基站的信号强度有关,目前行业中并没有明确的标准,格数与信号强度关联均为厂商而定,iPhone 4信号强度与格数如下图:
诺基亚手机和iPhone 4信号强度与格数对比如下:
信号格数
接收电平强度
诺基亚
iPhone4
5格:
大于-85dBm
大于-91dBm
4格:
-85dBm至-90dBm
-91dBm至-101dBm
3格:
-90dBm至-95dBm
-101dBm至-103dBm
2格:
-95dBm至-100dBm
-103dBm至-107dBm
1格:
-100dBm至-105dBm
-107dBm至-113dBm
脱网:
小于-105 dBm
小于-113dBm
注:上表数据均为5格信号显示方式,如N97等7格信号原则与上述不同。
在这里,我采用了android系统上关于GSM模块信号格数与信号强度的对应关系,如下代码所示:
public int getGsmLevel() {
int level;
// ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
// asu = 0 (-113dB or less) is very weak
// signal, its better to show 0 bars to the user in such cases.
// asu = 99 is a special case, where the signal strength is unknown.
int asu = getGsmSignalStrength();
if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD;
else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE;
else level = SIGNAL_STRENGTH_POOR;
if (DBG) log("getGsmLevel=" + level);
return level;
}
上面的asu即AT+CSQ指令返回的RSSI值。
参考文章:http://blog.csdn.net/garybook/article/details/17006609
如果是CDMA模块,应该可以参考下面的代码:
参考文章:http://www.2cto.com/kf/201306/218756.html
在Android4.0的系统中,手机中显示信号强度格数的代码在
frameworks\base\telephony\java\android\telephony\SignalStrength.java
getLevel( )函数,该函数是主要用来获取信号的强度。
public int getLevel() {
int level;
if (isGsm) {
level = getLteLevel();
if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = getGsmLevel();
}
} else {
int cdmaLevel = getCdmaLevel();
int evdoLevel = getEvdoLevel();
if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know evdo, use cdma */
level = cdmaLevel;
} else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know cdma, use evdo */
level = evdoLevel;
} else {
/* We know both, use the lowest level */
//level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
level = cdmaLevel > evdoLevel ? cdmaLevel : evdoLevel;
}
}
if (DBG) log("getLevel=" + level);
return level;
}
public int getLevel() {
int level;
if (isGsm) {
level = getLteLevel();
if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = getGsmLevel();
}
} else {
int cdmaLevel = getCdmaLevel();
int evdoLevel = getEvdoLevel();
if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know evdo, use cdma */
level = cdmaLevel;
} else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know cdma, use evdo */
level = evdoLevel;
} else {
/* We know both, use the lowest level */
//level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
level = cdmaLevel > evdoLevel ? cdmaLevel : evdoLevel;
}
}
if (DBG) log("getLevel=" + level);
return level;
}
getCdmaLevel( )获取CdmaLevel,同样也有getEvdoLevel( )函数,在上一个函数中,通过比较Evdo和Cdma的强度,来最终确定信号的显示强度,也就是我们在通知栏里看到的信号格数。
public int getLevel() {
int level;
if (isGsm) {
level = getLteLevel();
if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = getGsmLevel();
}
} else {
int cdmaLevel = getCdmaLevel();
int evdoLevel = getEvdoLevel();
if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know evdo, use cdma */
level = cdmaLevel;
} else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know cdma, use evdo */
level = evdoLevel;
} else {
/* We know both, use the lowest level */
//level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
level = cdmaLevel > evdoLevel ? cdmaLevel : evdoLevel;
}
}
if (DBG) log("getLevel=" + level);
return level;
}
public int getLevel() {
int level;
if (isGsm) {
level = getLteLevel();
if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = getGsmLevel();
}
} else {
int cdmaLevel = getCdmaLevel();
int evdoLevel = getEvdoLevel();
if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know evdo, use cdma */
level = cdmaLevel;
} else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know cdma, use evdo */
level = evdoLevel;
} else {
/* We know both, use the lowest level */
//level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
level = cdmaLevel > evdoLevel ? cdmaLevel : evdoLevel;
}
}
if (DBG) log("getLevel=" + level);
return level;
}
» 本文地址: http://velep.com/archives/1147.html
» 文章出处: reille博客—http://velep.com , 如果没有特别声明,文章均为reille博客原创作品