|
- /*
- *********************************************************************************************************
- *
- * 模块名称 : TCPnet网络协议栈测试
- * 文件名称 : app_tcpnet_lib.c
- * 版 本 : V1.0
- * 说 明 : 测试的功能说明
- * 1. 强烈推荐将网线接到路由器或者交换机上面测试,因为已经使能了DHCP,可以自动获取IP地址。
- * 2. 客户端的例子相比服务器的例子稍麻烦些,因为客户端的例子需要用户知道电脑端IP和端口号。
- * 并根据实际情况设置IP和端口号的宏定义,这个配置在文件app_tcpnet_lib.c开头,测试的时
- * 候板子要连接这个IP和端口(下面是默认配置,一定要根据实际情况重新配置,如果不会配置,
- * 看本例程对应的教程即可):
- * #define IP1 192
- * #define IP2 168
- * #define IP3 1
- * #define IP4 2
- * #define PORT_NUM 1001
- * 3. 创建了一个TCP Client,而且使能了局域网域名NetBIOS,用户只需在电脑端ping armfly
- * 就可以获得板子的IP地址,本地端口被设置为1024。
- * 4. 用户可以在电脑端用网络调试软件创建TCP Server连接此客户端。
- * 5. 按键K1按下,发送8字节的数据给TCP Server。
- * 6. 按键K2按下,发送1024字节的数据给TCP Server。
- * 7. 按键K3按下,发送5MB字节的数据给TCP Server。
- * 8、摇杆OK键按下,连接远程服务器。
- *
- * 修改记录 :
- * 版本号 日期 作者 说明
- * V1.0 2020-01-09 Eric2013 首发
- *
- * Copyright (C), 2019-2030, 安富莱电子 www.armfly.com
- *
- *********************************************************************************************************
- */
- #include "includes.h"
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
- /*
- *********************************************************************************************************
- * 宏定义,远程服务器的IP和端口
- *********************************************************************************************************
- */
- /* 要访问的远程服务器IP和端口配置,也就是电脑端调试助手设置的IP和端口号 */
- #define IP1 192
- #define IP2 168
- #define IP3 28
- #define IP4 146
- #define PORT_NUM 1001
- /* 这个是本地端口 */
- #define LocalPort_NUM 1024
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- NET_ADDR4 addr = { NET_ADDR_IP4, PORT_NUM, IP1,IP2,IP3,IP4};
- int32_t tcp_sock;
- /* TCPnet API的返回值 */
- static const char * ReVal_Table[]=
- {
- "netOK: Operation succeeded",
- "netBusy: Process is busy",
- "netError: Unspecified error",
- "netInvalidParameter: Invalid parameter specified",
- "netWrongState: Wrong state error",
- "netDriverError: Driver error",
- "netServerError: Server error",
- "netAuthenticationFailed: User authentication failed",
- "netDnsResolverError: DNS host resolver failed",
- "netFileError: File not found or file r/w error",
- "netTimeout: Operation timeout",
- };
- /*
- *********************************************************************************************************
- * 函 数 名: tcp_cb_client
- * 功能说明: TCP Socket的回调函数
- * 形 参: socket 句柄
- * event 事件类型
- * addr NET_ADDR类型变量,记录IP地址,端口号。
- * buf ptr指向的缓冲区记录着接收到的TCP数据。
- * len 记录接收到的数据个数。
- * 返 回 值:
- *********************************************************************************************************
- */
- extern osThreadId_t ThreadIdTaskMsgPro;
- uint32_t tcp_cb_client (int32_t socket, netTCP_Event event,
- const NET_ADDR *addr, const uint8_t *buf, uint32_t len)
- {
- switch (event)
- {
- /*
- 远程客户端连接消息
- 1、数组ptr存储远程设备的IP地址,par中存储端口号。
- 2、返回数值1允许连接,返回数值0禁止连接。
- */
- case netTCP_EventConnect:
- return (1);
- /* Socket远程连接已经建立 */
- case netTCP_EventEstablished:
- printf_debug("Socket is connected to remote peer\r\n");
- break;
- /* 连接断开 */
- case netTCP_EventClosed:
- osThreadFlagsSet(ThreadIdTaskMsgPro, KEY4_BIT3);
- printf_debug("Connection has been closed\r\n");
- break;
- /* 连接终止 */
- case netTCP_EventAborted:
- break;
- /* 发送的数据收到远程设备应答 */
- case netTCP_EventACK:
- break;
- /* 接收到TCP数据帧,ptr指向数据地址,par记录数据长度,单位字节 */
- case netTCP_EventData:
- printf_debug("Data length = %d\r\n", len);
- printf ("%.*s\r\n",len, buf);
- break;
- }
- return (0);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TCPnetTest(void)
- {
- int32_t iCount;
- uint8_t *sendbuf;
- uint32_t maxlen;
- netStatus res;
- const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
- uint32_t EvtFlag;
- tcp_sock = netTCP_GetSocket (tcp_cb_client);
-
- if (tcp_sock > 0)
- {
- /* 使能TCP_TYPE_KEEP_ALIVE,会一直保持连接 */
- netTCP_SetOption (tcp_sock, netTCP_OptionKeepAlive, 1);
- }
- while (1)
- {
-
- EvtFlag = osThreadFlagsWait(0x0000000FU, osFlagsWaitAny, usMaxBlockTime);
-
- /* 按键消息的处理 */
- switch (EvtFlag)
- {
- /* 接收到K1键按下,给远程TCP客户端发送8字节数据 */
- case KEY1_BIT0:
- iCount = 8;
- if(netTCP_GetState(tcp_sock) == netTCP_StateESTABLISHED)
- {
- do
- {
- if(netTCP_SendReady(tcp_sock) == true )
- {
- maxlen = netTCP_GetMaxSegmentSize (tcp_sock);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- sendbuf = netTCP_GetBuffer (maxlen);
- sendbuf[0] = '1';
- sendbuf[1] = '2';
- sendbuf[2] = '3';
- sendbuf[3] = '4';
- sendbuf[4] = '5';
- sendbuf[5] = '6';
- sendbuf[6] = '7';
- sendbuf[7] = '8';
-
- /* 必须使用申请的内存空间 */
- netTCP_Send (tcp_sock, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
- /* 接收到K2键按下,给远程TCP客户端发送1024字节的数据 */
- case KEY2_BIT1:
- iCount = 1024;
- if(netTCP_GetState(tcp_sock) == netTCP_StateESTABLISHED)
- {
- do
- {
- if(netTCP_SendReady(tcp_sock) == true )
- {
- maxlen = netTCP_GetMaxSegmentSize (tcp_sock);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- sendbuf = netTCP_GetBuffer (maxlen);
- sendbuf[0] = '1';
- sendbuf[1] = '2';
- sendbuf[2] = '3';
- sendbuf[3] = '4';
- sendbuf[4] = '5';
- sendbuf[5] = '6';
- sendbuf[6] = '7';
- sendbuf[7] = '8';
-
- /* 必须使用申请的内存空间 */
- netTCP_Send (tcp_sock, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
-
-
- /* 接收到K3键按下,给远程TCP客户端发送5MB数据 */
- case KEY3_BIT2:
- iCount = 5*1024*1024;
- if(netTCP_GetState(tcp_sock) == netTCP_StateESTABLISHED)
- {
- do
- {
- if(netTCP_SendReady(tcp_sock) == true )
- {
- maxlen = netTCP_GetMaxSegmentSize (tcp_sock);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- sendbuf = netTCP_GetBuffer (maxlen);
- sendbuf[0] = '1';
- sendbuf[1] = '2';
- sendbuf[2] = '3';
- sendbuf[3] = '4';
- sendbuf[4] = '5';
- sendbuf[5] = '6';
- sendbuf[6] = '7';
- sendbuf[7] = '8';
-
- /* 必须使用申请的内存空间 */
- netTCP_Send (tcp_sock, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
-
- /* 接收到摇杆OK键按下,连接远程服务器 */
- case KEY4_BIT3:
- if (tcp_sock > 0)
- {
- if(netTCP_GetState(tcp_sock) != netTCP_StateESTABLISHED)
- {
- netTCP_Abort(tcp_sock);
- res = netTCP_Connect (tcp_sock, (NET_ADDR *)&addr, LocalPort_NUM);
- printf_debug("%s\r\n", ReVal_Table[res]);
- }
- }
- break;
-
- /* 其他的键值不处理 */
- default:
- break;
- }
- }
- }
- /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
|
|