support PLC socket from Wang_Linyu

it is OK
This commit is contained in:
xuedongliang 2022-03-22 17:25:21 +08:00
commit 5d6d85b068
68 changed files with 1447 additions and 697 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020 AIIT XUOS Lab * Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -11,16 +11,14 @@
*/ */
/** /**
* @file tcp_echo_socket_demo.c * @file lwip_tcp_socket_demo.c
* @brief One UDP demo based on LwIP * @brief TCP socket demo based on LwIP
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-29 * @date 2022-03-21
*/ */
#include <transform.h> #include <transform.h>
#include <xizi.h>
#include "board.h"
#include "sys_arch.h" #include "sys_arch.h"
#include <lwip/sockets.h> #include <lwip/sockets.h>
#include "lwip/sys.h" #include "lwip/sys.h"
@ -28,6 +26,7 @@
#define TCP_DEMO_BUF_SIZE 65535 #define TCP_DEMO_BUF_SIZE 65535
char tcp_socket_ip[] = {192, 168, 250, 252}; char tcp_socket_ip[] = {192, 168, 250, 252};
u16_t tcp_socket_port = LWIP_TARGET_PORT;
/******************************************************************************/ /******************************************************************************/
@ -44,41 +43,46 @@ static void TCPSocketRecvTask(void *arg)
recv_buf = (char *)malloc(TCP_DEMO_BUF_SIZE); recv_buf = (char *)malloc(TCP_DEMO_BUF_SIZE);
if (recv_buf == NULL) if (recv_buf == NULL)
{ {
lw_print("No memory\n"); lw_error("No memory\n");
goto __exit; continue;
} }
fd = socket(AF_INET, SOCK_STREAM, 0); fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) if (fd < 0)
{ {
lw_print("Socket error\n"); lw_error("Socket error\n");
goto __exit; free(recv_buf);
continue;
} }
tcp_addr.sin_family = AF_INET; tcp_addr.sin_family = AF_INET;
tcp_addr.sin_addr.s_addr = INADDR_ANY; tcp_addr.sin_addr.s_addr = INADDR_ANY;
tcp_addr.sin_port = htons(LWIP_LOCAL_PORT); tcp_addr.sin_port = htons(tcp_socket_port);
memset(&(tcp_addr.sin_zero), 0, sizeof(tcp_addr.sin_zero)); memset(&(tcp_addr.sin_zero), 0, sizeof(tcp_addr.sin_zero));
if (bind(fd, (struct sockaddr *)&tcp_addr, sizeof(struct sockaddr)) == -1) if (bind(fd, (struct sockaddr *)&tcp_addr, sizeof(struct sockaddr)) == -1)
{ {
lw_print("Unable to bind\n"); lw_error("Unable to bind\n");
goto __exit; closesocket(fd);
free(recv_buf);
continue;
} }
lw_print("tcp bind success, start to receive.\n"); lw_print("tcp bind success, start to receive.\n");
lw_pr_info("\n\nLocal Port:%d\n\n", LWIP_LOCAL_PORT); lw_notice("\n\nLocal Port:%d\n\n", tcp_socket_port);
// setup socket fd as listening mode // setup socket fd as listening mode
if (listen(fd, 5) != 0 ) if (listen(fd, 5) != 0 )
{ {
lw_print("Unable to listen\n"); lw_error("Unable to listen\n");
goto __exit; closesocket(fd);
free(recv_buf);
continue;
} }
// accept client connection // accept client connection
clientfd = accept(fd, (struct sockaddr *)&tcp_addr, (socklen_t*)&addr_len); clientfd = accept(fd, (struct sockaddr *)&tcp_addr, (socklen_t*)&addr_len);
lw_pr_info("client %s connected\n", inet_ntoa(tcp_addr.sin_addr)); lw_notice("client %s connected\n", inet_ntoa(tcp_addr.sin_addr));
while(1) while(1)
{ {
@ -86,34 +90,31 @@ static void TCPSocketRecvTask(void *arg)
recv_len = recvfrom(clientfd, recv_buf, TCP_DEMO_BUF_SIZE, 0, (struct sockaddr *)&tcp_addr, &addr_len); recv_len = recvfrom(clientfd, recv_buf, TCP_DEMO_BUF_SIZE, 0, (struct sockaddr *)&tcp_addr, &addr_len);
if(recv_len > 0) if(recv_len > 0)
{ {
lw_pr_info("Receive from : %s\n", inet_ntoa(tcp_addr.sin_addr)); lw_notice("Receive from : %s\n", inet_ntoa(tcp_addr.sin_addr));
lw_pr_info("Receive data : %d - %s\n\n", recv_len, recv_buf); lw_notice("Receive data : %d - %s\n\n", recv_len, recv_buf);
} }
sendto(clientfd, recv_buf, recv_len, 0, (struct sockaddr*)&tcp_addr, addr_len); sendto(clientfd, recv_buf, recv_len, 0, (struct sockaddr*)&tcp_addr, addr_len);
} }
__exit:
if (fd >= 0)
closesocket(fd);
if (recv_buf)
free(recv_buf);
} }
closesocket(fd);
free(recv_buf);
} }
void TCPSocketRecvTest(int argc, char *argv[]) void TCPSocketRecvTest(int argc, char *argv[])
{ {
int result = 0; int result = 0;
pthread_t th_id;
pthread_attr_t attr;
if(argc == 2) if(argc >= 2)
{
lw_print("lw: [%s] target ip %s\n", __func__, argv[1]);
if(sscanf(argv[1], "%d.%d.%d.%d:%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3], &tcp_socket_port) == EOK)
{ {
lw_print("lw: [%s] gw %s\n", __func__, argv[1]);
sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]); sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]);
} }
}
lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_socket_ip);
sys_thread_new("TCPSocketRecvTask", TCPSocketRecvTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); sys_thread_new("TCPSocketRecvTask", TCPSocketRecvTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
} }
@ -133,51 +134,51 @@ static void TCPSocketSendTask(void *arg)
if (fd < 0) if (fd < 0)
{ {
lw_print("Socket error\n"); lw_print("Socket error\n");
goto __exit; return;
} }
struct sockaddr_in tcp_sock; struct sockaddr_in tcp_sock;
tcp_sock.sin_family = AF_INET; tcp_sock.sin_family = AF_INET;
tcp_sock.sin_port = htons(LWIP_TARGET_PORT); tcp_sock.sin_port = htons(tcp_socket_port);
tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(tcp_socket_ip[0], tcp_socket_ip[1], tcp_socket_ip[2], tcp_socket_ip[3])); tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(tcp_socket_ip[0], tcp_socket_ip[1], tcp_socket_ip[2], tcp_socket_ip[3]));
memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero));
if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr))) if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr)))
{ {
lw_print("Unable to connect\n"); lw_print("Unable to connect\n");
goto __exit; closesocket(fd);
return;
} }
lw_print("tcp connect success, start to send.\n"); lw_notice("\n\nTarget Port:%d\n\n", tcp_socket_port);
lw_pr_info("\n\nTarget Port:%d\n\n", LWIP_TARGET_PORT);
while (cnt --) while (cnt --)
{ {
lw_print("Lwip client is running.\n"); lw_print("Lwip client is running.\n");
snprintf(send_msg, sizeof(send_msg), "TCP test package times %d\r\n", cnt); snprintf(send_msg, sizeof(send_msg), "TCP test package times %d\r\n", cnt);
sendto(fd, send_msg, strlen(send_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); sendto(fd, send_msg, strlen(send_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr));
lw_pr_info("Send tcp msg: %s ", send_msg); lw_notice("Send tcp msg: %s ", send_msg);
MdelayKTask(1000); MdelayKTask(1000);
} }
__exit:
if (fd >= 0)
closesocket(fd); closesocket(fd);
return; return;
} }
void TCPSocketSendTest(int argc, char *argv[]) void TCPSocketSendTest(int argc, char *argv[])
{ {
if(argc == 2) if(argc >= 2)
{
lw_print("lw: [%s] target ip %s\n", __func__, argv[1]);
if(sscanf(argv[1], "%d.%d.%d.%d:%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3], &tcp_socket_port) == EOK)
{ {
lw_print("lw: [%s] gw %s\n", __func__, argv[1]);
sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]); sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]);
} }
}
lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_socket_ip); lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_socket_ip);
sys_thread_new("tcp socket", TCPSocketSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); sys_thread_new("TCP Socket Send", TCPSocketSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0),

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020 AIIT XUOS Lab * Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -12,33 +12,25 @@
/** /**
* @file lwip_udp_socket_demo.c * @file lwip_udp_socket_demo.c
* @brief One UDP demo based on LwIP * @brief UDP demo based on LwIP
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-29 * @date 2022-03-21
*/ */
#include <transform.h> #include <transform.h>
#include <xizi.h>
#include "board.h"
#include "sys_arch.h" #include "sys_arch.h"
#include "lwip/udp.h" #include "lwip/sockets.h"
#include "lwip/opt.h"
#include <lwip/sockets.h>
#include "lwip/sys.h"
#define UDP_BUF_SIZE 65536 #define UDP_BUF_SIZE 65536
extern char udp_target[];
static struct udp_pcb *udpecho_raw_pcb;
char udp_socket_ip[] = {192, 168, 250, 252}; char udp_socket_ip[] = {192, 168, 250, 252};
u16_t udp_socket_port = LWIP_LOCAL_PORT;
/******************************************************************************/ /*****************************************************************************/
static void UdpSocketRecvTask(void *arg) static void UdpSocketRecvTask(void *arg)
{ {
lw_print("UdpSocketRecvTask start.\n"); int fd = -1;
int socket_fd = -1;
char *recv_buf; char *recv_buf;
struct sockaddr_in udp_addr, server_addr; struct sockaddr_in udp_addr, server_addr;
int recv_len; int recv_len;
@ -49,134 +41,124 @@ static void UdpSocketRecvTask(void *arg)
recv_buf = (char *)malloc(UDP_BUF_SIZE); recv_buf = (char *)malloc(UDP_BUF_SIZE);
if(recv_buf == NULL) if(recv_buf == NULL)
{ {
lw_print("No memory\n"); lw_error("No memory\n");
goto __exit; continue;
} }
socket_fd = socket(AF_INET, SOCK_DGRAM, 0); fd = socket(AF_INET, SOCK_DGRAM, 0);
if(socket_fd < 0) if(fd < 0)
{ {
lw_print("Socket error\n"); lw_error("Socket error\n");
goto __exit; free(recv_buf);
continue;
} }
udp_addr.sin_family = AF_INET; udp_addr.sin_family = AF_INET;
udp_addr.sin_addr.s_addr = INADDR_ANY; udp_addr.sin_addr.s_addr = INADDR_ANY;
udp_addr.sin_port = htons(LWIP_LOCAL_PORT); udp_addr.sin_port = htons(udp_socket_port);
memset(&(udp_addr.sin_zero), 0, sizeof(udp_addr.sin_zero)); memset(&(udp_addr.sin_zero), 0, sizeof(udp_addr.sin_zero));
if(bind(socket_fd, (struct sockaddr *)&udp_addr, sizeof(struct sockaddr)) == -1) if(bind(fd, (struct sockaddr *)&udp_addr, sizeof(struct sockaddr)) == -1)
{ {
lw_print("Unable to bind\n"); lw_error("Unable to bind\n");
goto __exit; closesocket(fd);
free(recv_buf);
continue;
} }
lw_print("UDP bind sucess, start to receive.\n"); lw_notice("UDP bind sucess, start to receive.\n");
lw_print("\n\nLocal Port:%d\n\n", LWIP_LOCAL_PORT); lw_notice("\n\nLocal Port:%d\n\n", udp_socket_port);
while(1) while(1)
{ {
memset(recv_buf, 0, UDP_BUF_SIZE); memset(recv_buf, 0, UDP_BUF_SIZE);
recv_len = recvfrom(socket_fd, recv_buf, UDP_BUF_SIZE, 0, (struct sockaddr *)&server_addr, &addr_len); recv_len = recvfrom(fd, recv_buf, UDP_BUF_SIZE, 0, (struct sockaddr *)&server_addr, &addr_len);
lw_pr_info("Receive from : %s\n", inet_ntoa(server_addr.sin_addr)); if(recv_len > 0)
lw_pr_info("Receive data : %s\n\n", recv_buf); {
sendto(socket_fd, recv_buf, recv_len, 0, (struct sockaddr*)&server_addr, addr_len); lw_notice("Receive from : %s\n", inet_ntoa(server_addr.sin_addr));
lw_notice("Receive data : %s\n\n", recv_buf);
}
sendto(fd, recv_buf, recv_len, 0, (struct sockaddr*)&server_addr, addr_len);
} }
__exit: closesocket(fd);
if(socket_fd >= 0)
{
closesocket(socket_fd);
}
if(recv_buf)
{
free(recv_buf); free(recv_buf);
} }
}
} }
void UdpSocketRecvTask(int argc, char *argv[]) void UdpSocketRecvTest(int argc, char *argv[])
{ {
int result = 0; if(argc >= 2)
pthread_t th_id; {
pthread_attr_t attr; lw_notice("lw: [%s] target ip %s\n", __func__, argv[1]);
if(sscanf(argv[1], "%d.%d.%d.%d:%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3], &udp_socket_port) == EOK)
if(argc == 2)
{ {
lw_print("lw: [%s] gw %s\n", __func__, argv[1]);
sscanf(argv[1], "%d.%d.%d.%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3]); sscanf(argv[1], "%d.%d.%d.%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3]);
} }
}
lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); lwip_config_tcp(lwip_ipaddr, lwip_netmask, udp_socket_ip);
sys_thread_new("UdpSocketRecvTask", UdpSocketRecvTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); sys_thread_new("UdpSocketRecvTask", UdpSocketRecvTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3),
UDPSocketRecv, UdpSocketRecvTask, UDP recv echo); UDPSocketRecv, UdpSocketRecvTest, UDP Receive DEMO);
static void UdpSocketSendTask(void *arg) static void UdpSocketSendTask(void *arg)
{ {
int cnt = LWIP_DEMO_TIMES; int cnt = LWIP_DEMO_TIMES;
char send_str[128]; char send_str[128];
int fd = -1;
lw_print("UdpSocketSendTask start.\n");
int socket_fd = -1;
memset(send_str, 0, sizeof(send_str)); memset(send_str, 0, sizeof(send_str));
socket_fd = socket(AF_INET, SOCK_DGRAM, 0); fd = socket(AF_INET, SOCK_DGRAM, 0);
if(socket_fd < 0) if(fd < 0)
{ {
lw_print("Socket error\n"); lw_error("Socket error\n");
goto __exit; return;
} }
struct sockaddr_in udp_sock; struct sockaddr_in udp_sock;
udp_sock.sin_family = AF_INET; udp_sock.sin_family = AF_INET;
udp_sock.sin_port = htons(LWIP_TARGET_PORT); udp_sock.sin_port = htons(udp_socket_port);
udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_target[0], udp_target[1], udp_target[2], udp_target[3])); udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_socket_ip[0], udp_socket_ip[1], udp_socket_ip[2], udp_socket_ip[3]));
memset(&(udp_sock.sin_zero), 0, sizeof(udp_sock.sin_zero)); memset(&(udp_sock.sin_zero), 0, sizeof(udp_sock.sin_zero));
if(connect(socket_fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr))) if(connect(fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr)))
{ {
lw_print("Unable to connect\n"); lw_error("Unable to connect\n");
goto __exit; closesocket(fd);
return;
} }
lw_print("UDP connect success, start to send.\n"); lw_print("UDP connect success, start to send.\n");
lw_print("\n\nTarget Port:%d\n\n", udp_sock.sin_port); lw_notice("\n\nTarget Port:%d\n\n", udp_sock.sin_port);
while (cnt --) while (cnt --)
{ {
snprintf(send_str, sizeof(send_str), "UDP test package times %d\r\n", cnt); snprintf(send_str, sizeof(send_str), "UDP test package times %d\r\n", cnt);
sendto(socket_fd, send_str, strlen(send_str), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); sendto(fd, send_str, strlen(send_str), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr));
lw_pr_info("Send UDP msg: %s ", send_str); lw_notice("Send UDP msg: %s ", send_str);
MdelayKTask(1000); MdelayKTask(1000);
} }
__exit: closesocket(fd);
if(socket_fd >= 0)
{
closesocket(socket_fd);
}
return; return;
} }
void UdpSocketSendTest(int argc, char *argv[]) void UdpSocketSendTest(int argc, char *argv[])
{ {
int result = 0; if(argc >= 2)
pthread_t th_id; {
pthread_attr_t attr; lw_notice("lw: [%s] target ip %s\n", __func__, argv[1]);
if(sscanf(argv[1], "%d.%d.%d.%d:%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3], &udp_socket_port) == EOK)
if(argc == 2)
{ {
lw_print("lw: [%s] gw %s\n", __func__, argv[1]);
sscanf(argv[1], "%d.%d.%d.%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3]); sscanf(argv[1], "%d.%d.%d.%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3]);
} }
}
lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); lwip_config_tcp(lwip_ipaddr, lwip_netmask, udp_socket_ip);
sys_thread_new("UdpSocketSendTask", UdpSocketSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); sys_thread_new("UdpSocketSendTask", UdpSocketSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
} }

View File

@ -0,0 +1,16 @@
# OPCUA DEMO README
## 文件说明
用于OPCUA 相关测试命令演示需要开启LWIP和OPCUA协议.
### 命令行
UaConnect [IP]
用于测试与OPCUA服务器连接连接成功应显示OK
UaObject [IP]
用于显示对应的OPCUA设备的节点信息

View File

@ -11,7 +11,7 @@
*/ */
/** /**
* @file ua_demo.c * @file opcua_demo.c
* @brief Demo for OpcUa function * @brief Demo for OpcUa function
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
@ -29,7 +29,6 @@
* Definitions * Definitions
******************************************************************************/ ******************************************************************************/
#define TCP_LOCAL_PORT 4840
#define UA_URL_SIZE 100 #define UA_URL_SIZE 100
#define UA_STACK_SIZE 4096 #define UA_STACK_SIZE 4096
#define UA_TASK_PRIO 15 #define UA_TASK_PRIO 15
@ -66,18 +65,17 @@ static void UaConnectTestTask(void* arg)
UA_ClientConfig_setDefault(config); UA_ClientConfig_setDefault(config);
snprintf(ua_uri, sizeof(ua_uri), "opc.tcp://%d.%d.%d.%d:4840", snprintf(ua_uri, sizeof(ua_uri), "opc.tcp://%d.%d.%d.%d:4840",
test_ua_ip[0], test_ua_ip[1], test_ua_ip[2], test_ua_ip[3]); test_ua_ip[0], test_ua_ip[1], test_ua_ip[2], test_ua_ip[3]);
ua_pr_info("ua uri: %d %s\n", strlen(ua_uri), ua_uri); ua_notice("ua uri: %d %s\n", strlen(ua_uri), ua_uri);
retval = UA_Client_connect(client,ua_uri); retval = UA_Client_connect(client,ua_uri);
if(retval != UA_STATUSCODE_GOOD) if(retval != UA_STATUSCODE_GOOD)
{ {
ua_pr_info("ua: [%s] connected failed %x\n", __func__, retval); ua_notice("ua: [%s] connected failed %x\n", __func__, retval);
UA_Client_delete(client); UA_Client_delete(client);
return; return;
} }
ua_pr_info("ua: [%s] connected ok!\n", __func__); ua_notice("ua: [%s] connected ok!\n", __func__);
UA_Client_disconnect(client);
UA_Client_delete(client); UA_Client_delete(client);
} }
@ -92,12 +90,13 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) |
void UaBrowserObjectsTestTask(void* param) void UaBrowserObjectsTestTask(void* param)
{ {
static int test_cnt = 0;
UA_Client* client = UA_Client_new(); UA_Client* client = UA_Client_new();
ua_pr_info("ua: [%s] start ...\n", __func__); ua_notice("ua: [%s] start %d ...\n", __func__, test_cnt++);
if(client == NULL) if(client == NULL)
{ {
ua_print("ua: [%s] tcp client null\n", __func__); ua_error("ua: [%s] tcp client NULL\n", __func__);
return; return;
} }
@ -107,18 +106,17 @@ void UaBrowserObjectsTestTask(void* param)
if(retval != UA_STATUSCODE_GOOD) if(retval != UA_STATUSCODE_GOOD)
{ {
ua_print("ua: [%s] connect failed %#x\n", __func__, retval); ua_error("ua: [%s] connect failed %#x\n", __func__, retval);
UA_Client_delete(client); UA_Client_delete(client);
return; return;
} }
ua_print("ua: [%s] connect ok!\n", __func__); ua_notice("--- start read time ---\n", __func__);
ua_pr_info("--- start read time ---\n", __func__);
ua_read_time(client); ua_read_time(client);
ua_pr_info("--- get server info ---\n", __func__); ua_notice("--- get server info ---\n", __func__);
ua_test_browser_objects(client); ua_test_browser_objects(client);
/* Clean up */ /* Clean up */
UA_Client_disconnect(client);
UA_Client_delete(client); /* Disconnects the client internally */ UA_Client_delete(client); /* Disconnects the client internally */
} }
@ -130,7 +128,7 @@ void* UaBrowserObjectsTest(int argc, char* argv[])
{ {
if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF)
{ {
lw_pr_info("input wrong ip\n"); lw_notice("input wrong ip\n");
return NULL; return NULL;
} }
} }
@ -147,7 +145,7 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) |
void UaGetInfoTestTask(void* param) void UaGetInfoTestTask(void* param)
{ {
UA_Client* client = UA_Client_new(); UA_Client* client = UA_Client_new();
ua_pr_info("ua: [%s] start ...\n", __func__); ua_notice("ua: [%s] start ...\n", __func__);
if(client == NULL) if(client == NULL)
{ {
@ -167,7 +165,7 @@ void UaGetInfoTestTask(void* param)
} }
ua_print("ua: [%s] connect ok!\n", __func__); ua_print("ua: [%s] connect ok!\n", __func__);
ua_pr_info("--- interactive server ---\n", __func__); ua_notice("--- interactive server ---\n", __func__);
ua_test_interact_server(client); ua_test_interact_server(client);
/* Clean up */ /* Clean up */
UA_Client_disconnect(client); UA_Client_disconnect(client);
@ -182,7 +180,7 @@ void* UaGetInfoTest(int argc, char* argv[])
{ {
if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF)
{ {
lw_pr_info("input wrong ip\n"); lw_notice("input wrong ip\n");
return NULL; return NULL;
} }
} }
@ -199,7 +197,7 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) |
void UaAddNodesTask(void* param) void UaAddNodesTask(void* param)
{ {
UA_Client* client = UA_Client_new(); UA_Client* client = UA_Client_new();
ua_pr_info("ua: [%s] start ...\n", __func__); ua_notice("ua: [%s] start ...\n", __func__);
if(client == NULL) if(client == NULL)
{ {
@ -219,7 +217,7 @@ void UaAddNodesTask(void* param)
} }
ua_print("ua: [%s] connect ok!\n", __func__); ua_print("ua: [%s] connect ok!\n", __func__);
ua_pr_info("--- add nodes ---\n", __func__); ua_notice("--- add nodes ---\n", __func__);
ua_add_nodes(client); ua_add_nodes(client);
/* Clean up */ /* Clean up */
UA_Client_disconnect(client); UA_Client_disconnect(client);
@ -234,7 +232,7 @@ void* UaAddNodesTest(int argc, char* argv[])
{ {
if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF)
{ {
lw_pr_info("input wrong ip\n"); lw_notice("input wrong ip\n");
return NULL; return NULL;
} }
} }

View File

@ -0,0 +1,48 @@
# PLC DEMO README
## 文件说明
用于PLC设备相关测试命令演示目前支持OPCUA协议对PLC进行远程控制该命令基于LWIP和OPCUA需要开启相关开关。
多个PLC设备可以组成一个channel用于一条相关业务线控制。
### 命令行
ShowChannel
显示注册到channel上的PLC设备范例如下
ch_type ch_name drv_name dev_name cnt
-----------------------------------------------------------------
PLC_Channel PLC OPCUA PLC Demo 4 1
PLC Demo 3 2
PLC Demo 2 3
PLC Demo 1 4
PLC Demo 0 5
ShowPLC
用于显示PLC范例如下
device vendor model product id
-----------------------------------------------------------------
PLC Demo 4 B&R X20 X20 CP1381 5
PLC Demo 3 B&R X20 X20 CP1586 4
PLC Demo 2 SIEMSNS S7-200 CPU SR60 3
PLC Demo 1 SIEMENS S7-1200 CPU 1215C 2
PLC Demo 0 SIEMENS S7-1500 CPU 1512SP-1PN 1
PlcRead [NodeID]
用于读取PLC节点信息
- [NodeID]: 如n4,1, 其中4代表namespace1代表节点号
PlcWrite
用于写入PLC节点数值
- [NodeID]: 如n4,1, 其中4代表namespace1代表节点号
- [value]: 为写入数值目前支持bool类型和int类型。bool型应为0b(代表false), 1b(代表true)

View File

@ -101,8 +101,6 @@ void PlcReadUATask(void* arg)
if(EOK != ret) if(EOK != ret)
{ {
plc_print("plc: [%s] open failed %#x\n", __func__, ret); plc_print("plc: [%s] open failed %#x\n", __func__, ret);
// free(plc_demo_dev.priv_data);
// plc_demo_dev.priv_data = NULL;
return; return;
} }
@ -163,8 +161,6 @@ void PlcWriteUATask(void* arg)
if(EOK != ret) if(EOK != ret)
{ {
plc_print("plc: [%s] open failed %#x\n", __func__, ret); plc_print("plc: [%s] open failed %#x\n", __func__, ret);
// free(plc_demo_dev.priv_data);
// plc_demo_dev.priv_data = NULL;
return; return;
} }

View File

@ -4,3 +4,7 @@ menuconfig USING_CONTROL_PLC_OPCUA
default y default y
depends on RESOURCES_LWIP depends on RESOURCES_LWIP
menuconfig USING_CONTROL_PLC_SOCKET
bool "PLC support SOCKET"
default y
depends on RESOURCES_LWIP

View File

@ -6,6 +6,10 @@ ifeq ($(CONFIG_USING_CONTROL_PLC_OPCUA), y)
SRC_DIR += opcua SRC_DIR += opcua
endif endif
ifeq ($(CONFIG_USING_CONTROL_PLC_SOCKET), y)
SRC_DIR += socket
endif
endif endif
SRC_FILES += interoperability.c SRC_FILES += interoperability.c

View File

@ -68231,11 +68231,11 @@ UA_Log_Stdout_log(void *context, UA_LogLevel level, UA_LogCategory category,
// (int)(tOffset / UA_DATETIME_SEC / 36), logLevelNames[level], logCategoryNames[category]); // (int)(tOffset / UA_DATETIME_SEC / 36), logLevelNames[level], logCategoryNames[category]);
// vprintf(msg, args); // vprintf(msg, args);
KPrintf("%s/%s" ANSI_COLOR_RESET "\t", ua_print("%s/%s" ANSI_COLOR_RESET "\t",
logLevelNames[level], logCategoryNames[category]); logLevelNames[level], logCategoryNames[category]);
vsnprintf(str, sizeof(str) - 1, msg, args); vsnprintf(str, sizeof(str) - 1, msg, args);
KPrintf(msg, str); ua_print(msg, str);
KPrintf("\n"); ua_print("\n");
// printf("\n"); // printf("\n");
fflush(stdout); fflush(stdout);

View File

@ -28,7 +28,7 @@ int ua_open(void *dev)
param->client = UA_Client_new(); param->client = UA_Client_new();
ua_pr_info("ua: [%s] start ...\n", __func__); ua_notice("ua: [%s] start ...\n", __func__);
if (param->client == NULL) if (param->client == NULL)
{ {
@ -39,11 +39,11 @@ int ua_open(void *dev)
UA_ClientConfig *config = UA_Client_getConfig(param->client); UA_ClientConfig *config = UA_Client_getConfig(param->client);
UA_ClientConfig_setDefault(config); UA_ClientConfig_setDefault(config);
ua_pr_info("ua: [%s] %d %s\n", __func__, strlen(param->ua_remote_ip), param->ua_remote_ip); ua_notice("ua: [%s] %d %s\n", __func__, strlen(param->ua_remote_ip), param->ua_remote_ip);
UA_StatusCode retval = UA_Client_connect(param->client, param->ua_remote_ip); UA_StatusCode retval = UA_Client_connect(param->client, param->ua_remote_ip);
if(retval != UA_STATUSCODE_GOOD) { if(retval != UA_STATUSCODE_GOOD) {
ua_pr_info("ua: [%s] deleted ret %x!\n", __func__, retval); ua_notice("ua: [%s] deleted ret %x!\n", __func__, retval);
return (int)retval; return (int)retval;
} }
return EOK; return EOK;
@ -52,7 +52,6 @@ int ua_open(void *dev)
void ua_close(void *dev) void ua_close(void *dev)
{ {
UaParamType *param = (UaParamType *)dev; UaParamType *param = (UaParamType *)dev;
UA_Client_disconnect(param->client);
UA_Client_delete(param->client); /* Disconnects the client internally */ UA_Client_delete(param->client); /* Disconnects the client internally */
} }

View File

@ -43,8 +43,9 @@ typedef struct UaParam
#define ua_print //KPrintf #define ua_print //KPrintf
#define ua_trace() //KPrintf("ua: [%s] line %d checked!\n", __func__, __LINE__) #define ua_trace() //KPrintf("ua: [%s] line %d checked!\n", __func__, __LINE__)
#define ua_pr_info KPrintf #define ua_notice KPrintf
#define ua_debug //KPrintf #define ua_debug //KPrintf
#define ua_error KPrintf
extern const char *opc_server_url; extern const char *opc_server_url;
extern char test_ua_ip[]; extern char test_ua_ip[];

View File

@ -42,7 +42,7 @@ static UA_StatusCode nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId
} }
UA_NodeId* parent = (UA_NodeId*)handle; UA_NodeId* parent = (UA_NodeId*)handle;
ua_pr_info("%d, %d --- %d ---> NodeId %d, %d\n", ua_notice("%d, %d --- %d ---> NodeId %d, %d\n",
parent->namespaceIndex, parent->identifier.numeric, parent->namespaceIndex, parent->identifier.numeric,
referenceTypeId.identifier.numeric, childId.namespaceIndex, referenceTypeId.identifier.numeric, childId.namespaceIndex,
childId.identifier.numeric); childId.identifier.numeric);
@ -81,38 +81,38 @@ void ua_print_value(UA_Variant* val)
if(val->type == &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]) if(val->type == &UA_TYPES[UA_TYPES_LOCALIZEDTEXT])
{ {
UA_LocalizedText* ptr = (UA_LocalizedText*)val->data; UA_LocalizedText* ptr = (UA_LocalizedText*)val->data;
ua_pr_info("%.*s (Text)\n", ptr->text.length, ptr->text.data); ua_notice("%.*s (Text)\n", ptr->text.length, ptr->text.data);
} }
else if(val->type == &UA_TYPES[UA_TYPES_UINT32]) else if(val->type == &UA_TYPES[UA_TYPES_UINT32])
{ {
UA_UInt32* ptr = (UA_UInt32*)val->data; UA_UInt32* ptr = (UA_UInt32*)val->data;
ua_pr_info("%d (UInt32)\n", *ptr); ua_notice("%d (UInt32)\n", *ptr);
} }
else if(val->type == &UA_TYPES[UA_TYPES_BOOLEAN]) else if(val->type == &UA_TYPES[UA_TYPES_BOOLEAN])
{ {
UA_Boolean* ptr = (UA_Boolean*)val->data; UA_Boolean* ptr = (UA_Boolean*)val->data;
ua_pr_info("%i (BOOL)\n", *ptr); ua_notice("%i (BOOL)\n", *ptr);
} }
else if(val->type == &UA_TYPES[UA_TYPES_INT32]) else if(val->type == &UA_TYPES[UA_TYPES_INT32])
{ {
UA_Int32* ptr = (UA_Int32*)val->data; UA_Int32* ptr = (UA_Int32*)val->data;
ua_pr_info("%d (Int32)\n", *ptr); ua_notice("%d (Int32)\n", *ptr);
} }
else if(val->type == &UA_TYPES[UA_TYPES_INT16]) else if(val->type == &UA_TYPES[UA_TYPES_INT16])
{ {
UA_Int16* ptr = (UA_Int16*)val->data; UA_Int16* ptr = (UA_Int16*)val->data;
ua_pr_info("%d (Int16)\n", *ptr); ua_notice("%d (Int16)\n", *ptr);
} }
else if(val->type == &UA_TYPES[UA_TYPES_STRING]) else if(val->type == &UA_TYPES[UA_TYPES_STRING])
{ {
UA_String* ptr = (UA_String*)val->data; UA_String* ptr = (UA_String*)val->data;
ua_pr_info("%*.s (String)\n", ptr->length, ptr->data); ua_notice("%*.s (String)\n", ptr->length, ptr->data);
} }
else if(val->type == &UA_TYPES[UA_TYPES_DATETIME]) else if(val->type == &UA_TYPES[UA_TYPES_DATETIME])
{ {
UA_DateTime* ptr = (UA_DateTime*)val->data; UA_DateTime* ptr = (UA_DateTime*)val->data;
UA_DateTimeStruct dts = UA_DateTime_toStruct(*ptr); UA_DateTimeStruct dts = UA_DateTime_toStruct(*ptr);
ua_pr_info("%d-%d-%d %d:%d:%d.%03d (Time)\n", ua_notice("%d-%d-%d %d:%d:%d.%03d (Time)\n",
dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec); dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
} }
} }
@ -144,14 +144,14 @@ void ua_print_nodeid(UA_NodeId *node_id)
switch(node_id->identifierType) switch(node_id->identifierType)
{ {
case UA_NODEIDTYPE_NUMERIC: case UA_NODEIDTYPE_NUMERIC:
ua_pr_info(" NodeID n%d,%d ", node_id->namespaceIndex, node_id->identifier.numeric); ua_notice(" NodeID n%d,%d ", node_id->namespaceIndex, node_id->identifier.numeric);
break; break;
case UA_NODEIDTYPE_STRING: case UA_NODEIDTYPE_STRING:
ua_pr_info(" NodeID n%d,%.*s ", node_id->namespaceIndex, node_id->identifier.string.length, ua_notice(" NodeID n%d,%.*s ", node_id->namespaceIndex, node_id->identifier.string.length,
node_id->identifier.string.data); node_id->identifier.string.data);
break; break;
case UA_NODEIDTYPE_BYTESTRING: case UA_NODEIDTYPE_BYTESTRING:
ua_pr_info(" NodeID n%d,%s ", node_id->namespaceIndex, node_id->identifier.byteString.data); ua_notice(" NodeID n%d,%s ", node_id->namespaceIndex, node_id->identifier.byteString.data);
break; break;
default: default:
break; break;
@ -160,7 +160,7 @@ void ua_print_nodeid(UA_NodeId *node_id)
void ua_print_object(UA_BrowseResponse* res) void ua_print_object(UA_BrowseResponse* res)
{ {
ua_pr_info("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME"); ua_notice("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME");
for(size_t i = 0; i < res->resultsSize; ++i) for(size_t i = 0; i < res->resultsSize; ++i)
{ {
@ -170,14 +170,14 @@ void ua_print_object(UA_BrowseResponse* res)
if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_NUMERIC) if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_NUMERIC)
{ {
ua_pr_info("%-9d %-16d %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, ua_notice("%-9d %-16d %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex,
ref->nodeId.nodeId.identifier.numeric, (int)ref->browseName.name.length, ref->nodeId.nodeId.identifier.numeric, (int)ref->browseName.name.length,
ref->browseName.name.data, (int)ref->displayName.text.length, ref->browseName.name.data, (int)ref->displayName.text.length,
ref->displayName.text.data); ref->displayName.text.data);
} }
else if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_STRING) else if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_STRING)
{ {
ua_pr_info("%-9d %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, ua_notice("%-9d %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex,
(int)ref->nodeId.nodeId.identifier.string.length, (int)ref->nodeId.nodeId.identifier.string.length,
ref->nodeId.nodeId.identifier.string.data, ref->nodeId.nodeId.identifier.string.data,
(int)ref->browseName.name.length, ref->browseName.name.data, (int)ref->browseName.name.length, ref->browseName.name.data,
@ -188,7 +188,7 @@ void ua_print_object(UA_BrowseResponse* res)
} }
} }
ua_pr_info("\n"); ua_notice("\n");
} }
UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValueId* array) UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValueId* array)
@ -203,7 +203,7 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu
|| (response.resultsSize != array_size)) || (response.resultsSize != array_size))
{ {
UA_ReadResponse_clear(&response); UA_ReadResponse_clear(&response);
ua_pr_info("ua: [%s] read failed 0x%x\n", __func__, ua_notice("ua: [%s] read failed 0x%x\n", __func__,
response.responseHeader.serviceResult); response.responseHeader.serviceResult);
return UA_STATUSCODE_BADUNEXPECTEDERROR; return UA_STATUSCODE_BADUNEXPECTEDERROR;
} }
@ -215,11 +215,11 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu
if((response.results[i].status == UA_STATUSCODE_GOOD) if((response.results[i].status == UA_STATUSCODE_GOOD)
&& (response.results[i].hasValue)) && (response.results[i].hasValue))
{ {
ua_pr_info("node %s: ", ua_get_nodeid_str(&array[i].nodeId)); ua_notice("node %s: ", ua_get_nodeid_str(&array[i].nodeId));
ua_print_value(&response.results[i].value); ua_print_value(&response.results[i].value);
} }
} }
ua_pr_info("\n"); ua_notice("\n");
free(arr_ret); free(arr_ret);
UA_ReadResponse_clear(&response); UA_ReadResponse_clear(&response);
@ -229,7 +229,7 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu
void ua_browser_id(UA_Client* client, UA_NodeId id) void ua_browser_id(UA_Client* client, UA_NodeId id)
{ {
/* Browse some objects */ /* Browse some objects */
ua_pr_info("Browsing nodes in objects folder:\n"); ua_notice("Browsing nodes in objects folder:\n");
UA_BrowseRequest bReq; UA_BrowseRequest bReq;
UA_BrowseRequest_init(&bReq); UA_BrowseRequest_init(&bReq);
bReq.requestedMaxReferencesPerNode = 0; bReq.requestedMaxReferencesPerNode = 0;
@ -327,7 +327,7 @@ void ua_write_nodeid_value(UA_Client* client, UA_NodeId id, char* value)
if(wResp.responseHeader.serviceResult == UA_STATUSCODE_GOOD) if(wResp.responseHeader.serviceResult == UA_STATUSCODE_GOOD)
{ {
ua_pr_info("write new value is: %s\n", value); ua_notice("write new value is: %s\n", value);
} }
UA_WriteRequest_clear(&wReq); UA_WriteRequest_clear(&wReq);
@ -489,7 +489,7 @@ void ua_read_time(UA_Client* client)
{ {
UA_DateTime raw_date = *(UA_DateTime*) value.data; UA_DateTime raw_date = *(UA_DateTime*) value.data;
UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date); UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);
ua_pr_info("date is: %d-%d-%d %d:%d:%d.%03d\n", ua_notice("date is: %d-%d-%d %d:%d:%d.%03d\n",
dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec); dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
} }

View File

@ -53,7 +53,7 @@ void ua_test_browser_objects(UA_Client *client)
ua_browser_id(client, UA_TEST_BROWSER_NODEID); ua_browser_id(client, UA_TEST_BROWSER_NODEID);
ua_browser_id(client, UA_TEST_BROWSER_NODEID1); ua_browser_id(client, UA_TEST_BROWSER_NODEID1);
test_id = UA_TEST_BROWSER_NODEID1; test_id = UA_TEST_BROWSER_NODEID1;
ua_pr_info("Show values in %s:\n", ua_get_nodeid_str(&test_id)); ua_notice("Show values in %s:\n", ua_get_nodeid_str(&test_id));
ua_test_read_array(client); ua_test_read_array(client);
return; return;
} }
@ -64,11 +64,11 @@ void ua_test_write_attr(UA_Client *client)
char val_str[UA_NODE_LEN]; char val_str[UA_NODE_LEN];
UA_NodeId id = UA_TEST_WRITE_NODEID; UA_NodeId id = UA_TEST_WRITE_NODEID;
ua_pr_info("--- Test write %s ---\n", ua_get_nodeid_str(&id)); ua_notice("--- Test write %s ---\n", ua_get_nodeid_str(&id));
ua_read_nodeid_value(client, id, &value); ua_read_nodeid_value(client, id, &value);
ua_write_nodeid_value(client, id, itoa(value + 1, val_str, 10)); ua_write_nodeid_value(client, id, itoa(value + 1, val_str, 10));
ua_read_nodeid_value(client, id, &value); ua_read_nodeid_value(client, id, &value);
ua_pr_info("\n"); ua_notice("\n");
} }
int ua_test_interact_server(UA_Client *client) int ua_test_interact_server(UA_Client *client)

