国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 手機(jī)知識 > 正文

Linux手機(jī)DIY.Shell應(yīng)用擴(kuò)展一 隨機(jī)來電鈴聲(E680系列)

2024-06-10 11:36:25
字體:
供稿:網(wǎng)友

    linux手機(jī)DIY.Shell應(yīng)用擴(kuò)展一.隨機(jī)來電鈴聲(E680系列)

    草木瓜

    2007-03-18

    一、什么是Shell

    在開始正題前,總習(xí)慣于從網(wǎng)上抄一些東東,來“豐富”下文章的內(nèi)容。
    Shell是一種具備特殊功能的程序,它是介于使用者和 UNIX/Linux 操作系統(tǒng)核
心程序(kernel)間的一個接口。換而言之,就是你平常要想操作 UNIX/Linux 的話,
就需要通過Shell來進(jìn)行。
    為什么我們說 Shell 是一種介于系統(tǒng)核心程序與使用者間的中介者呢?讀過操
作系統(tǒng)概論的讀者們都知道操作系統(tǒng)是一個系統(tǒng)資源的管理者與分配者,當(dāng)用戶有請
求時,得向系統(tǒng)提出;從操作系統(tǒng)的角度來看,它也必須防止使用者因為錯誤的操作
而造成系統(tǒng)的損害。眾所周知,對計算機(jī)系統(tǒng)下命令得通過預(yù)定義的命令或程序。
    Shell本身就是一個程序,一個已經(jīng)由別人寫好并且編譯過的程序,它從輸入設(shè)
備讀取命令,將其轉(zhuǎn)換為計算機(jī)操作系統(tǒng)可以理解的機(jī)器碼,然后執(zhí)行。
  各種操作系統(tǒng)其實都有它自己的Shell,以大家容易理解的DOS為例,它的Shell
就是command.com文件。Windows下的DOS命令dir,copy等之類都是通過其解釋執(zhí)行
的。

    Unix/Linux系統(tǒng)下Shell也有多種。常用的有Bourne Shell(sh)、C-Shell
(csh)、Korn Shell(ksh)和Bourne Again Shell(bash)。
    Bourne Shell(sh)是AT&T Bell實驗室的Steven Bourne為AT&T的Unix開發(fā)的,
它是Unix的默認(rèn)Shell,也是其它Shell的開發(fā)基礎(chǔ)。Bourne Shell在編程方面相當(dāng)
優(yōu)秀,但在處理與用戶的交互方面不如其它幾種Shell。
    C Shell(csh)是加州伯克利大學(xué)的Bill Joy為BSD Unix開發(fā)的,與sh不同,它
的語法與C語言很相似。它提供了Bourne Shell所不能處理的用戶交互特征,如命令
補(bǔ)全、命令別名、歷史命令替換等。但是,C Shell與BourneShell并不兼容。
    Korn Shell(ksh)是AT&T Bell實驗室的David Korn開發(fā)的,它集合了C Shell
和Bourne Shell的優(yōu)點,并且與Bourne Shell向下完全兼容。Korn Shell的效率很
高,其命令交互界面和編程交互界面都很好。
    Bourne Again Shell(bash)是自由軟件基金會(GNU)開發(fā)的一個Shell,它是Linux
系統(tǒng)中一個默認(rèn)的Shell。Bash不但與Bourne Shell兼容,還繼承了C Shell、Korn
Shell等眾多優(yōu)點。

<Linux手機(jī)DIY系列:http://blog.csdn.net/liwei_cmg/category/241839.aspx>

    二、隨機(jī)來電鈴音的總體思路

    隨機(jī)來電鈴這東西早就有人實現(xiàn),方法也是多種多樣的。具體這個東西的作用是
仁者見仁,智者見智。個人覺得偶爾用用感覺也不錯,重要的是挖掘Shell擴(kuò)展手機(jī)
應(yīng)用的潛力。而且Shell對大多數(shù)人來說,上手也比較容易,相關(guān)資料也十分多。夏新
E600和飛利浦968的安裝包就是通過簡單的一些Shell來實現(xiàn)。可以說,研究這些手機(jī)
最為關(guān)鍵的部分,就是Shell!

    現(xiàn)在大多數(shù)Linux智能手機(jī),鈴音配置都是以文本格式存在,可見理論上直接修改
