一. motorola普通铃声
1) 测试环境:手机型号--a388、t191;工具--nok2phone;网关--亚信
2) 制作过程:以”999朵玫瑰”为例,首先用nok2phone打开相应的midi文件,在nok2phone的输出框中产生motorola普通铃声所需的字串,如” 2 f2 e2 c2 d4 r2 a-1 g-1 f-2 g-2 c2 a-6 a-4 c2 a-2 g-6 d1 d1 c2 d2 e2”,根据算法计算出真正所需发送的铃声,内容是” l35&2 2f2e2c2d4r2a-1g-1f-2g-2c2a-6a-4c2a-2g-6d1d1c2d2e2&&27”,通过sp程序将该字串做为普通的文本消息发送至手机,手机上显示收到铃声。
3) 算法:motorola的铃声格式如下:
<header><tempo value><musical data><delimiter><checksum>
-----------------------------------------------------------------------------------------
header:l35&
tempo value:由1或2或3或4加空格构成,缺省为2,如”2 “
musical data:将nok2phone中产生的字串去掉空格即可
delimiter:&&
checksum:对musical data进行的校验和,两个字节。方法为对musical data中的数据从前往后对每个字符进行异或运算,运算的结果假设其十六进制的表示为xy,那checksum的第一个字节的十六进制形式为3y,第二个字节的十六进制形式为3x。
部分算法:
byte a = 0, check1, check2;
cstring sread(_t(“2 f2 e2 c2 d4 r2 a-1 g-1 f-2 g-2 c2 a-6 a-4 c2 a-2 g-6 d1 d1 c2 d2 e2”)), sring;
sread.replace(" ","");
arraymessage.setsize(sread.getlength() + 1);
strcpy((char *)arraymessage.getdata(), sread);
for(int i=0;i<arraymessage.getsize()-1;i++)
{
a = a ^ arraymessage.getat(i);
}
check1 = 0x30 + (a & 0xf);
check2 = 0x30 + (a>>4 & 0xf) ;
sring.format("l35&2 %s&&%c%c",(char *)arraymessage.getdata(),check2,check1);
4) 发送参数设置:该消息是以普通文本方式的消息下发,ftm=0,udhi=0,pid=0,如果checksum不对,则该消息以文本方式显示在手机上,否则显示为铃声。
二. siemens图片(适用于其支持的各种大小的图片)
1) 测试环境:手机型号--3118;网关--亚信
2) 制作过程:首先选择一张101x29的单色bmp图做为源文件,文件名为1.bmp。通过程序的处理源文件被拆成4条连续的消息以二进制的形式存放在文件1.pic中,发送时依次取出来发送即可。第一条和第四条消息的十六进制内容如下:
第一条:2f 2f 53 45 4f 01 6e 00 dd 05 00 00 01 00 04 00 8e 01 00 00
03 62 6d 70 05 31 2e 62 6d 70 42 4d 8e 01 00 00 00 00 00 00
3e 00 00 00 28 00 00 00 48 00 00 00 1c 00 00 00 01 00 01 00
00 00 00 00 50 01 00 00 00 00 00 00 00 00 00 00 02 00 00 00
02 00 00 00 ff ff ff 00 00 00 00 00 c0 3f 00 00 00 10 eb 00
00 00 00 00 e0 3f 00 fc 00 21 db 00 00 00 00 00 e0 3e 03 03
00 71 f3 00 00 00 00 00 e0 3e 04 00 80 0d fe 00 00 00 00 00
…….
第四条:2f 2f 53 45 4f 01 6e 00 dd 05 00 00 04 00 04 00 8e 01 00 00
03 62 6d 70 05 31 2e 62 6d 70 0e 18 00 db e0 00 00 00 0f e7
ff fc 1c 10 00 71 c0 00 00 00 07 ff be 00 3c 70 00 00 00 00
00 00 07 ef fc 00 df e0 00 00 00 00 00 00 05 ec ff 00 fb c0
00 00 00 00 00 00 02 66 df 00 bf 30 00 00 00 00 00 00
3) 算法:其图片格式如下:
<identifier><version><datasize><referenceid><actpacketnumber><numberofpackets><objectsize> <objecttype><objectname><data>
-----------------------------------------------------------------------------
identifier:标识。5字节。设为”//seo”(注意大小写)
version:版本号。1字节。设为1
datasize:数据大小。2字节。每个包里可图片数据的大小,对于同一图片的不同包的该值相同,最后一个包里实际剩余数据大小不足时,添0补足
referenceid:序列号。4字节。可自行设定,对同一图片的不同包的该值相同
actpacketnumber:当前包是第几包。2字节。从1开始计数
numberofpackets:总包数。2字节。
objectsize:图片的大小。4字节。
objecttype:类型为图片。4字节。第一字节为长度,因为类型为”bmp”所以第一字节为3,第二至第四字节为”bmp”
objectname:图片的名称,包括扩展名。长度不定。第一个字节为长度。如图片为1.bmp,则objectname的长度为6,第一个字节为5。第二至六个字节为”1.bmp”
data:图片数据。从图片文件中拆分出来的数据。
部分算法:
cstring stofile(_t(".//1.pic")), sfile(_t(".//1.bmp"));
cstdiofile ffromfile, ftofile(stofile, cfile::modecreate cfile::modereadwrite cfile::typebinary);;
char smessage[256], sread[8000];
int nfilelen=0;
//头信息
char identifier[5] = {'/','/','s','e','o'};
byte version = 1;
short datasize;
int referenzid = 1500 ,len=0;
short actnumber = 0;
short packnumber;
char objectsize[4];
char objecttype[4] = {0x3,'b','m','p'};
char objectname[20];
char data[200];
memset(smessage,0,sizeof(smessage));
memset(sread,0,sizeof(sread));
memset(objectsize,0,4);
len = sfile.getlength();
cfileexception e;
if(!ffromfile.open(sfile,cfile::moderead cfile::typebinary,&e))
exit(1);
nfilelen = ffromfile.getlength();
if(ffromfile.read(sread, nfilelen)>0)
{
memcpy(objectsize,sread+2,2);
objectname[0] = len;
memcpy(objectname+1,sfile, len);
datasize = 140 - 25 - len;
int nsize, nlast;
memcpy(&nsize, objectsize, 4);
nlast = nsize%datasize;
if(nlast)
packnumber = nsize/datasize + 1;
else
packnumber = nsize/datasize;
actnumber = 0;
//设置头信息
memcpy(smessage, identifier, 5);
memcpy(smessage+5, &version, 1);
memcpy(smessage+6, &datasize, 2);
memcpy(smessage+8, &referenzid, 4);
memcpy(smessage+14, &packnumber, 2);
memcpy(smessage+16, objectsize, 4);
memcpy(smessage+20, objecttype, 4);
memcpy(smessage+24, objectname, len +1);
for(int i=1; i<=packnumber; i++)
{
actnumber ++;
memcpy(smessage+12, &actnumber, 2);
if(!nlast i<packnumber)
{
memcpy(smessage+25+len,sread+(i-1)*datasize, datasize);
ftofile.write(smessage, 140);
}
else if(i == packnumber)
{
memcpy(smessage+25+len,sread+(i-1)*datasize, nlast);
ftofile.write(smessage, 25+len+nlast);
}
}
}
ffromfile.close();
ftofile.close();
4) 发送参数设置:ftm=0xf5,udhi=0,pid=0。
5) 其它说明:在对datasize说明时,作者提到了当最后一包中实际数据内容不足时要补”0”,这种做法已经网友实验过是可行的,但在我的算法中,我并没有补0,实际发送也成功收到,这点有兴趣的朋友可以两种都试试。另外,对于图片文件名不要取得过长,否则会占用消息的长度,拆出更多的包。
三. siemens铃声
1) 测试环境:手机型号--3118;网关--亚信
2) 制作过程:首先选一首”甜蜜蜜.mid”做为源文件。通过程序的处理源文件被拆成8条连续的消息以二进制的形式存放在文件1.rng中,发送时依次取出来发送即可。第一条和第八条消息的十六进制内容如下:
第一条:2f 2f 53 45 4f 01 69 00 e8 03 00 00 01 00 08 00 f8 02 00 00
03 6d 69 64 0a cc f0 c3 db c3 db 2e 6d 69 64 4d 54 68 64 00
00 00 06 00 01 00 02 00 78 4d 54 72 6b 00 00 00 19 00 ff 58
04 04 02 18 08 00 ff 59 02 00 00 00 ff 51 03 09 27 c0 00 ff
2f 00 4d 54 72 6b 00 00 02 41 00 ff 21 01 00 00 ff 03 0e c5
4b ae b1 b5 4c bc c4 ad b7 b6 a1 a4 af 00 90 4c 64 78 4c 00
00 4f 64 3c 4f 00 00 51 64 3c 51 00 00 4c 64 81 34 4c 00 00
…….
第八条:2f 2f 53 45 4f 01 69 00 e8 03 00 00 08 00 08 00 f8 02 00 00
03 6d 69 64 0a cc f0 c3 db c3 db 2e 6d 69 64 3c 80 4f 64 00
90 51 64 3c 80 51 64 00 90 4f 64 81 34 80 4f 64 00 ff 2f 00
3) 铃声格式如下:(同图片格式)
<identifier><version><datasize><referenceid><actpacketnumber><numberofpackets><objectsize> <objecttype><objectname><data>
------------------------------------------------------------------------------
identifier:标识。5字节。设为”//seo”(注意大小写)
version:版本号。1字节。设为1
datasize:数据大小。2字节。每个包里可mid数据的大小,对于同一mid的不同包的该值相同,最后一个包里实际剩余数据大小不足时,添0补足
referenceid:序列号。4字节。可自行设定,对同一首mid的不同包的该值相同
actpacketnumber:当前包是第几包。2字节。从1开始计数
numberofpackets:总包数。2字节。
objectsize:mid的大小。4字节。
objecttype:类型为mid。4字节。第一字节为长度,因为类型为”mid”所以第一字节为3,第二至第四字节为”mid”
objectname:mid的名称,包括扩展名。长度不定。第一个字节为长度。如歌曲为”甜蜜蜜.mid”,则objectname的长度为10,第一个字节为10。第二至十个字节为” 甜蜜蜜.mid”
data:mid数据。从mid文件中拆分出来的数据。
部分算法同图片的处理,将其中stofile(_t("甜蜜蜜.mid")), sfile(_t(".//1.rng”)); char objecttype[4] = {0x3,'m','i','d'};做相应修改即可。
4) 发送参数设置:ftm=0xf5,udhi=0,pid=0。
5) 其它说明:所使用的mid文件要是单音轨的,文件长度可长可短,但最好用工具处理到450至700字节之间,否则造成数据拆包过多,对消息的可靠传送及计费带来不便。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器