View File

@ -0,0 +1,11 @@
menuconfig USING_CONTROL_PLC_OPCUA
bool "PLC support OPCUA"
default y
depends on RESOURCES_LWIP
menuconfig USING_CONTROL_PLC_SOCKET
bool "PLC support SOCKET"
default y
depends on RESOURCES_LWIP

View File

@ -0,0 +1,4 @@
SRC_FILES := plc_socket.c
include $(KERNEL_ROOT)/compiler.mk

View File

@ -0,0 +1,18 @@
# PLC SOCKET README
## 文件说明
用于测试PLC socket通信. 通过建立与制定IP的PLC设备的socket连接, 发送命令给PLC设备, 实现相关功能. 实现该功能需要开启LWIP, 同时需要扩大shell的栈大小和内存空间。
### 命令行
PLCSocket ip=[PLC IP] port=[PLC port] tcp=[1: TCP; 0: UDP] cmd=[相关命令] file=[制定配置文件]
配置文件支持json格式, 默认文件名为socket_param.json, 放置于plc目录下, 文件内容如下:
{
"ip": "192.168.250.6",
"port": 102,
"tcp": 1,
"cmd": [x, x, x]
}

View File

@ -0,0 +1,364 @@
/*
* Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file plc_socket.c
* @brief Demo for PLC socket communication function
* @version 1.0
* @author AIIT XUOS Lab
* @date 2022.03.16
*/
#include "transform.h"
#include "plc_socket.h"
#include "sys_arch.h"
#include "lwip/sockets.h"
#include "control_file.h"
// max support plc socket test commands number
#define PLC_SOCK_CMD_NUM CTL_CMD_NUM
#define PLC_SOCK_TIMEOUT 50000
// for saving PLC command index
int plc_cmd_index = 0;
// only for test
#define SUPPORT_PLC_SIEMENS
//siemens test
PlcBinCmdType TestPlcCmd[PLC_SOCK_CMD_NUM] = {0};
//Test information
//SIEMENS ip: 192.168.250.9 port: 102
//S7-200 ip: 192.168.250.8 port: 102
//S7-1200 ip: 192.168.250.6 port: 102
//OML ip: 192.168.250.3 port: 9600
PlcSocketParamType plc_socket_demo_data = {
#ifdef SUPPORT_PLC_SIEMENS
.ip = {192, 168, 250, 6},
.port = 102,
.device_type = PLC_DEV_TYPE_SIEMENS,
.socket_type = SOCK_STREAM,
.cmd_num = 3,
#else
.ip = {192, 168, 250, 3},
.port = 9600,
.device_type = PLC_DEV_TYPE_OML,
.socket_type = SOCK_DGRAM,
.cmd_num = 1,
#endif
.recv_len = PLC_RECV_BUF_LEN,
.recv_buf = NULL,
};
#define OML_HEADER_LEN 78
#define CHECK_OML_HEADER(_s) ((0xC0 == *(_s)) && (0x00 == *(_s + 1)) && (0x02 == *(_s + 2)) && (0x00 == *(_s + 3)))
/******************************************************************************/
static void plc_print_array(char *title, int size, uint8_t *cmd)
{
lw_notice("%s : %d - ", title, size);
for(int i = 0; i < size; i++)
{
lw_notice(" %#x", cmd[i]);
}
lw_notice("\n");
}
static void *PlcSocketStart(void *arg)
{
int fd = -1;
int timeout, recv_len;
struct sockaddr_in sock_addr;
socklen_t addr_len = sizeof(struct sockaddr_in);
PlcSocketParamType *param = (PlcSocketParamType *)&plc_socket_demo_data;
plc_print("start %d.%d.%d.%d:%d dev %d sock %d\n",
param->ip[0],
param->ip[1],
param->ip[2],
param->ip[3],
param->port,
param->device_type,
param->socket_type);
param->recv_len = PLC_RECV_BUF_LEN;
//malloc memory
param->recv_buf = (char *)malloc(param->recv_len);
if (param->recv_buf == NULL)
{
plc_error("No memory\n");
return NULL;
}
fd = socket(AF_INET, param->socket_type, 0);
if (fd < 0)
{
plc_error("Socket error %d\n", param->socket_type);
free(param->recv_buf);
return NULL;
}
plc_print("start %d.%d.%d.%d:%d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3], param->port);
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(param->port);
sock_addr.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(param->ip[0], param->ip[1], param->ip[2], param->ip[3]));
memset(&(sock_addr.sin_zero), 0, sizeof(sock_addr.sin_zero));
if (connect(fd, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr)) < 0)
{
plc_error("Unable to connect\n");
closesocket(fd);
free(param->recv_buf);
return NULL;
}
lw_notice("client %s connected\n", inet_ntoa(sock_addr.sin_addr));
for(int i = 0; i < param->cmd_num; i ++)
{
PlcBinCmdType *cmd = &TestPlcCmd[i];
sendto(fd, cmd->cmd, cmd->cmd_len, 0, (struct sockaddr*)&sock_addr, addr_len);
plc_print_array("Send cmd", cmd->cmd_len, cmd->cmd);
MdelayKTask(cmd->delay_ms);
timeout = PLC_SOCK_TIMEOUT;
memset(param->recv_buf, 0, param->recv_len);
while(timeout --)
{
recv_len = recvfrom(fd, param->recv_buf, param->recv_len, 0, (struct sockaddr *)&sock_addr, &addr_len);
if(recv_len > 0)
{
if(param->device_type == PLC_DEV_TYPE_OML)
{
if((recv_len == OML_HEADER_LEN) && (CHECK_OML_HEADER(param->recv_buf)))
{
lw_notice("This is Oml package!!!\n");
}
}
lw_notice("Receive from : %s\n", inet_ntoa(sock_addr.sin_addr));
plc_print_array("Receive data", recv_len, param->recv_buf);
break;
}
}
}
closesocket(fd);
free(param->recv_buf);
return NULL;
}
void PlcGetParamCmd(char *cmd)
{
const char s[2] = ",";
char *token;
uint16_t cmd_index = 0;
char bin_cmd[PLC_BIN_CMD_LEN] = {0};
token = strtok(cmd, s);
while(token != NULL)
{
sscanf(token, "%x", &bin_cmd[cmd_index]);
plc_print("%d - %s %d\n", cmd_index, token, bin_cmd[cmd_index]);
token = strtok(NULL, s);
cmd_index ++;
}
TestPlcCmd[plc_cmd_index].cmd_len = cmd_index;
memcpy(TestPlcCmd[plc_cmd_index].cmd, bin_cmd, cmd_index);
plc_print("get %d cmd len %d\n", plc_cmd_index, TestPlcCmd[plc_cmd_index].cmd_len);
plc_cmd_index ++;
plc_socket_demo_data.cmd_num = plc_cmd_index;
}
void PlcShowUsage(void)
{
plc_notice("------------------------------------\n");
plc_notice("PlcSocket [ip].[ip].[ip].[ip]:[port]\n");
plc_notice("PlcSocket support other param:\n");
plc_notice("plc=[] 0: OML 1:SIEMENS\n");
plc_notice("tcp=[] 0: udp 1:tcp\n");
plc_notice("ip=[ip.ip.ip.ip]\n");
plc_notice("port=port\n");
plc_notice("file: use %s\n", PLC_SOCK_FILE_NAME);
plc_notice("------------------------------------\n");
}
#if defined(MOUNT_SDCARD) && defined(LIB_USING_CJSON)
void PlcGetParamFromFile(char *file_name)
{
PlcSocketParamType *param = &plc_socket_demo_data;
char *file_buf = malloc(CTL_FILE_LEN);
if(file_buf == NULL)
{
plc_error("No enough buffer %d\n", CTL_FILE_LEN);
return;
}
memset(file_buf, 0, CTL_FILE_LEN);
if(CtlFileReadWithFilename(file_name, CTL_FILE_LEN, file_buf) != EOK)
{
plc_error("Can't open file %s\n", file_name);
//try again default file
if(strcmp(file_name, PLC_SOCK_FILE_NAME) != 0)
{
if(CtlFileReadWithFilename(PLC_SOCK_FILE_NAME, CTL_FILE_LEN, file_buf) != EOK)
{
plc_error("Can't open file %s\n", file_name);
return;
}
}
else
{
return;
}
}
CtlParseJsonData(file_buf);
memcpy(param->ip, ctl_file_param.ip, 4);
param->port = ctl_file_param.port;
param->cmd_num = ctl_file_param.cmd_num;
param->socket_type = ctl_file_param.tcp ? SOCK_STREAM : SOCK_DGRAM;
for(int i = 0; i < param->cmd_num; i++)
{
TestPlcCmd[i].cmd_len = ctl_file_param.cmd_len[i];
memcpy(TestPlcCmd[i].cmd, ctl_file_param.cmd[i], TestPlcCmd[i].cmd_len);
}
plc_print("ip: %d.%d.%d.%d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3]);
plc_print("port: %d", param->port);
plc_print("tcp: %d", param->socket_type);
plc_print("cmd number: %d\n", param->cmd_num);
for(int i = 0; i < param->cmd_num; i++)
{
plc_print_array("cmd", TestPlcCmd[i].cmd_len, TestPlcCmd[i].cmd);
}
free(file_buf);
}
#endif
void PlcCheckParam(int argc, char *argv[])
{
int i;
PlcSocketParamType *param = &plc_socket_demo_data;
plc_cmd_index = 0;
for(i = 0; i < argc; i++)
{
char *str = argv[i];
int is_tcp = 0;
char cmd_str[PLC_BIN_CMD_LEN] = {0};
plc_print("check %d %s\n", i, str);
#if defined(MOUNT_SDCARD) && defined(LIB_USING_CJSON)
if(strncmp(str, "file", 4) == 0)
{
char file_name[CTL_FILE_NAME_LEN] = {0};
if(sscanf(str, "file=%s", file_name) == EOF)
{
strcpy(file_name, PLC_SOCK_FILE_NAME);
}
plc_notice("get %s parameter file %s\n", str, file_name);
PlcGetParamFromFile(file_name);
return;
}
#endif
if(sscanf(str, "ip=%d.%d.%d.%d",
&param->ip[0],
&param->ip[1],
&param->ip[2],
&param->ip[3]) == 4)
{
plc_print("find ip %d %d %d %d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3]);
continue;
}
if(sscanf(str, "port=%d", &param->port) == 1)
{
plc_print("find port %d\n", param->port);
continue;
}
if(sscanf(str, "tcp=%d", &is_tcp) == 1)
{
plc_print("find tcp %d\n", is_tcp);
param->socket_type = is_tcp ? SOCK_STREAM:SOCK_DGRAM;
continue;
}
if(sscanf(str, "plc=%d", &param->device_type) == 1)
{
plc_print("find device %d\n", param->device_type);
continue;
}
if(sscanf(str, "cmd=%s", cmd_str) == 1)
{
plc_print("find cmd %s\n", cmd_str);
PlcGetParamCmd(cmd_str);
continue;
}
}
if(argc >= 2)
{
if(sscanf(argv[1], "%d.%d.%d.%d:%d",
&param->ip[0],
&param->ip[1],
&param->ip[2],
&param->ip[3],
&param->port) != EOF)
{
return;
}
if(sscanf(argv[1], "%d.%d.%d.%d",
&param->ip[0],
&param->ip[1],
&param->ip[2],
&param->ip[3]) != EOF)
{
return;
}
}
else
{
PlcShowUsage();
}
}
void PlcSocketTask(int argc, char *argv[])
{
int result = 0;
pthread_t th_id;
pthread_attr_t attr;
attr.schedparam.sched_priority = LWIP_DEMO_TASK_PRIO;
attr.stacksize = LWIP_TASK_STACK_SIZE;
PlcSocketParamType *param = &plc_socket_demo_data;
PlcCheckParam(argc, argv);
lwip_config_net(lwip_ipaddr, lwip_netmask, param->ip);
PrivTaskCreate(&th_id, &attr, PlcSocketStart, param);
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3),
PlcSocket, PlcSocketTask, Test PLC Socket);

View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file plc_socket.h
* @brief Demo for PLC socket communication function
* @version 1.0
* @author AIIT XUOS Lab
* @date 2022.03.16
*/
#ifndef __PLC_SOCKET_H_
#define __PLC_SOCKET_H_
#define PLC_BIN_CMD_LEN 512
// for plc socket test bin commands
typedef struct
{
uint16_t delay_ms;
uint8_t cmd_len;
uint8_t cmd[PLC_BIN_CMD_LEN];
}PlcBinCmdType;
enum PlcDeviceType {
PLC_DEV_TYPE_OML = 0,
PLC_DEV_TYPE_IPC,
PLC_DEV_TYPE_BRL,
PLC_DEV_TYPE_SIEMENS,
PLC_DEV_TYPE_SIEMENS_1200,
PLC_DEV_TYPE_JF_IPC,
PLC_DEV_TYPE_HG,
/* ...... */
PLC_DEV_TYPE_END,
};
#define PLC_IP_LEN 16
#define PLC_DEV_NAME_LEN 32
#define PLC_RECV_BUF_LEN CTL_FILE_LEN
typedef struct PlcSocketParamStruct{
char ip[PLC_IP_LEN];
uint32_t port;
uint32_t device_type; //PlcDeviceType
uint32_t socket_type; //UDP or TCP
char device[PLC_DEV_NAME_LEN];
uint32_t cmd_num; // command number
uint32_t recv_len; // receive length
uint8_t *recv_buf; // receive buffer
}PlcSocketParamType;
//debug command
#define plc_print //KPrintf
#define plc_error KPrintf
#define plc_notice KPrintf
#endif

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 AIIT XUOS Lab * Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:

View File

@ -1,4 +1,8 @@
SRC_FILES := control.c SRC_FILES := control.c
ifeq ($(CONFIG_MOUNT_SDCARD),y)
SRC_FILES += control_file.c
endif
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -0,0 +1,213 @@
/*
* Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file control_file.c
* @brief control relative file operation
* @version 1.0
* @author AIIT XUOS Lab
* @date 2022-03-17
*/
#include <stdio.h>
#include "cJSON.h"
#include "transform.h"
#include "control_file.h"
//json file parameter for PLC socket communication as below:
//{
// "ip": "192.168.250.6",
// "port": 102,
// "cmd": [3, 0, 0, 22, 17, 224, 0, 0, 2, 200, 0, 193, 2, 2, 1, 194, 2, 2, 1, 192, 1, 10],
// "cmd1": [3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 0, 0, 13, 0, 8, 0, 0, 240, 0, 0, 1, 0, 1, 0, 240], \r\n" \
// "cmd2": [3, 0, 0, 31, 2, 240, 128, 50, 1, 0, 0, 51, 1, 0, 14, 0, 0, 4, 1, 18, 10, 16, 2, 0, 210, 0, 52, 132, 0, 0, 0]\r\n" \
//}"
#define TEST_PLC_JSON_TXT \
"{ \r\n"\
" \"ip\": \"192.168.250.6\", \r\n"\
" \"port\": 102, \r\n"\
" \"tcp\": 1, \r\n"\
" \"cmd\": [3, 0, 0, 22, 17, 224, 0, 0, 2, 200, 0, 193, 2, 2, 1, 194, 2, 2, 1, 192, 1, 10], \r\n"\
" \"cmd1\": [3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 0, 0, 13, 0, 8, 0, 0, 240, 0, 0, 1, 0, 1, 0, 240], \r\n" \
" \"cmd2\": [3, 0, 0, 31, 2, 240, 128, 50, 1, 0, 0, 51, 1, 0, 14, 0, 0, 4, 1, 18, 10, 16, 2, 0, 210, 0, 52, 132, 0, 0, 0]\r\n" \
"}"
CtlPlcSockParamType ctl_file_param;
FILE *CtlFileInit(char *file)
{
FILE *fd = NULL;
#ifdef MOUNT_SDCARD
// SD card mount flag 1: OK
if(sd_mount_flag == 0)
{
ctl_error("SD card mount failed\n");
return NULL;
}
fd = fopen(file, "a+");
if(fd == NULL)
{
ctl_error("open file %s failed\n", file);
}
#endif
return fd;
}
void CtlFileClose(FILE *fd)
{
fclose(fd);
}
void CtlFileRead(FILE *fd, int size, char *buf)
{
fseek(fd, 0, SEEK_SET);
fread(buf, size, 1, fd);
ctl_print("read file %d: %.100s\n", size, buf);
}
void CtlFileWrite(FILE *fd, int size, char *buf)
{
size_t write_size = 0;
write_size = fwrite(buf, strlen(buf) + 1, 1, fd);
ctl_print("write size %d: %s\n", size, buf);
}
int CtlFileReadWithFilename(char *file, int size, char *buf)
{
FILE *fd;
fd = fopen(file, "r");
if(fd == NULL)
{
ctl_error("open file %s failed\n", file);
return EEMPTY;
}
fseek(fd, 0, SEEK_SET);
fread(buf, size, 1, fd);
ctl_print("read file %d: %.100s\n", size, buf);
return EOK;
}
void CtlCreateFileTest(void)
{
FILE *fd = CtlFileInit(PLC_SOCK_FILE_NAME);
if(fd == NULL)
return;
char *file_buf = TEST_PLC_JSON_TXT;
CtlFileWrite(fd, strlen(file_buf), file_buf);
CtlFileClose(fd);
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0),
CtlCreateFile, CtlCreateFileTest, Test control file);
#ifdef LIB_USING_CJSON
void CtlParseJsonArray(cJSON *dat, int *cmd_len, char *cmd)
{
int len, i;
if(cJSON_IsArray(dat))
{
len = cJSON_GetArraySize(dat);
ctl_print("json cmd %d\n", len);
for(i = 0; i < len; i++)
{
cJSON *cmd_val = cJSON_GetArrayItem(dat, i);
if(NULL == cmd_val)
continue;
ctl_print("0x%x ", cmd_val->valueint);
cmd[i] = cmd_val->valueint;
}
*cmd_len = len;
ctl_print("\n");
}
}
void CtlParseJsonData(char *buf)
{
cJSON *file_dat = NULL;
cJSON *ip_dat = NULL;
cJSON *port_dat = NULL;
cJSON *tcp_dat = NULL;
cJSON *cmd_dat = NULL;
char cmd_title[10] = {"cmd"};
CtlPlcSockParamType *file_param = &ctl_file_param;
file_dat = cJSON_Parse(buf);
if(file_dat == NULL)
{
ctl_error("ctrl parse failed\n");
return;
}
ip_dat = cJSON_GetObjectItem(file_dat, "ip");
port_dat = cJSON_GetObjectItem(file_dat, "port");
tcp_dat = cJSON_GetObjectItem(file_dat, "tcp");
ctl_print(" ip : %s\n", ip_dat->valuestring);
sscanf(ip_dat->valuestring, "%d.%d.%d.%d", &file_param->ip[0],
&file_param->ip[1],
&file_param->ip[2],
&file_param->ip[3]);
ctl_print(" port: %s %d\n", ip_dat->string, port_dat->valueint);
file_param->port = port_dat->valueint;
file_param->tcp = tcp_dat->valueint;
file_param->cmd_num = 0;
for(int i = 0; i < CTL_CMD_NUM; i++)
{
cmd_dat = cJSON_GetObjectItem(file_dat, cmd_title);
if(!cmd_dat)
break;
CtlParseJsonArray(cmd_dat, &file_param->cmd_len[i], file_param->cmd[i]);
snprintf(cmd_title, sizeof(cmd_title), "cmd%d", ++file_param->cmd_num);
}
cJSON_Delete(file_dat);
}
void CtlParseFileTest(void)
{
//for PLC socket parameter file
FILE *fd = CtlFileInit(PLC_SOCK_FILE_NAME);
if(fd == NULL)
{
ctl_error("ctl get file %s failed\n", PLC_SOCK_FILE_NAME);
return;
}
char *file_buf = malloc(CTL_FILE_LEN);
if(file_buf == NULL)
{
ctl_error("ctl malloc failed\n");
return;
}
memset(file_buf, 0, CTL_FILE_LEN);
CtlFileRead(fd, CTL_FILE_LEN, file_buf);
CtlFileClose(fd);
CtlParseJsonData(file_buf);
free(file_buf);
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0),
CtlParseFile, CtlParseFileTest, Parse control file);
#endif

