C# 通過串口傳送簡訊

來源:互聯網
上載者:User

標籤:

手機簡訊群發作為企業日常通知,公告,天氣預報等資訊的一個發布平台,在於成本低,操作方便等諸多特點,成為企業通訊之首選。本文介紹簡訊的編碼方式,AT指令以及用C#實現串口通訊的方法。

前言目前,傳送簡訊的方式主要有三種:

1、網關方式:向當前電信部門申請,不需要另外裝置。但是費用相對來說,比較高,以目前上海移動公司推出的簡訊群發套餐來說,對於中小企業的簡訊息的發送數量來看,

簡訊群發和打電話相比,幾乎沒有什麼優勢。對於幾萬人的大公司而言,可能很便宜。對於幾百人甚至更少人的公司來說,這種方式根本不划算。

2、終端方式:藉助GSM Modem(簡訊貓)之類的裝置,通過資料線與PC機的串口相連,來群發簡訊,加之目前電信部門的拇指派地感地帶之類的套餐,基本是成本在一條簡訊大概在5分錢左右,而簡訊貓的價格根本晶片不同,價格有所不同,最便宜的二三百錢就可搞定,貴的也就一千塊左右。這種方式適合於小型企業和個人,而且這種方式不需要網路支援,只需要一台有串口的電腦即可。但這種方式的一個缺點就是如果群發人數比較多的情況下,發送資訊會比較慢,還有儘管簡訊貓廠家宣傳支援所有GSM卡,但是在市面的上150,158,159的卡相容性比較差,其中我就用過150的卡,只能發送資訊,而收不到回複資訊。這種方式需要理解串口通訊、AT指令、簡訊編碼、解碼。

3、利用網站來實現,方式很簡單。不過對網站的依賴性強,對網路的穩定性要求也高,且需要簡訊中介軟體支援,不太適合簡訊開發。

4、也是終端方式,就是一台高效能的簡訊貓支援,該簡訊貓可以同時插2張,最多插8張手機卡,進行同時的簡訊群發。目前我們手機的接收的到很多垃圾簡訊基本就是這種方式發出來的,這種支援2張手機卡的簡訊貓價格在一千塊左右,支援8張手機卡的簡訊貓價格大概在四千塊左右。而且發送速度快。但是這種方式有三個缺點:

(1)該簡訊貓在一個時間周期內發出的資訊是有限制的,比如只用一張手機卡的簡訊貓,一小時大概只能發布700條資訊;(2)這種簡訊群發,會被電信部門視為垃圾簡訊,會被屏蔽掉,比如上海,目前這種方式就不能用,在奧運期間,好像北京也會屏蔽掉這種資訊。

(3)發送資訊量越大,單條資訊價格越低。但是就是發送10萬條簡訊,平均單條資訊價格也在5分錢的樣子。 下面詳細說一下,第二種簡訊貓方式的進行簡訊群發的原理。簡訊發送的原理附後,這不是我們開發的重點。簡訊編碼   在收發簡訊方面,按時間產生先後,

共產生了三種模式:

Block Mode、基於AT指令的Text Mode、基於AT指令的PDU Modem, Text Mode比較簡單,多款諾基亞手機均支援該模式。西門子的手機大多隻支援PDU模式,PDU模式是發送或接收手機SMS資訊的一種方法,簡訊息本文經過十六進位編碼後被傳送。目前,

PDU已取代Block Mode,因我們主要探討PDU模式的發送。以西門子3508手機為例。   

