2017年10月16日 星期一

DIY - ESP8266:ESP8266 SDK ESPCONN UDP Server 網路程式(三十七)

DIY - ESP8266:ESP8266 SDK ESPCONN UDP Server 網路程式(三十七):
 
雖然 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)
操作系統:Microsoft Windows 7 64-bit 
開發平台: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%
天氣:微雨

沒有留言:

張貼留言