View File

@ -0,0 +1,59 @@
/*
* Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file control_file.h
* @brief control relative API
* @version 1.0
* @author AIIT XUOS Lab
* @date 2022-03-17
*/
#ifndef __CONTROL_FILE_H_
#define __CONTROL_FILE_H_
#define CTL_FILE_LEN 1000 // control file size
#define CTL_CMD_NUM 10 // support command number
#define CTL_CMD_LEN 100 // control command length
#define CTL_IP_LEN 32 // IP address length
#define CTL_FILE_NAME_LEN 100 // file name length
#define PLC_SOCK_FILE_NAME "/plc/socket_param.json"
#define ctl_print //KPrintf
#define ctl_error KPrintf
// for running plc socket
typedef struct CtlPlcSockParamStruct
{
char ip[CTL_IP_LEN];
int port;
int tcp; // 1: TCP 0: UDP
int cmd_num; //command number
int cmd_len[CTL_CMD_NUM]; // command length
char cmd[CTL_CMD_NUM][CTL_CMD_LEN];
}CtlPlcSockParamType;
extern CtlPlcSockParamType ctl_file_param;
extern int sd_mount_flag;
FILE *CtlFileInit(char *file);
void CtlFileClose(FILE *fd);
void CtlFileRead(FILE *fd, int size, char *buf);
void CtlFileWrite(FILE *fd, int size, char *buf);
int CtlFileReadWithFilename(char *file_name, int size, char *buf);
#ifdef LIB_USING_CJSON
void CtlParseJsonData(char *buf);
#endif
#endif

