專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

Rainbow網(wǎng)絡(luò)通信:一個(gè)簡(jiǎn)單的TCP客戶(hù)端

作者:白櫟旸   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月30日   【字體:

    Rainbow開(kāi)發(fā)包對(duì)TCP協(xié)議進(jìn)行了很好的封裝,使用起來(lái)同樣簡(jiǎn)單,在軟件包的“Projects\TCP-Client”文件夾包含了本文的完整工程,可以直接編譯、燒寫(xiě)和調(diào)試。這個(gè)程序主要展示如何通過(guò)TCP向服務(wù)器端發(fā)送字符串,看看main.cpp的代碼:

#include "WProgram.h"
#include "Ethernet.h"
#include "EthernetClient.h"
 
//網(wǎng)絡(luò)模塊的MAC地址
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//網(wǎng)絡(luò)模塊的IP地址
IPAddress ip(192, 168, 1, 15);
 
//定義對(duì)方ip和端口
IPAddress serverIp(192, 168, 1, 171);
uint16_t port = 6000;
 
//定義TCP客戶(hù)端對(duì)象
EthernetClient client;
//記錄向服務(wù)器發(fā)送消息的次數(shù),我們的例子只發(fā)送5次
uint8_t sendNums = 0;
 
void setup()
{
  //初始化Rainbow
  boardInit();
  //初始化默認(rèn)串口
  Serial.begin();
  Serial.println("TCP-Client start...");
  //對(duì)網(wǎng)絡(luò)進(jìn)行初始化
  Ethernet.begin(mac, ip);
  //與服務(wù)器三次握手,建立連接
  if(client.connect(serverIp, port))
  {
    Serial.println("TCP client-to-server established...");
  }
}
 
void loop()
{
  //判斷是否建立起有效連接
  if(client.connected())
  {
    //發(fā)送5次消息后關(guān)閉連接
    if(sendNums > 5)
    {
      client.stop();
    }
    client.print("Hello,world!\r\n");
    sendNums++;
    //間隔2秒發(fā)送一次
    delay(2000);
  }
}
 
int main()
{
  setup();
  while(1) loop();
}
 
    TCP協(xié)議是一個(gè)可靠的通信協(xié)議,在通信前需要經(jīng)過(guò)三次握手方能建立起連接,連接成功后才能進(jìn)行可靠的流式通信。和UDP通信相比,TCP通信由于通信前要進(jìn)行三次握手,每次發(fā)送數(shù)據(jù)完畢要等對(duì)方確認(rèn)(ACK),而UDP只管發(fā)送出去,少了協(xié)商過(guò)程,因此在局域網(wǎng)或者可靠通信的網(wǎng)絡(luò)環(huán)境下通信效率會(huì)高于TCP,但是在廣域網(wǎng)或者通信質(zhì)量不太好的環(huán)境下,UDP往往不是很可靠,如果要在這種環(huán)境下使用UDP可靠通信的話,還需要一些數(shù)據(jù)收發(fā)確認(rèn)算法(協(xié)議)的支持。
 
    Rainbow作為客戶(hù)端,要和服務(wù)器進(jìn)行通信,需要以下幾個(gè)步驟:
    1、定義EthernetClient對(duì)象:EthernetClient client
    2、調(diào)用client.connect(serverIp, port)進(jìn)行TCP三次握手,握手成功返回true
    3、發(fā)送前調(diào)用client.connected()判斷連接是否有效
    4、通過(guò)client中的print、write等方法向服務(wù)器發(fā)送消息,client是Stream的子類(lèi),可以使用Stream中的方法。
    5、發(fā)送消息完畢,調(diào)用client.stop()關(guān)閉連接
 
    上面的程序編譯無(wú)誤后,將程序燒寫(xiě)到Rainbow中,然后在電腦上運(yùn)行串口調(diào)試工具并和Rainbow連接成功,在端口號(hào)為6000上啟動(dòng)TCP監(jiān)聽(tīng),然后按下Rainbow的復(fù)位鍵,可以在串口調(diào)試工具中看到輸出的日志,同時(shí),每隔2秒,將在從網(wǎng)絡(luò)上接收到Rainbow發(fā)來(lái)的數(shù)據(jù),Rainbow發(fā)送5次后自動(dòng)中斷和服務(wù)器的連接:
關(guān)閉窗口

相關(guān)文章