SMS是由Etsi所制定的一個規範(GSM 03.40 和 GSM 03.38)。當使用7-bits編碼時,它可以發送最多160個字元;但用8 -bit編碼,最多可以發送140個字元,通常無法直接通過手機顯示;還有用16-bit編碼時,最多70個字元,被用來顯示Unicode(UCS2) 文本資訊,可以被大多數的手機所顯示。我們今天討論的是UCS2編碼,也就是說,最多隻能發送70個字元,不管英文還是中文。   

      現例如我們現在要發送如下資訊,向My Phone13715342642發送"你好,Hello!"。在沒有發送之前,你要清楚,手機SIM卡所在地的簡訊中心號,並不是你現在所在地方的簡訊中心號,像我在深圳,深圳的簡訊中心號是:8613800755000,即使我現在到外地,簡訊中心號仍是深圳。從上面我們得到了下面的資訊:   接收的手機號:13715342642   簡訊中心號:8613800755000   簡訊內容:你好,Hello!   在實際使用中,上面這些資訊並不為手機所執行,要進行編碼手機才會執行,先不管,看看編碼後的資訊: 0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021   看不懂吧,我來解釋一下:   08 - 指的是簡訊中心號的長度,也就是指(91)+( 683108705500F0)的長度   91 - 指的是簡訊息中心號碼類型。91是TON/NPI遵守International/E.164標準,指在號碼前需加‘+‘號;此外還有其它數值,但91最常用。   683108705500F0 - 簡訊息中心號碼。由於位置上略有處理,實際號碼應為:8613800731500(字母F是指長度減1)。這需要根據不同的地區作相應的修改。前面的(08)+(91)+( 683108705500F0)實際上就構成了整個簡訊的一部份,通稱短訊息中心地址(Address of the SMSC)。

 11 - 檔案頭位元組  

 00 - 資訊類型(TP-Message-Reference)

 0D - 被叫號碼長度  

 91 - 被叫號碼類型  

 其實在實際處理中,我們通常把11000D91寫死在程式中,因為在國內,這些資料都是不會改變的。   683117352446F2 -被叫號碼,經過了位移處理,實際號碼為"8613715342642"。

上面的(00)+(0D)+(91)+ ( 683117352446F2),構成了整個簡訊的第二部份目的地址(TP-Destination-Address)。  

 00 - 協議標識TP-PID,這裡一般為00  

 08 - 資料編碼方案TP-DCS(TP-Data-Coding-Scheme),採用前面說的USC2(16bit)資料編碼  

 00 - 有效期間TP-VP(TP-Valid-Period)  

 12-長度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的長度 36 / 2 = 18 的十六進 12   4F60597DFF0C00480065006C006C 006F0021- 這裡就是簡訊內容了,實際內容為:"你好,Hello!" AT指令   說到AT指令可多了,有厚厚的一本書,不屬於我們今天討論的範圍,在這裡我僅討論在傳送簡訊中必須要用的幾個AT指令。

  與SMS有關的GSM AT指令(from GSM07.05)如表1所示: AT 指令 功 能 AT+CMGC Send an SMS command(發出一條短訊息命令) AT+CMGD Delete SMS message(刪除SIM卡記憶體的短訊息) AT+CMGF Select SMS message formate(選擇短訊息資訊格式:0-PDU;1-文本) AT+CMGL List SMS message from preferred store(列出SIM卡中的短訊息PDU/text:

0/"REC UNREAD"-未讀,

1/"REC READ"-已讀,

2/"STO UNSENT"-待發,

3/"STO SENT"-已發,

4/"ALL"-全部的)

AT+CMGR Read SMS message(讀短訊息)

AT+CMGS Send SMS message(發送短訊息)

AT+CMGW Write SMS message to memory(向SIM記憶體中寫入待發的短訊息)

AT+CMSS Send SMS message from storage(從SIN|M記憶體中發送短訊息)

AT+CNMI New SMS message indications(顯示新收到的短訊息)

AT+CPMS Preferred SMS message storage(選擇短訊息記憶體)

AT+CSCA SMS service center address(短訊息中心地址)

AT+CSCB Select cell broadcast messages(選擇蜂窩廣播訊息)

AT+CSMP Set SMS text mode parameters(設定短訊息文字模式參數)

AT+CSMS Select Message Service(選擇短Message Service)

表一:相關的GSM AT指令   我現在以執行個體來說明這些指令的使用方法:   先用行動數據線將手機串連到電腦串口,並將串口的傳輸速率設定為19200,可以開始了。   

   1、首先測試你的串連及手機是否支援AT指令,請在你的串口偵錯工具中輸入:   AT<斷行符號>   螢幕上返回"OK"表明電腦與手機串連正常,那樣我們就可以進行其它的AT指令測試了  

 2、設定簡訊發送格式   AT+CMGF=1<斷行符號>   螢幕上返回"OK"表明現在簡訊的發送方式為PDU方式,如果是設定為TEXT方式,則,AT+CMGF=0<斷行符號>  

 3、 傳送簡訊   發送內容及手要號仍舊同上面在編碼中的一樣,編碼後,得到要發送的資料如下 0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C006F0021   我們用如下指令來發送   AT+CMGS=33<斷行符號>   如果返回">",就把上面編碼資料輸入,並以CTRL+Z結尾,稍等一下,你就可以看到返回OK啦。   說明一下,為什麼AT+CMGS=33呢,是這樣得來的: 11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021   這一段字串的長度除以2得到的結果,上面的字串,簡訊中心號加上簡訊內容得到的,怎麼得到的,請回顧一下解碼部份   在我們前面的討論中,一條完整的簡訊發送,只要執行三條AT指令,AT、AT+CMGS=?、AT+CMGS=?就可以了。由於篇幅,

