开发板与电脑间通过网口通信(踩坑版)

目录

1、查看Debian开发板的网络配置

​2、设置电脑的网络

3、关闭防火墙

1. 关闭 ufw 防火墙

2. 关闭 iptables 防火墙

3. 禁用 iptables 服务(如果启用)

4. 查看防火墙状态

5. 禁用 firewalld(如果启用)

4、配置完后ping一下看看通不通(101是主机,102是虚拟机,103是开发板)

有个注意的地方,如果可以ping通主机,却不能ping通虚拟机,需要查看虚拟机的网络情况,且虚拟机不能联wifi(或关闭主机wifi)。​编辑注意看虚拟机的网络设置​编辑​编辑

5、ping通之后,我们运行我们的代码

以下展示效果:


1、查看Debian开发板的网络配置

sudo su
cd /etc/networc/
vim interfaces


我的开发板有两个网线插口,分别为eth0和eth1,原来的eth0的配置的自动,我希望是eth0的地址和eth1的地址都由我指定,修改如下:设置为指定的ip,需要设置ip、子网掩码、默认网关。


2、设置电脑的网络

在控制面板找到网络和internet,找到网络和共享中心,点击以太网(如果没有,检查网线是不是已经互相连了)。

点击属性页

设置指定的ip地址,注意,我们开发板设置的ip是192.168.1.103,那电脑只能设置192.168.1.*,*为1~205(除了103),其他两项与开发板设置的要相同。

3、关闭防火墙


电脑的防火墙关闭方法不做过多介绍,注意三个部分都要关闭

以下介绍Debian开发板的防火墙的关闭方法

在 Debian 系统上关闭防火墙通常涉及以下几个步骤。Debian 系统可能使用 ufw(Uncomplicated Firewall)或 iptables 来管理防火墙规则。以下是如何禁用这些防火墙的步骤:

1. 关闭 ufw 防火墙

如果你的系统使用 ufw 来管理防火墙,可以使用以下命令禁用它,如果没有ufw命令,可以sudo apt-get install ufw去安装一下。

sudo ufw disable

该命令会关闭 ufw 并清除防火墙规则。

2. 关闭 iptables 防火墙

如果你使用 iptables 作为防火墙,禁用防火墙规则的最直接方法是清除所有规则。运行以下命令来清除现有的 iptables 防火墙规则并设置默认的接受策略:

# 清除所有现有规则
sudo iptables -F

# 删除所有自定义链
sudo iptables -X

# 设置默认策略为接受(允许所有流量)
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

3. 禁用 iptables 服务(如果启用)

在一些 Debian 系统上,iptables 可能作为一个服务运行。如果你希望禁用它并确保它在系统重启时不会启动,可以使用以下命令:

# 禁用 iptables 服务
sudo systemctl stop netfilter-persistent
sudo systemctl disable netfilter-persistent

4. 查看防火墙状态

在禁用防火墙之后,你可以运行以下命令来确认防火墙的状态,确保所有规则都已经清除并且允许所有流量:

  • 查看 ufw 状态:

    sudo ufw status
    

    输出应该显示 Status: inactive,表示 ufw 防火墙已被禁用。

  • 查看 iptables 规则:

    sudo iptables -L
    

    这应该返回空规则列表,或显示 ACCEPT 为默认策略。

5. 禁用 firewalld(如果启用)

如果你的系统使用 firewalld,你可以使用以下命令禁用它:

# 停止 firewalld 服务
sudo systemctl stop firewalld

# 禁用 firewalld 服务,确保它在重启时不再启动
sudo systemctl disable firewalld

4、配置完后ping一下看看通不通(101是主机,102是虚拟机,103是开发板)

有个注意的地方,如果可以ping通主机,却不能ping通虚拟机,需要查看虚拟机的网络情况,且虚拟机不能联wifi(或关闭主机wifi)。

注意看虚拟机的网络设置

5、ping通之后,我们运行我们的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <iostream>
#include <pthread.h>
#include <semaphore.h>

#include <sys/select.h>
#include <sys/times.h>

#include <sys/epoll.h>

