天天看點

【STM32 .Net MF開發闆學習-27】GPRS通信實作

GPRS是General Packet Radio Service(通用分組無線服務技術)的簡稱,它是GSM行動電話使用者可用的一種移動資料業務。GPRS和以往連續在頻道傳輸的方式不同,是以封包(Packet)式來傳輸。我們基于.NET Micro Framework 4.1平台,開發了YFSoft.Hardware.GPRS庫,通過該庫,使用者簡單調用相關接口,就可以實作GPRS通信。

我們所選用的硬體為基于SIM300_V7.02子產品的開發闆,通過序列槽和.NET MF開發闆進行連接配接(如下圖)。

【STM32 .Net MF開發闆學習-27】GPRS通信實作

 由于.NET Micro Framework開發闆提供的序列槽為母頭,是以和GPRS開發闆連接配接需要制作專門的連接配接線,簡單期間,我用單排針做了三線的交叉連接配接線(不過最好還是采用專門的接頭,下面的連接配接線插接不是很緊密,容易出現通信故障),如下圖。

【STM32 .Net MF開發闆學習-27】GPRS通信實作

 硬體平台搭建好後,我們編寫GPRS TCP通信程式(UDP和TCP類似,這裡就不再舉例了)。

核心代碼如下:

        public static void Main()

        {                        

            gprs = new GPRS("COM2", 115200, GPRS.GprsType.SIM300_V7_02);

            gprs.DataReceived += new GPRSDataReceivedEventHandler(gprs_DataReceived);

            if ((ret=gprs.Open()) != 0) 

            {

                Debug.Print("Open Failed:" + ret.ToString());

                gprs.Close();

                return;

            }

             if ((ret = gprs.SetAPN("CMNET")) != 0)

                Debug.Print("Config Failed:" + ret.ToString());

            Debug.Print("Signal:" + gprs.Signal.ToString());

            if (!gprs.Connect(GPRS.GprsMode.TCP, "221.217.???.???", 8080, 200))

                Debug.Print("Connect Failed!");

                gprs.Close();

            Debug.Print("IP:" + gprs.LocalIP);

            Debug.Print(gprs.StateString(gprs.State));

            while (true)

            {             

                Thread.Sleep(1000);

            //gprs.Disconnect();

            //gprs.Close();

        }

        static void gprs_DataReceived(object sender)

        {

            GPRS gprs = (GPRS)sender;

            if (gprs.Available > 0)

               Debug.Print(gprs.Receive());

        static void key_Click(Button button, KeyPad.ButtonState state, DateTime time)

            string KeyName = "";

            if (state == KeyPad.ButtonState.Up && gprs != null)

              if (!gprs.Send("Hello MF - " + KeyName, 1000))

                {

                    Debug.Print("Send Failed!");

                }

 在開始測試前,我們需要運作一個TCP Server程式(可以從文末提供的連接配接進行下載下傳),如下圖:

【STM32 .Net MF開發闆學習-27】GPRS通信實作

而在VS2010中的.NET Micro Framework代碼運作結果如下:

【STM32 .Net MF開發闆學習-27】GPRS通信實作

我們按開發闆上的按鈕向伺服器發送資料,或通過TCPServer程式向開發闆發送資料,其運作效果就如上兩圖所示。

為了便于使用者深入了解YFSoft.Hardware.GPRS庫,我們編寫了詳盡的庫函數手冊,主要内容如下:

屬性:讀寫

說明: 逾時時間,主要指發送AT指令時,裝置的響應時間,該參數和響應時傳回OK或ERROR的AT指令配合使用。該時間機關為毫秒,實際使用時逾時等待時間有可能會遠大于該值。

屬性:隻讀

說明:目前手機信号強度。

範圍:

0 -113 dBm or less

1 -111 dBm

2...30 -109... -53 dBm

31 -51 dBm or greater

99 not known or not detectable

說明:GPRS狀态。

0 - None,

1 - IP_INITIAL,

2 - IP_START,

3 - IP_CONFIG,

4 - IP_IND,

5 - IP_GPRSACT,

6 - IP_STATUS,

7 - TCP_CONNECTING,

8 - UDP_CONNECTING,

9 - IP_CLOSE,

10 - CONNECT_OK,       

說明:本地IP位址。

說明:TCP 連接配接狀态。

說明:目前接收緩沖區已接收的資料長度。

聲明:GPRSDataReceivedEventHandler DataReceived

參數:object sender – GPRS類的執行個體

說明:TCP或UDP已接收到資料

聲明:SMSMessageReceivedEventHandler MessageReceived

說明:短信接收通知

聲明:GPRS(string portName, int baudRate,GprsType type)

參數:portName –序列槽名稱,如COM1

      baudRate – 波特率,預設115200

      type – GPRS子產品類型,目前支援SIM300_V7_02及和其相容的子產品。

傳回:無

說明:GPRS類的構造函數。

聲明:void SetDebugMode(bool on)

參數:on – True 開啟Debug模式 False 關閉Debug模式

說明:設定Debug模式,開啟後,通信過程中的AT指令的内容會通過Debug.Print函數輸出。

聲明:int Open()

參數:無

傳回:操作傳回值

0 – 成功

1 – 序列槽打開失敗

2 – 裝置不線上 (AT)

3 – 設定回顯失敗 (ATE1)

4 – 設定IP頭顯示失敗 (AT+CIPHEAD=1)

5 – 設定傳回資訊格式失敗 (ATV1)

6 – 設定消息格式失敗 (AT+CMGF=1)

7 – 設定是否輸出錯誤資訊模式失敗(AT+CMEE=0)

8 – 檢測SIM失敗(AT+CPIN?)

9 – 注冊到移動營運商的網絡失敗(AT+CREG?)

說明:打開序列槽,并進行必要的配置。

聲明:void Close()

說明:關閉序列槽。

聲明:int SetAPN(string apn)

參數:apn – 接入點的名稱,如CMNET

1 – 注冊GPRS業務失敗

2 – 配置接入點失敗

3 – 設定連接配接模式失敗,連接配接是伺服器還是域名 0是IP位址

4 – 設定應用模式失敗,如果為1 則發送的AT指令也為資料需要服務端解除,如果為0則AT指令會有響應

說明:配置GPRS必要參數。

聲明:string StateString(GprsState state)

參數:state – GPRS狀态

傳回:GPRS狀态的字元串形式

"IP INITIAL",

"IP START",

"IP CONFIG",

"IP IND",

"IP GPRSACT",

"IP STATUS",

"TCP CONNECTING",

"UDP CONNECTING",

"IP CLOSE",

"CONNECT OK"

說明: 傳回GPRS狀态的字元串形式。.NET Micro Framework和.NET Framework不同,ToString并不傳回enum的名稱,而是對應數字的字元。

聲明:bool Connect(GprsMode mode,string ip,int port,int overtime)

參數:mode –TCP或UDP

      ip – 伺服器IP位址

      port – 端口

      overtime – 和 Overtime不同,這是等待連接配接成功的逾時時間。

傳回:連接配接狀态 bool 成功 false 失敗

      注意,目前狀态為IP_IND 時,通信狀态也是成功的。

說明:連接配接TCP或UDP伺服器。

聲明:void Disconnect ()

說明:斷開GPRS連接配接。

聲明:bool Send (string buffer,int overtime)

參數:buffer – 要發送的字元串

      overtime – 和 Overtime不同,這是等待資料發送成功的逾時時間。

傳回:發送狀态 bool 成功 false 失敗

說明:向TCP或UDP的伺服器發送資料。目前僅支援字元發送。

聲明:string Receive ()

傳回:傳回TCP或UDP伺服器發回的資料(一次傳回目前緩沖區的全部字元串,最長1024)。

說明:接收TCP或UDP的伺服器發送的資料。目前僅支援字元資料接收。

聲明:bool SendMessage (sring phone,string msg,int overtime)

參數:phone – 電話号碼

msg – 要發送的字元串

說明:發送短信。目前僅支援字元發送。

聲明:string[] ReceiveMessage ()

傳回:傳回目前未讀的短信字元串集合。

說明:接收短信。目前僅支援字元資料接收。

QQ群:127465602

繼續閱讀