手机铃声和图片的详细设计说明 这篇文档将前些日子自己测试的过程写下来供大家参考,可能现在这些东西许多人已经不再做了,但为了那些还在为这些东西摸索的朋友提供方便我还是写出来,但因为时间和资料的原因,所涉及到的还不是很全,希望知道更多细节的朋友们能与我分享你们在这方面的经验与知识。我将尽可能详细地写出它们制作的过程,包括测试用的手机型号,使用的工具,相关的算法,SP发送参数的设置等。
一. 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的铃声格式如下:
1<header><tempo value=""><musical data=""><delimiter><checksum>
2\-----------------------------------------------------------------------------------------
3Header:L35&
4Tempo Value:由1或2或3或4加空格构成,缺省为2,如”2 “
5Musical Data:将NOK2PHONE中产生的字串去掉空格即可
6Delimiter:&&
7Checksum:对Musical Data进行的校验和,两个字节。方法为对Musical Data中的数据从前往后对每个字符进行异或运算,运算的结果假设其十六进制的表示为XY,那Checksum的第一个字节的十六进制形式为3Y,第二个字节的十六进制形式为3X。
8
9部分算法:
10BYTE a = 0, check1, check2;
11CString 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;
12
13sRead.Replace(" ","");
14arrayMessage.SetSize(sRead.GetLength() + 1);
15strcpy((char *)arrayMessage.GetData(), sRead);
16for(int i=0;i<arraymessage.getsize()-1;i++) &="" (a="" +="" 0xf);="" ^="" a="a" arraymessage.getat(i);="" check1="0x30" check2="0x30" {="" }="">>4 & 0xf) ;
17
18sRing.Format("L35&2 %s&&%c%c",(char *)arrayMessage.GetData(),check2,check1);
194) 发送参数设置:该消息是以普通文本方式的消息下发,ftm=0,udhi=0,pid=0,如果Checksum不对,则该消息以文本方式显示在手机上,否则显示为铃声。
20
21二. SIEMENS图片(适用于其支持的各种大小的图片)
221) 测试环境:手机型号--3118;网关--亚信
232) 制作过程:首先选择一张101X29的单色BMP图做为源文件,文件名为1.BMP。通过程序的处理源文件被拆成4条连续的消息以二进制的形式存放在文件1.PIC中,发送时依次取出来发送即可。第一条和第四条消息的十六进制内容如下:
24第一条:2F 2F 53 45 4F 01 6E 00 DD 05 00 00 01 00 04 00 8E 01 00 00
2503 62 6D 70 05 31 2E 62 6D 70 42 4D 8E 01 00 00 00 00 00 00
263E 00 00 00 28 00 00 00 48 00 00 00 1C 00 00 00 01 00 01 00
2700 00 00 00 50 01 00 00 00 00 00 00 00 00 00 00 02 00 00 00
2802 00 00 00 FF FF FF 00 00 00 00 00 C0 3F 00 00 00 10 EB 00
2900 00 00 00 E0 3F 00 FC 00 21 DB 00 00 00 00 00 E0 3E 03 03
3000 71 F3 00 00 00 00 00 E0 3E 04 00 80 0D FE 00 00 00 00 00
31…….
32第四条:2F 2F 53 45 4F 01 6E 00 DD 05 00 00 04 00 04 00 8E 01 00 00
3303 62 6D 70 05 31 2E 62 6D 70 0E 18 00 DB E0 00 00 00 0F E7
34FF FC 1C 10 00 71 C0 00 00 00 07 FF BE 00 3C 70 00 00 00 00
3500 00 07 EF FC 00 DF E0 00 00 00 00 00 00 05 EC FF 00 FB C0
3600 00 00 00 00 00 02 66 DF 00 BF 30 00 00 00 00 00 00
373) 算法:其图片格式如下:
38<identifier><version><datasize><referenceid><actpacketnumber><numberofpackets><objectsize> <objecttype><objectname><data>
39\-----------------------------------------------------------------------------
40Identifier:标识。5字节。设为”//SEO”(注意大小写)
41Version:版本号。1字节。设为1
42DataSize:数据大小。2字节。每个包里可图片数据的大小,对于同一图片的不同包的该值相同,最后一个包里实际剩余数据大小不足时,添0补足
43ReferenceID:序列号。4字节。可自行设定,对同一图片的不同包的该值相同
44ActPacketNumber:当前包是第几包。2字节。从1开始计数
45NumberOfPackets:总包数。2字节。
46ObjectSize:图片的大小。4字节。
47ObjectType:类型为图片。4字节。第一字节为长度,因为类型为”bmp”所以第一字节为3,第二至第四字节为”bmp”
48ObjectName:图片的名称,包括扩展名。长度不定。第一个字节为长度。如图片为1.bmp,则ObjectName的长度为6,第一个字节为5。第二至六个字节为”1.bmp”
49Data:图片数据。从图片文件中拆分出来的数据。</data></objectname></objecttype></objectsize></numberofpackets></actpacketnumber></referenceid></datasize></version></identifier></arraymessage.getsize()-1;i++)></checksum></delimiter></musical></tempo></header>