FreeRTOS_sockets.h
void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent );
vApplicationIPNetworkEventHook() 是由应用程序定义的钩子
(或回调)函数,当网络连接或断开连接时,TCP/IP
堆栈会调用该函数。 TCP/IP 堆栈调用该函数时,
TCP/IP 集会设置该函数的参数值。
回调函数由应用程序编写器实现,但由
TCP/IP 堆栈调用。 回调函数的原型必须
完全匹配上面的原型(包括函数名称)。
如果 IP 堆栈由于网络已连接调用
vApplicationIPNetworkEventHook(),则 eNetworkEvent 参数的值等于
则 eNetworkEvent 参数的值将等于 eNetworkUp:
-
如果 ipconfigUSE_DHCP 服务器在 FreeRTOS IPConfig.h 中设置为1 ,则
调用 vApplicationIPNetworkEventHook ( eNetworkUp ) ,前提是
已从 DHCP 服务器获得 IP 地址,并且先前从 DHCP 获得的 IP 地址租约
DHCP 获取的 IP 地址的租约被续约时。
-
如果在
FreeRTOSIPConfig.h 中将 ipconfigUSE_DHCP 服务器设置为 0,则下列情形下会调用 vApplicationIPNetworkEventHook( eNetworkUp ):
使用静态 IP 地址初始化网络时。
如果 IP 堆栈由于网络断开而调用
vApplicationIPNetworkEventHook(),则 eNetworkEvent 参数的值为
eNetworkDown:
-
TCP/IP 堆栈调用 vApplicationIPNetworkEventHook( eNetworkDown ),
前提条件是网络驱动程序(以太网外设的接口)已通知
网络连接已断开。 但并非所有驱动程序都能
实现此功能。
应用程序仅调用 vApplicationIPNetworkEventHook()
的条件是在 FreeRTOSIPConfig.h 中将 ipconfigUSE_NETWORK_EVENT_HOOK 设置为 1。
网络事件钩子很适合创建使用 IP 堆栈的任务,
因为它能确保在 TCP/IP 堆栈准备就绪之前不会创建任务。
用法示例:
void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent )
{
uint32_t ulIPAddress, ulNetMask, ulGatewayAddress, ulDNSServerAddress;
static BaseType_t xTasksAlreadyCreated = pdFALSE;
int8_t cBuffer[ 16 ];
if( eNetworkEvent == eNetworkUp )
{
if( xTasksAlreadyCreated == pdFALSE )
{
xTasksAlreadyCreated = pdTRUE;
}
FreeRTOS_GetAddressConfiguration( &ulIPAddress,
&ulNetMask,
&ulGatewayAddress,
&ulDNSServerAddress );
FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );
printf( "IP Address: %srn", cBuffer );
FreeRTOS_inet_ntoa( ulNetMask, cBuffer );
printf( "Subnet Mask: %srn", cBuffer );
FreeRTOS_inet_ntoa( ulGatewayAddress, cBuffer );
printf( "Gateway IP Address: %srn", cBuffer );
FreeRTOS_inet_ntoa( ulDNSServerAddress, cBuffer );
printf( "DNS server IP Address: %srn", cBuffer );
}
}
Example vApplicationIPNetworkEventHook() definition
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.