1. 程式人生 > >【筆記更新】ESP8266串列埠透傳筆記

【筆記更新】ESP8266串列埠透傳筆記

晶片:ESP8285

環境:官方RTOS_SDK

在做串列埠資料通過TCP傳送的時候會碰到客戶端沒200位元組一個包傳送,但是到server端並不是200位元組一個包収的,原因是lwip在TCP通訊的時候預設是開啟Nagle’s演算法的,這個是一種防止一直髮小包,serve端接不過來而導致快取區阻塞導致丟包問題,會把小包快取成大包進行傳送,只要進位制就可以了,這裡我用的socket API,程式碼如下:

static void _set_tcp_nodelay(int fd) {
    int enable = 1;
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&enable, sizeof(enable));
}

在做websever的時候我碰到了用socket API進入accept阻塞後長時間沒有連結,再次連線會出現連線失敗問題,至今沒有找到原因,我用ESP8266自帶的TCP API的可以支援長時間,但是連線次數超過5次後就無法連線了,這裡的原因是因為需要顯示呼叫一個初始化介面,但是官方文件裡沒有給出,程式碼如下:

    espconn_init();
    xTaskCreate(vTask_TCP_sever, "vTask_TCP_sever", 500, NULL, 6, NULL);

這裡做的TCP連線都是在  BSD(socket)   API基礎上開發的

在做TCP Server的時候會碰到客戶端異常斷開的情況(晶片電源不穩斷電,異常重啟,訊號影響斷鏈),這是如果是select處理多連線,這時候主要是斷電重連,這時候就需要配置一個引數,就是“保活”,SO_KEEPALIVE屬性,就是TCP協議棧的預設心跳包,如果有連線則繼續,連線失敗,這是對應設定的socket會返回一個返回一個err的讀事件,這時就可以處理關閉和回收記憶體的事情了,程式碼如下:

							//設定心跳檢測機制
							int on = 1; 
							ret = setsockopt(clicoon[i].sock, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on));
                                                        //設定對應屬性,這裡在原始碼裡有提示,必須是秒為單位
							int keepIdle = 3;	//in seconds
						    	int keepInterval = 2;	//in seconds
						   	int keepCount = 3;
						    	setsockopt(clicoon[i].sock, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));
							setsockopt(clicoon[i].sock, IPPROTO_TCP,TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
							setsockopt(clicoon[i].sock,IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

我在這沒有新增異常判斷

這裡是一些小坑,不斷更新,希望看到的多多補充。