1. 程式人生 > >開發板+GSM模組彩信傳送實現

開發板+GSM模組彩信傳送實現

一、文件簡介:

本文件用於介紹1B開發板+GSM模組傳送彩信的實現過程,以及彩信MMS協議封裝過程。

開發環境引數:

作業系統:Ubuntu 11.04

本機平臺:X86

目標平臺:Loongson 1B 開發板+華為GSM模組MG323

交叉編譯工具鏈:gcc-3.4.6-2f1B交叉編譯工具鏈)

所需軟體及工具包:

1b-linux-3.0核心git版本號:115a0a040ffdaaba5f3afa58cb08625020d3fde8

PPP工具原始碼包:ppp-2.4.5.tar.gz

二、實現過程

1.實現步驟:

A. 開發板上PPP連線GPRS上網

B. 與移動閘道器建立TCP-Socket連線

C. 封裝MMS-PDU資料包

D. 封裝HTTP-POST資料包

E. 傳送HTTP報文至移動閘道器

F. 接收網關回覆信息

2.開發板上PPP連線GPRS上網

首先配置kernel使它支援如下PPP選項:

Make menuconfig--->Device Drivers--->Network device support--->

PPP(point-to-point) support
PPP multilink support(EXPERIMENTAL)
PPP support for async serial prots
PPP support for sync tty ports
PPP Deflate compression
PPP BSD-Compress compression

接下來編譯交叉編譯ppp-2.4.5

編譯完成後將./pppd/pppd, ,/chat/chat, ./pppdump/pppdump, ./pppstats/pppstats四個檔案拷貝到1B開發板檔案系統的/usr/sbin目錄下,並將他們的檔案屬性改為755

檢查/etc/host.conf指令碼,確保這一行:order hosts,bind

1B開發板檔案系統/etc/ppp目錄下建立如下四個PPP配置檔案:

File1/etc/ppp/peers/gprs

#/etc/ppp/peers/gprs

# Usage:   root>pppd call gprs

/dev/ttyS0   #改成自己的GSM模組裝置號

115200    #改成自己串列埠波特率

nocrtscts 

#可能你的串列埠是需要crtscts,硬體流控的,這是由你的串列埠決定的,一般嵌入式系統的串列埠沒有帶硬體流控,也不需要就加nocrtscts

modem   #這個引數使得pppd程序將等待模組發回的CD (Carrier Detect)訊號,與local真好相反

#noauth

debug  #把除錯資訊輸出到/var/log/messages,在除錯成功後去掉它,以減少垃圾的產生。

nodetach 

#hide-password

usepeerdns  #以下的3個引數一般不可少

noipdefault

defaultroute 

user "cmnet"  #設定接入的使用者名稱,在chap-secrets或者pap-secets中使用

0.0.0.0:0.0.0.0  #本地和遠端的ip都設為0使得接入的isp分配本地的ip地址

ipcp-accept-local  #要求peer也就是isp給自己非配動態的IP地址

#ipcp-accept-remote

#lcp-echo-failure  12

#lcp-echo-interval 3

noccp  #不需要壓縮控制協議,有可能對端不需要,根據自己的isp的情況

#novj

#novjccomp

persist  #保證在連線斷開的情況下不退出,並嘗試重新開啟連線

connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat' 

#pppd呼叫chat會話程序接入對端isp,啟動對端的pppd,然後本地pppd與對端的pppd一起進行協

#商網路引數和chap/pap認證,成功後,再進行ncp層的ip的分配。

File2/etc/ppp/gprs-connect-chat

#/etc/ppp/gprs-connect-chat

#chat script for China Mobile, used wavecom module by lee.

TIMEOUT 15

ABORT '\nDELAYED\r'

ABORT '\nBUSY\r'

ABORT '\nERROR\r'

ABORT '\nNO DIALTONE\r'

ABORT '\nNO CARRIER\r'

'' \rAT

OK ATS0=0

OK ATE0V1

OK AT+CGDCONT=1,"IP","CMWAP"

OK ATDT*99***1#

CONNECT ''

