65.9K
CodeProject 正在变化。 阅读更多。
Home

3G调制解调器互联网拨号器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (88投票s)

2010年10月22日

CPOL

7分钟阅读

viewsIcon

811800

downloadIcon

65961

3G调制解调器互联网拨号器

此代码使用VS2008 SP1开发。

Screen_1.png

History_1.png

Traffic.png

引言

无线3G调制解调器是一种连接到蜂窝网络而不是固定电话系统的调制解调器。它允许您在任何可以接收到手机信号的地方获得宽带互联网访问。如今,许多手机都内置了3G调制解调器。

有很多很棒的文章指导您如何为普通调制解调器编写互联网拨号器(其中大多数也适用于3G调制解调器),但有些信息缺失,例如信号强度、连接模式(GSM、GPRS、EDGE、HSDPA等)以及其他与无线调制解调器相关的信息。

背景

我所有的工作和测试都在华为调制解调器上进行,但与其他调制解调器相比,情况应该不会有太大变化。在开始之前,您需要成功安装调制解调器,并且您应该注意到安装调制解调器后,它通常会添加三个端口:一个用于调制解调器本身,另外两个用于应用程序接口。以我的华为调制解调器为例,您应该在设备管理器中看到以下内容:

在“调制解调器”下
HUAWEI Mobile Connect - 3G Modem
在“端口”下
HUAWEI Mobile Connect - 3G Application Interface (COM #)
HUAWEI Mobile Connect - 3G PC UI Interface (COM #)

device_manger.jpg

我们只对两个端口感兴趣:“Huawei Connect - 3G Modem”端口是调制解调器端口,应在此端口上调用正常的连接和断开命令(RAS应该为我们处理),以及“HUAWEI Mobile Connect - 3G PC UI Interface”端口,调制解调器使用该端口发送诸如信号质量、信号模式等事件。

代码设计

我试图尽可能地保持代码的面向对象性,以便代码可以重用且易于维护,因为并非所有制造商都使用相同的命令集。我使用了工厂设计模式,根据安装的调制解调器动态选择要加载的正确类。首先创建一个CDummyModem 的实例,然后识别调制解调器型号,并为该调制解调器构造相应的类。

拨号

拨号有两种方式:一种是打开“Huawei Connect - 3G Modem”端口并发出拨号命令,另一种是让RAS为您处理。我选择了简单的方式,使用RAS来处理拨号。

有很多文章详细介绍了RAS函数,所以我不会深入探讨。此外,还有很多现成的类使使用RAS函数更加容易,但我认为自己动手创建更好。

要使用CMyRas 类,您需要创建一个CMyRas实例

CMyRAS m_RAS;

然后,您必须调用Initialize 函数,传递一个指向CWnd 的指针,该窗口将接收来自RAS回调函数的事件。

if(!m_RAS.Initialize(m_pEventWnd))
{
    //Error
    return FALSE;
}

调用Initialize 函数还会检索地址簿条目列表及其计数。您可以使用GetEntriesCount 来了解地址簿条目的数量,并可以使用GetEntry 函数按索引获取条目。

现在,您已准备好使用Dial函数进行拨号,通过传递要拨号的条目名称、用户名和密码。

要挂断连接,只需调用HangUp

注意:您需要确保调制解调器设置了正确的APN,否则服务器将断开您的连接。

与调制解调器通信

发送和接收调制解调器的消息很简单,您需要做的就是打开“HUAWEI Mobile Connect - 3G PC UI”端口并发送您的命令。如果您打开调制解调器端口,您将无法使用RAS进行拨号。

我添加了我自己的串行端口类CSerial。我只需要简单地读写串行端口。CSerial 类有两个线程:一个用于读取,一个用于写入。要使用该类,请创建一个类的实例并调用Initialize,该函数接受一个指向CModem 类的指针,以便将从端口接收到的数据转发。现在,您需要通过调用Open 函数来打开端口,Open 函数还将启动读取和写入线程。

完成后,调用ShutDown 来关闭端口并终止线程。

调制解调器事件

调制解调器流量状态

通常,HUAWEI 3G调制解调器会将其状态发送到“HUAWEI Mobile Connect - 3G PC UI”。DSFLOWRPT 消息每两秒钟通知我们一次连接状态。在串行端口上接收到的文本大致如下:

^DSFLOWRPT:0000240E,00000000,00000000,00000000000AD023,00000000002FA192,0003E800,0003E800 

这是对数字含义的解释

^DSFLOWRPT: N1, N2, N3, N4, N5, N6, N7 
        N1: Connection duration in seconds 
        N2: measured upload speed 
        N3: measured download speed 
        N4: number of sent data 
        N5: number of received data  
        N6: connection, supported by the maximum upload speed
        N7: connection, supported by a maximum download speed 

使用DSFLOWRPT 事件提供的信息,您可以绘制图表显示您的连接状态(随时间的上传/下载)。

注意:此事件仅在您已连接时发送。

信号质量

一旦信号水平发生变化,您的调制解调器将发送一个RSSI 事件。RSSI事件显示当前的信号质量级别。通常在0到31之间。

此表将RSSI值与信号质量进行映射

词语 区块 百分比 RSSI 分贝
Excellent [][][][][] 100 31 >-51
97 30 -53
94 29 -55
90 28 -57
87 27 -59
84 26 -61
Good [][][][] 81 25 -63
77 24 -65
74 23 -67
71 22 -69
68 21 -71
65 20 -73
一般 [][][] 61 19 -75
58 18 -77
55 17 -79
52 16 -81
48 15 -83
45 14 -85
[][] 42 13 -87
39 12 -89
35 11 -91
32 10 -93
29 9 -95
26 8 -97
非常差 [] 23 7 -99
19 6 -101
16 5 -103
13 4 -105
10 3 -107
6 2 -109
无信号 3 1 -111
0 0 <-113

有些调制解调器不发送状态事件或信号质量事件,解决方法是创建一个线程,该线程会定期查询调制解调器的状态。

常用3G命令列表

有些命令可用于查询或设置。要查询,您需要附加“?”。要设置,您需要附加“=”。例如,要查询调制解调器的当前APN,请使用以下命令:

AT+CGDCONT?

设置APN

AT+CGDCONT=1,”IP”,”apn name”
AT命令 描述
AT 获取调制解调器的注意力
ATI 获取制造商信息
AT+CGMI 获取制造商信息
AT+CIMI 获取SIM IMSI号码
AT+CGSN 获取调制解调器IMEI
AT^HWVER 获取硬件版本
AT^SYSINFO 获取系统信息
AT+CSQ 获取信号强度
AT+CGMR 打印调制解调器的固件版本
ATZ 将调制解调器重置回默认出厂设置
AT+CFUN 获取/设置操作模式
AT+CPIN 获取/设置PIN
AT+CGDCONT 获取/设置APN
AT^SYSCFG 获取/设置系统配置
AT+CUSD 发送USSD命令

关注点

真正促使我开发此应用程序的原因是,我注意到随调制解调器附带的应用程序无法提供准确的信号质量。调制解调器还支持一些选项,但无法通过该应用程序进行设置(例如,强制连接到3G模式)。

此外,我不喜欢调制解调器应用程序的GUI。我只需要一个简单干净的拨号器。

参考文献

AT命令和3G调制解调器一般信息的优秀参考资料

历史

  • V0.6 (2011年7月11日)
    • 新的GUI(特别感谢Zaki Fachromi和Calvin Lichty)
    • 更好的华为(Vodafone品牌)调制解调器检测
  • V0.5 (2010年12月15日)
    • 添加了流量图
    • 更新了上下文菜单
    • 拨号(Bug修复)
    • Bug 修复
  • V0.4 (2010年12月5日)
    • 现在支持HUAWEI EC169(特别感谢goldboar)
    • 基本ZTE调制解调器支持(Beta版)
    • 添加了一个线程“StatisticsThread”,如果调制解调器不发送状态事件,则可以使用该线程。
    • Bug 修复
  • V0.3 (2010年11月21日)
    • 向托盘图标添加了上下文菜单
    • 添加了流量大小查看器“历史记录”
    • 设置频段(Bug修复)
    • 改进了调制解调器检测
    • 日志记录现在在发布版本中启用
    • 一个非常详细的日志用于跟踪(仅限调试版本)
    • 许可证更改
  • V0.2 (2010年11月11日)
    • 添加了日志记录功能
    • 添加了频段选择
    • 设置APN(Bug修复)
    • 添加了安装项目
  • V0.1b (2010年10月30日)
    • 添加了最小化到托盘
  • V0.1 (2010年10月22日)
    • 首次发布

正在进行中

  • 添加热点(Wi-Fi)功能(通过您的无线网卡共享您的3G连接)
© . All rights reserved.