// 服务端函数
void server102(int port)
{
    int serv_sock{}, clnt_sock{};
    struct sockaddr_in serv_adr{}, clnt_adr{};
    socklen_t clnt_sz = sizeof(clnt_adr);
    char buf[1024] = "";  // 收发缓冲区

    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    if (serv_sock == -1) {
        perror("socket error");
        return;
    }

    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(port);

    // 绑定
    if (bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1) {
        perror("bind error");
        close(serv_sock);
        return;
    }

    // 监听
    if (listen(serv_sock, 5) == -1) {
        perror("listen error");
        close(serv_sock);
        return;
    }

    // epoll
    epoll_event event;
    int epfd = epoll_create(1);
    if (epfd == -1) {
        perror("epoll_create error");
        close(serv_sock);
        return;
    }

    epoll_event* all_events = new epoll_event[100];
    event.events = EPOLLIN;
    event.data.fd = serv_sock;
    epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &event);

    while (true) {
        int event_cnt = epoll_wait(epfd, all_events, 100, 1000);
        if (event_cnt == -1) {
            perror("epoll_wait error");
            break;
        }
        if (event_cnt == 0) continue;

        for (int i = 0; i < event_cnt; i++) {
            if (all_events[i].data.fd == serv_sock) {
                clnt_sz = sizeof(clnt_adr);
                clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_sz);
                if (clnt_sock == -1) {
                    perror("accept error");
                    continue;
                }

                event.events = EPOLLIN;
                event.data.fd = clnt_sock;
                epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event);
                printf("client is connected! %d\n", clnt_sock);
            } else {
                ssize_t len = read(all_events[i].data.fd, buf, sizeof(buf));
                if (len <= 0) {
                    epoll_ctl(epfd, EPOLL_CTL_DEL, all_events[i].data.fd, NULL);
                    close(all_events[i].data.fd);
                    printf("client is closed! %d\n", all_events[i].data.fd);
                } else {
                    write(all_events[i].data.fd, buf, len);
                }
            }
        }
    }

    delete[] all_events;
    close(serv_sock);
    close(epfd);
}

