手機短信羣發做爲企業平常通知,公告,天氣預報等信息的一個發佈平臺,在於成本低,操做方便等諸多特色,成爲企業通信之首選。本文介紹短信的編碼方式,AT指令以及用C#實現串口通信的方法。數組
前言目前,發送短信的方式主要有三種:緩存
一、網關方式:向當前電信部門申請,不須要另外設備。可是費用相對來講,比較高,以目前上海移動公司推出的短信羣髮套餐來講,對於中小企業的短信息的發送數量來看,網絡
短信羣發和打電話相比,幾乎沒有什麼優點。對於幾萬人的大公司而言,可能很便宜。對於幾百人甚至更少人的公司來講,這種方式根本不划算。函數
二、終端方式:藉助GSM Modem(短信貓)之類的設備,經過數據線與PC機的串口相連,來羣發短信,加之目前電信部門的拇指派地感地帶之類的套餐,基本是成本在一條短信大概在5分錢左右,而短信貓的價格根本芯片不一樣,價格有所不一樣,最便宜的二三百錢就可搞定,貴的也就一千塊左右。這種方式適合於小型企業和我的,並且這種方式不須要網絡支持,只須要一臺有串口的計算機便可。但這種方式的一個缺點就是若是羣發人數比較多的狀況下,發送信息會比較慢,還有儘管短信貓廠家宣傳支持全部GSM卡,可是在市面的上150,158,159的卡兼容性比較差,其中我就用過150的卡,只能發送信息,而收不到回覆信息。這種方式須要理解串口通訊、AT指令、短信編碼、解碼。性能
三、利用網站來實現,方式很簡單。不過對網站的依賴性強,對網絡的穩定性要求也高,且須要短信中間件支持,不太適合短信開發。測試
四、也是終端方式,就是一臺高性能的短信貓支持,該短信貓能夠同時插2張,最多插8張手機卡,進行同時的短信羣發。目前咱們手機的接收的到不少垃圾短信基本就是這種方式發出來的,這種支持2張手機卡的短信貓價格在一千塊左右,支持8張手機卡的短信貓價格大概在四千塊左右。並且發送速度快。可是這種方式有三個缺點:網站
(1)該短信貓在一個時間週期內發出的信息是有限制的,好比只用一張手機卡的短信貓,一小時大概只能發佈700條信息;(2)這種短信羣發,會被電信部門視爲垃圾短信,會被屏蔽掉,好比上海,目前這種方式就不能用,在奧運期間,好像北京也會屏蔽掉這種信息。編碼
(3)發送信息量越大,單條信息價格越低。可是就是發送10萬條短信,平均單條信息價格也在5分錢的樣子。 下面詳細說一下,第二種短信貓方式的進行短信羣發的原理。短信發送的原理附後,這不是咱們開發的重點。短信編碼 在收發短信方面,按時間產生前後,.net
共產生了三種模式:調試
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個字符,無論英文仍是中文。
現例如咱們如今要發送以下信息,向個人手機13715342642發送"你好,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(選擇短消息服務)
表一:相關的GSM AT指令 我如今以實例來講明這些指令的使用方法: 先用手機數據線將手機鏈接到電腦串口,並將串口的波特率設置爲19200,能夠開始了。
一、首先測試你的鏈接及手機是否支持AT指令,請在你的串口調試程序中輸入: AT<回車> 屏幕上返回"OK"代表計算機與手機鏈接正常,那樣咱們就能夠進行其它的AT指令測試了
二、設置短信發送格式 AT+CMGF=1<回車> 屏幕上返回"OK"代表如今短信的發送方式爲PDU方式,若是是設置爲TEXT方式,則,AT+CMGF=0<回車>
三、 發送短信 發送內容及手要號仍舊同上面在編碼中的同樣,編碼後,獲得要發送的數據以下 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