我只能在這裡提到這麼多,大家要是想瞭解更多,可以向各手機廠商索取AT指令白皮書,裡面很詳細的。  

 上面講到的,只能為我們實際中作準備,我們還必須要一個發送途徑,根據我們的需要,我們選擇投資最少,實現比較方便的串口通訊。注意,串口通過資料線跟手機相連,用AT指令來實現傳送簡訊,在我們選擇資料線時,建議購買原廠所配,非原廠所配,在使用過程中,經常出現一些莫明其妙的問題,比如,手機螢幕黑了,手機老是提示電池電量不足之類的。  串口通訊   

在C#中要實現串口通訊,很多人都不知所措,在論壇上經常可以看到"怎麼用MSCOMM實現串口通訊"、"怎樣能過串口與裝置相連"諸如此類的問題。其實國外的網友早就把這些列入FAQ中了。   通常,在C#中實現串口通訊,

我們有四種方法:   

第一:通過MSCOMM控制項這是最簡單的,最方便的方法。可功能上很難做到控制自如,同時這個控制項在VS2003環境裡沒有,如果需要在VS2003環境開發串口通訊,需要在VB60裡把這個控制項借過來,而且還需要註冊,以後在偵錯工具的過程中,會出現再讓你註冊的情況(這方面有興趣的朋友,可以加我QQ:617586962,大家一起探討,我用這種方式開發幾個通訊後台)。VS2005之後,包括VS2008裡這個控制項已經加裡去了,使用起來很方便的。  

 第二:微軟在.NET新推出了一個串口控制項,基於.NET的P/Invoke調用方法實現,詳細的大家可以訪問微軟網站http: //msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便得到更多資料。  

 第三:就是用第三方控制項啦,可一般都要付費的,不太合實際,不作考慮  

 第四:自己用API寫串口通訊,這樣難度高點,但對於我們來說,可以方便實現自己想要的各種功能   在本文,我們採用第四種方法來實現串口通訊,不過不是自己寫,用一個國外網友現成的已經封裝好的類庫,不過功能簡單點,相對我們來說已經夠用了。   

在整個終端簡訊的操作過程中,與串口的通訊,只用到了四個功能,開啟、寫、讀、關閉串口。下面是類庫對這四個功能的定義:   

開啟串口:   

函數原型:public void Open()   

說明:開啟事先設定好的連接埠   

樣本:

    using JustinIO;

 static JustinIO.CommPort ss_port = new JustinIO.CommPort();

  ss_port.PortNum = COM1; //連接埠號碼

 ss_port.BaudRate = 19200; //串口通訊傳輸速率

  ss_port.ByteSize = 8; //資料位元

 ss_port.Parity = 0; //同位

 ss_port.StopBits = 1;//停止位

  ss_port.ReadTimeout = 1000; //讀逾時

  try {  if (ss_port.Opened)

 {   

    ss_port.Close();   

    ss_port.Open(); //開啟串口 

  }  

  else

 {  

 ss_port.Open();//開啟串口 

  }

 return     true;

  } catch(Exception e)

{

 MessageBox.Show("錯誤:" + e.Message);

 return false;

}   寫串口:  

 函數原型:

   public void Write(byte[] WriteBytes)

  WriteBytes 就是你的寫入的位元組,注意,字串要轉換成位元組數組才能進行通訊  

 樣本:

    ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI/r")); //擷取手機品牌  

 讀串口:   

  函數原型:

  public byte[] Read(int NumBytes)  

 NumBytes 讀入緩衝數,注意讀取來的是位元組數組,要實際應用中要進行字元轉換  

 樣本: string response = Encoding.ASCII.GetString(ss_port.Read(128)); //讀取128個位元組緩衝

  關閉串口:   

   函數原型:ss_port.Close()   

   樣本: ss_port.Close(); 實現上上邊說了半天,簡訊貓實際就是兩個作用:

(1)把PC的簡訊內容組包後通過簡訊貓發出去;

(2)把外邊的簡訊通過貓收上來;實際上API就是初始化裝置,讀資訊,寫資訊這幾個過程; /////////////////// 本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/hbqhdlc/archive/2008/10/02/3009889.aspx

C# 通過串口傳送簡訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.