View File

@ -10,5 +10,8 @@ ifeq ($(CONFIG_LIB_LV),y)
SRC_DIR += lvgl SRC_DIR += lvgl
endif endif
ifeq ($(CONFIG_LIB_USING_CJSON),y)
SRC_DIR += cJSON
endif
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -0,0 +1,3 @@
SRC_FILES := cJSON.c
include $(KERNEL_ROOT)/compiler.mk

View File

@ -7,7 +7,7 @@
/** /**
* @file board.c * @file board.c
* @brief relative configure for ok1052-c * @brief relative configure for ok1052-c board
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021.11.11 * @date 2021.11.11
@ -15,15 +15,15 @@
/************************************************* /*************************************************
File name: board.c File name: board.c
Description: support imxrt1052-board init function Description: support ok1052-c board init function
Others: take SDK_2.6.1_MIMXRT1052xxxxB for references Others: take SDK_2.6.1_MIMXRT1052xxxxB for references
History: History:
1. Date: 2022-01-25 1. Date: 2021-11-11
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. support imxrt1052-board MPUclockmemory init 1. support ok1052-c board MPU, Clock, Memory init
2. support imxrt1052-board uartsemcsdio driver init 2. support ok1052-c board uart, semc, sdio driver init
3. support imxrt1052-board I2C, SPI, ADC, RTC driver init 3. support ok1052-c board I2C, SPI, ADC, RTC driver init
*************************************************/ *************************************************/
#include "fsl_common.h" #include "fsl_common.h"
@ -44,6 +44,9 @@ extern int ExtSramInit(void);
#if defined(FS_VFS) && defined(MOUNT_SDCARD) #if defined(FS_VFS) && defined(MOUNT_SDCARD)
#include <iot-vfs.h> #include <iot-vfs.h>
// SD card mount flag 1: OK
int sd_mount_flag = 0;
/** /**
* @description: Mount SD card * @description: Mount SD card
* @return 0 * @return 0
@ -51,7 +54,10 @@ extern int ExtSramInit(void);
int MountSDCard(void) int MountSDCard(void)
{ {
if (MountFilesystem(SDIO_BUS_NAME, SDIO_DEVICE_NAME, SDIO_DRIVER_NAME, FSTYPE_FATFS, "/") == 0) if (MountFilesystem(SDIO_BUS_NAME, SDIO_DEVICE_NAME, SDIO_DRIVER_NAME, FSTYPE_FATFS, "/") == 0)
{
sd_mount_flag = 1;
KPrintf("sd card mount to '/'"); KPrintf("sd card mount to '/'");
}
else else
KPrintf("sd card mount to '/' failed!"); KPrintf("sd card mount to '/' failed!");
@ -72,15 +78,23 @@ int MountSDCard(void)
#ifdef BSP_USING_LWIP #ifdef BSP_USING_LWIP
#include <connect_ethernet.h> #include <connect_ethernet.h>
#endif #endif
#ifdef BSP_USING_LPUART #ifdef BSP_USING_LPUART
#include <connect_uart.h> #include <connect_uart.h>
#endif #endif
#ifdef BSP_USING_ADC #ifdef BSP_USING_ADC
#include <connect_adc.h> #include <connect_adc.h>
#endif #endif
#ifdef BSP_USING_I2C
#include <connect_i2c.h>
#endif
#ifdef BSP_USING_SPI #ifdef BSP_USING_SPI
#include <connect_spi.h> #include <connect_spi.h>
#endif #endif
#ifdef BSP_USING_RTC #ifdef BSP_USING_RTC
#include <connect_rtc.h> #include <connect_rtc.h>
#endif #endif
@ -685,6 +699,10 @@ void InitBoardHardware()
Imxrt1052HwAdcInit(); Imxrt1052HwAdcInit();
#endif #endif
#ifdef BSP_USING_I2C
Imxrt1052HwI2cInit();
#endif
#ifdef BSP_USING_SPI #ifdef BSP_USING_SPI
Imxrt1052HwSpiInit(); Imxrt1052HwSpiInit();
#endif #endif

View File

@ -7,7 +7,7 @@
/** /**
* @file board.h * @file board.h
* @brief define imxrt1052-board init configure and start-up function * @brief define ok1052-c init configure and start-up function
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-28 * @date 2021-05-28
@ -15,7 +15,7 @@
/************************************************* /*************************************************
File name: board.h File name: board.h
Description: define imxrt1052-board board init function and struct Description: define ok1052-c board init function and struct
Others: Others:
History: History:
1. Date: 2021-05-28 1. Date: 2021-05-28

View File

@ -7,7 +7,7 @@
/** /**
* @file clock_config.h * @file clock_config.h
* @brief define imxrt1052-board clock configure * @brief define ok1052-c board clock configure
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-29 * @date 2021-05-29

View File

@ -7,7 +7,7 @@
/** /**
* @file pin_mux.h * @file pin_mux.h
* @brief define imxrt1052-board pin configure * @brief define ok1052-c board pin configure
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-29 * @date 2021-05-29

View File

@ -28,7 +28,7 @@
/** /**
* @file link.lds * @file link.lds
* @brief ok1052-c Linker script * @brief ok1052-c board Linker script
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-28 * @date 2021-05-28
@ -36,7 +36,7 @@
/************************************************* /*************************************************
File name: link.lds File name: link.lds
Description: ok1052-c Linker script Description: ok1052-c board Linker script
Others: take MIMXRT1052xxxxx_flexspi_nor.ld for references Others: take MIMXRT1052xxxxx_flexspi_nor.ld for references
History: History:
1. Date: 2021-05-28 1. Date: 2021-05-28

View File

@ -28,7 +28,7 @@
/** /**
* @file link.lds * @file link.lds
* @brief ok1052-c Linker script * @brief ok1052-c board Linker script
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-28 * @date 2021-05-28
@ -36,7 +36,7 @@
/************************************************* /*************************************************
File name: link.lds File name: link.lds
Description: ok1052-c Linker script Description: ok1052-c board Linker script
Others: take MIMXRT1052xxxxx_flexspi_nor.ld for references Others: take MIMXRT1052xxxxx_flexspi_nor.ld for references
History: History:
1. Date: 2021-05-28 1. Date: 2021-05-28

View File

@ -7,7 +7,7 @@
/** /**
* @file clock_config.c * @file clock_config.c
* @brief support imxrt1052-board clock configure * @brief support ok1052-c board clock configure
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-29 * @date 2021-05-29

View File

@ -7,7 +7,7 @@
/** /**
* @file pin_mux.c * @file pin_mux.c
* @brief support imxrt1052-board pin configure * @brief support ok1052-c board pin configure
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-29 * @date 2021-05-29

View File

@ -1,43 +1,28 @@
/* /*
* Copyright (c) 2020 RT-Thread Development Team * Copyright (c) 2022 AIIT XUOS Lab
* * XiUOS is licensed under Mulan PSL v2.
* SPDX-License-Identifier: Apache-2.0 * You can use this software according to the terms and conditions of the Mulan PSL v2.
* * You may obtain a copy of Mulan PSL v2 at:
* Change Logs: * http://license.coscl.org.cn/MulanPSL2
* Date Author Notes * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* 2012-04-25 weety first version * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
*/ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/** /**
* @file connect_i2c.c * @file connect_i2c.c
* @brief support ok1052-c i2c function and register to bus framework * @brief support ok1052-c board i2c function and register to bus framework
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-01 * @date 2022-03-01
*/ */
/*************************************************
File name: connect_i2c.c
Description: support ok1052-c i2c configure and i2c bus register function
Others: take RT-Thread v4.0.2/components/drivers/i2c/i2c-bit-ops.c for references
https://github.com/RT-Thread/rt-thread/tree/v4.0.2
History:
1. Date: 2022-03-01
Author: AIIT XUOS Lab
Modification:
1. support ok1052-c i2c bit configure, write and read
2. support ok1052-c i2c bus device and driver register
*************************************************/
#include <board.h> #include <board.h>
#include "bus_serial.h" #include "bus_serial.h"
#include "connect_i2c.h" #include "connect_i2c.h"
#include "fsl_lpi2c.h" #include "fsl_lpi2c.h"
#ifndef BSP_USING_I2C1
#define BSP_USING_I2C1
#endif
static uint32 I2cWriteData(struct I2cHardwareDevice *i2c_dev, struct I2cDataStandard *msg) static uint32 I2cWriteData(struct I2cHardwareDevice *i2c_dev, struct I2cDataStandard *msg)
{ {
status_t ret; status_t ret;
@ -158,7 +143,7 @@ static int BoardI2cDevBend(void)
} }
/*BOARD I2C INIT*/ /*BOARD I2C INIT*/
int Stm32HwI2cInit(void) int Imxrt1052HwI2cInit(void)
{ {
static int init_flag = 0; static int init_flag = 0;
x_err_t ret = EOK; x_err_t ret = EOK;
@ -174,7 +159,7 @@ int Stm32HwI2cInit(void)
static struct I2cDriver i2c_driver; static struct I2cDriver i2c_driver;
memset(&i2c_driver, 0, sizeof(struct I2cDriver)); memset(&i2c_driver, 0, sizeof(struct I2cDriver));
#ifdef BSP_USING_I2C1 #ifdef BSP_USING_I2C
i2c_driver.configure = I2cDrvConfigure; i2c_driver.configure = I2cDrvConfigure;
ret = BoardI2cBusInit(&i2c_bus, &i2c_driver); ret = BoardI2cBusInit(&i2c_bus, &i2c_driver);

View File

@ -1,40 +1,18 @@
/* /*
* The Clear BSD License * Copyright (c) 2022 AIIT XUOS Lab
* Copyright (c) 2015, Freescale Semiconductor, Inc. * XiUOS is licensed under Mulan PSL v2.
* Copyright 2016-2017 NXP * You can use this software according to the terms and conditions of the Mulan PSL v2.
* All rights reserved. * You may obtain a copy of Mulan PSL v2 at:
* * http://license.coscl.org.cn/MulanPSL2
* Redistribution and use in source and binary forms, with or without modification, * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* are permitted (subject to the limitations in the disclaimer below) provided * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* that the following conditions are met: * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* * See the Mulan PSL v2 for more details.
* o Redistributions of source code must retain the above copyright notice, this list */
* of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* o Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** /**
* @file connect_i2c_eeprom.h * @file connect_i2c_eeprom.h
* @brief ok1052-c eeprom relative codes * @brief ok1052-c board eeprom relative codes
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-01 * @date 2022-03-01
@ -87,7 +65,6 @@ void I2cEEpromTestWrite(void)
int I2cEEpromTest(void) int I2cEEpromTest(void)
{ {
Stm32HwI2cInit();
BOARD_InitI2C1Pins(); BOARD_InitI2C1Pins();
I2cHardwareInit(); I2cHardwareInit();
I2cEEpromTestWrite(); I2cEEpromTestWrite();

View File

@ -34,7 +34,7 @@
/** /**
* @file hardware_i2c.c * @file hardware_i2c.c
* @brief ok1052-c i2c relative codes * @brief ok1052-c i2c board relative codes
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-01 * @date 2022-03-01

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020 AIIT XUOS Lab * Copyright (c) 2021 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -12,8 +12,8 @@
/** /**
* @file connect_adc.h * @file connect_adc.h
* @brief define imxrt1052-baord adc function and struct * @brief define ok1052-c board adc function and struct
* @version 1.1 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-12-28 * @date 2021-12-28
*/ */

View File

@ -12,10 +12,10 @@
/** /**
* @file connect_gpio.h * @file connect_gpio.h
* @brief define imxrt1052-board gpio function and struct * @brief define ok1052-c board gpio function and struct
* @version 2.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-15 * @date 2022-03-01
*/ */
#ifndef __CONNECT_GPIO_H_ #ifndef __CONNECT_GPIO_H_

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020 AIIT XUOS Lab * Copyright (c) 2021 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -12,7 +12,7 @@
/** /**
* @file connect_i2c.h * @file connect_i2c.h
* @brief define imxrt1052-baord i2c function and struct * @brief define ok1052-c board i2c function and struct
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-04-25 * @date 2021-04-25
@ -37,7 +37,7 @@ typedef struct Stm32I2c
#define i2c_print KPrintf #define i2c_print KPrintf
int Stm32HwI2cInit(void); int Imxrt1052HwI2cInit(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -12,7 +12,7 @@
/** /**
* @file connect_rtc.h * @file connect_rtc.h
* @brief define imxrt1052-baord rtc function and structure * @brief define ok1052-c board rtc function and struct
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-01 * @date 2022-03-01

View File

@ -12,7 +12,7 @@
/** /**
* @file connect_sdio.h * @file connect_sdio.h
* @brief define imxrt1052-baord sdio function and struct * @brief define ok1052-c board sdio function and struct
* @version 2.0 * @version 2.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-01-24 * @date 2022-01-24

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020 AIIT XUOS Lab * Copyright (c) 2021 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -12,7 +12,7 @@
/** /**
* @file connect_spi.h * @file connect_spi.h
* @brief define imxrt1052-baord spi function and struct * @brief define ok1052-c board spi function and struct
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-04-25 * @date 2021-04-25

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020 AIIT XUOS Lab * Copyright (c) 2021 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -12,7 +12,7 @@
/** /**
* @file connect_uart.h * @file connect_uart.h
* @brief define imxrt1052-board usart function and struct * @brief define ok1052-c board usart function and struct
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-28 * @date 2021-05-28
@ -27,8 +27,6 @@
extern "C" { extern "C" {
#endif #endif
#define KERNEL_CONSOLE_BUS_NAME SERIAL_BUS_NAME_1 #define KERNEL_CONSOLE_BUS_NAME SERIAL_BUS_NAME_1
#define KERNEL_CONSOLE_DRV_NAME SERIAL_DRV_NAME_1 #define KERNEL_CONSOLE_DRV_NAME SERIAL_DRV_NAME_1
#define KERNEL_CONSOLE_DEVICE_NAME SERIAL_1_DEVICE_NAME_0 #define KERNEL_CONSOLE_DEVICE_NAME SERIAL_1_DEVICE_NAME_0

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020 AIIT XUOS Lab * Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -12,7 +12,7 @@
/** /**
* @file connect_usb.h * @file connect_usb.h
* @brief define imxrt1052-baord usb function and struct * @brief define ok1052-c board usb function and struct
* @version 2.0 * @version 2.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-02-09 * @date 2022-02-09

View File

@ -8,7 +8,7 @@
/** /**
* @file fsl_lpi2c.h * @file fsl_lpi2c.h
* @brief support ok1052-c i2c driver * @brief support ok1052-c board i2c driver
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-01 * @date 2022-03-01
@ -16,7 +16,7 @@
/************************************************* /*************************************************
File name: fsl_lpi2c.h File name: fsl_lpi2c.h
Description: support ok1052-c i2c driver Description: support ok1052-c board i2c driver
History: History:
1. Date: 2022-03-01 1. Date: 2022-03-01

View File

@ -34,7 +34,7 @@
/** /**
* @file connect_rtc.c * @file connect_rtc.c
* @brief ok1052-c rtc function and structure * @brief ok1052-c board rtc function and structure
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-01 * @date 2022-03-01
@ -42,13 +42,14 @@
/************************************************* /*************************************************
File name: connect_rtc.c File name: connect_rtc.c
Description: support ok1052-c rtc configure and spi bus register function Description: support ok1052-c board rtc configure and spi bus register function
History: History:
1. Date: 2022-03-01 1. Date: 2022-03-01
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. change command for XUOS 1. change command for XUOS
2. add module codes for XUOS
*************************************************/ *************************************************/
#include "board.h" #include "board.h"

View File

@ -42,13 +42,13 @@
/************************************************* /*************************************************
File name: hardware_rtc.c File name: hardware_rtc.c
Description: support ok1052-c rtc driver I2C function Description: support ok1052-c board rtc hardware driver I2C function
History: History:
1. Date: 2022-01-18 1. Date: 2022-01-18
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. support ok1052-c rtc 1. support ok1052-c board rtc
*************************************************/ *************************************************/
#include "connect_rtc.h" #include "connect_rtc.h"

View File

@ -16,14 +16,14 @@
/************************************************* /*************************************************
File name: connect_sdio.c File name: connect_sdio.c
Description: support imxrt1052-board sd card configure and sdio bus register function Description: support ok1052-c board sd card configure and sdio bus register function
Others: take SDK_2.6.1_MIMXRT1052xxxxB/boards/evkbimxrt1050/driver_examples/sdcard/polling/sdcard_polling.c for references Others: take SDK_2.6.1_MIMXRT1052xxxxB/boards/evkbimxrt1050/driver_examples/sdcard/polling/sdcard_polling.c for references
History: History:
1. Date: 2022-01-24 1. Date: 2022-01-24
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. support imxrt1052-board sdio configure, write and read 1. support ok1052-c board sdio configure, write and read
2. support imxrt1052-board sdio bus device and driver register 2. support ok1052-c board sdio bus device and driver register
*************************************************/ *************************************************/
#include <connect_sdio.h> #include <connect_sdio.h>

View File

@ -5,26 +5,6 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
/**
* @file board.c
* @brief relative configure for ok1052-c
* @version 1.0
* @author AIIT XUOS Lab
* @date 2021.11.11
*/
/*************************************************
File name: board.c
Description: support imxrt1052-board init function
Others: take SDK_2.6.1_MIMXRT1052xxxxB for references
History:
1. Date: 2022-01-25
Author: AIIT XUOS Lab
Modification:
1. support imxrt1052-board MPUclockmemory init
2. support imxrt1052-board uartsemcsdio driver init
*************************************************/
#include "fsl_semc.h" #include "fsl_semc.h"
/******************************************************************************* /*******************************************************************************

View File

@ -10,7 +10,7 @@
/** /**
* @file connect_flash_spi.c * @file connect_flash_spi.c
* @brief support ok1052-c-board spi flash function and register to bus framework * @brief support ok1052-c board spi flash function and register to bus framework
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-01 * @date 2022-03-01
@ -18,14 +18,14 @@
/************************************************* /*************************************************
File name: connect_flash_spi.c File name: connect_flash_spi.c
Description: support ok1052-c-board spi flash bus register function Description: support ok1052-c board spi flash bus register function
Others: take RT-Thread v4.0.2/bsp/stm32/stm32f407-atk-explorer/board/ports/spi-flash-init.c Others: take RT-Thread v4.0.2/bsp/stm32/stm32f407-atk-explorer/board/ports/spi-flash-init.c
https://github.com/RT-Thread/rt-thread/tree/v4.0.2 https://github.com/RT-Thread/rt-thread/tree/v4.0.2
History: History:
1. Date: 2022-03-01 1. Date: 2022-03-01
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. for ok1052-c compilation 1. for ok1052-c board compilation
*************************************************/ *************************************************/
#include "flash_spi.h" #include "flash_spi.h"

View File

@ -15,7 +15,7 @@
/** /**
* @file connect_spi.c * @file connect_spi.c
* @brief support ok1052-c spi function and register to bus framework * @brief support ok1052-c board spi function and register to bus framework
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2022-03-01 * @date 2022-03-01
@ -23,16 +23,16 @@
/************************************************* /*************************************************
File name: connect_spi.c File name: connect_spi.c
Description: support ok1052-c spi configure and spi bus register function Description: support ok1052-c board spi configure and spi bus register function
Others: take RT-Thread v4.0.2/bsp/stm32/libraries/HAL_Drivers/drv_spi.c for references Others: take RT-Thread v4.0.2/bsp/stm32/libraries/HAL_Drivers/drv_spi.c for references
https://github.com/RT-Thread/rt-thread/tree/v4.0.2 https://github.com/RT-Thread/rt-thread/tree/v4.0.2
History: History:
1. Date: 2022-03-01 1. Date: 2022-03-01
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. support ok1052-c spi configure, write and read 1. support ok1052-c board spi configure, write and read
2. support ok1052-c spi bus device and driver register 2. support ok1052-c board spi bus device and driver register
3. add ok1052-c spi test letter command 3. add ok1052-c board spi test letter command
*************************************************/ *************************************************/
#include "board.h" #include "board.h"
@ -58,7 +58,6 @@ Modification:
#define TRANSFER_BAUDRATE (500000U) /*! Transfer baudrate - 500k */ #define TRANSFER_BAUDRATE (500000U) /*! Transfer baudrate - 500k */
#define spi_print KPrintf #define spi_print KPrintf
#define spi_trace() KPrintf("lw: [%s][%d] passed!\n", __func__, __LINE__)
typedef struct __spi_transfer_t typedef struct __spi_transfer_t
{ {

View File

@ -8,7 +8,7 @@
/** /**
* @file connect_uart.c * @file connect_uart.c
* @brief support imxrt1052-board uart function and register to bus framework * @brief support ok1052-c board uart function and register to bus framework
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-28 * @date 2021-05-28
@ -16,14 +16,14 @@
/************************************************* /*************************************************
File name: connect_uart.c File name: connect_uart.c
Description: support imxrt1052-board uart configure and uart bus register function Description: support ok1052-c board uart configure and uart bus register function
Others: take SDK_2.6.1_MIMXRT1052xxxxB/components/uart/lpuart_adapter.c for references Others: take SDK_2.6.1_MIMXRT1052xxxxB/components/uart/lpuart_adapter.c for references
History: History:
1. Date: 2021-05-28 1. Date: 2021-05-28
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. support imxrt1052-board uart configure, write and read 1. support ok1052-c board uart configure, write and read
2. support imxrt1052-board uart bus device and driver register 2. support ok1052-c board uart bus device and driver register
*************************************************/ *************************************************/
#include <board.h> #include <board.h>

View File

@ -16,14 +16,14 @@
/************************************************* /*************************************************
File name: connect_usb.c File name: connect_usb.c
Description: support imxrt1052-board usb host configure and sdio bus register function Description: support ok1052-c board usb host configure and sdio bus register function
Others: take SDK_2.6.1_MIMXRT1052xxxxB/boards/evkbimxrt1050/usb_examples/usb_host_msd_command for references Others: take SDK_2.6.1_MIMXRT1052xxxxB/boards/evkbimxrt1050/usb_examples/usb_host_msd_command for references
History: History:
1. Date: 2022-02-09 1. Date: 2022-02-09
Author: AIIT XUOS Lab Author: AIIT XUOS Lab
Modification: Modification:
1. support imxrt1052-board usb host configure, write and read 1. support ok1052-c board usb host configure, write and read
2. support imxrt1052-board usb host bus device and driver register 2. support ok1052-c board usb host bus device and driver register
*************************************************/ *************************************************/
#include <board.h> #include <board.h>
#include <connect_usb.h> #include <connect_usb.h>
@ -202,7 +202,7 @@ static void UsbHostTask(void* parameter)
} }
} }
/*Init usb host busdriver*/ /*Init usb host bus driver*/
static int BoardUsbBusInit(struct UsbBus *usb_bus, struct UsbDriver *usb_driver) static int BoardUsbBusInit(struct UsbBus *usb_bus, struct UsbDriver *usb_driver)
{ {
x_err_t ret = EOK; x_err_t ret = EOK;
@ -255,7 +255,7 @@ static int BoardUsbDevBend(void)
return ret; return ret;
} }
/*RT1052 BOARD USB INIT*/ /*OK1052-C BOARD USB INIT*/
int Imxrt1052HwUsbHostInit(void) int Imxrt1052HwUsbHostInit(void)
{ {
x_err_t ret = EOK; x_err_t ret = EOK;

View File

@ -310,6 +310,7 @@ endif
ifeq ($(CONFIG_SUPPORT_CONTROL_FRAMEWORK), y) ifeq ($(CONFIG_SUPPORT_CONTROL_FRAMEWORK), y)
KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control # KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control #
KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control/shared #
KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control/plc/interoperability/opcua # KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control/plc/interoperability/opcua #
KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control/plc/shared # KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control/plc/shared #
KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/lib/cJSON KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/lib/cJSON

View File

@ -232,7 +232,7 @@ netconn_prepare_delete(struct netconn *conn)
err_t err_t
netconn_delete(struct netconn *conn) netconn_delete(struct netconn *conn)
{ {
err_t err; err_t err = ERR_OK;
/* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */ /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */
if (conn == NULL) { if (conn == NULL) {
@ -246,7 +246,7 @@ netconn_delete(struct netconn *conn)
} else } else
#endif /* LWIP_NETCONN_FULLDUPLEX */ #endif /* LWIP_NETCONN_FULLDUPLEX */
{ {
// err = netconn_prepare_delete(conn); err = netconn_prepare_delete(conn);
} }
if (err == ERR_OK) { if (err == ERR_OK) {
netconn_free(conn); netconn_free(conn);

View File

@ -74,7 +74,7 @@ a lot of data that needs to be copied, this should be set high. */
#define MEMP_NUM_TCP_PCB_LISTEN 2 #define MEMP_NUM_TCP_PCB_LISTEN 2
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP /* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
segments. */ segments. */
#define MEMP_NUM_TCP_SEG 120 #define MEMP_NUM_TCP_SEG 20
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active /* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
timeouts. */ timeouts. */
#define MEMP_NUM_SYS_TIMEOUT 6 #define MEMP_NUM_SYS_TIMEOUT 6
@ -212,26 +212,19 @@ The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums
--------------------------------- ---------------------------------
*/ */
#define DEFAULT_RAW_RECVMBOX_SIZE 10 #define DEFAULT_RAW_RECVMBOX_SIZE 8
#define DEFAULT_UDP_RECVMBOX_SIZE 10 #define DEFAULT_UDP_RECVMBOX_SIZE 8
#define DEFAULT_TCP_RECVMBOX_SIZE 10 #define DEFAULT_TCP_RECVMBOX_SIZE 8
#define DEFAULT_ACCEPTMBOX_SIZE 10 #define DEFAULT_ACCEPTMBOX_SIZE 8
#define DEFAULT_THREAD_PRIO 20 #define DEFAULT_THREAD_PRIO 20
#define DEFAULT_THREAD_STACKSIZE 1024 #define DEFAULT_THREAD_STACKSIZE 1024
#define TCPIP_THREAD_NAME "tcp" #define TCPIP_THREAD_NAME "tcp"
#define TCPIP_THREAD_STACKSIZE 8192 #define TCPIP_THREAD_STACKSIZE 8192
#define TCPIP_MBOX_SIZE 10 #define TCPIP_MBOX_SIZE 8
#define TCPIP_THREAD_PRIO 15 #define TCPIP_THREAD_PRIO 15
//#define IPERF_SERVER_THREAD_NAME "iperf_server"
//#define IPERF_SERVER_THREAD_STACKSIZE 1024
//#define IPERF_SERVER_THREAD_PRIO 0
//#define BLOCK_TIME 250
//#define BLOCK_TIME_WAITING_FOR_INPUT ( ( portTickType ) 100 )
/* /*
---------------------------------------- ----------------------------------------
---------- Lwip Debug options ---------- ---------- Lwip Debug options ----------
@ -257,9 +250,9 @@ typedef unsigned int nfds_t;
#define MEMP_MEM_MALLOC 1 #define MEMP_MEM_MALLOC 1
#define lw_print //KPrintf #define lw_print //KPrintf
#define lw_trace() //KPrintf("lw: [%s][%d] passed!\n", __func__, __LINE__) #define lw_error KPrintf
#define lw_error() //KPrintf("lw: [%s][%d] failed!\n", __func__, __LINE__) #define lw_notice KPrintf
#define lw_pr_info KPrintf
#endif /* __LWIPOPTS_H__ */ #endif /* __LWIPOPTS_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@ -513,16 +513,16 @@ void lwip_config_net(char *ip, char *mask, char *gw)
if(chk_lwip_bit(LWIP_PRINT_FLAG)) if(chk_lwip_bit(LWIP_PRINT_FLAG))
{ {
lw_pr_info("\r\n************************************************\r\n"); lw_notice("\r\n************************************************\r\n");
lw_pr_info(" Network Configuration\r\n"); lw_notice(" Network Configuration\r\n");
lw_pr_info("************************************************\r\n"); lw_notice("************************************************\r\n");
lw_pr_info(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1], lw_notice(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1],
((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]); ((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]);
lw_pr_info(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1], lw_notice(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1],
((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]); ((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]);
lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1], lw_notice(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1],
((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]); ((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]);
lw_pr_info("************************************************\r\n"); lw_notice("************************************************\r\n");
} }
lwip_config_input(&gnetif); lwip_config_input(&gnetif);
} }

View File

@ -1386,6 +1386,9 @@ tcp_output(struct tcp_pcb *pcb)
/* In the case of fast retransmit, the packet should not go to the tail /* In the case of fast retransmit, the packet should not go to the tail
* of the unacked queue, but rather somewhere before it. We need to check for * of the unacked queue, but rather somewhere before it. We need to check for
* this case. -STJ Jul 27, 2004 */ * this case. -STJ Jul 27, 2004 */
/*when useg is NULL, cause exception*/
if(useg == NULL)
break;
if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) { if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) {
/* add segment to before tail of unacked list, keeping the list sorted */ /* add segment to before tail of unacked list, keeping the list sorted */
struct tcp_seg **cur_seg = &(pcb->unacked); struct tcp_seg **cur_seg = &(pcb->unacked);

View File

@ -18,40 +18,18 @@
* @date 2021.12.15 * @date 2021.12.15
*/ */
#include "lwip/opt.h"
#if LWIP_IPV4 && LWIP_RAW
#include "ping.h"
#include "lwip/timeouts.h"
#include "lwip/init.h"
#include "netif/ethernet.h"
#include "board.h" #include "board.h"
#include "pin_mux.h" #include "sys_arch.h"
#include "clock_config.h"
#include <transform.h>
#include <sys_arch.h>
#include "connect_ethernet.h"
/******************************************************************************/ /******************************************************************************/
static void *LwipSetIPTask(void *param) static void LwipSetIPTask(void *param)
{ {
lwip_config_net(lwip_ipaddr, lwip_netmask, lwip_gwaddr); lwip_config_net(lwip_ipaddr, lwip_netmask, lwip_gwaddr);
} }
void LwipSetIPTest(int argc, char *argv[]) void LwipSetIPTest(int argc, char *argv[])
{ {
int result = 0;
pthread_t th_id;
pthread_attr_t attr;
attr.schedparam.sched_priority = LWIP_DEMO_TASK_PRIO;
attr.stacksize = LWIP_TASK_STACK_SIZE;
if(argc >= 4) if(argc >= 4)
{ {
lw_print("lw: [%s] ip %s mask %s gw %s\n", __func__, argv[1], argv[2], argv[3]); lw_print("lw: [%s] ip %s mask %s gw %s\n", __func__, argv[1], argv[2], argv[3]);
@ -65,12 +43,7 @@ void LwipSetIPTest(int argc, char *argv[])
sscanf(argv[1], "%d.%d.%d.%d", &lwip_ipaddr[0], &lwip_ipaddr[1], &lwip_ipaddr[2], &lwip_ipaddr[3]); sscanf(argv[1], "%d.%d.%d.%d", &lwip_ipaddr[0], &lwip_ipaddr[1], &lwip_ipaddr[2], &lwip_ipaddr[3]);
} }
result = pthread_create(&th_id, &attr, LwipSetIPTask, NULL); sys_thread_new("SET ip address", LwipSetIPTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
if (0 == result) {
lw_print("lw: [%s] thread %d successfully!\n", __func__, th_id);
} else {
lw_print("lw: [%s] failed! error code is %d\n", __func__, result);
}
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3),
@ -81,21 +54,20 @@ void LwipShowIPTask(int argc, char *argv[])
{ {
char mac_addr[] = configMAC_ADDR; char mac_addr[] = configMAC_ADDR;
lw_pr_info("\r\n************************************************\r\n"); lw_notice("\r\n************************************************\r\n");
lw_pr_info(" Network Configuration\r\n"); lw_notice(" Network Configuration\r\n");
lw_pr_info("************************************************\r\n"); lw_notice("************************************************\r\n");
lw_pr_info(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_ipaddr)[0], ((u8_t *)&lwip_ipaddr)[1], lw_notice(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_ipaddr)[0], ((u8_t *)&lwip_ipaddr)[1],
((u8_t *)&lwip_ipaddr)[2], ((u8_t *)&lwip_ipaddr)[3]); ((u8_t *)&lwip_ipaddr)[2], ((u8_t *)&lwip_ipaddr)[3]);
lw_pr_info(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_netmask)[0], ((u8_t *)&lwip_netmask)[1], lw_notice(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_netmask)[0], ((u8_t *)&lwip_netmask)[1],
((u8_t *)&lwip_netmask)[2], ((u8_t *)&lwip_netmask)[3]); ((u8_t *)&lwip_netmask)[2], ((u8_t *)&lwip_netmask)[3]);
lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_gwaddr)[1], lw_notice(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_gwaddr)[1],
((u8_t *)&lwip_gwaddr)[2], ((u8_t *)&lwip_gwaddr)[3]); ((u8_t *)&lwip_gwaddr)[2], ((u8_t *)&lwip_gwaddr)[3]);
lw_pr_info(" MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr[0], mac_addr[1], mac_addr[2], lw_notice(" MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr[0], mac_addr[1], mac_addr[2],
mac_addr[3], mac_addr[4], mac_addr[5]); mac_addr[3], mac_addr[4], mac_addr[5]);
lw_pr_info("************************************************\r\n"); lw_notice("************************************************\r\n");
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0),
showip, LwipShowIPTask, GetIp [IP] [Netmask] [Gateway]); showip, LwipShowIPTask, GetIp [IP] [Netmask] [Gateway]);
#endif