File3/etc/ppp/chap-secrets

#cat /etc/ppp/chap-secrets

#client server secret IP address

"cmnet" * "cmnet" *

File4/etc/ppp/pap-secrets

#cat /etc/ppp/pap-secrets

# Secrets for authentication using PAP# client server secret IP addresses

######## redhat-config-network will overwrite this part!!! (begin) ##########

######## redhat-config-network will overwrite this part!!! (end) ############

"cmnet" * "cmnet" *

完成以上配置,然後在板上執行以下指令就能實現PPP連線GPRS了:

[[email protected]:/]#pppd call gprs &

[[email protected]:/]#ifconfig

ppp0      Link encap:Point-to-Point Protocol  

          inet addr:10.55.53.150  P-t-P:192.200.1.21  Mask:255.255.255.255

          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1

          RX packets:4 errors:0 dropped:0 overruns:0 frame:0

          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:3 

          RX bytes:58 (58.0 B)  TX bytes:98 (98.0 B)

[[email protected]:/]#ping 10.0.0.172

PING 10.0.0.172 (10.0.0.172): 56 data bytes

64 bytes from 10.0.0.172: seq=0 ttl=252 time=556.702 ms

64 bytes from 10.0.0.172: seq=1 ttl=252 time=293.645 ms

64 bytes from 10.0.0.172: seq=2 ttl=252 time=492.732 ms

64 bytes from 10.0.0.172: seq=3 ttl=252 time=290.228 ms

^C

--- 10.0.0.172 ping statistics ---

4 packets transmitted, 4 packets received, 0% packet loss

round-trip min/avg/max = 290.228/408.326/556.702 ms

看到以上列印資訊,就說明成功使用PPP撥通GSM模組的GPRS連線上網路。

3.MMS封裝及傳送過程

彩信和其它WAP應用的架構差不多,都要經過WAP Gateway中轉,彩信在中國移動以及中國聯通的GPRS接入點均一樣,都是10.0.0.17280埠或者9201。要注意的是彩信並非直接投遞給接收方,而是像郵件一樣,先發送給一箇中間伺服器MMS Proxy-RelayMMS Proxy-Relay暫時儲存彩信,然後通過push協議給彩信接收方傳送一個通知,彩信接收方收到通知後從MMS Proxy-Relay上獲取彩信內容。MMS ClientWAP Gateway之間用WAP傳輸協議傳輸,而WAP GatewayMMS Proxy-Relay之間走傳統的TCP/IP協議

要實現傳送彩信,作為客戶端,我們需要完成的主要是與10.0.0.172建立TCP連線,將彩信資料包傳送至WAP Gateway即可,其他部分工作由WAP Gateway與MMS Proxy-Relay自行完成。

將彩信資料包傳送至WAP Gateway有兩種實現方式,由於MMS是基於WAP協議的,移動的WAP代理伺服器80/8080埠支援WAP2.0,可以採用HTTP方式傳輸資料;也可以通過WSP/WTP/WDP這一套傳輸協議傳輸資料,WAP代理伺服器9201埠支援WSP/WTP/WDP協議。在這裡我們選擇的是HTTP方式。

以下是採用HTTP方式傳輸資料的資料包結構:

1

HTTP-HEADER

HTTP-DATA

2

MMS-HEADER

Message Body

接下來從MMS-PDU封裝實現開始,主要參考MMS的編碼協議文件《WAP-209-MMSEncapsulation-20010601-a.pdf》。

首先需要了解一下MMS PDU的結構,MMS PDUProtocol Data Unit,協議資料單元)由MMS頭和MMS訊息體組成,MMS頭由多個域名和域值組成,由客戶端指定,MMS頭裡面的一些域可以被MMS Proxy-Replay修改或補充,MMS Proxy-Replay使用這些頭域資訊生成MM通知以及構造接收MM PDU中的相關頭域,連同訊息實體一同送往接收方。訊息體跟在MMS頭之後,大多數MMS PDU只含有MMS頭,它們起到建立和維持通訊的作用,只有在M-Send.reqM-Retrieve.conf PDU中才有訊息體。MMS PDUHTTP PDU極為類似,但要簡單一些。一個MMS PDU對應一種訊息格式。不同型別的MMS PDU有不同的MMS Header MMS Header根據由一系列的域組成,這些域定義了PDU的各種屬性,包括PDU型別,版本號,接受方,傳送方,主題,傳送時間等。MMS Header中的域分為可選項和必選項,根據PDU的型別不同而不同。

