`
izuoyan
  • 浏览: 8948951 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

modem 的发送过程

阅读更多

该作者通过复原传真整个过程,分析mgetty-1.1.36源码得到的分析结果,具有参考意义。

http://hi.baidu.com/kkernel/blog/item/c331c0291b7bdef999250aa0.html

Auther:  Guo Wenxue Data: 2008.11.20

参考3类传真机收发传真的过程:

http://hi.baidu.com/kkernel/blog/item/05ffd52e87e9b9574ec22663.html

参考mgetty-1.1.36的源代码分析:

PHASE A

Modem发送命令:

Ate0;

At+fclass=1;

Atdt628 //我们的传真分机号码

Modem返回:

======================Part1 : modem echo ========================

Rev 9: 0x61 0x74 0x64 0x74 0x36 0x32 0x38 0x0d 0x0a

a t d t 6 2 8 \r \n

======================Part2: Fax return “Connect” ====================

Rev 11: 0x0d 0x0a 0x43 0x4f 0x4e 0x4e 0x45 0x43 0x54 0x0d 0x0a

\r \n C O N N E C T \r \n

======================Part3: NSF Frame ===========================

Rev 24: 0xff 0x03 0x20 0x00 0x00 0x56 0x55 0x55 0x00 0x8c 0x90 0x80 0x34 0x0c 0x94 0x37

0x10 0x03 0x0d 0x0a 0x4f 0x4b 0x0d 0x0a

DLE ETX \r \n O K \r \n

注:

class1.cint fax1_dial_and_phase_AB _P2( (dial_cmd,fd), char * dial_cmd, int fd )函数中:

0x03 à0x10这一部分为NSF Frame,他由0x20这个值标志。

代码:

if ( (len = fax1_receive_frame( fd, first? 0:3, 30, framebuf ) ) //Modem的返回到framebuf

switch ( framebuf[1] )

{

case T30_CSI: fax1_copy_id( framebuf ); break;

case T30_NSF: fax1_incoming_nsf( framebuf+2, len-2 ); break; //如果是NSF

case T30_DIS: fax1_parse_dis( framebuf ); break; //如果是DIS,下面介绍

case T30_DCN: fax1_send_dcn( fd, 20 ); return ERROR;

default:

lprintf( L_WARN, "unexpected frame type 0x%02x", framebuf[1] );

}

fax1_incoming_nsf定义在faxlib.c中;

fax1_parse_dis定义在class1lib.c中;

======================Part4: Remote传真的相关信息========================

Rev 16: 0xff 0x03 0x40 0x32 0x30 0x37 0x30 0x33 0x37 0x39 0x35 0x37 0x32 0x30 0x20 0x20

ETX @ 2 0 7 0 3 7 9 5 7 2 0 SPACE SPACE //这是我们的传真号码

Rev 17: 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0xbd 0x64 0x10 0x03 0x0d 0x0a 0x4f 0x4b 0x0d 0x0a

SPACE ---------------------------------> SPACE DLE ETX \r \n O K \r \n

==================Part5: DIS Frame Remote传真机的capability==================

Rev 19: 0xff 0x13 0x80 0x00 0xee 0xa8 0xc4 0x80 0x11 0xe7 0xb3 0x10 0x03 0x0d 0x0a 0x4f 0x4b 0x0d 0x0a

注:0x80标志这是DIS frame,参考上面的代码。

class1lib.cvoid fax1_parse_dis _P1((frame), uch * frame )函数中:

首先将frame知道0x00 (FIF), 这样frame[1]=0xee frame[2]=0xa8,下面按源代码的注释对这两个字节进行分析:0xee= 1110 1110 0xa8=1010 1000

BIT9是从0x00(FIF)这个位置开始偏移,即frame[1]bit0,依次类推:

BIT 9:  0->fax_to_poll=FALSE

BIT 10: 1->Can receive //receiving capabilities

BIT 11-14: 1110 1110(0xee)&0011 1100 (0x3c) = 0x2c

所以:case 0x2c: remote_cap.br = V17 | V29 | V27ter=ffe


BIT 15: 1->remote_cap.vr = 1;

BIT 16: 1->remote_cap.df = 1;

BIT 17-18: remote_cap.wd = frame[2] & 0x03;

页面宽度valid: 0/1/2 = 215/255/303 mm: 00->215mm

BIT 19-20: remote_cap.ln = ( frame[2] >> 2 ) & 0x03;

页面长度valid: 0/1/2 = A4/B4/unlimited: 10->unlimited

BIT 21-23: remote_cap.st = fax1_st_table[ (frame[2] >> 4) & 0x07 ].st;

(Frame[2]>>4)&0x07=0x0010=2

查表得:fax1_st_table[2].st = { 3, 10, 10, " 10ms" } /* 2 = 010 */

struct fax1_st_table { int st; int ms_n; int ms_f; char * txt; };

所以remote_cap.st=3.

BIT 24: extend bit

if ( frame[2] & 0x80 ) /* extend bit */ 最高位为1,故为真

{

/* bit 27: ECM */

if ( frame[3] & 0x04 ) // 0xc4 &0x80 = 0 不带ECM

remote_cap.ec = 1;

}

PHASE B:

文件Class1lib.cint fax1_send_dcs _P2((fd, s_time), int fd, int s_time )函数是modemRemote FAX 发送DCS Frame:

while( dcs_btp->speed > 2400 &&

( dcs_btp->speed > fax1_max || ( dcs_btp->flag & fax1_ftm & remote_cap.br ) == 0 ) )

dcs_btp++;

其中:

fax1_max初始化为最大速率14400,V17_14400

fax1_ftm是由at+ftm=?命令获取的modem支持的速率,我们的modem返回是:

3,24,48,72,73,74,96,97,98,121,122,145,146

所以该modem支持class1lib.c中结构体struct fax1_btable fax1_btable[]定义的全部速率;

remote_cap.br为上PHASE A获取的remote_cap.br = V17 | V29 | V27ter=ffe

这样Local Modemremote FAX协商的速率应该为V29_9600, dcs_btp= fax1_btable[3];

此时,发送的DCS Frame为:

framebuf[0] = 0x03 | T30_FINAL = 0x03 | 0x10 = 0x13;

framebuf[1] = fax1_dis | T30_DCS = 0x0 | 0x82 = 0x82; //fax1_dump_frame() will set last bit to 0

framebuf[2] = 0;

framebuf[3] = 0x02 | dcs_btp->dcs_bits | ((fax1_res&remote_cap.vr)<<6) | 0x00

= 0x02 | 0x04 | ( (1 &1) <<6) | 00

= 0100 0010 = 0x46;

framebuf[4] = 0x00 // 00-> 215 mm width

| 0x04 // B4 length

| 0x00 // scan time: 00->?

| 0x00; // No extend bit

= 0x04;


分享到:
评论

相关推荐

    金笛JAVA版短信开发控件 V2.1.rar_java 短信_java 短信发送_短信 java_短信开发_短信控件

    由控件自行完成连接或发送过程,当操作完成后,将执行结果以事件的形式通知容器程序。 2、内部包含收发缓冲队列。控件可以同时接受容器程序较多的发送请求,控件将这些发送请求放到一个发送队列中,控件依次逐个执行...

    WEAVECOM MODEM短信API

    5.通信过程中启用数据终端就绪 (DTR) 信号,未设置则默认为:true; 6.每个字节的标准停止位数,未设置则默认为:One; 控件一共有4个事件: 短信发送完成事件处理方法(SendCompleted) AT指令响应事件处理方法...

    BitWare 用modem发传真打电话的软件

    从“发送传真”中发送传真文档的过程是 1.首先在 BitWare 窗口中双击“传输传真”的图标,将出现“传输传真”窗口。 2.在工具栏选择“新建”按钮或者由“作业”菜单中选择“新建”,就会出现“拨传真号”对话框...

    DLL.rar_gsmmodem.d_串口_短信 程序

    GsmModem 源码 短信模块通过串口与PC机相连,该程序操作短信模块,发送手机短信,不支持接收手机短信,短信内容是从Microsoft SQL server中读取的,数据表和存储过程都提供了。开发平台是.net,语言是C#。操作短信...

    linux传输文件命令 rz 和 sz详解

    利用Zmodem协议,可以在modem上发送512字节的数据块。如果某个数据块发生错误,接受端会发送“否认”应答,因此,数据块就会被重传。它是Xmodem 文件传输协议的一种增强形式,不仅能传输更大的数据,而且错误率更小...

    数通网络实践之三种串行通信

    如果数据是发送给Modem进行转发的,字符串 前面就不会设置AT标识。通信产业对数据速率和通讯距离的要求不断 提高,后面才开发出像100BaseT这样为我们普遍熟知的标准,另外, Base系列标准也是串行通讯。 作为数通...

    Mscomm串口控件

    还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工 、事件驱动的、高效实用的通信程序。但在实际通信软件设计过程中,MSComm控件并非像想像中那样完美和...

    西门子的GSM 无线通信模块TC35iAT指令从而实现收发短消息的过程

    本文介绍了西门子的GSM 无线通信模块TC35i,并提出了由TC35i 模块通过搭建外围电路构成一个GSM Modem,PC机通过串口数据线向其发送 AT指令,从而实现短消息的发送和接收。详细介绍了TC35i的外围电路设计,给出了实际...

    MSCOMM控件

    还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工 、事件驱动的、高效实用的通信程序。但在实际通信软件设计过程中,MSComm控件并非像想像中那样完美和...

    MSCOMM控件的使用

    还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工 、事件驱 动的、高效实用的通信程序。但在实际通信软件设计过程中,MSComm控件并非像想像中那样完美和...

    完整3G-AT指令集

    3G-AT指令集,完美的解析3G通讯过程发送的各种指令。非常靠谱

    移动短消息控件

    &lt;br/&gt;安装 安 Modem硬件厂商的说明书进行收发短消息Modem的安装,安装成功之后即可用SmsControl控件进行移动短消息的发送和接收。 &lt;br/&gt; 开发 SmsControl控件经过严格设计,其特点为:1、调用...

    AnyDATA短消息内容乱码解决方法

    本文档描述了AnyDATA公司的CDMA无线MODEM的短消息接收/发送过程中出现乱码的情况。 对这些情况进行了分析,并针对性的提出可行的解决方案

    Delphi网络通信协议分析与应用实现pdf清晰

    6.4 MIME编码解码与发送附件 6.4.1 RFC822的局限 6.4.2 UUENCODE编码与解码 6.4.3 MIME及其编码 6.4.4 构造MIME信件 6.4.5 MIME信件的语法分析 6.5 E-mail乱码 6.5.1 乱码的常见形式及形成原因 6.5.2 避免...

    Visual C++实践与提高——串口通信与工程应用篇1

    11.4.3 MCM200/MCM500读写操作过程 338 11.4.4 ZLG500A读写模块介绍 339 11.5 射频卡应用的设计 340 11.5.1 读写器成品的设计方法 340 11.5.2 使用射频卡模块的设计方法 340 11.6 小结 340 第12章 组态王的应用 341 ...

    visual C++_Turbo C串口通信编程实践

    7.3.1 数据校验过程 7.3.2奇偶校验 7.3.3 异或校验 7.3.4 CRC循环冗余码校验 7.4 串口通信数据包处理方法编程实例第8章 单片机串口通信 第8章 单片机串口通信 8.1 单片机串口硬件系统及C51程序开发 ...

    VB网络与Internet相关小例子源码打包下载.rar

    获娶修改计算机的IP地址及子网掩码、网络拷贝文件方法一(服务器)、利用MSComm控件拨电话、禁止使用网上邻居、检测MODEM的状态、控上网过程、获取网卡的物理地址、网络计时器、获娶修改网关、获得拨号网络的列表并...

    智能蓝牙锁.doc

    上电,循环检测键盘是否按下F1,如按下F1,ALARM灯亮,进行自身初始化,等待 连接,监控中心发送create connect命令后,A端接收到connect complete event,连接过程结束。当连接正常建立进入工作状态,ALARM灯灭,...

    VB MSCOMM控件的使用

    还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工 、事件驱动的、高效实用的通信程序。但在实际通信软件设计过程中,MSComm控件并非像想像中那样完美和...

    深入解析为何发展多核基站调制解调器

    调制解调器(Modem)是调制器(Modulator)和解调器(Demodulator)合在一起的总称,使数字数据能在模拟信号传输线上传输的转换接口。...计算机在发送数据时,先由Modem把数字信号转换为相应的模拟信

Global site tag (gtag.js) - Google Analytics