View File

@ -1,7 +1,37 @@
/*
* Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file lwip_demo.h
* @brief lwip demo relative struct and definition
* @version 1.0
* @author AIIT XUOS Lab
* @date 2022-03-21
*/
#ifndef __LWIP_DEMO_H__ #ifndef __LWIP_DEMO_H__
#define __LWIP_DEMO_H__ #define __LWIP_DEMO_H__
typedef struct LwipTcpSocketStruct
{
char ip[6];
uint16_t port;
char *buf;
}LwipTcpSocketParamType;
#define LWIP_TEST_MSG_SIZE 128
#define LWIP_TEST_STACK_SIZE 4096 #define LWIP_TEST_STACK_SIZE 4096
#define LWIP_TEST_TASK_PRIO 20 #define LWIP_TEST_TASK_PRIO 20
#endif /* __LWIP_DEMO_H__ */ #endif /* __LWIP_DEMO_H__ */

View File

@ -61,54 +61,54 @@ int LwipPrintDHCP(struct netif *netif)
{ {
dhcp_last_state = dhcp->state; dhcp_last_state = dhcp->state;
lw_pr_info(" DHCP state : "); lw_notice(" DHCP state : ");
switch (dhcp_last_state) switch (dhcp_last_state)
{ {
case DHCP_STATE_OFF: case DHCP_STATE_OFF:
lw_pr_info("OFF"); lw_notice("OFF");
break; break;
case DHCP_STATE_REQUESTING: case DHCP_STATE_REQUESTING:
lw_pr_info("REQUESTING"); lw_notice("REQUESTING");
break; break;
case DHCP_STATE_INIT: case DHCP_STATE_INIT:
lw_pr_info("INIT"); lw_notice("INIT");
break; break;
case DHCP_STATE_REBOOTING: case DHCP_STATE_REBOOTING:
lw_pr_info("REBOOTING"); lw_notice("REBOOTING");
break; break;
case DHCP_STATE_REBINDING: case DHCP_STATE_REBINDING:
lw_pr_info("REBINDING"); lw_notice("REBINDING");
break; break;
case DHCP_STATE_RENEWING: case DHCP_STATE_RENEWING:
lw_pr_info("RENEWING"); lw_notice("RENEWING");
break; break;
case DHCP_STATE_SELECTING: case DHCP_STATE_SELECTING:
lw_pr_info("SELECTING"); lw_notice("SELECTING");
break; break;
case DHCP_STATE_INFORMING: case DHCP_STATE_INFORMING:
lw_pr_info("INFORMING"); lw_notice("INFORMING");
break; break;
case DHCP_STATE_CHECKING: case DHCP_STATE_CHECKING:
lw_pr_info("CHECKING"); lw_notice("CHECKING");
break; break;
case DHCP_STATE_BOUND: case DHCP_STATE_BOUND:
lw_pr_info("BOUND"); lw_notice("BOUND");
break; break;
case DHCP_STATE_BACKING_OFF: case DHCP_STATE_BACKING_OFF:
lw_pr_info("BACKING_OFF"); lw_notice("BACKING_OFF");
break; break;
default: default:
lw_pr_info("%u", dhcp_last_state); lw_notice("%u", dhcp_last_state);
assert(0); assert(0);
break; break;
} }
lw_pr_info("\r\n"); lw_notice("\r\n");
if (dhcp_last_state == DHCP_STATE_BOUND) if (dhcp_last_state == DHCP_STATE_BOUND)
{ {
lw_pr_info("\r\n IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr)); lw_notice("\r\n IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr));
lw_pr_info(" IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask)); lw_notice(" IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask));
lw_pr_info(" IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw)); lw_notice(" IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw));
return 1; return 1;
} }
} }

