先來看看ESP8266的UDP通訊,主要看它的廣播模式。說這個,需要先了解UDP通訊是什么?
說到UDP,伴隨而來的還有另一個東西,就是TCP。這里不說定義,只說應用。簡單來說,這兩者都是網絡通信中常用的通信協議。
最主要的區別,TCP通訊比較穩定,它和接收端要進行三次握手,接收端有沒有收到數據,都能知道。優點是安全,缺點是和UDP相比,速度慢。UDP在發送時,不管有沒有接收方,也不管接收方有沒有收到,只要把數據發出去,就完了。所以,相比TCP,安全性差一些,速度要快一些。
但并不是說安全性差,就不能用,像視頻、音頻等一些無關緊要的數據,都可以用UDP來進行傳輸。
UDP包的最大長度是多少?
65535個字節。但是除掉IP頭(20字節)和UDP頭(8字節)之后,剩余65507個字節。
UDP如何廣播?
IP 255.255.255.255 為廣播地址,往這個地址發數據,局域網中的所有機器都可以收到。
對UDP有一個基本了解之后,咱們來進行ESP8266的UDP廣播。本節程序是在上一節程序基礎上修改的,所以如果你上一節看懂了,這一節是很簡單的。使用步驟多一點,但是并不麻煩,分為6步。
1.包含頭文件
#include "espconn.h"
#include "mem.h"
主要是"espconn.h",涉及到UDP通訊所需的各種數據結構。
2.設置工作模式及相關參數
wifi_set_opmode(0x03); // station+ soft-ap模式
struct softap_config config; //定義AP參數結構體,
wifi_softap_get_config(&config); //獲取當前AP模式的參數
os_memcpy(config.ssid,"ESP8266",strlen("ESP8266")); //修改AP名稱
os_memcpy(config.password,"123456789",strlen("123456789")); //修改AP密碼
config.ssid_len=strlen("ESP8266"); //修改 AP名稱的長度
wifi_softap_set_config(&config); //使修改后的參數生效
此時,如果把程序燒錄進去,可以看到當前環境下有一個ESP8266的wifi,輸入密碼“123456789”可以連接。
3.掃描并連接當前環境下的wifi
跟上一節一樣,掃描當前環境下的wifi,并進行連接。我這里連接我家里的“shatanliu”,你要改成你自己的。
4.連接成功后,設置UDP相關參數
跟上一節相比,這里要對Wifi_conned();進行修改。
首先頭文件中定義一個結構體形式的ESPCONN描述符:
struct espconn user_udp_espconn;
關于espconn,SDK中給出的定義如下:
/** A espconn descriptor */
struct espconn {
/** type of the espconn (TCP, UDP) */
enum espconn_type type;
/** current state of the espconn */
enum espconn_state state;
union {
esp_tcp *tcp;
esp_udp *udp;
} proto;
/** A callback function that is informed about events for this espconn */
espconn_recv_callback recv_callback;
espconn_sent_callback sent_callback;
uint8 link_cnt;
void *reverse;
};
可以看到,無論是TCP通訊還是UDP通訊,都要用到這個結構體,同時,要在結構體內設置相應的發送、接收回調函數。
接下來就是一個UDP參數的設置過程:
wifi_set_broadcast_if(STATIONAP_MODE);
設置UDP廣播包的發送接口,默認soft-ap。這里選擇的是station和soft-ap。
參數:1、station 2、soft-ap 3、station和soft-ap
user_udp_espconn.type=ESPCONN_UDP; //設置為UDP通信
//開辟UDP參數需要的空間
user_udp_espconn.proto.udp=(esp_udp *)os_zalloc(sizeof(esp_udp));
//設置本地端口和遠程端口
user_udp_espconn.proto.udp->local_port=2525;
user_udp_espconn.proto.udp->remote_port=1024;
//設置遠程IP
const char udp_remote_ip[4]={255,255,255,255};
os_memcpy(user_udp_espconn.proto.udp->remote_ip,udp_remote_ip,4);
//設置發送完成和接收完成的回調函數
espconn_regist_recvcb(&user_udp_espconn,user_udp_recv_cb);
espconn_regist_sentcb(&user_udp_espconn,user_udp_sent_cb);
//使UDP參數生效
espconn_create(&user_udp_espconn);
//UDP發送函數
user_udp_send();
5.定義發送完成和接收完成的回調函數
void ICACHE_FLASH_ATTR user_udp_sent_cb(void *arg)
{
os_printf("SEND SUCCESS!");
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer,(os_timer_func_t *)user_udp_send,0);
os_timer_arm(&test_timer,1000,0);
}
串口打印:SEND SUCCESS! 然后延時1秒,調用UDP發送函數。
為什么串口不發送中文?SDK3.0的版本,串口對中文的支持好像不太好,有興趣的自己試一下。
void ICACHE_FLASH_ATTR user_udp_recv_cb(void *arg,
char *pdata,
unsigned short len)
{
os_printf("udp have received data:%s",pdata);
}
把收到的數據,串口打印出來。
6.定義UDP發送函數
void ICACHE_FLASH_ATTR user_udp_send(void)
{
char hwaddr[6];
char DeviceBuffer[40]={0};
wifi_get_macaddr(STATION_IF,hwaddr);
os_sprintf(DeviceBuffer,"DEVICE MAC ADDRESS IS:"MACSTR"!!
ESP8266 IOT!",MAC2STR(hwaddr));
espconn_send(&user_udp_espconn,DeviceBuffer,os_strlen(DeviceBuffer));
}
通過wifi_get_macaddr函數獲取station模式下的MAC地址,并通過espconn_sent函數打印出來。
函數定義
sint8 espconn_send(
struct espconn *espconn,
uint8 *psent,
uint16 length
)
參數:
struct espconn *espconn : 對應網絡傳輸的結構體
uint8 *psent : 發送的數據
uint16 length : 數據長度
程序修改完成,保存、清理、編譯、下載一條龍,然后重新上電。這里,需要借助串口助手和網絡調試助手兩個工具來查看效果。效果如下所示:
打開網絡調試助手:
如圖,依次設置相關的參數。
怎么知道顯示的MAC地址對不對?打開路由器的管理界面,看當前連接設備的MAC地址:
如此,說明發送端(路由下的8266)和接收端(路由下的PC)成功進行通信。
如果這時候網絡調試助手發送數據:hello。
串口助手會收到如下信息:
至此,UDP廣播說完了。你們可以試一下讓當前電腦連接8266,看網絡調試助手里的參數如何修改。
-
通信協議
+關注
關注
28文章
879瀏覽量
40299 -
TCP
+關注
關注
8文章
1353瀏覽量
79055 -
UDP
+關注
關注
0文章
325瀏覽量
33931
發布評論請先 登錄
相關推薦
評論