單片機LWIP協議中客戶端無法連接到服務器問題?

現在大多的單片機使用LwIP協議來實現互聯網功能,但是在剛剛學習時發現有個問題就是,LwIP協議用作服務器端時可以成功執行建立Socket,綁定端口號以及啟動偵聽等功能。但是用作客戶端時,無法連接到指定的服務器端。其實問題主要出在時序上,由於LwIP初始化需要一定的時間而且這個過程與主程序是並列進行的。

LwIP協議初始化主要完成設備 IP的指定(如果連接到路由器以及運行DHCP服務,還要等待路由器為設備分配 IP)、網關等認證。

由於單片機做服務器端的初始化與等待連接的客戶端無關,所以可以在LwIP未初始化完成時便可以啟動偵聽服務,但也要等LwIP初始化完成才可以接收客戶端連接。

但單片機做客戶端時,需要向服務器端發起連接,所以在LwIP協議沒有初始化完成時是不可能發起連接的。所以解決問題要在LwIP初始化完成後再運行客戶端初始化和發起連接。

工具/原料

Keil

TCP&UDP測試工具

STM32F107 + DM9161AEP 硬件平臺

路由器及PC

方法/步驟

找到main程序中的LwIP_Init函數,並右鍵搜索定義(Definition)

單片機LWIP協議中客戶端無法連接到服務器問題

由於我用的路由器加DHCP服務,所以用crtl + f 查找“LWIP_DHCP”,找到如圖所示的函數段。

單片機LWIP協議中客戶端無法連接到服務器問題

再往下找到諸如“IPaddress = netif.ip_addr.addr;”語句的地方,這句話意思就是將分配好的IP賦值給IPaddress 變量,即表示 LwIP初始化完成,系統已經得到路由器DHCP分配到的IP地址,在後面即可添加客戶端定義語句。我的客戶端定義是寫在“Ehome_init”函數中的。

單片機LWIP協議中客戶端無法連接到服務器問題

在Ehome_init函數內,同時定義了服務器端與客戶端,而且下載到硬件平臺都初始化運行成功。

IP4_ADDR(&Server_ipaddr,192,168,1,112);

為所要連接的服務器地址,即我的 PC地址。

tcp_bind(pcb_client, IP_ADDR_ANY, 8091);

為綁定客戶端socket的端口,為測試方便我綁定了8091端口,其實不綁定也可。

tcp_connect(pcb_client, &Server_ipaddr, EHOME_SERVER_PORT, Ehome_Client_Connected)

既為客戶端連接到服務器函數,其中pcb_client為客戶端socket,Server_ipaddr為服務器IP,EHOME_SERVER_PORT為所要連接的服務器端口號,這裡為8090(可以直接寫數字“8090”),Ehome_Client_Connected為連接成功後調取的函數。

單片機LWIP協議中客戶端無法連接到服務器問題

在電腦上用TCP&UDP測試工具建立TCP服務器端,端口為8090(單片機程序中設定所要連接到的服務器端口號),然後啟動服務器。

單片機LWIP協議中客戶端無法連接到服務器問題

將前面寫好的程序編譯連接並下載到單片機內運行,可以看到服務器端自動接受到單片機客戶端的連接,併成功接受到信息。

單片機LWIP協議中客戶端無法連接到服務器問題

相關問題答案