手機鈴聲和圖片的詳細設計說明

手機鈴聲和圖片的詳細設計說明

發佈時間:20040524  點擊數:1579  作者:syy007   轉載出處:天堂鳥 錄入:web

<script language=javascript src="../Include/ubb.js" type=text/javascript></script> <script language=javascript type=text/javascript> document.write(ubbcode("手機鈴聲和圖片的詳細設計說明

這篇文檔將前些日子自己測試的過程寫下來供大家參考,可能現在這些東西許多人已經不再做了,但爲了那些還在爲這些東西摸索的朋友提供方便我還是寫出來,但因爲時間和資料的原因,所涉及到的還不是很全,希望知道更多細節的朋友們能與我分享你們在這方面的經驗與知識。我將儘可能詳細地寫出它們製作的過程,包括測試用的手機型號,使用的工具,相關的算法,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的鈴聲格式如下:
<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字節之間,否則造成數據拆包過多,對消息的可靠傳送及計費帶來不便。

")); </script> 手機鈴聲和圖片的詳細設計說明

這篇文檔將前些日子自己測試的過程寫下來供大家參考,可能現在這些東西許多人已經不再做了,但爲了那些還在爲這些東西摸索的朋友提供方便我還是寫出來,但因爲時間和資料的原因,所涉及到的還不是很全,希望知道更多細節的朋友們能與我分享你們在這方面的經驗與知識。我將儘可能詳細地寫出它們製作的過程,包括測試用的手機型號,使用的工具,相關的算法,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的鈴聲格式如下:
<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字節之間,否則造成數據拆包過多,對消息的可靠傳送及計費帶來不便。
發佈了8 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章