顯示具有 其他 標籤的文章。 顯示所有文章
顯示具有 其他 標籤的文章。 顯示所有文章

2010年5月17日

IBM X3650 M2 的網卡異常

轉換到新工作後,公司目前採購的主機幾乎都是IBM的,跟之前的HP或Dell不太一樣,還要慢慢瞭解IBM主機…

前幾天發生了一個狀況,主機有二片網路卡,都是內建的Broadcom NetXtreme II,其中一片網路卡會發生FTP 或遠端桌面有時會短暫無回應,但Ping都正常沒有miss,我抓取封包發現有時主機會idle,我懷疑是Layer 1或2 出了問題,嘗試換線換port都無效,更換新版的Driver後就恢復正常。
也許是這張網卡的功能太多了,有增加了許多功能IPMI,Checksum offload..等,基本的功能反而出錯了…

我處理的方式是更新新版的網路卡Driver (Broadcom NetXtreme II Driver v5.0.12 到 v5.2.14.0)
http://www-947.ibm.com/systems/support/supportsite.wss/docdisplay?lndocid=MIGR-5083635&brandind=5000008

2007年9月21日

用VB6.0編寫手機簡訊發送

用VB6.0編寫手機簡訊發送

因為手機簡訊的發送是以PDU串的形式發送出去的,中文字符以Unicode碼來表示,所以在發送中文簡訊之前必須首先將中文字符轉換為Unicode 碼,下面的函數將實現這個功能。這個函數主要應用到VB自帶的一個格式轉換函數:ChrW()將中文轉換為Unicode碼。 
PublicFunctionchg(rmsgAsString)AsString
  DimtepAsString
  DimtempAsString
  DimiAsInteger
  DimbAsInteger
  tep=rmsg
  i=Len(tep)
  b=i/4
  Ifi=b*4Then
  b=b-1
  tep=Left(tep,b*4)
  Else
  tep=Left(tep,b*4)
  EndIf
  chg=""
  Fori=1Tob
  temp="&H"&Mid(tep,(i-1)*4 1,4)
  chg=chg&ChrW(CInt(Val(temp)))
  Nexti
  EndFunction

  同上,為了發送以PDU模式發送簡訊,必須將手機號碼和對方手機號碼也轉換為PDU格式,下面的函數就是為了實現這種轉換: 

  PublicFunctiontelc(numAsString)AsString
  DimtlAsInteger
  Dimltem,rtem,ttemAsString
  DimtiAsInteger
  ttem=""
  tl=Len(num)
  Iftl<>11Andtl<>13Then
  MsgBox"wrongnumber."&tl
  ExitFunction
  EndIf
  Iftl=11Then
  tl=tl 2
  num="86"&num
  EndIf
  Forti=1TotlStep2
  ltem=Mid(num,ti,1)
  rtem=Mid(num,ti 1,1)
  Ifti=tlThenrtem="F"
  ttem=ttem&rtem<em
  Nextti
  telc=ttem
  EndFunction  

  手機號碼有兩種表示方法:11位和13位(帶國家碼86),一般手機發送時都是以13位形式表示的,所以以上的函數還有一個功能是自動將11位格式手機號碼轉換為13位形式,然後再轉換為PDU串。

  手機簡訊的發送主要借助於VB的Mscomm控件實現,關於Mscomm控件,前面的技術介紹部分有詳細介紹。簡訊的發送是由AT CMGS指令完成的,採用PDU模式發送,函數代碼如下:

  Constprex="0891"
  Constmidx="11000D91"
  Constsufx="000800"
  PublicFunctionSendsms(cscaAsString,numAsString,msgAsString)As_Boolean
  Dimpdu,psmsc,pnum,pmsgAsString
  DimlengAsString
  DimlengthAsInteger
  length=Len(msg)
  length=2*length
  leng=Hex(length)
  Iflength<16Thenleng="0"&leng
  psmsc=Trim(telc(csca))
  pnum=Trim(telc(num))
  pmsg=Trim(ascg(msg))
  pdu=prex&psmsc&midx&pnum&sufx&leng&pmsg
  sleep(1)
  mobcomm.Output="AT CMGF=0" vbCr
  mobcomm.Output="AT CMGS="&Str(15 length) vbCr
  mobcomm.Output=pdu&Chr$(26)
  sleep(1)
  Sendsms=True
  EndFunction  

  因為手機同一時間只能處理一件事情,因此這個函數只負責發送簡訊,關於簡訊發送成功與否以及閱讀簡訊的部分集中在一起處理。判斷手機簡訊發送成功與否主要由AT CMGS命令執行以後的返回碼來決定(可參見前文的AT指令介紹部分)。

  為了防止手機因過於繁忙而出錯,這裡採取了一定的方法讓手機有充分的時間處理發送和接收及刪除等操作。Sleep()函數正是為此而設計的,在發送及刪除操作後都會讓程序暫停一秒,這樣就不至於使得手機過於繁忙。

  Unicode碼解碼函數  

  相比於手機簡訊的發送而言,手機簡訊的接收主要的工作正好與之相反。手機簡訊的發送需要將待發送的簡訊內容轉換為Unicode碼,而簡訊的接收則需要將接收到的Unicode碼轉換成中文字符。下面的函數將實現解碼功能。同手機簡訊發送的編碼函數一樣,這裡也應用了一個VB內置的函數AscW()函數來將Unicode碼轉換為中文:

  PublicFunctionascg(smsgAsString)AsString
  Dimsi,sbAsInteger
  DimstmpAsInteger
  DimstempAsString
  sb=Len(smsg)
  ascg=""
  Forsi=1Tosb
  stmp=AscW(Mid(smsg,si,1))
  IfAbs(stmp)<127Then
  stemp="00"&Hex(stmp)
  Else
  stemp=Hex(stmp)
  EndIf
  ascg=ascg&stemp
  Nextsi
  ascg=Trim(ascg)
  EndFunction 

  2手機簡訊接收函數 

  相對於簡訊的發送函數而言,簡訊的接收相當簡單,只需要以下的三行代碼就完成了。但是它使用的技術卻決不比簡訊的發送少,這裡主要用到了Mscomm控件的Output屬性和AT CMGR指令。 

  PublicSubreadsms(rnumAsString)
  mobcomm.Output="AT CMGF=1" vbCr
  mobcomm.Output="AT CMGR="&rnum vbCr
  EndSub