這類文件就可以輕松實現(xiàn)對短信息和手機(jī)鈴聲進(jìn)行更改。但在實際操作過程中發(fā)現(xiàn),直
接去修改這個文件的話,E680是不能夠即時生效的,需要重新設(shè)置刷新才行。
    后經(jīng)一些嘗試發(fā)現(xiàn),先設(shè)置好鈴音的配置文件,修改實際的對應(yīng)鈴聲文件最為有效。
   
  AlertRingTone1 = /mmc/mmca1/Music/Ring/ring.mp3
  AlertRingTone2 = /mmc/mmca1/Music/Ring/ring.mp3
  AlertRingerIDs = 0
  AlertStyleIconDir = /usr/language/alertStyle/
  AlertSystemVolume = 10
  AlertTextMsg = /mmc/mmca1/Music/Ring/message.mp3
   
    [AlertTextMsg]對應(yīng)短信息鈴聲,[AlertRingTone1]對應(yīng)來電鈴聲,這個配置文
件我不去改它,動態(tài)修改的是ring.mp3,message.mp3的實際文件。修改的過程僅僅就是
mv Artist.mp3 ring.mp3這么簡單。

    下面需要解決的就是修改時機(jī)和隨即性兩個問題。我這里顯然是一個在后臺不斷循
環(huán)運行的Shell腳本,當(dāng)短信息或者來電時,系統(tǒng)會啟動alterPRoCSS這個進(jìn)程,這個腳
本自然能檢測的這個進(jìn)程相關(guān)信息,并修改相應(yīng)的鈴聲文件。至于隨機(jī)性,其實來電本
身就是隨機(jī)事件,這里只用了一個偽隨即方法,即根據(jù)來電的時間信息,進(jìn)行鈴聲文件
選擇。


    三、腳本文件全內(nèi)容