View File

@ -60,7 +60,7 @@ void LwipPingTest(int argc, char *argv[])
{ {
if(sscanf(argv[1], "%d.%d.%d.%d", &lwip_gwaddr[0], &lwip_gwaddr[1], &lwip_gwaddr[2], &lwip_gwaddr[3]) == EOF) if(sscanf(argv[1], "%d.%d.%d.%d", &lwip_gwaddr[0], &lwip_gwaddr[1], &lwip_gwaddr[2], &lwip_gwaddr[3]) == EOF)
{ {
lw_pr_info("input wrong ip\n"); lw_notice("input wrong ip\n");
return; return;
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020 AIIT XUOS Lab * Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -11,86 +11,91 @@
*/ */
/** /**
* @file tcp_echo_socket_demo.c * @file lwip_tcp_demo.c
* @brief One UDP demo based on LwIP * @brief TCP demo based on LwIP
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-29 * @date 2022-03-21
*/ */
#include <transform.h>
#include <xizi.h>
#include "board.h" #include "board.h"
#include "lwip_demo.h"
#include "sys_arch.h" #include "sys_arch.h"
#include <lwip/sockets.h> #include "lwip/sockets.h"
#include "lwip/sys.h"
#include "tcpecho_raw.h" #include "tcpecho_raw.h"
#define MSG_SIZE 128 char tcp_demo_msg[LWIP_TEST_MSG_SIZE] = {0};
char tcp_demo_ip[] = {192, 168, 250, 252};
// this is for test in shell, in fact, shell restrict the length of input string, which is less then 128 u16_t tcp_demo_port = LWIP_TARGET_PORT;
char tcp_send_msg[MSG_SIZE] = {0};
char tcp_target[] = {192, 168, 250, 252};
/******************************************************************************/ /******************************************************************************/
static void LwipTcpSendTask(void *arg) static void LwipTcpSendTask(void *arg)
{ {
lw_print("LwipTcpSendTask start.\n");
int fd = -1; int fd = -1;
fd = socket(AF_INET, SOCK_STREAM, 0); fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) if (fd < 0)
{ {
lw_print("Socket error\n"); lw_error("Socket error\n");
return; return;
} }
LwipTcpSocketParamType *param = (LwipTcpSocketParamType *)arg;
struct sockaddr_in tcp_sock; struct sockaddr_in tcp_sock;
tcp_sock.sin_family = AF_INET; tcp_sock.sin_family = AF_INET;
tcp_sock.sin_port = htons(LWIP_TARGET_PORT); tcp_sock.sin_port = htons(param->port);
tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(tcp_target[0], tcp_target[1], tcp_target[2], tcp_target[3])); tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(param->ip[0], param->ip[1], param->ip[2], param->ip[3]));
memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero));
if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr))) if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr)))
{ {
lw_print("Unable to connect\n"); lw_error("Unable to connect\n");
goto __exit; closesocket(fd);
return;
} }
lw_print("tcp connect success, start to send.\n"); lw_notice("tcp connect success, start to send.\n");
lw_print("\n\nTarget Port:%d\n\n", tcp_sock.sin_port); lw_notice("\n\nTarget Port:%d\n\n", tcp_sock.sin_port);
sendto(fd, tcp_send_msg, strlen(tcp_send_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); sendto(fd, tcp_demo_msg, strlen(tcp_demo_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr));
lw_print("Send tcp msg: %s ", tcp_send_msg); lw_notice("Send tcp msg: %s ", tcp_demo_msg);
__exit:
if (fd >= 0)
closesocket(fd); closesocket(fd);
return; return;
} }
void LwipTcpSendTest(int argc, char *argv[]) void LwipTcpSendTest(int argc, char *argv[])
{ {
memset(tcp_send_msg, 0, MSG_SIZE); LwipTcpSocketParamType param;
memset(tcp_demo_msg, 0, LWIP_TEST_MSG_SIZE);
if(argc >= 2) if(argc >= 2)
{ {
strncpy(tcp_send_msg, argv[1], strlen(argv[1])); strncpy(tcp_demo_msg, argv[1], strlen(argv[1]));
} }
else else
{ {
strncpy(tcp_send_msg, "hello world", strlen("hello world")); strncpy(tcp_demo_msg, "hello world", strlen("hello world"));
} }
strcat(tcp_send_msg, "\r\n"); strcat(tcp_demo_msg, "\r\n");
if(argc >= 3) if(argc >= 3)
{ {
sscanf(argv[2], "%d.%d.%d.%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3]); if(sscanf(argv[2], "%d.%d.%d.%d:%d", &tcp_demo_ip[0], &tcp_demo_ip[1], &tcp_demo_ip[2], &tcp_demo_ip[3], &tcp_demo_port) == EOK)
{
sscanf(argv[2], "%d.%d.%d.%d", &tcp_demo_ip[0], &tcp_demo_ip[1], &tcp_demo_ip[2], &tcp_demo_ip[3]);
} }
}
lw_notice("get ipaddr %d.%d.%d.%d:%d\n", tcp_demo_ip[0], tcp_demo_ip[1], tcp_demo_ip[2], tcp_demo_ip[3], tcp_demo_port);
lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_demo_ip);
lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); memcpy(param.ip, tcp_demo_ip, 4);
sys_thread_new("tcp send", LwipTcpSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); param.port = tcp_demo_port;
param.buf = malloc(LWIP_TEST_MSG_SIZE);
memcpy(param.buf, tcp_demo_msg, LWIP_TEST_MSG_SIZE);
sys_thread_new("tcp send", LwipTcpSendTask, &param, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3),

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 AIIT XUOS Lab * Copyright (c) 2022 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2. * XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at: * You may obtain a copy of Mulan PSL v2 at:
@ -15,24 +15,23 @@
* @brief One UDP demo based on LwIP * @brief One UDP demo based on LwIP
* @version 1.0 * @version 1.0
* @author AIIT XUOS Lab * @author AIIT XUOS Lab
* @date 2021-05-29 * @date 2022-03-21
*/ */
#include <transform.h>
#include <xizi.h>
#include "board.h" #include "board.h"
#include "sys_arch.h" #include "sys_arch.h"
#include "lwip/udp.h" #include "lwip/udp.h"
#include <lwip/sockets.h> #include "lwip/sockets.h"
#include "lwip/sys.h"
#define UDP_TASK_STACK_SIZE 4096
#define UDP_TASK_PRIO 15
#define PBUF_SIZE 27 #define PBUF_SIZE 27
static struct udp_pcb *udpecho_raw_pcb; static struct udp_pcb *udpecho_raw_pcb;
char udp_target[] = {192, 168, 250, 252};
char udp_demo_ip[] = {192, 168, 250, 252};
u16_t udp_demo_port = LWIP_TARGET_PORT;
char hello_str[] = {"hello world\r\n"}; char hello_str[] = {"hello world\r\n"};
char udp_send_msg[] = "\n\nThis one is UDP pkg. Congratulations on you.\n\n"; char udp_demo_msg[] = "\nThis one is UDP package!!!\n";
/******************************************************************************/ /******************************************************************************/
@ -46,62 +45,55 @@ static void LwipUDPSendTask(void *arg)
socket_fd = socket(AF_INET, SOCK_DGRAM, 0); socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_fd < 0) if (socket_fd < 0)
{ {
lw_print("Socket error\n"); lw_error("Socket error\n");
return; return;
} }
struct sockaddr_in udp_sock; struct sockaddr_in udp_sock;
udp_sock.sin_family = AF_INET; udp_sock.sin_family = AF_INET;
udp_sock.sin_port = htons(LWIP_TARGET_PORT); udp_sock.sin_port = htons(udp_demo_port);
udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_target[0],udp_target[1],udp_target[2],udp_target[3])); udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]));
memset(&(udp_sock.sin_zero), 0, sizeof(udp_sock.sin_zero)); memset(&(udp_sock.sin_zero), 0, sizeof(udp_sock.sin_zero));
if (connect(socket_fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr))) if (connect(socket_fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr)))
{ {
lw_print("Unable to connect\n"); lw_error("Unable to connect\n");
goto __exit;
}
lw_print("UDP connect success, start to send.\n");
lw_print("\n\nTarget Port:%d\n\n", udp_sock.sin_port);
sendto(socket_fd, udp_send_msg, strlen(udp_send_msg), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr));
lw_pr_info("Send UDP msg: %s ", udp_send_msg);
__exit:
if (socket_fd >= 0)
{
closesocket(socket_fd); closesocket(socket_fd);
return;
} }
lw_notice("UDP connect success, start to send.\n");
lw_notice("\n\nTarget Port:%d\n\n", udp_sock.sin_port);
sendto(socket_fd, udp_demo_msg, strlen(udp_demo_msg), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr));
lw_notice("Send UDP msg: %s ", udp_demo_msg);
closesocket(socket_fd);
return; return;
} }
void *LwipUdpSendTest(int argc, char *argv[]) void *LwipUdpSendTest(int argc, char *argv[])
{ {
int result = 0; memset(udp_demo_msg, 0, sizeof(udp_demo_msg));
sys_thread_t th_id;
memset(udp_send_msg, 0, sizeof(udp_send_msg));
if(argc == 1) if(argc == 1)
{ {
lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_target[0], udp_target[1], udp_target[2], udp_target[3]); lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]);
strncpy(udp_send_msg, hello_str, strlen(hello_str)); strncpy(udp_demo_msg, hello_str, strlen(hello_str));
} }
else else
{ {
strncpy(udp_send_msg, argv[1], strlen(argv[1])); strncpy(udp_demo_msg, argv[1], strlen(argv[1]));
strncat(udp_send_msg, "\r\n", 2); strncat(udp_demo_msg, "\r\n", 2);
if(argc == 3) if(argc == 3)
{ {
sscanf(argv[2], "%d.%d.%d.%d", &udp_target[0], &udp_target[1], &udp_target[2], &udp_target[3]); sscanf(argv[2], "%d.%d.%d.%d", &udp_demo_ip[0], &udp_demo_ip[1], &udp_demo_ip[2], &udp_demo_ip[3]);
} }
} }
lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_target[0], udp_target[1], udp_target[2], udp_target[3]);
lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]);
sys_thread_new("udp socket send", LwipUDPSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
lwip_config_net(lwip_ipaddr, lwip_netmask, udp_demo_ip);
sys_thread_new("udp send", LwipUDPSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3),
@ -120,12 +112,13 @@ static void LwipUdpRecvTask(void *arg, struct udp_pcb *upcb, struct pbuf *p,
{ {
return; return;
} }
udp_len = p->tot_len; udp_len = p->tot_len;
lw_pr_info("Receive data :%dB\r\n", udp_len); lw_notice("Receive data :%dB\r\n", udp_len);
if(udp_len <= 80) if(udp_len <= 80)
{ {
lw_pr_info("%.*s\r\n", udp_len, (char *)(p->payload)); lw_notice("%.*s\r\n", udp_len, (char *)(p->payload));
} }
udp_buf = pbuf_alloc(PBUF_TRANSPORT, PBUF_SIZE, PBUF_RAM); udp_buf = pbuf_alloc(PBUF_TRANSPORT, PBUF_SIZE, PBUF_RAM);
@ -162,5 +155,5 @@ void LwipUdpRecvTest(void)
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0),
UDPRecv, LwipUdpRecvTest, UDP server echo); UDPRecv, LwipUdpRecvTest, UDP Receive echo);

