一、彩信开发动态链接库简介. 1
二、彩信开发动态链接库详解. 2
1、彩信开发动态链接库简明案例. 2
2、彩信开发动态链接库. 2
3、函数详解. 3
4、完整的例子. 5
三、MMS文件解析. 6
1、MMS文件详解. 6
2、SMIL语言简介. 7
3、简单的SMIL文件. 7
四、创建彩信开发平台. 8
1、彩信开发平台简述. 8
2、彩信猫GPRS拨号连接的设置过程. 9
3、通过AT指令对GPRS设备进行初始化. 10
4、创建拨号网络连接. 11
5、动态链接库的引用方法. 17
五、综述. 19
附录一、超级终端简介. 20
附录二、AT指令. 22
多媒体短信服务(MMS),也就是通常所说的彩信,是在短信息服务(SMS)和增强短信服务(EMS)技术基础上进一步发展起来的。典型的彩信是以MIME格式编码打包,并通过WAP协议进行传递的(另一种方式使用TCP/IP协议)。本动态链接库采用的就是此种方式。
本动态链接库是在Microsoft Visual Studio 2005下使用C#语言开发的DLL类库,提供简单的开发流程,灵活的开发方式,支持多种彩信文件:
1、标准MMS格式,文件后缀名“.mms”。此格式包含彩信消息头和消息体,且消息头中应包含发送目标信息,如对方手机号码。如果开发人员有已经打包好的MMS文件,可以调用动态链接库中的函数直接发送。
2、SMIL文件+独立多媒体文件。开发人员独自编写SMIL文件,可以获得更丰富的彩信表现能力。开发人员只须向发送链表中加入SMIL文件和相应的多媒体文件即可。此程序可以对其自动打包,以生成标准的MMS格式。
3、独立的多媒体格式。为了提高彩信的兼容性,本程序采用标准封装方式,将独立的多媒体文件打包成MMS格式,以便大多数用户能够收到彩信。目前,本动态链接库支持常用的多媒体文件。
文本文件:txt格式,必须采用UTF-8编码格式;
图片文件:jpg,bmp,gif,png;
声音文件:amr,mid,midi。
采用本动态链接库发送彩信非常简单方便。
在正式介绍本开发包之前,先来看一下如下代码片段:
① mm.SetSubject("彩信测试"); // 设置标题
② mm.AddTo("131********"); // 添加接收号码,调用一次添加一个接收号码
// 添加发送文件,包含文件路径,调用一次添加一个发送文件
③ mm.AddFile("E:/…/***.mms");
④ // mm.AddFile("E:/…/***.smil");
⑤ // mm.AddFile("E:/…/***.gif");
⑥ string szReult = ms.Send(mm);
⑦ mm.ClearTo();
⑧ mm.ClearFile();
第①行代码设置彩信标题,第②行代码设置发送目标号码,③-⑤行代码添加文件,第⑥行代码发送彩信,第⑦行代码清除发送目标,第⑧行代码清除发送文件。
方法一:若发送标准MMS格式彩信,只添加第③行代码即可。
方法二:若发送SMIL文件+独立多媒体文件,可以注释掉第③行,添加第④行和第⑤行。
方法三:若发送独立文件,只须添加第⑤行。
多种情况下的处理工作全部由第⑥行函数完成。
不管是方法二还是方法三,一次可以添加多个独立多媒体文件,只需重复调用AddFile()函数即可。注意:采用方法二时,smil文件必须第一个添加到动态数组中。
本程序没有使用重载的方式编写Send()函数,是为了增加程序的灵活性。二次开发人员可以任意组合手机号码与彩信内容。
本动态链接库名字空间为“MMSLib”,包含两个类:“MMSender”和“MMessage”。
类MMSender包含四个函数:
MMSender() 构造函数;
void SetMMSC(string) 设置彩信中心网址;
void SetProxy(string) 设置代理服务器网关。
string Send(MMSLib.MMessage) 发送彩信函数;
类MMessage包含七个函数:
MMessage() 构造函数;
void SetSubject(string) 设置彩信标题;
void AddTo(string) 添加目标手机号码;
void AddFile(string) 添加文件;
void ClearTo() 清除链表中目标手机号码;
void ClearFile() 清除链表中文件;
byte[] GetContent() 打包并获取彩信,Send()中已封装此函数。
类MMSender主要包含发送彩信的相关方法。
⑴ MMSender() 构造函数
通过如下代码可以创建一个MMSender对象。
MMSender ms = new MMSender();
⑵ void SetMMSC(string) 设置彩信中心网址
通过如下代码可以设置彩信中心网址,根据不同的SIM卡采用不同的地址。
ms.SetMMSC("http://mmsc.monternet.com"); // 中国移动 ms.SetMMSC("http://mmsc.myuni.com.cn"); // 中国联通
⑶ void SetProxy(string) 设置代理服务器网关
通过如下代码可以设置代理服务器网关。
ms.SetProxy("10.0.0.172:80");
⑷ string Send(MMSLib.MMessage) 发送彩信函数
在调用string Send(MMSLib.MMessage)方法之前,应首先创建MMessage对象,并对其初始化。
Send()方法封装了网络初始化方法,彩信读取方法,网络通讯方法。此方法完成了彩信发送的全过程。
类MMessage主要包含彩信打包的相关方法。
在类MMessage中维护了两个ArrayList动态数组lDest和lFile,用于管理目标手机号码和彩信文件。函数AddTo(string),AddFile(string),ClearTo(),ClearFile()的功能就是对这两个动态数组进行添加与清除操作。
⑸ MMessage() 构造函数
通过如下代码可以创建一个MMessage对象。
MMessage mm = new MMessage();
⑹ void SetSubject(string) 设置彩信标题;
通过如下代码可以设置彩信标题。
mm.SetSubject("彩信测试");
⑺ void AddTo(string) 添加目标手机号码
添加接收号码,调用一次添加一个接收号码。
通过如下代码可以添加目标手机号码
mm.AddTo("131********");
⑻ void AddFile(string) 添加文件
AddFile()中的参数为string型,是待发送文件的全文件路径,调用一次添加一个发送文件。如本章第一节所述,AddFile()的参数可以采用灵活的形式,包括①“.mms”文件;②“.smil”+多媒体文件;③独立的多媒体文件。详细分析参见第三章。
通过如下代码可以添加文件;
mm.AddFile("E:/…/***.***");
⑼ void ClearTo() 清除链表中目标手机号码
通过如下代码可以清除链表中目标手机号码
mm.ClearTo();
⑽ void ClearFile() 清除链表中文件
通过如下代码可以清除链表中文件
mm.ClearFile();
⑾ byte[] GetContent() 打包并获取彩信,Send()中已封装此函数。
此函数是整个程序的核心部分,读取lDest和lFile中的信息,并将其打包成MMS格式二进制数据。
// 发送MMS的过程
// 创建消息发送接口
MMSender ms = new MMSender();
// 设置参数属性
// 默认属性已经是中国移动参数,因此如果是中国移动用户,以下两个操作可以不需要
ms.SetMMSC("http://mmsc.monternet.com"); // 中国移动
//ms.SetMMSC("http://mmsc.myuni.com.cn"); // 中国联通
ms.SetProxy("10.0.0.172:80");
// 创建消息
MMessage mm = new MMessage();
// 设置消息内容
mm.SetSubject("彩信测试"); // 设置标题
mm.AddTo("131********"); // 添加接收号码,调用一次添加一个接收号码
// 添加发送文件,包含文件路径,调用一次添加一个发送文件
mm.AddFile("E:/…/***.mms"); // 发送MMS格式彩信
// 发送消息
string szReult = ms.Send(mm); // 可以通过读取szReult判断发送结果。
mm.SetSubject("新标题"); // 修改标题
mm.ClearTo(); // 清除接收号码,
mm.AddTo("135********"); // 改变发送目标,彩信标题和内容不变
ms.Send(mm); //
mm.ClearFile(); // 清除彩信内容
// 改变彩信内容
mm.AddFile("E:/ …/pres.smil"); // 添加SMIL文件
mm.AddFile("E:/ …/ID-0001.gif"); // 添加多媒体文件
ms.Send(mm);
mm.ClearTo(); // 清除接收号码,
mm.ClearFile(); // 清除彩信内容
mm.AddTo("138********"); // 添加接收号码,调用一次添加一个接收号码
mm.AddFile("E:/ …/ID-0001.jpg"); // 添加多媒体文件
mm.AddFile("E:/ …/ID-0001.txt"); // 添加多媒体文件
ms.Send(mm); // 发送彩信
每个MMS都是由MMS Header和MMS Body组成。
如图所示,MMS文件主要包含两部分:1、MMS headers;2、Message Body。
为了保证彩信兼容多种手机型号,本文的Message Body部分采用标准SMIL2.0语言描述。因此,本文所涉及的MMS文件可细分为三个部分:
1、MMS headers。
2、SMIL2.0语言描述文件。
3、Message Body中多媒体文件。
如果用户只输入:
mm.AddFile("E:/…/***.mms"); // 发送MMS格式彩信
则,程序将此彩信直接发送。
如果用户输入如下形式:
mm.AddFile("E:/ …/***.smil"); // 添加SMIL文件
mm.AddFile("E:/ …/ID-0001.gif"); // 添加多媒体文件
则程序只添加MMS headers部分,其他部分打包实现。
注意:在此种情况下,smil必须第一个添加到动态数组中。
如果用户只输入多媒体文件:
mm.AddFile("E:/ …/ID-0001.jpg"); // 添加多媒体文件
mm.AddFile("E:/ …/ID-0001.txt"); // 添加多媒体文件
则程序添加MMS headers部分,并按照固定的方式编写SMIL文件,同时对多媒体文件打包,以便生成完整的MMS格式文件。
SMIL是同步多媒体集成语言(Synchronized Multimedia Integration Language)的缩写,念做smile。它是由3W(World Wide Web Consortium)组织规定的多媒体操纵语言。最新的SMIL版本是2001年8月推出的SMIL 2.0版本。SMIL与我们网页上用的Html(超文本传输语言)的语法格式非常相似。后者主要针对普通的网络媒体文件进行操纵(文字、图片、声音、动画、视频的机械堆砌),而前者则操纵多媒体片断(对多媒体片断的有机的、智能的组合)。
SMIL 2.0版本,参见:http://www.w3.org/TR/2005/REC-SMIL2-20050107/。
SMIL 1.0版本,参见:http://www.w3.org/TR/1998/REC-smil-19980615/。
本例子为本程序中内置的SMIL语言文本。如果开发人员只添加独立的多媒体文件,则本例子中的通用文本会添加到打包文件中去。
<smil xmlns="http://www.w3.org/2001/SMIL20/CR/Language">
<head>
<meta name="title" content="mmsPower" />
<meta name="copyright" content="MMSPC2PHONE" />
<meta name="version" content="0.309" />
<layout>
<root-layout width="176" height="208"/>
<region id="Text" top="0%" left="0%" height="100%" width="100%"/>
<region id="Image" top="0%" left="0%" height="100%" width="100%"/>
</layout>
</head>
<body>
<par dur="10000ms">
<text src="ID-0001.txt" region="Text"/>
</par>
<par dur="10000ms">
<img src="ID-0001. jpg " region="Image"/>
</par>
<par dur="10000ms">
<audio src="ID-0001.mid" repeat="indefinite"/>
</par>
</body>
</smil>
彩信开发动态链接库属于彩信开发平台的中间层,完整的彩信开发平台还需要彩信猫硬件的支持和WAP网络连接。
彩信开发平台的创建过程如下:
第一步,确保彩信猫硬件连接正常(略);
第二步,在超级终端下通过AT指令对彩信猫进行初始化,建立彩信猫对GPRS、WAP网关的支持;
第三步,设置拨号网络连接。通过此连接,可以使计算机通过彩信猫访问WAP网关。
详细步骤参见本章第2节。
AT指令设置图解详见本章第3节。超级终端与AT指令的相关知识参见本文附录。
设置拨号网络连接图解详见本章第4节。
创建彩信开发平台后,再将本动态链接库引入二次开发系统中,即可建立完整的彩信应用环境。此过程详见本章第5节。
以下过程在后面章节中有详细图解。
一) AT 指令设置部分
(1) AT+CGCLASS=”B” 置为“B”模式。
(2) AT+CGDCONT=1,”IP”,”CMWAP” 设置WAP连接。
(3) AT+CSQ 检查信号 若返回10—31,0之间的信号数字则继续,如果信号是99,99,则应该考虑不停的键入A/命令,不停的让模块去搜寻网络。
(4) AT+CGACT=1,1 激活,返回OK则继续。
(5) AT+CGREG? 若返回为0,1则可以,若返回0,0则不行返回(1)重来。或者,不停键入A/,多次执行AT+CGREG?命令。
(6) AT+IPR=115200;&W 更改模块速率并保存。
二) 设置MODERN
(1) 控制面板à调制解调器à常规à选择添加à不检测调制解调器à标准调制解调器类型à标准19200bps调制解调器à通讯串口1(建议只使用串口COM1)
(2) 设置19200调制解调器
属性à调制解调器à最高速率(115200)
三) 设置拨号网络
(1) 新建连接à标准19200调制解调器
(2) 区号置空à电话号码{GPRS V5.29版本设置为*99***1#){注意:如果是GPRS 5.26版本号的话,电话号码改为*98*1#}
(3) 完成
四) 双击新建的拨号网络,置空用户名和密码,拨号进行,检测用户名和密码,通过之后登陆网络。
超级终端和AT指令简介,参见附录。
在超级终端下,对模块进行设置,详细记录如下:
at
OK
at+ccid //检测是否装有SIM 卡
+CCID: "89860060190200147245" // 由具体SIM卡序列号决定
OK
at+cgmr //检测软件版本,5.0 以上的才有GPRS 功能支持
534_09gg.2C2 1747684 080602 16:50
OK
at+csq //检测信号质量,确定是否可以登陆上网络
+CSQ: 28,0
OK
at+CGCLASS="B" //设置模块工作类型
OK
AT+CGDCONT=1,"IP","CMWAP" //设置WAP网关,只有开通GPRS 功能的SIM 卡才可以
OK
AT+CSQ
+CSQ: 27,0
OK
AT+CGACT=1,1 //激活网络
OK
AT+CGREG? //检测是否登陆上GPRS网络
+CGREG: 0, 1 //成功登陆
OK
AT+IPR=115200;&W //更改串口速率并保存退出
OK
⑴ 设置MODERN
打开:控制面板à调制解调器à选择“添加”。
弹出“添加硬件向导”对话框,选择“不检测调制解调器”,单击“下一步”。COM1)
显示“选择制造商与型号”界面,选择“标准调制解调器类型”,“标准19200bps调制解调器”,单击“下一步”。此过程可能占用较长时间,请耐心等待。显示“选择调试解调器的端口”界面,点击“COM1”(由彩信猫所连接的端口号决定),点击“下一步”。
依次出现如下界面:
点击“完成”后,可出现如下界面:
单击“属性”,显示“标准 19200 bps 调制解调器 属性”对话框
选择“调制解调器”属性页,“最大端口速度”设置为“115200”,单击确定。
至此,MODERN设置结束。
⑵ 设置拨号网络
新建连接
选择“连接到Internet”,单击“下一步”。
选择“手动设置我的连接”,单击“下一步”。
选择“用拨号调制解调器连接”,单击“下一步”。
输入“ISP名称”,可以自定义,我在这里设置为“标准19200调制解调器”。
设置电话号码为“*99***1#”。
注意:如果是GPRS 5.26版本号的话,电话号码改为“*98*1#”。
“Internet帐户信息”的用户名和密码不用设置,单击“下一步”
完成。
本动态链接库是在Microsoft Visual Studio 2005下使用C#语言开发的DLL类库,所以在此环境下开发彩信发送程序,动态链接库的引用方法非常简单。
如下图所示,在“项目”菜单下选择“添加引用”。
在“添加引用”对话框中,选择“浏览”选项卡,选择本动态链接库“MMSLib.dll”,单击“确定”按钮, 动态链接库即成功引入用户程序中。
在“解决方案资源管理器”中,在“引用”目录下,即可看到刚才添加的动态链接库的名字空间。
在“对象浏览器”下,可以看到“MMSLib”的对象信息。
程序需要添加如下代码才可以使用动态链接库中的对象:
using MMSLib;
下面是一个简单的例子:
通过拨号连接网络,然后再运行此程序,就可以发送彩信了。注意查看SIM卡是属于哪个运营商的,从而设置不同的彩信中心网址。
前面章节详细介绍了彩信开发的各个过程。下面将开发流程再细数一遍,以提供开发人员整体的开发思路。
因为彩信应用系统是软硬件结合的系统,所以,在进行开发之前,开发人员应确保彩信猫设备连接正常。
彩信猫连接计算机后,需要对彩信猫进行初始化,可以在超级终端下通过AT指令对彩信猫进行检测,并进行GPRS网络设置,使其支持GPRS网络连接。超级终端与AT指令的使用方法详见本文附录。GPRS网络设置方法详见第四章第2节和第3节。
初始化硬件后,需要建立拨号网络连接,详细内容参见第四章第2节和第4节。
创建开发平台后,开发人员只需将本动态链接库引用至自己的软件开发环境即可。详细内容参见第四章第5节。
动态链接库相关内容总结如下:
动态链接库的结构信息,参见第二章第2节。函数详解,参见第二章第3节。
动态链接库简明使用例子参见第二章第1节,完整的使用例子参见第二章第4节。
两个例子包含了彩信发送过程的相关过程。
本动态链接库支持的彩信文件格式,参见第一章。
MMS打包格式详解,参见第三章。
彩信程序编写完成后,发送彩信的过程如下:
1、通过拨号连接GPRS网络;
2、运行彩信程序。
超级终端是windows自带的一个串口调试工具,其使用较为简单,被广泛使用在串口设备的初级调试上。
打开超级终端:开始à程序à附件à通讯à超级终端。
下面介绍一下一般使用的步骤:
配置连接需要调试串口基本参数,其操作为:
⑴ 选择菜单“文件”下“属性”菜单项。
⑵ 配置调试设备所连接串口“连接时使用”
⑶ 按“配置”按钮进行配置选定串口信息
⑷ 依次选定每秒位数(波特率)等参数,一般情况下MODEM设置波特率后即可,其它位取默认设置。
⑸ 确定退出配置
⑹ 按工具条上“呼叫”按钮连接所调试设备
⑺ 输入英文字母AT然后回车,此时如果设置正确,则会返回英文字母OK
⑻ 如果参数设置不正确,则提示无法连接,或者连接后无法输入AT字母,此时,请确认步骤 ⑵ 中串口选择正确、请确认波特率设置正确。
⑼ 大部分GPRS MODEM出厂的时候其波特率已经设置为115200,但是也可能部分设置为9600或者其它。在MODEM支持的范围内,越高的波特率代表了越高的计算机传输数据到MODEM的能力。
AT指令是指从终端设备(Terminal Equipment, TE)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter, TA)或数据电路终端设备(Data Circuit Terminal Equipment, DCTE)发送,用于控制移动台(Mobile Station, MS)的功能,以实现与GSM网络业务进行交互的操作指令。
20世纪90年代初,AT指令仅被用于调制解调器操作。当时,为了能够控制MODEM工作,原著名通信设备生产商Hayes制定了一套指令,通过通信软件(如超级终端)控制MODEM的各项操作。这套指令称为“AT指令”。
由于当时缺少对移动电话文本消息控制的先例,因此人们开发了一种称为“SMS Block Mode”的协议,通过终端设备或计算机来控制短消息服务。几年后,诺基亚、爱立信、摩托罗拉和惠普等几大主要的移动电话生产厂商又共同研制了一整套用于GSM业务的AT指令,并形成GSM 07.05标准以及在此之后的GSM 07.07标准。目前,AT指令已经在手机通信中发挥重要的作用,通过AT指令能够控制手机执行许多操作,包括呼叫服务、短消息服务、传真、GPRS等。
(以上内容摘自《Q2406无线CPU嵌入式开发技术》,洪利、杜耀宗编著,北京航空航天大学出版社出版)
常用的几个AT命令
⑴ AT
测试指令,返回OK表示串口设备正常
⑵ AT+CGMM
显示MODEM型号
⑶ AT+CGMR
显示MODEM软件版本号
⑷ AT+CGMI
显示MODEM生产厂家
⑸ AT+IPR=?/AT+IPR?/ AT+IPR=115200
前者查询MODEM支持的所有波特率,后者显示当前设定波特率,最后一条是设置MODEM波特率为115200。