雖然 TCP 提供的是一個可靠的資料流傳送服務,而且筆者已經完成 ESP8266 Soft-AP TCP Server 程式,但想試驗在同一時間將小量訊息發送給大量的接收設備(多點傳輸),而無需建立點對點連接,這便需要使用 UDP (User Datagram Protocol / 用戶資料報協定)協議來傳輸訊息資料。筆者順利完成 ESP8266 TCP 網路程式和 Microsoft Excel VBA 收發數據程式後,便要嘗試使用 UDP 來通訊,其實 ESP8266 的 TCP 和 UDP 編程是大同小異,所以有了 TCP 編程的經驗,UDP 便比較容易。
ESP8266 Station + Soft-AP Mode(STA + AP Mode) |
開發平台:ESP8266 Windows IDE Eclipse Mars.2 v4.5.2版本
C 程式:DIY - ESP8266 - 011 AP UDP Server - 20170523
UDP 則是一個非連線型(Connectionless)的非可靠傳輸協定﹐它並不會運用確認機制來保證資料是否正確的被接收、不需要重傳遺失的資料、資料的接收可不必按順序進行、也不提供回傳機制來控制資料流的速度。因此﹐UDP 信息可能會在網路傳送過程中丟失﹑重複﹑或不依順序﹐而且抵達速度也可能比接收端的處理速度還快。對於某些訊息量較大、時效性大於可靠性的傳輸來說(比方說語音 / 影像),UDP 的確是個不錯的選擇。
由於 UDP 不需要可靠傳輸,因此相較於 TCP 來說,一大堆必需佔據封包表頭的 over head 都可省略,從而換取更大的 payroll 空間。這樣的結果,將令到單一的 IP 封包在作 UDP 連線時所攜載的資料要比 TCP 連線多更多。這是靠犧牲可靠性而換取得來的,若連線需要在 UDP 上作可靠傳輸,那麼,其確認機制將從傳輸層退為應用層進行了、也就是程式本身要提供可靠傳輸機制。
ESP8266 Station + Soft-AP UDP 的配置初始化流程:
1. 將 ESP8266 配置成 Station + Soft-AP 模式,將模式改為STATIONAP_MODE(0x03),wifi_set_opmode(STATIONAP_MODE);
2. 利用 wifi_softap_get_config(struct softap_config* config) 獲取當前配置
3. 拷貝默認設置,os_memcpy(congfig.ssid,”*“,strlen(“*“)) 、os_memcpy(congfig.password,”#######”,strlen(“#######”))
4. config.ssid_len=strlen(“ESP8266”)
5. 利用 wifi_softap_set_config(struct softap_config *config) 函數,將之前的配置放入函數 wifi_softap_set_config(&config)
ESP8266 Station + Soft-AP 配置的初始化程式:
/******************************************************************************
* FunctionName : user_init(void)
* Description : User Init Program Start Here
* Parameters : none
* Returns : none
*******************************************************************************/
void
ICACHE_FLASH_ATTR user_init(void)
{
// Start STATIONAP Configuration
struct softap_config apConfig;
wifi_set_opmode(STATIONAP_MODE);
// Copy STATIONAP Config Parameters
os_memset(&apConfig,0x0,sizeof(apConfig));
apConfig.authmode = AUTH_OPEN;
apConfig.channel = 0;
apConfig.max_connection = 4;
apConfig.ssid_len =
os_strlen(TRANS_SSID);
os_strncpy(apConfig.ssid,TRANS_SSID,os_strlen(TRANS_SSID));
// Setup STATIONAP Config Parameters
wifi_softap_set_config(&apConfig);
wifi_set_broadcast_if(STATIONAP_MODE);
}
|
ESP8266 UDP 通訊:
1. 初始化 UDP espconn 參數,包括 Type、State、Port number 和 IP address
2. 拷貝設置,os_memcpy(pUdpServer->proto.udp->remote_ip, udp_remote_ip,4)
3. 註冊 接收回調函數
4. 註冊 發送回調函數
5. 建立 UDP 通信
6. 獲取 station 的 MAC 地址
7. 發送資料
8. 發送成功後使用計時器繼續發送
ESP8266 UDP 配置程式:
// Create UDP Server and Allocate address
for ESPCONN
pUdpServer = (struct espconn
*)os_zalloc((uint32)sizeof(struct espconn));
// Configure UDP Server Parameters
pUdpServer->type = ESPCONN_UDP;
pUdpServer->state = ESPCONN_NONE;
pUdpServer->proto.udp = (esp_udp
*)os_zalloc(sizeof(esp_udp));
pUdpServer->proto.udp->local_port = 2525;
pUdpServer->proto.udp->remote_port
= 2525;
struct ip_info ipconfig;
const char udp_remote_ip[4] =
{255,255,255,255};
os_memcpy(pUdpServer->proto.udp->remote_ip,
udp_remote_ip,4);
pUdpServer->proto.udp->remote_port
= 2525;
// Register Callback Monitor WiFi Status
wifi_set_event_handler_cb(wifi_event_handler_cb1);
// Register Callback Monitor WiFi Status
espconn_regist_recvcb(pUdpServer, trans_udpclient_recv_cb);
espconn_regist_sentcb(pUdpServer, trans_udpclient_sent_cb);
espconn_regist_reconcb(pUdpServer, trans_udpclient_recon_cb);
espconn_regist_disconcb(pUdpServer,
trans_udpclient_discon_cb);
espconn_status=espconn_create(pUdpServer);
}
|
ESP8266 模塊 WiFi Station + Soft-AP UDP Server 模式 |
ESP8266 模塊 WiFi Station + Soft-AP UDP Server 模式連接 |
ESP8266 模塊 WiFi Station + Soft-AP UDP Server 模式收發資料 |
ESP8266 模塊 WiFi Station + Soft-AP UDP Server 模式測試 |
2017年 10月 16日 天氣報告
氣溫:26.6度 @ 22:10
相對濕度:百分之 86%
天氣:微雨
沒有留言:
張貼留言