常見的PDU的型別有:

傳送請求:     M-send.req

傳送確認:     M-send.conf

彩信通知:     M-notification.ind

通知迴應:     M-notifyresp.ind

獲取彩信迴應: M-retrieve.conf

接收確認:     M-acknowledge.ind

彩信回執:     M-delivery.ind

而要實現傳送彩信功能,我們需要完成一個M-send.req Message的封裝。M-send.req Message由兩部分組成,MMS Header後面接的是Message Body。根據MMS Message Body組裝的是否有序(是否有位置控制資訊,有顯示先後順序),M-send.req Message的組裝方式分為:

application/vnd.wap.multipart.mixed方式,所有的訊息內容混合在一起,沒有時間上的順序,內容怎麼顯示由客戶端的顯示控制策略來決定。
application/vnd.wap.multipart.related方式,各訊息內容之間有一定關係,該關係可能是顯示的時間上的先後,顯示的位置等。這樣在終端顯示該訊息的時候,就可以以幻燈片的方式顯示一系列訊息。

我們僅需要簡單實現文字以及圖片的傳送,所以選擇application/vnd.wap.multipart.mixed組裝方式。

根據協議文件,M-send.req Message Header由以下內容組成:

Name

Content

Comments

Value

X-Mms-Message-Type

Message-type-value=m-send-req

Mandatory

0x0C

X-Mms-Transaction-ID

Transaction-id-value

Mandatory

0x18

X-Mms-MMS-Version

MMS-version-value

Mandatory

0x0D

Date

Date-value

Optional

0x05

From  

From-value

Mandatory

0x09

To

To-value

Optional

0x17

Cc

Cc-value

Optional

0x02

Bcc

Bcc-value

Optional

0x01

Subject

Subject-value 

Optional

0x16

X-Mms-Message-Class

Message-class-value

Optional

0x0A

X-Mms-Expiry

Expiry-value

Optional

0x08

X-Mms-Delivery-Time

Delivery-time-value

Optional

0x07

X-Mms-Priority

Priority-value

Optional

0x0F

X-Mms-Sender-Visibility

Sender-visibility-value

Optional

0x14

X-Mms-Delivery-Report

Delivery-report-value

Optional

0x06

X-Mms-Read-Reply

Read-reply-value

Optional

0x10

Content-Type

Content-type-value

Mandatory

0x04

在MMS-HEADERX-Mms-Message-Type ,X-Mms-Transaction-IDX-Mms-MMS-Version必須位於MMS-HEADER的開始,並且按照前面所列的順序。Content-Type必須在MMS-HEADER域的最後,其後為訊息體,其它域的順序可以隨意安排。而為了使傳輸的資料更緊湊,MMS協議規定,對於Header Field Name的編碼,數值的最高位(即bit7)置1。因此,上述編碼值在實際的MMS PDU中需要加上0x80。 

下面主要以一段MMS PDU資料為例進行分析各個域值:

8c  80  98  30  00  8d  90  89  01  81  97  2b  38  36  31  35  38  31  34  35  34  32  39  37  35  2f  54  59  50  45  3d  50  4c  4d  4e  00  96  74  65  73  74  00  84  a3  02  1c  0c  0a  83  85  31  2e  74  78  74  00  81  ea  c0  22  3c  31  2e  74  78  74  3e  00  8e  31  2e  74  78  74  00  4d  4d  53  20  42  79  20  45  74  68  61  6e  12  df  22  9d  c0  22  3c  31  2e  67  69  66  3e  00  8e  31  2e  67  69  66  00  ff  d8 ... ff  d9

8C:X-Mms-Message-Type
80:M-send.req

98X-Mms-Transaction-ID

