TA的每日心情 | 开心 2024-10-14 08:33 |
---|
签到天数: 2451 天 连续签到: 1 天 [LV.Master]伴坛终老
|
本帖最后由 limale 于 2017-1-17 20:29 编辑
先前测试了TCP,今天我们来了解及测试一下另外一种数据传输协议UDP。我也是边学边用还是先脑补一下吧。
UDP(User Data Protocol,用户数据报协议)
(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
UDP的包头结构:
源端口 16位
目的端口 16位
长度 16位
校验和 16位
Fireduino WiFi UDP流程
第一步:
创建一个 WiFiUDP对象,接着调用对象函数begin函数,初始化UDP对象以及开始监听端口,参数为需要监听的端口号。
第二步:
数据的接受
如果UDP端口接到到远程发送的数据,通过调用对象parsePacket函数可以获取数据包大小。之后通过调用对象函数read 读取数据。
数据的发送
UDP 数据包的发送需要通过对象函数beginPacket指定远程主机的IP地址和端口号,之后调用对象函数write写入数据后,调用对象函数endPacket完成组包后扔到网络发送。
第三步:
完成数据传输后可以调用UDP对象 stop 函数 释放UDP资源。
小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
首先实例化UDP对象并且指定本地端口号为2390。
这里指定本地端口启动UDP服务,电脑作为UDP Client。
如果有接收到Client发送的消息,通过串口打印相关的内容,同时Server向Client发送反馈消息通信结束,依次循环。
主要代码:- #include <Arduino.h>
- #include "Wire.h"
- #include "oled.h"
- #include "oledfont.h"
- #include "TF.h"
- #include "Audio.h"
- #include <WiFi.h>
- #include <WiFiUdp.h>
- //板载led
- #define LED_GREEN 13
- #define LED_BLUE 3
- #define Trigger_T_measuremnet_hold_master 0xe3
- #define Trigger_RH_measuremnet_hold_master 0xe5
- extern int16_t SHT20_Read_value(uint8_t value);
- uint16_t SHT20_val;
- float SHT20_val_temp;
- float SHT20_val_humi;
- char str[15] = {};
- char music1[10] = {"love.MP3"};
- char music2[10] = {"sara.MP3"};
- //char ssid[] = {"network ssid"}; //your network SSID(name)
- //char pwd[] = {"123456"}; //your network password
- int status = WL_IDLE_STATUS;
- unsigned int localPort = 2390; // local port to listen on
- char packetBuffer[255]; //buffer to hold incoming packet
- char ReplyBuffer[] = "hello!!!"; // a string to send back
- WiFiUDP Udp;
- boolean alreadyConnected = false;
- void printWifiStatus();
- void Sys_Init(void)
- {
- pinMode(OLED_GND, OUTPUT);
- pinMode(OLED_VCC, OUTPUT);
- pinMode(OLED_CLK, OUTPUT);
- pinMode(OLED_DIN, OUTPUT);
- pinMode(OLED_RES, OUTPUT);
- pinMode(OLED_DC, OUTPUT);
- pinMode(OLED_CS, OUTPUT);
- digitalWrite(OLED_GND,LOW);
- digitalWrite(OLED_VCC,HIGH);
-
- pinMode(LED_GREEN, OUTPUT);
- digitalWrite(LED_GREEN,HIGH);
- Wire.begin();
- OLED_Init();
- OLED_Clear();
-
- delay(500);
- Serial.begin(115200);
- Serial.print("\r\narduino setup ...\r\n");
-
- if(!SD.begin())
- {
- Serial.println("sd init err\r\n");
- while(1);
- }
- // check for the presence of the shield:
- if (WiFi.status() == WL_NO_SHIELD) {
- Serial.println("WiFi shield not present");
- // don't continue:
- while (true);
- }
- String fv = WiFi.firmwareVersion();
- if (fv != "1.1.0") {
- Serial.println("Please upgrade the firmware");
- }
- // attempt to connect to Wifi network:
- while (status != WL_CONNECTED) {
- Serial.print("Attempting to connect to SSID: ");
- Serial.println(ssid);
- // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
- status = WiFi.begin(ssid, pwd);
- // wait 10 seconds for connection:
- // delay(10000);
- }
- Serial.println("Connected to wifi");
- printWifiStatus();
- Serial.println("\nStarting connection to server...");
- // if you get a connection, report back via serial:
- Udp.begin(localPort);
- }
- void Main(void)
- {
- char str1[] = {"eeboard"};
- char str2[] = {"www.eeboard.com"};
- uint8_t i = 4;
-
- OLED_ShowCHinese(i, 0, 0);
- OLED_ShowCHinese(i+16, 0, 1);
- OLED_ShowString(i+32, 0, str1, 16);
- OLED_ShowCHinese(i+88,0, 2);
- OLED_ShowCHinese(i+104,0, 3);
- // OLED_ShowString(4,2,str2,16);
- while(1)
- {
- SHT20_val = SHT20_Read_value(Trigger_RH_measuremnet_hold_master);
- SHT20_val &= ~0x0003;
- SHT20_val_humi = -6.0 + 125.0 / 65536 * (float)SHT20_val;
- sprintf(str, "= %5.2f RH ", SHT20_val_humi);
- OLED_ShowCHinese(0, 4, 4);
- OLED_ShowCHinese(16, 4, 5);
- OLED_ShowString(32, 4, str, 16);
-
- SHT20_val = SHT20_Read_value(Trigger_T_measuremnet_hold_master);
- SHT20_val &= ~0x0003;
- SHT20_val_temp = -46.85 + 175.72 / 65536 * (float)SHT20_val;
- sprintf(str, "= %5.2f C ", SHT20_val_temp);
- OLED_ShowCHinese(0, 6, 6);
- OLED_ShowCHinese(16, 6, 7);
- OLED_ShowString(32, 6, str, 16);
- // if there's data available, read a packet
- int packetSize = Udp.parsePacket();
- if (packetSize) {
- Serial.print("Received packet of size ");
- Serial.println(packetSize);
- Serial.print("From ");
- IPAddress remoteIp = Udp.remoteIP();
- Serial.print(remoteIp);
- Serial.print(", port ");
- Serial.println(Udp.remotePort());
- // read the packet into packetBufffer
- int len = Udp.read(packetBuffer, 255);
- if (len > 0) {
- packetBuffer[len] = 0;
- }
- Serial.println("Contents:");
- Serial.println(packetBuffer);
- // send a reply, to the IP address and port that sent us the packet we received
- Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
- Udp.write(ReplyBuffer);
- Udp.endPacket();
- }
- }
- }
- void printWifiStatus() {
- // print the SSID of the network you're attached to:
- Serial.print("SSID: ");
- Serial.println(WiFi.SSID());
- // print your WiFi shield's IP address:
- IPAddress ip = WiFi.localIP();
- Serial.print("IP Address: ");
- Serial.println(ip);
- // print the received signal strength:
- long rssi = WiFi.RSSI();
- Serial.print("signal strength (RSSI):");
- Serial.print(rssi);
- Serial.println(" dBm");
- }
复制代码 程序源码:
UDP.zip
(9.03 KB, 下载次数: 0)
|
评分
-
查看全部评分
|