View File

@ -492,7 +492,7 @@ int get_url_ip(char* url)
/* convert URL to IP */ /* convert URL to IP */
if (lwip_getaddrinfo(url, NULL, &hint, &res) != 0) if (lwip_getaddrinfo(url, NULL, &hint, &res) != 0)
{ {
lw_pr_info("ping: unknown host %s\n", url); lw_notice("ping: unknown host %s\n", url);
return -1; return -1;
} }
memcpy(&h, &res->ai_addr, sizeof(struct sockaddr_in *)); memcpy(&h, &res->ai_addr, sizeof(struct sockaddr_in *));
@ -500,13 +500,13 @@ int get_url_ip(char* url)
lwip_freeaddrinfo(res); lwip_freeaddrinfo(res);
if (inet_aton(inet_ntoa(ina), &target_addr) == 0) if (inet_aton(inet_ntoa(ina), &target_addr) == 0)
{ {
lw_pr_info("ping: unknown host %s\n", url); lw_notice("ping: unknown host %s\n", url);
return -2; return -2;
} }
/* new a socket */ /* new a socket */
if ((s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP)) < 0) if ((s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP)) < 0)
{ {
lw_pr_info("ping: create socket failed\n"); lw_notice("ping: create socket failed\n");
return -3; return -3;
} }
@ -521,12 +521,12 @@ int get_url_ip(char* url)
#endif /* LWIP_DEBUG */ #endif /* LWIP_DEBUG */
if ((recv_len = lwip_ping_recv(s, &ttl)) >= 0) if ((recv_len = lwip_ping_recv(s, &ttl)) >= 0)
{ {
lw_pr_info("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt, lw_notice("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt,
ttl, sys_now() - ping_time); ttl, sys_now() - ping_time);
} }
else else
{ {
lw_pr_info("From %s icmp_seq=%d timeout\n", inet_ntoa(ina), cnt); lw_notice("From %s icmp_seq=%d timeout\n", inet_ntoa(ina), cnt);
} }
} }

View File

@ -159,9 +159,9 @@ tcpecho_raw_ack(struct tcp_pcb *tpcb, struct tcpecho_raw_state* es){
if((recv_len != TCP_MSS) || (recv_buf[recv_len - 1] == TCP_EOF_CH)) if((recv_len != TCP_MSS) || (recv_buf[recv_len - 1] == TCP_EOF_CH))
{ {
if(g_buf_size < MAX_TCP_SHOW_SIZE){ if(g_buf_size < MAX_TCP_SHOW_SIZE){
lw_pr_info("Received: %s\n", g_buf); lw_notice("Received: %s\n", g_buf);
}else{ }else{
lw_pr_info("Received a string of length %d\n", g_buf_size); lw_notice("Received a string of length %d\n", g_buf_size);
} }
tcpecho_raw_ack_size(tpcb, g_buf_size); tcpecho_raw_ack_size(tpcb, g_buf_size);

View File

@ -1652,6 +1652,7 @@ void shellTask(void *param)
shellHandler(shell, data[i]); shellHandler(shell, data[i]);
} }
} }
KPrintf("");
} }
} }