30  00:MMS Transaction ID為48
8D:X-Mms-Version
90:MMS Version為1.0

89From 傳送方

01:後接一個位元組資料 
81:傳送方號碼佔位符

97To 接收方

2b  38  36  31  35  38  31  34  35  34  32  39  37  35  2f  54  59  50  45  3d  50  4c  4d  4e  00:接收方資料“+86***********/TYPE=PLMN ”

84Content-Type

a3表示:application/vnd.wap.multipart.mixed組裝方式 

02:表示後接兩部分內容資料

接下來講述一下內容資料部分的結構:

每一部分的內容資料均由兩部分組成,分別是Header+Data

首先包含一個HeaderLen,用來指示ContentType域和Header域的總長度,是一個Uintvar變數

接下來時DataLen,用來指示後面Data域的長度,在這裡指的是一塊多媒體資料的位元組數

然後是ContentType域用來表示後面的資料塊是什麼型別的資料(如txt文字,jpeg圖片,還是vidoe資料流)

再後邊是Content LocationContent ID,通常是多媒體資料的檔名,Content Location域以單引號"開始,後面一對<>裡面包含檔名,Content ID域則直接就是一對<>裡面包含檔名

最後接Data域,它的長度由DataLen指定

1c  0c  0a  83  85  31  2e  74  78  74  00  81  ea  c0  22  3c  31  2e  74  78  74  3e  00  8e  31  2e  74  78  74  00  4d  4d  53  20  42  79  20  45  74  68  61  6e  :第一段內容的Header+Data

1cHeader的長度為28位元組

0cData的長度為12位元組

0a:指明後邊資料為txt文字型別

85 ~00:這段資料的指明檔名為1.txt

4d~6e:文字資料

12  df  22  9d  c0  22  3c  31  2e  67  69  66  3e  00  8e  31  2e  67  69  66  00  ff  d8 ... ff  d9  第二段內容的Header+Data

12Header的長度為18位元組

df 22Data的長度為1219位元組

HeaderLenDataLen均是採用Uintvar變數,特點是對超過7bit的數值進行拆分,低7位存放資料,高位補1表示有後續,最大32bit。 

9d:指明後邊資料為gif格式,但是在測試過程中,發現jpg格式也可以傳送成功並顯示。

22 ~00:這段資料的指明檔名為1.gif

ff~d9:圖片資料,這是一張jpg圖片

至此,便完成了整個MMS PDU的組裝,在組裝的過程中,需計算好整個MMS PDU的長度。

接下來是對MMS PDU進行HTTP封裝,主要方法是為MMS PDU增加一個HTTP HEADER,以下是HTTP HEADER相關程式碼:

if(mms_main.net_choose == UNIWAP)

    {

        //聯通彩信接入點

        sprintf(http_request,, "POST http://mmsc.myuni.com.cn/ HTTP/1.1\r\n"

                "Host:10.0.0.172:80\r\nUser-Agent: Ethan\r\n"

                "Content-Type: application/vnd.wap.multipart.related\r\n"

                "Accept: application/vnd.wap.multipart.related\r\n"

                "Content-Length: %d\r\n\r\n", mms_pdu_len);

    }

    else if(mms_main.net_choose == CMWAP)

    {

        //移動彩信接入點

        sprintf(http_request, "POST http://mmsc.monternet.com/ HTTP/1.1\r\n"

                "Host:10.0.0.172:80\r\nUser-Agent: Ethan\r\n"

                "Content-Type: application/vnd.wap.multipart.related\r\n"

                "Accept: application/vnd.wap.multipart.related\r\n"

                "Content-Length: %d\r\n\r\n", mms_pdu_len);

}

其中mms_pdu_len為之前MMS PDU的長度,若Content-Length錯誤,則網關回復HTTP 400錯誤(Content-Length<mms_pdu_len)或者HTTP 500錯誤(Content-Length>mms_pdu_len)

然後將MMS PDU整個資料包置於HTTP HEADER之後,再發送出去即可。

傳送成功,網關回復:

HTTP/1.1 200 OK