// 客户端函数
void client102(const char* ip, int port)
{
    int cln_sock = socket(PF_INET, SOCK_STREAM, 0);
    if (cln_sock == -1) {
        perror("socket error");
        return;
    }

    struct sockaddr_in serv_adr;
    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = inet_addr(ip);
    serv_adr.sin_port = htons(port);

    if (connect(cln_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1) {
        perror("connect error");
        close(cln_sock);
        return;
    }

    char message[256] = "";
    while (true) {
        printf("Input message(q/Q to quit): ");
        fgets(message, sizeof(message), stdin);
        if (!strcmp(message, "q\n") || !strcmp(message, "Q\n")) break;
        write(cln_sock, message, strlen(message));
        memset(message, 0, sizeof(message));
        read(cln_sock, message, sizeof(message));
        printf("server: %s\n", message);
    }

    close(cln_sock);
}

// 解析命令行参数
void lession102(int argc, char* argv[])
{
    if (argc < 3) {
        fprintf(stderr, "Usage: ./myepoll s <port> | ./myepoll c <ip> <port>\n");
        exit(EXIT_FAILURE);
    }

    if (strcmp(argv[1], "s") == 0) {
        // 服务端
        int port = atoi(argv[2]);
        server102(port);
    } else if (strcmp(argv[1], "c") == 0) {
        // 客户端
        if (argc < 4) {
            fprintf(stderr, "Client mode requires <ip> and <port>\n");
            exit(EXIT_FAILURE);
        }
        const char* ip = argv[2];
        int port = atoi(argv[3]);
        client102(ip, port);
    } else {
        fprintf(stderr, "Invalid option: %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }
}

int main(int argc, char* argv[])
{
    lession102(argc, argv);
    return 0;
}

我们在虚拟机上编译一下生成可执行文件,首先是在虚拟机运行的版本

由于开发板是体系,我们还需要生成一个arm版本的可执行文件

如果没有工具,先安装。

sudo apt update
sudo apt install g++-aarch64-linux-gnu

编译

aarch64-linux-gnu-g++ -std=c++11 -o myepoll01 epolltest.cpp -pthread

 把新的可执行文件复制到开发板。


以下展示效果:

首先,开发板我们先查看eth0和eth1哪个再用,,我们用的eth0,将开发板当服务器,虚拟机当客户端

接着用开发半当客户端,虚拟机当服务器

<think>好的,用户想实现电脑飞凌OK3588开发板网口通信。首先,我需要明确他们的具体需求和当前的环境配置。用户提到了参考的两篇引用,其中涉及驱动编译和4G模组的使用,可能需要考虑网络驱动的准备工作。 首先,确保硬件连接正确。用户需要使用网线连接电脑开发板的以太网口,或者通过路由器/交换机连接。如果是直连,可能需要交叉线,但现在大多数网卡支持自动翻转,普通网线应该也能用。 接下来是网络配置。需要给开发板电脑设置同一网段的静态IP,避免DHCP分配导致的问题。例如,开发板设为192.168.1.100,电脑设为192.168.1.101,子网掩码255.255.255.0。这一步需要指导用户如何通过ifconfig或网络管理工具设置IP。 然后测试基础连通性,使用ping命令检查双方是否能通信。如果不通,可能是防火墙或路由问题,需要排查。这里可能需要提醒用户关闭防火墙或配置规则允许ICMP。 之后是选择通信方式。用户可能需要TCP/UDP通信,或者更高层的协议如HTTP。提供简单的示例代码会更有帮助,比如Python的socket程序,分别作为服务器和客户端。开发板作为服务端监听,电脑作为客户端连接,或者反过来。需要确保端口开放和程序权限。 另外,用户之前提到的驱动编译可能涉及网络模块的驱动,比如USB转以太网或其他网络接口。需要确认开发板的以太网驱动已经正确加载,使用ifconfig -a查看接口是否存在。如果有问题,可能需要参考引用中的驱动编译步骤,确保内核支持相关硬件。 还要考虑开发板当前的操作系统情况,是否已经配置好网络服务,比如SSH,方便文件传输和远程控制。用户可能需要通过SCP或TFTP传输文件,或者使用网络调试工具如netcat进行快速测试。 用户可能遇到的常见问题包括IP配置错误、物理连接问题、驱动未加载、防火墙阻止等。需要一步步引导用户检查这些方面,并提供相应的解决方法。例如,使用dmesg查看驱动加载日志,或者iptables配置放行端口。 最后,生成的相关问题需要考虑用户可能的后续需求,比如如何传输文件、提高传输速度、网络调试工具的使用,以及无线网络连接的可能性。这些扩展问题能帮助用户更全面地应用开发板的网络功能。</think>### 电脑飞凌OK3588网口通信实现步骤 #### 一、硬件连接网络配置 1. **物理连接** - 使用网线直接连接电脑网口OK3588开发板网口(需确认网口指示灯状态正常) - 或通过路由器/交换机连接二者至同一局域网[^2] 2. **IP地址设置** *开发板端*(以静态IP为例): ```bash ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up ``` *电脑端*: - Windows:在「网络适配器设置」中手动设置IPv4地址为`192.168.1.101`,子网掩码`255.255.255.0` - Linux: ```bash ifconfig eth0 192.168.1.101 netmask 255.255.255.0 ``` #### 二、基础连通性测试 ```bash # 开发板执行(测试到电脑的连通性): ping 192.168.1.101 # 电脑执行(测试到开发板的连通性): ping 192.168.1.100 ``` *若不通请检查*: - 防火墙是否关闭(开发板执行`iptables -F`) - 网线/接口物理状态(`ethtool eth0`查看连接速率) - IP配置是否冲突 #### 三、通信实现方案 ##### 方案1:TCP/UDP Socket通信 *开发板作为服务端*(Python示例): ```python # server.py import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('0.0.0.0', 8888)) s.listen(1) conn, addr = s.accept() print('Connected by', addr) data = conn.recv(1024) print("Received:", data.decode()) conn.send(b"ACK from OK3588") ``` *电脑作为客户端*: ```python # client.py import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.1.100', 8888)) s.send(b"Hello OK3588") print("Response:", s.recv(1024).decode()) ``` ##### 方案2:SSH远程控制(需开发板开启ssh服务) ```bash # 电脑执行: ssh [email protected] ``` #### 四、驱动内核验证 1. 确认以太网驱动已加载: ```bash lsmod | grep dwc_eth # 飞凌开发板常用千兆网卡驱动 ``` 2. 检查网络接口状态: ```bash ethtool eth0 | grep "Link detected" ``` [^1]: 驱动加载参考:【飞凌嵌入式 OK3399-C+开发板试用体验】 [^2]: IP配置参考:实测|飞凌嵌入式OK3588-C开发板4G模组的使用测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yy__xzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值