物聯網資料卡系統原始碼——通訊模組整體概述

小y發表於2017-03-24

在這個萬物互聯的時代,物聯網應用以及深入到我們生活的方方面面,大到智慧城市、智慧交通,小到行車記錄儀,各種穿戴裝置,智慧家居,都有物聯網應用的身影,讓我們感受到生活品質和檔次的提升。

那麼作為程式設計師的我們,物聯網通訊到底如何做呢? 

本系列文章即將帶您一起走進物聯網系統開發的世界。也希望同行一起分享和討論物聯網相關知識和開發經驗。

首先看一下物聯網系統的整體架構,看上一篇文章:物聯網資料卡系統原始碼——整體架構

本篇將講解物聯網系統中的通訊模組實現原理及相關內容

物聯網資料卡系統原始碼——通訊模組

 

1.通訊模組的功能

系統傳送指令資訊到物聯網路卡,物聯網路卡接收到指令後做相應邏輯處理,並返回資訊給系統。

2.通訊模組實現的原理

一般是通過運營商(移動、聯通、電信)提供的簡訊閘道器通訊協議,來給物聯網資料卡傳送資訊。

三大運營商使用的協議不同,分別是:中國移動CMPP協議、聯通SGIP協議、電信SMGP協議。

具體的協議介紹這裡就不展開了,參考閱讀:協議介紹

 

3.使用中國移動CMPP協議實現物聯網通訊模組

物聯網路卡選任何一家運營商合作都沒有關係(但個人經驗,移動的訊號是最好的。^_^根據自己情況選擇)

移動使用的是CMPP協議,此協議2001年出了CMPP2.0版,之後持續升級過CMPP2.1,到2002年出了CMPP3.0版之後就未升級過,一直很穩定,能滿足各種應用需求。CMPP3.0擴充套件手機號為32位,增加了號碼型別和linkid等欄位,做物聯網路卡當然選擇支援擴充套件更多且最穩定的CMPP3.0版本。

下面介紹一款程式,此程式為中國移動CMPP協議程式介面,適合在中國移動申請了簡訊傳送埠的公司使用。

本程式功能包括:

1、支援Cmpp2.0、3.0協議;

2、支援一般的簡訊傳送、上行簡訊接收、狀態報告;

3、支援長簡訊,包括下發長簡訊、上行接收長簡訊;

4、支援Ms Sql資料庫、MySql資料庫;

5、支援普通手機號和物聯網路卡;

6、整合了郵件群發功能;

7、支援擴充套件號;比如你的傳送號碼是1008622,可以擴充套件成100862201、100862202等

程式適用於Cmpp3.0、Cmpp2.0協議,可用.Net任何版本編譯。簡訊Win服務程式+MsSql/MySql資料庫原始碼,直接配置好win服務並啟動,自己只需往資料庫裡面寫入資料就可以傳送簡訊,接收的簡訊儲存在另一張表中,讀取即可收到上行簡訊。

4.設計原則

軟體設計的基本原則是“高內聚,低耦合”,本模組遵循此原則。

此類涉及通訊的應用中,簡訊通訊部分本身是可以不帶任何業務邏輯的,即只負責簡訊收發這一單一功能,所以可以設計成獨立模組與其他業務處理模組分開,實現鬆耦合,獨立分散式部署。

簡訊通訊模組從資料庫讀取待傳送簡訊資料,然後放入快取佇列進行多執行緒傳送,這樣其他模組只需要往資料庫插入資料,就可以傳送簡訊,從而實現了跨語言和跨平臺。不管業務系統使用JAVA、PHP、C#、Python或者其他語言,也不管業務系統是在Windows還是在Linux系統部署,只要可以遠端訪問資料庫,就可以使用簡訊通訊模組的簡訊收發功能。

通訊模組每天的傳送量比較大,每時每刻都在持續執行,這就必須能實現獨立部署,提高效能,同時也不影響其他業務功能的效能。

5.程式實現

程式設計成一個Windows服務的形式,可以安全的駐存在系統中穩定執行,防止人為因數關閉程式。同時設計成支援Sql Server和MySql兩種資料庫,且可以通過修改配置項來實時切換。

根據功能不同又可以細分成專門負責實現CMPP協議格式,與移動閘道器通訊的模組,和專門讀取資料庫資料,處理髮送任務的Windows服務模組。

 

上圖程式碼為簡訊win服務程式碼截圖,相關程式碼模組解釋:

 

Xiaoy.SMS專案:為簡訊元件原始碼,負責實現CMPP協議並與簡訊閘道器通訊.
SMSWinService專案: 簡訊服務原始碼,負責讀取資料庫待發簡訊併傳送以及上行簡訊的接收,當然還包括windows服務的安裝等功能.
SMSTest專案:簡訊測試程式原始碼,Windows桌面程式,用於簡訊除錯.

 

下載

上圖為簡訊除錯小程式截圖。簡訊程式開發好之後,聯調是一個繁瑣的工作,因為協議引數就有幾十個,任何一個引數填寫錯誤都有可能導致簡訊傳送不成功,這就需要有一款除錯工具來幫忙了,有時候不是你的程式編碼有問題,而是移動運營商那邊沒幫你配置好,或者你填的引數輸入錯誤,造成了傳送失敗。遇到這種情況,可以通過傳送後返回的狀態(見上圖中紅色日誌)來判斷是哪裡的問題。

簡訊傳送流程如下:

第一步:程式傳送Submit包到閘道器,閘道器會返回SubmitResp包,根據包中的Result的值來判斷是否傳送成功。

result=0代表傳送成功,其他代表失敗,失敗的原因可以查詢返回碼的意義:返回碼說明

這時候只是傳送到了閘道器,至於閘道器是否成功傳送到使用者手機或物聯網路卡,尚不知道。比如使用者手機關機,或物聯網路卡未插入裝置中則收不到簡訊。

第二步:當簡訊閘道器成功傳送簡訊到使用者手機卡或物聯網路卡上時,會返回狀態報告給SP端(即本程式)。

如果狀態報告中的結果是DELIVRD,則證明資訊已經成功傳送到物聯網路卡,併成功接收到。

也就是說,當第一步result=0的時候,基本SP的傳送任務完成了,如果收不到也是卡的問題(欠費、關機、未插卡等)。

第二步是更精確的知道卡是否收到資訊,但有可能一兩天才會返回。要接收狀態報告,需要在提交Submit包的時候把“RegisteredDelivery”欄位設為1。

上圖為簡訊閘道器模擬器工具截圖。在本地測試需要用到簡訊閘道器模擬器。

由於篇幅有限,本文從整體講解一個大概,未完待續。

 

 

本系列文章將繼續開新篇講解CMPP協議模組的實現,和SMSWindows服務模組的實現,歡迎持續關注。小y的QQ 271963990

 

提綱

1 物聯網資料卡系統原始碼——前篇

1.1 物聯網技術架構圖

1.2 物聯網的主要應用領域

1.3 物聯網感測器61個應用領域

1.4 物聯網常見通訊協議梳理

2 物聯網資料卡系統原始碼——通訊模組

2.1 通訊模組整體概述

2.2 協議封裝和實現

2.3 長簡訊

2.4 粘包的處理

2.5 物聯網通訊與普通簡訊通訊的區別和要注意的地方

3 物聯網資料卡系統原始碼——Windows服務模組

3.1 Windows服務模組概述

3.2 Windows服務模組實現

3.3 高併發回撥處理

3.4 部署安裝

相關文章