Content-Type: application/vnd.wap.mms-message

Content-Length: 32

Date: Thu, 07 Jun 2012 07:00:56 GMT

Server: MMSC

x-mmsc-code: -128

x-mmsc-from: 86***********

x-mmsc-tid: 0

x-mmsc-to: +86***********

相關推薦

開發+GSM模組傳送實現

一、文件簡介: 本文件用於介紹1B開發板+GSM模組傳送彩信的實現過程,以及彩信MMS協議封裝過程。 開發環境引數: 作業系統:Ubuntu 11.04 本機平臺:X86 目標平臺:Loongson 1B 開發板+華為GSM模組MG323 交叉編譯工具鏈:gcc-3.4.

Arduino與Air800開發使用UART通:傳輸DHT22傳感器數據

mic sta sam ext table per emp out 標識符 硬件介紹 Arduino Leonardo在數字引腳0(RX)和1(TX)進行串口通信時是使用“Serial1”,USB的串口通信使用的是“Serial&rdq

【嵌入式Linux】ARM開發通過NFS掛載Linux主機實現檔案共享

一般在Linux主機上arm-linux-gcc編譯程式,然後將該生成的可執行檔案傳送給ARM開發板,ARM開發板再執行該檔案。 (主機Linux系統)--->(ARM開發板Linux系統)  傳送檔案的過程可以採用NFS,FTP等多種方法 採用NFS實現遠端掛載,ARM

OK6410開發學習之一步一步實現精簡BootLoader(BL1部分)

眾所周知,ok6410開發板是一塊基於s3c6410晶片的開發板,板載資源豐富。s3c6410是三星電子生產的基於arm11核心的晶片。本文旨在總結一下bootloader操作步驟,用於以後複習、查詢。通過分析bootloader行業老大哥uboot程式碼,總結出要實現OK6410開發板的啟動引

TQ2440開發學習紀實(10)--- 實現多工處理,最簡單OS模型

Keywords: Mutitasking,Context Switch,Thread 0 多工(多執行緒,多程序)基本概念 0.1 CPU與多工 對於“多工(Multitasking)”,不同的應用領域有不同術語。在作業系統領域,一般稱為“多工”

高通android 7.0傳送流程