001  #!/bin/bash
002 
003 
004  #當(dāng)前路徑
005  Path_Current=/mmc/mmca1/soft/ring
006 
007  #日志文件
008  File_Log=$Path_Current/log.txt
009 
010  #來電鈴聲目錄
011  if [ ! -f $Path_Current/ring.txt ]
012  then
013  echo /mmc/mmca1/Music/Game > $Path_Current/ring.txt
014  fi
015  Path_Ring=`cat $Path_Current/ring.txt`
016 
017  #短信息鈴聲目錄
018  if [ ! -f $Path_Current/msg.txt ]
019  then
020  echo /mmc/mmca1/Music/Game > $Path_Current/msg.txt
021  fi
022  Path_Message=`cat $Path_Current/msg.txt`
023 
024  #固定來電消息文件目錄
025  if [ ! -f $Path_Current/default.txt ]
026  then
027  echo /mmc/mmca1/Music/Ring > $Path_Current/default.txt
028  IsReset=1
029  else
030  IsReset=0
031  fi
032  Path_Default=`cat $Path_Current/default.txt`
033 
034 
035  #系統(tǒng)預(yù)定義短信最長秒
036  if [ ! -f $Path_Current/maxmessage.txt ]
037  then
038  echo "15" > $Path_Current/maxmessage.txt
039  fi
040  Var_MsgMaxSec $Path_Current/maxmessage.txt`
041 
042  #指定的短消息鈴聲
043  Default_MessageFile=$Path_Default/message.mp3
044  #指定的電話鈴聲
045  Default_RingFile=$Path_Default/ring.mp3
046 
047 
048  #指令集
049  File_Busybox=/mmc/mmca1/tmp/busybox
050  #臨時處理配置的文件
051  File_Sed=$Path_Current/tmpsed.txt
052  #臨時文件大聲
053  File_TmpRingLoud=$Path_Current/tmpRingLoud.pts
054  #臨時文件輕聲
055  File_TmpRingSoft=$Path_Current/tmpRingSoft.pts
056 
057  #臨時進(jìn)程文件
058  File_TmpProcess=$Path_Current/tmpgrep.txt
059 
060 
061  #臨時可供隨機(jī)的文件列表
062  FileList_Tmp=filelist.txt
063 
064  #系統(tǒng)大聲的配置文件
065  File_RingLoud=/ezxlocal/download/appwrite/setup/RingLoud.pts
066  #系統(tǒng)輕聲的配置文件
067  File_RingSoft=/ezxlocal/download/appwrite/setup/RingSoft.pts
068 
069 
070  echo "====== Random Ring ======" >> $File_Log
071  echo `$File_Busybox date` " : Start" >> $File_Log
072 
073 
074  if [ "$IsReset" = "1" ]
075  then
076 
077  echo `$File_Busybox date` " : Create New PtsFile" >> $File_Log
078 
079  #生成新的配置文件
080  echo "#!/bin/sed -f" > $File_Sed
081  echo "/AlertRingTone1/ c//" >> $File_Sed
082  echo "AlertRingTone1 = $Default_RingFile" >> $File_Sed
083  echo "/AlertRingTone2/ c//" >> $File_Sed
084  echo "AlertRingTone2 = $Default_RingFile" >> $File_Sed
085  echo "/AlertTextMsg/ c//" >> $File_Sed
086  echo "AlertTextMsg = $Default_MessageFile" >> $File_Sed
087 
088  #echo $File_Sed " " $File_RingLoud
089  $File_Sed $File_RingLoud > $File_TmpRingLoud
090  $File_Sed $File_RingSoft > $File_TmpRingSoft
091 
092  cp -f $File_TmpRingLoud $File_RingLoud
093  cp -f $File_TmpRingSoft $File_RingSoft
094 
095  fi
096 
097  #$File_Busybox renice -20 $$
098  echo $$ > $Path_Current/proc.txt
099 
100  echo `$File_Busybox date` " : ProcessID " $$ >> $File_Log
101 
102  while
103 
104  do
105 
106   ProcID_Alert=`pidof alertprocess`
107 
108   if [ "$ProcID_Alert" = "" ]
109   then
110   
111    echo "Runing ..."
112    sleep 1s
113    
114   else
115   
116    echo `$File_Busybox date` " : AlertProcessID " $ProcID_Alert >> $File_Log
117   
118    ps -ef | grep ".mp3" | grep -v grep > $File_TmpProcess
119    
120    if grep "ring.mp3" $File_TmpProcess | grep -v grep
121    then
122     Havesession="PHONE"
123     echo `$File_Busybox date` " : Have Phone " >> $File_Log
124    fi
125    
126    if grep "message.mp3" $File_TmpProcess | grep -v grep
127    then
128     HaveSession="MESSAGE"
129     echo `$File_Busybox date` " : Have Message " >> $File_Log
130    fi   
131 
132    #循環(huán)變量
133    i=0
134       
135    while [ ! "$ProcID_Alert" = "" ]
136    do
137     ProcID_Alert=`pidof alertprocess`
138     sleep 1s
139     #echo "sleep now!"
140     
141     if [ "$HaveSession" = "MESSAGE" ]
142     then
143      if [ "$i" = "$Var_MsgMaxSecond" ]
144      then
145       kill -9 `pidof alertprocess`
146      else
147       i=$(($i+1))
148      fi
149     fi 
150     
151    done
152 
153    Value_Base=`$File_Busybox date -u '+%M%S'`
154    
155    #echo "OK"
156    
157    if [ "$HaveSession" = "PHONE" ]
158    then
159 
160     #處理隨機(jī)來鈴
161     cd $Path_Ring
162     rm $FileList_Tmp
163     find . -name '*[m,M][p,P]3' | sed  's/^.//g' > $FileList_Tmp
164     Max_Count=`$File_Busybox wc $FileList_Tmp | $File_Busybox awk '{print $1}'`
165     Value_Round=$(($Value_Base % $Max_Count + 1))
166     
167     #echo $Value_Round
168     
169     Name_NextRing=`sed -n "$Value_Round p" $Path_Ring/$FileList_Tmp`
170     rm $FileList_Tmp
171     
172     if [ -f $Default_RingFile ]
173     then
174      
175      if [ -f $Path_Current/prering.txt ]
176      then
177       #echo
178       mv "$Default_RingFile" "`cat $Path_Current/prering.txt`"
179       echo `$File_Busybox date` " : mv $Default_RingFile" "`cat $Path_Current/prering.txt`" >> $File_Log
180      else
181       rm "$Default_RingFile"
182       echo `$File_Busybox date` " : rm $Default_RingFile" >> $File_Log
183      fi
184      
185     fi
186     
187     #echo
188     mv "$Path_Ring$Name_NextRing" "$Default_RingFile"
189     echo $Path_Ring$Name_NextRing > $Path_Current/prering.txt 
190     echo `$File_Busybox date` " : mv $Path_Ring$Name_NextRing" "$Default_RingFile" >> $File_Log
191     
192    fi  
193 
194    if [ "$HaveSession" = "MESSAGE" ]
195    then
196    
197     #處理隨機(jī)短信息
198     cd $Path_Message
199     rm $FileList_Tmp
200     find . -name '*[m,M][p,P]3' | sed  's/^.//g' > $FileList_Tmp
201     Max_Count=`$File_Busybox wc $FileList_Tmp | $File_Busybox awk '{print $1}'`
202     Value_Round=$(($Value_Base % $Max_Count + 1))
203     
204     #echo $Value_Round
205     
206     Name_NextMessage=`sed -n "$Value_Round p" $Path_Message/$FileList_Tmp`
207     rm $FileList_Tmp
208 
209     
210     if [ -f $Default_MessageFile ]
211     then
212      
213      if [ -f $Path_Current/premsg.txt ]
214      then
215       #echo
216       mv "$Default_MessageFile" "`cat $Path_Current/premsg.txt`"
217       echo `$File_Busybox date` " : mv $Default_MessageFile" "`cat $Path_Current/premsg.txt`" >> $File_Log
218      else
219       rm "$Default_MessageFile"
220       echo `$File_Busybox date` " : rm $Default_MessageFile" >> $File_Log
221      fi
222     
223     fi
224      
225     #echo
226     mv "$Path_Message$Name_NextMessage" "$Default_MessageFile"
227     echo $Path_Message$Name_NextMessage > $Path_Current/premsg.txt
228     echo `$File_Busybox date` " : mv $Path_Message$Name_NextMessage" "$Default_MessageFile" >> $File_Log
229 
230     
231     #kill -9 `pidof alertprocess`
232     #cp -f $Path_Ring/$Name_NextRing
233    
234    fi
235 
236    
237    sleep 1s
238   
239   fi
240 
241 
242  done


四、腳本文件說明


    這個腳本雖然有點注釋,但乍一看還是有點亂,這里作一些補(bǔ)充。
   
    腳本主要分“變量定義和預(yù)處理”<001-100>“主循環(huán)”<101-242>兩部分。
   
    A.“變量定義和預(yù)處理”
   
    這個腳本命名隨意,但是存放路徑必須與<005>所定義的路徑相同。(注:這里也
完全可以用`pwd`來代替。)
    腳本運行后會在當(dāng)前路徑下生成如下文件:
   
    log.txt     記錄整個運行日志
   
    ring.txt    記錄來電鈴音隨機(jī)選擇的目錄,目前腳本會包含該目錄的所有子
                目錄
               
    msg.txt     記錄短信息鈴音隨即選擇的目錄,同上
   
    default.txt 記錄來電的固定文件的目錄,
   
    maxmessage.txt  記錄短信的最長響鈴時間
   
    此外還產(chǎn)生了一些tmp的臨時文件。
    
    B.“主循環(huán)”
    系統(tǒng)總會不斷執(zhí)行<106>這條語句,經(jīng)過一些嘗試,使用pidof效率是最高的,
否則后臺一旦起了Shell,系統(tǒng)整體速度會略有減慢。
    Shell進(jìn)程運行后,一旦有來電,會自動執(zhí)行<114>下面的內(nèi)容,<118>-<130>
進(jìn)行進(jìn)程信息提取,判斷是短信息還是來電。<132>-<151>是對短信的特別處理,
如超過最大響鈴時間,即終止響鈴。
    <157>-<234>是對隨即鈴聲文件的真正處理。即每次來電,將文件mv,從而保
證下次響鈴的隨機(jī)性。
    這個腳本主要用了busybox,原因是系統(tǒng)的原來的功能比較有限。
    五、后記

    本腳本涉及的命令是十分常見的:ps,sed,find,grep,date等,所要注意的是
E680是用bash,對于$(())的數(shù)值運算表達(dá)方式,其它shell并不能通用。
    對于Linux手機(jī)新手來說,現(xiàn)在只需要一些耐心去消化腳本所使用的Shell命令
和Shell規(guī)范。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 万荣县| 大同市| 彩票| 陆良县| 江城| 瑞金市| 龙岩市| 紫阳县| 红桥区| 常州市| 横峰县| 广安市| 大厂| 新晃| 岳西县| 新干县| 石嘴山市| 渭南市| 靖江市| 黑水县| 抚远县| 德格县| 潞城市| 长葛市| 聂荣县| 杨浦区| 灌阳县| 泰安市| 长泰县| 平乡县| 叶城县| 蕉岭县| 桑植县| 于都县| 葵青区| 瑞金市| 南陵县| 张家界市| 罗江县| 宜川县| 若尔盖县|