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模块信号格数与信号强度的对应关系,如下代码所示:
01 | public int getGsmLevel() { |
08 | int asu = getGsmSignalStrength(); |
10 | if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; |
11 | else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT; |
12 | else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD; |
13 | else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE; |
14 | else level = SIGNAL_STRENGTH_POOR; |
16 | if (DBG) log ( "getGsmLevel=" + 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( )函数,该函数是主要用来获取信号的强度。
01 | public int getLevel() { |
05 | level = getLteLevel(); |
06 | if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { |
07 | level = getGsmLevel(); |
10 | int cdmaLevel = getCdmaLevel(); |
11 | int evdoLevel = getEvdoLevel(); |
12 | if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { |
15 | } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { |
21 | level = cdmaLevel > evdoLevel ? cdmaLevel : evdoLevel; |
24 | if (DBG) log ( "getLevel=" + level); |
28 | public int getLevel() { |
32 | level = getLteLevel(); |
33 | if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { |
34 | level = getGsmLevel(); |
37 | int cdmaLevel = getCdmaLevel(); |
38 | int evdoLevel = getEvdoLevel(); |
39 | if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { |
42 | } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { |
48 | level = cdmaLevel > evdoLevel ? cdmaLevel : evdoLevel; |
51 | if (DBG) log ( "getLevel=" + level); |
getCdmaLevel( )获取CdmaLevel,同样也有getEvdoLevel( )函数,在上一个函数中,通过比较Evdo和Cdma的强度,来最终确定信号的显示强度,也就是我们在通知栏里看到的信号格数。
01 | public int getCdmaLevel() { |
02 | final int cdmaDbm = getCdmaDbm(); |
03 | final int cdmaEcio = getCdmaEcio(); |
07 | if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT; |
08 | else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD; |
09 | else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE; |
10 | else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR; |
11 | else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; |
14 | if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT; |
15 | else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD; |
16 | else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE; |
17 | else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR; |
18 | else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; |
20 | int level = (levelDbm < levelEcio) ? levelDbm : levelEcio; |
21 | if (DBG) log ( "getCdmaLevel=" + level + ",cdmaDbm=" + cdmaDbm + ",cdmaEcio=" +cdmaEcio); |
25 | public int getCdmaLevel() { |
26 | final int cdmaDbm = getCdmaDbm(); |
27 | final int cdmaEcio = getCdmaEcio(); |
31 | if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT; |
32 | else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD; |
33 | else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE; |
34 | else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR; |
35 | else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; |
38 | if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT; |
39 | else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD; |
40 | else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE; |
41 | else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR; |
42 | else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; |
44 | int level = (levelDbm < levelEcio) ? levelDbm : levelEcio; |
45 | if (DBG) log ( "getCdmaLevel=" + level + ",cdmaDbm=" + cdmaDbm + ",cdmaEcio=" +cdmaEcio); |
» 郑重声明:
原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)