ComposeMessageActivity.java sendMessage WorkingMessage send private void prepareForSave(boolean notify) {         // Make sure our

基於MT7688模組開發筆記10——通過TFTP實現Ubuntu與開發之間的檔案傳輸

本篇文章是上一篇文章的繼續,在這篇文章裡我通過在Ubuntu上搭建TFTP伺服器,實現了在MT7688開發板上上傳和下載Ubuntu中的檔案,這為後面的程式開發提供了方便。 一、安裝TFTP伺服器:安裝tftp-hpa和tftpd-hpa軟體 1.1安裝第一個軟體 [ema

開發模式之自己定義菜單實現

ces event pre api pid 開發人員 web weixin src 編輯模式和開發模式是有沖突的。所以我們啟用微信公眾號的開發模式之後。那些菜單是看不到的哦。只是如今個人訂閱號是不能夠使用高級開發人員模式的。如自己定義菜單,只是我們還是能夠通過測試號

小程序開發05-日歷組件的實現

.html 沒有 UNC true prope time lse strac html 接上文:微信小程序開發04-打造自己的UI庫 github地址:https://github.com/yexiaochai/wxdemo 我們這裏繼續實現我們的日歷組件,這個日歷組件

開發自動拉群微雲控系統,可實現全自動一鍵拉群

tco key return cati 劃線 除了 com off shm 微信自動拉群雲控系統源碼,全自動一鍵拉群。自動統計新加的好友,自動將所有新加好友一鍵拉群。服務器端下發群二維碼,手機端一鍵拉群。全自動大批量,同時拉群。 在系統的開發實現過程中,除了服務器端推送指

迅為iTOP-4418/6818開發-驅動-實現GPIO擴展

更改 數組 ebo img 便是 查詢 6818開發板 必須 http 實現 GPIO 擴展,先弄清楚“復用”的概念,將調用這些 GPIO 的驅動去掉配置,重新編譯,加到自己的驅動中,就可以實現擴展的 GPIO 的輸入和輸出。另外必須要先看文檔“迅為iTOP-4418開發板

26、【支付模組開發】——支付寶回撥函式實現和查詢使用者訂單狀態介面編寫

####1、支付寶回撥函式實現 我們在除錯支付寶沙箱環境的時候,支護寶會有一個回撥函式,也就是在支付成功之後,可以呼叫我們支付之後需要執行的相關方法,從而達到資料庫的資料和我們的操作相統一。 首先我們先在本地將回調函式編寫好~ 在OrderController類中新建我們的支付寶回撥函式

iTOP-6818開發-Android4.4系統下RFID射頻模組測試例程

平臺:迅為iTOP-6818開發板 系統:Android4.4版本 例程:RFID射頻模組測試例程 rc522 驅動在 Android 系統的核心是預設整合的,使用者可以在開發板上使用命令“ls /dev |grep rc522”來檢測。如果出現了“rc522”的結果,如下圖

聯盛德WIFI模組 山景語音Codec 智慧音箱開發、智慧語音玩具開發 上手教程(一)

新板子除錯步驟 接線如圖: 連線JLINK,開啟板子, 開啟keil工程:e:\work\智慧硬體\軟硬體\聯盛德-wifi模組\音訊AP8048c\MVs18_01_07\Examples\SpiFlash\SpiFlashExample.uvproj 之後點

虛擬機器主機linux(unbuntu)和開發使用串列埠連線以及傳送接收檔案

一、串列埠使用背景 基本上檔案都是用tftp、nfs協議上傳和接收,不過這個需要使用到網路,相當於佔用網線口,不過相對而言,檔案上傳速度較快,對於檔案小的檔案(<1M大小),建議使用minicom工具;對於大檔案,推薦使用tftp或者nfs工具。 二、minicom工具 1、linux

FPGA-07-50秒倒計時的實現(特權XILINX spartan-6開發

工具 ISE14.7 通過時間分頻在4位7段數碼管中顯示2個數字,給人眼一個錯覺是同時顯示出兩個數字。 實驗原理是輪流向各位數碼管送出字形碼和相應的位選訊號,利用數碼管閃爍的餘暉和人眼視覺的暫留作用,使人感覺像各位管同時在顯示 就像微控制器數碼管的思想一樣:這裡也要做相同的事情。 微

Python 通過微控制實現app定位傳送到個人伺服器,再轉發微伺服器接收位置資訊。

考慮到女友的安全問題,就做了一個app實現定位和伺服器實現轉發的東西。剛學python,竟沒想到用物件程式設計會更加方便,全程過程式開發,程式碼有點臃腫,就當學習下python吧.效果就是:在微信公眾號中輸入指定字元比如:”我要知道你的位置”,手機那端的位置就彈出來了.主要是講一下思路:先是

基於Arduino開發使用HC-12遠端無線通訊模組

在本篇文章中,我們將學習如何使用HC-12無線序列通訊模組,該模組能夠在多個Arduino開發板之間進行遠端無線通訊,距離可達1.8km。其中,我列舉了兩個基本的例子,來解釋瞭如何連線HC-12模組並在兩個Arduinos之間進行基本通訊,另外一個例子是通過使用第一個Arduino開發板

Arduino開發使用DS3231實時時鐘模組的方法

在本篇文章中,我們將學習如何基於Arduino開發板使用DS3231實時時鐘模組。這裡第一個問題是,當Arduino本身具有內建計時器時,為什麼我們實際上需要為Arduino專案提供單獨的RTC。好吧,原因就是RTC模組使用電池執行,即使我們重新程式設計微控制器或斷開主電源,也可以保持時

shell或python呼叫企業微傳送訊息(實現報警功能)

shell或python呼叫企業微信傳送訊息(實現報警功能) 官方文件 企業內部開發簡易教程:https://work.weixin.qq.com/api/doc#90000/90003/90487服務端API:https://work.weixin.qq.com/api/doc#90000/90135/