開發板+GSM模組彩信傳送實現
一、文件簡介:
本文件用於介紹1B開發板+GSM模組傳送彩信的實現過程,以及彩信MMS協議封裝過程。
開發環境引數:
作業系統:Ubuntu 11.04
本機平臺:X86
目標平臺:Loongson 1B 開發板+華為GSM模組MG323
交叉編譯工具鏈:gcc-3.4.6-2f(1B交叉編譯工具鏈)
所需軟體及工具包:
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-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.172的80埠或者9201埠。要注意的是彩信並非直接投遞給接收方,而是像郵件一樣,先發送給一箇中間伺服器MMS Proxy-Relay。MMS Proxy-Relay暫時儲存彩信,然後通過push協議給彩信接收方傳送一個通知,彩信接收方收到通知後從MMS Proxy-Relay上獲取彩信內容。MMS Client和WAP Gateway之間用WAP傳輸協議傳輸,而WAP Gateway和MMS 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 PDU(Protocol Data Unit,協議資料單元)由MMS頭和MMS訊息體組成,MMS頭由多個域名和域值組成,由客戶端指定,MMS頭裡面的一些域可以被MMS Proxy-Replay修改或補充,MMS Proxy-Replay使用這些頭域資訊生成MM通知以及構造接收MM PDU中的相關頭域,連同訊息實體一同送往接收方。訊息體跟在MMS頭之後,大多數MMS PDU只含有MMS頭,它們起到建立和維持通訊的作用,只有在M-Send.req和M-Retrieve.conf PDU中才有訊息體。MMS PDU和HTTP 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-HEADER中,X-Mms-Message-Type ,X-Mms-Transaction-ID和X-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
98:X-Mms-Transaction-ID
30 00:MMS Transaction ID為48
8D:X-Mms-Version
90:MMS Version值為1.0
89:From 傳送方
01:後接一個位元組資料
81:傳送方號碼佔位符
97:To 接收方
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 ”
84:Content-Type
a3:表示:application/vnd.wap.multipart.mixed組裝方式
02:表示後接兩部分內容資料
接下來講述一下內容資料部分的結構:
每一部分的內容資料均由兩部分組成,分別是Header+Data;
首先包含一個HeaderLen,用來指示ContentType域和Header域的總長度,是一個Uintvar變數;
接下來時DataLen,用來指示後面Data域的長度,在這裡指的是一塊多媒體資料的位元組數;
然後是ContentType域用來表示後面的資料塊是什麼型別的資料(如txt文字,jpeg圖片,還是vidoe資料流);
再後邊是Content Location和Content 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
1c:Header的長度為28位元組
0c:Data的長度為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
12:Header的長度為18位元組
df 22:Data的長度為1219位元組
HeaderLen和DataLen均是採用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/