RK3326的Linux嵌入式设备基于SMB/CIFS实现局域网与PC端文件交互方案
2026/7/19 13:58:23 网站建设 项目流程

前言

项目背景:

近期承接一款Linux嵌入式检测设备定制开发项目,主控芯片采用瑞芯微 RK3326,搭载嵌入式 Linux+Qt 上位机软件,主要功能为采集某些车辆数据、生成 PDF 检测报告、读取 PC 下发的设备参数配置文件。客户现场使用场景为车间局域网环境:多台检测设备与办公 PC 接入同一台 WiFi 路由器,设备无独立服务器、无云平台,要求本地局域网内完成Linux系统的设备端,与PC电脑端的双向文件交互,具体如下:

  • PC 端固定目录存放设备运行 ini 配置文件,设备上电自动读取全部配置;
  • 设备完成检测后生成 PDF 报告,自动上传至 PC 指定存储文件夹;
  • 支持现场操作人员手动修改 PC 上的配置文件,设备实时重载;
  • 操作门槛低,现场工程师仅需输入 PC 局域网 IP 即可完成连接,无需复杂网络配置。

方案选型对比

项目初期,梳理三种局域网文件交互方案,逐一对比优劣,最终敲定 Windows SMB/CIFS 挂载方案:

方案优势劣势项目适配性
FTP/SFTP 文件传输跨平台通用、协议成熟需要 PC 开启 FTP 服务、配置账户端口;设备每次读写文件需建立连接,批量读取 ini、持续上传 PDF 逻辑复杂;现场 PC 防火墙极易拦截 21 端口,车间电脑多为普通员工权限,无法开启 FTP 服务不太好,现场部署成本高
自定义 Socket 文件传输自主可控、无系统依赖需要 PC 端配套上位机接收程序,客户现场不愿额外安装软件;文件断点续传、目录遍历、权限校验需从零开发,开发周期长、BUG 风险高放弃了,客户拒绝安装 PC 软件
SMB/CIFS 共享目录挂载Windows 原生支持,无需额外安装 PC 软件;设备端将 PC 共享目录挂载为本地路径,Qt 直接文件 IO 读写,业务层无需处理网络协议;仅需配置一次 IP,长期稳定读写;适配车间 Windows 办公电脑首选方案,完美匹配客户需求决定选用

方案整体架构说明

  • 网络层:RK3326 设备、Windows PC 连接同一 WiFi 局域网,网段统一;路由器关闭 AP 隔离,设备与 PC 二层互通;PC 绑定静态 IP,避免 IP 漂移导致挂载失效。
  • PC 端:Windows 开启 SMB1.0 协议、配置文件夹匿名共享(Guest 免密模式),开放 139、445、137、138 端口,NTFS 与 SMB 双重权限放开读写。
  • 设备固件层:内核开启 CONFIG_CIFS,内置 cifs 文件系统模块,支持 mount -t cifs 挂载命令。
  • 设备应用层:Qt 封装 SMB 挂载工具类,自动创建挂载目录、动态根据用户输入 IP 拼接共享路径、一键挂载 / 卸载,上层业务直接以本地文件形式读写 PC 共享目录,无需网络相关逻辑改造。
  • 业务数据流:
    读流程:Qt 读取 /mnt/pc_share/Config/*.ini → 解析参数初始化设备;
    写流程:设备生成 PDF 报告 → Qt 调用文件接口复制至 /mnt/pc_share/Report/,实时同步至 PC 磁盘。

第一章 Windows PC 端全套标准化配置(包含Windows家庭版,量产免密 Guest 模式)

本项目测试电脑为 Windows 家庭版系统,无本地组策略 gpedit.msc、无本地用户和组 lusrmgr.msc 图形工具,所有配置全部通过系统功能、注册表、CMD 命令实现,全程不需要专业系统权限,普通管理员账号即可完成。

基础环境说明
  • PC 无线局域网 IP:192.168.103.19(路由器后台绑定 MAC 静态分配,禁止自动 DHCP 浮动 IP);
  • 本地磁盘路径:E 盘根目录创建固定文件夹 E:\test\TTM313,内置两级子目录:
    Config:存放所有设备 ini 配置文件,设备只读访问;
    Report:设备上传 PDF 检测报告,设备拥有写入、新建、删除权限;
  • SMB 共享名称统一为 TTM313,挂载路径固定 //PCIP/TTM313;
  • 认证模式:匿名 Guest 免密登录,适配嵌入式老旧 SMB1 协议,现场无需记录账号密码,降低操作难度。

1.1 步骤一:开启 SMB 1.0/CIFS 系统组件(嵌入式设备强制依赖)

RK3326 老旧 Linux 内核仅稳定兼容 SMB1.0 协议,Windows 10/11 默认关闭该组件,不开启则设备无法建立连接,也是项目调试初期最高发报错根源。
快捷键 Win+R 唤起运行窗口,输入命令“optionalfeatures.exe”回车,打开 Windows 功能管理器;
在功能列表中向下滑动,找到“SMB 1.0/CIFS 文件共享支持”总项,展开全部子项,将下面这三个子项全部勾选:“SMB 1.0/CIFS 自动删除”、“SMB 1.0/CIFS 文件共享”、“SMB 1.0/CIFS 客户端”;

点击确定,系统自动下载安装对应组件,等待进度条走完;
强制重启电脑:组件安装完成不重启不会生效,90% 初期 “找不到网络名” 报错均来自未重启;
重启完成后验证组件状态:右键开始菜单,打开管理员 PowerShell,输入校验命令:

Get-SmbServerConfiguration|Select EnableSMB1Protocol

实际显示如下:

输出结果为 True 代表 SMB1 协议正常启用,若为 False 需要重新勾选组件并再次重启。

1.2 步骤二:无线网卡开启文件共享与 NetBIOS over TCP/IP

SMB1 协议依赖 NetBIOS 协议完成局域网设备寻址,网卡默认关闭 NetBIOS 会导致本地 127 回环访问、局域网 IP 访问全部失败,操作流程:

  • 打开控制面板 - 网络和 Internet - 网络适配器,找到当前连接WiFi 的无线网卡(我是WIFI连接的,如果你是优先连接,你就找对应有线网卡);

  • 右键无线网卡选择属性,在项目列表中勾选「Microsoft 网络的文件和打印机共享」,未勾选则 Windows 不对外提供共享服务;

  • 双击列表内「Internet 协议版本 4 (TCP/IPv4)」,弹出 IPv4 配置窗口,切换至「高级」按钮;

  • 在高级 TCP/IP 设置中切换 WINS 标签页,选择「启用 TCP/IP 上的 NetBIOS」,一路点击确定保存全部窗口;

  • 右键 WiFi 网卡选择禁用,等待 5 秒后重新启用,刷新网卡网络配置,确保 NetBIOS 参数生效。

1.3 步骤三:注册表修改(家庭版无组策略核心配置,解决来宾匿名拦截)

Windows 新版系统默认拦截不安全来宾 SMB 登录,同时强制开启 SMB 数字签名,与 RK3326 SMB1 协议存在兼容性冲突,家庭版无法通过组策略修改,只能通过注册表写入参数,修改完成必须重启电脑。
Win+R 输入 regedit 打开注册表编辑器,分两处路径修改:

1.3.1 放开不安全来宾 SMB 登录权限

注册表路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters
右键 Parameters 文件夹,新建 DWORD (32 位) 值;
命名为AllowInsecureGuestAuth,双击打开,数值数据填写 1,基数选择十进制;
该参数作用:允许 Guest 匿名账户通过 SMB1 协议访问本机共享文件夹,关闭该参数时,设备端 Guest 登录会直接提示用户名密码无效。

1.3.2 关闭 SMB 强制数字签名,兼容老旧嵌入式设备

注册表路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
右键新建两个 DWORD (32 位) 值,数值全部设置为 0:
RequireSecuritySignature = 0;
EnableSecuritySignature = 0;
系统默认开启 SMB 签名校验,RK3326 内核不支持签名逻辑,会直接挂载失败,关闭签名后二者协议握手正常。
注册表全部修改完成,保存所有窗口,重启电脑使注册表参数完全生效。

1.4 步骤四:启用系统内置 Guest 来宾账户,设置空密码

项目采用免密匿名模式,登录账户固定为系统 Guest,Windows 默认禁用来宾账户,需要管理员 CMD 命令启用并清空密码:
右键开始菜单,打开管理员 CMD 终端;
执行第一条命令启用来宾账户:

net user Guest /active:yes

提示命令成功完成代表启用;
3. 执行第二条命令清空 Guest 登录密码:

net user Guest""

双引号内无任何字符,代表账户无密码,匹配设备端挂载参数password=空密码配置。

1.5 步骤五:局域网高级共享参数配置

打开控制面板 - 网络和共享中心 - 高级共享设置;
专用网络(当前 WiFi 所属网络类型):勾选启用网络发现、启用文件和打印机共享;
所有网络分类:找到密码保护共享选项,选择关闭密码保护共享;
点击保存更改,系统自动记录局域网共享规则。

1.6 步骤六:文件夹目录创建 + NTFS 本地权限 + SMB 共享双重权限配置

该步骤为 PC 配置核心,绝大多数设备挂载后无法读写文件的故障,根源是缺少 NTFS 底层本地权限,仅配置共享权限无法完成文件读写,必须双重权限同时配置。

6.1 创建标准目录结构

打开 E 盘,逐级新建文件夹(根据自己的实际需要命名):“E:\test\TTM313” ,内部新建两个子文件夹 Config、Report,严格区分配置读取目录与报告写入目录(这里也是根据你要共享读写的实际需要进行新建,不需要按照本文的例子命名)。

6.2 NTFS 底层安全权限配置

右键E:\test\TTM313 文件夹,选择属性,切换至安全标签,点击编辑按钮;
在权限编辑窗口点击添加,输入用户名 Guest,点击检查名称,系统自动识别来宾账户,确定添加;
选中 Guest 用户,下方权限列表全部勾选允许:完全控制、修改、读取和执行、列出文件夹内容、读取、写入;
重复添加 Everyone 用户,同样授予全部允许权限,兼顾其他电脑访问兼容性;
返回文件夹属性常规标签,取消勾选「只读」,点击高级,勾选 “将更改应用于此文件夹、子文件夹和文件”,确定保存,确保子目录 Config、Report 同步继承读写权限。

6.3 SMB 共享权限配置

右键目标文件夹,切换共享标签,点击高级共享;
勾选共享此文件夹,共享名称严格填写SmbShare,与设备挂载路径保持一致;
点击权限按钮,添加 Guest、Everyone 两个用户,全部授予完全控制权限;
所有弹窗依次点击应用、确定,完整保存共享配置。

1.7 步骤七:Windows 防火墙放行 SMB 协议端口

Windows 默认防火墙拦截 SMB 局域网访问,必须手动放行对应 TCP、UDP 端口,否则同 WiFi 下设备无法与 PC 建立连接:
Win+R 输入wf.msc打开高级安全 Windows 防火墙;
左侧入站规则,右侧新建规则,第一条规则配置 TCP 端口:
规则类型选择端口,下一步选择 TCP,特定本地端口填写139,445;
允许连接,下一步勾选域、专用、公用三类网络;
规则名称填写 SMB TCP 共享 139/445,完成创建;
再次新建规则,配置 UDP 端口:
端口类型 UDP,特定本地端口137,138;
允许全部网络,命名 SMB UDP NetBIOS,完成;
打开控制面板 - Windows 防火墙 - 允许应用通过防火墙,在应用列表找到文件和打印机共享,专用、公用复选框全部勾选,保存设置。
补充说明:现场电脑安装火绒、360 安全卫士、电脑管家等第三方安全软件,需要完全退出实时防护,第三方安全软件会底层拦截 445 端口,导致共享访问失败。

1.8 步骤八:重启 SMB 核心系统服务,加载全部配置

管理员 CMD 执行四条服务重启命令,刷新共享服务缓存,无需重启整机即可临时生效:

net stop LanmanServer net start LanmanServer net stop LanmanWorkstation net start LanmanWorkstation

LanmanServer 为 Windows 共享主服务,LanmanWorkstation 负责客户端 SMB 连接,重启后所有注册表、权限、共享配置同步加载。

1.9 步骤九:PC 本地自检,验证共享功能可用

全部配置完成后,通过两条命令自检,确认 PC 侧无配置问题,再进行设备端调试,避免现场调试时分不清故障端:
自检 1:查看本机共享列表

net share


输出列表中出现 TTM313 E:\test\TTM313 代表共享文件夹创建成功。
当然,这时候,在“此电脑”中也能看到共享的目录

第二章 RK3326 设备固件前置校验与 adb 调试操作

2.1 固件底层前置要求

内核编译开启CONFIG_CIFS=y/m,内置 cifs 文件系统驱动,支持 mount -t cifs 命令;
根文件系统具备完整 mount、umount 工具,支持文件权限参数 file_mode、dir_mode;
设备 WiFi 驱动正常,可连接 2.4G/5G 车间局域网 WiFi,自动获取同网段 IP;
设备 Qt 程序运行权限为 root,挂载、卸载系统命令属于特权操作,普通用户权限会执行失败。

2.2 adb shell 调试前置操作流程

设备通过 USB 数据线连接 Windows PC,设备开启 adb 调试模式;
Windows 终端输入adb shell,进入设备 Linux 根终端,提示符为root@TTM313:/#;
基础连通性校验:ping PC 静态 IP,验证局域网互通:

//根据自己实际的局域网IPping192.168.103.19

持续发包无丢包代表网络正常,ping 不通排查路由器 AP 隔离、WiFi 网段不一致、PC 防火墙拦截 ICMP;
4. 校验 cifs 内核模块可用性:

modprobe cifs

无任何报错输出,代表模块加载正常;提示找不到模块则固件未开启 cifs,需要重新编译内核。

2.3 手动挂载完整流程(adb 调试验证)

项目初期 Qt 代码未开发完成时,通过 adb 手动执行挂载命令验证连通性,分步执行避免目录不存在报错:
创建固定挂载目录 /mnt/pc_share,-p 参数自动生成上级目录,重复执行不会报错(根据你实际情况设定目录文件夹名称):

mkdir-p/mnt/pc_share

完整单行挂载命令(适配 Guest 免密、SMB1、中文不乱码、嵌入式兼容参数)运行:

mount-tcifs //192.168.103.19/TTM313 /mnt/pc_share-ousername=Guest,password=,vers=1.0,iocharset=utf8,file_mode=0644,dir_mode=0755,noserverino

参数逐项解释:
//192.168.103.19/TTM313:PC 共享源路径,IP 可根据用户输入动态替换;
/mnt/pc_share:设备本地固定挂载点;
username=Guest:Windows 合法匿名登录账户
password=:空密码,匹配 Guest 无密码配置;
vers=1.0:强制使用 SMB1 协议,适配 RK3326 老旧内核;
iocharset=utf8:解决中文文件夹、中文文件名乱码;
file_mode=0644、dir_mode=0755:控制设备创建文件、文件夹读写权限;
noserverino:修复嵌入式 Linux 读取共享目录卡顿、文件识别丢失问题。
挂载成功校验:

ls/mnt/pc_share

输出 Config、Report 两个文件夹代表挂载完成,可读取 ini、写入 PDF;

  1. 卸载共享目录(文件占用时使用懒卸载 - l,避免卡死):
    bash
    运行
    umount -l /mnt/pc_share

第三章 Qt 上层应用完整封装实现(适配 RK3326 嵌入式 Linux)

根据客户需求,Qt 程序需要实现核心逻辑:自动判断挂载目录是否存在、用户输入 PC 局域网 IP 动态拼接共享路径、一键挂载 / 卸载、实时判断挂载状态、挂载失败返回详细错误信息弹窗提示。代码分为工具类头文件、实现文件、UI 调用示例三部分,全部经过真机编译运行,无平台兼容性问题。

3.1 工具类头文件 smbsharehelper.h

#ifndefSMBSHAREHELPER_H#defineSMBSHAREHELPER_H#include<QObject>#include<QString>#include<QProcess>#include<QDir>#include<QFileInfo>classSmbShareHelper:publicQObject{Q_OBJECTpublic:explicitSmbShareHelper(QObject*parent=nullptr);// 挂载共享目录// pcIp: 用户输入PC IP,如"192.168.103.19"// 返回true挂载成功,false失败boolmountPcShare(constQString&pcIp);// 卸载共享目录boolumountPcShare();// 判断是否已经挂载成功boolisMounted()const;private:// 挂载点路径constQString m_mountPoint="/mnt/pc_share";// 共享文件夹名固定TTM313constQString m_shareName="TTM313";};#endif// SMBSHAREHELPER_H

3.2 工具类实现文件 smbsharehelper.cpp

#include"smbsharehelper.h"#include<QTextStream>#include<QFile>#include"log4qt/logger.h"#include"CommonDefine.h"LOG4QT_DECLARE_STATIC_LOGGER(logger,ConfigControl)SmbShareHelper::SmbShareHelper(QObject*parent):QObject(parent){}boolSmbShareHelper::mountPcShare(constQString&pcIp){// 1. 拼接SMB共享源路径 //IP/TTM313QString smbSource=QString("//%1/%2").arg(pcIp).arg(m_shareName);// 2. 判断挂载目录是否存在,不存在创建QDirmountDir(m_mountPoint);if(!mountDir.exists()){// mkdir -p 创建多级目录QProcess mkdirProc;QStringList mkdirArgs;mkdirArgs<<"-p"<<m_mountPoint;mkdirProc.start("mkdir",mkdirArgs);if(!mkdirProc.waitForFinished(3000)){logger()->info()<<__FUNCTION__<<QString(", 创建pc_share目录超时...");returnfalse;}if(mkdirProc.exitCode()!=0){logger()->info()<<__FUNCTION__<<QString(", 创建pc_share目录失败...")<<mkdirProc.readAllStandardError();returnfalse;}}// 3. 组装完整mount命令参数QStringList mountArgs;mountArgs<<"-t"<<"cifs"<<smbSource<<m_mountPoint<<"-o"<<"username=Guest,password=,vers=1.0,iocharset=utf8,file_mode=0644,dir_mode=0755,noserverino";// 4. 执行mountQProcess mountProc;mountProc.start("mount",mountArgs);if(!mountProc.waitForFinished(5000)){logger()->info()<<__FUNCTION__<<QString(", 挂载命令执行超时,请检查网络或IP");returnfalse;}intexitCode=mountProc.exitCode();if(exitCode!=0){logger()->info()<<__FUNCTION__<<QString(", 挂载失败,错误详情:")<<mountProc.readAllStandardError();returnfalse;}// 5. 挂载成功校验目录存在QDirtestDir(m_mountPoint);if(!testDir.exists()){logger()->info()<<__FUNCTION__<<QString(", 命令执行无报错,但挂载目录未生效");returnfalse;}returntrue;}boolSmbShareHelper::umountPcShare(){if(!isMounted()){returntrue;}QProcess umountProc;QStringList args;args<<"-l"<<m_mountPoint;// -l 懒卸载,避免文件占用卡住umountProc.start("umount",args);if(!umountProc.waitForFinished(3000)){logger()->info()<<__FUNCTION__<<QString(", 卸载超时");returnfalse;}if(umountProc.exitCode()!=0){logger()->info()<<__FUNCTION__<<QString(", 挂载失败,错误详情:")<<umountProc.readAllStandardError();returnfalse;}returntrue;}boolSmbShareHelper::isMounted()const{// 读取 /proc/mounts 判断是否存在挂载记录QFilemountsFile("/proc/mounts");if(!mountsFile.open(QIODevice::ReadOnly))returnfalse;QTextStreamstream(&mountsFile);QString content=stream.readAll();mountsFile.close();// 包含挂载点路径即代表已挂载returncontent.contains(m_mountPoint);}

3.3 调用示例

#include"smbsharehelper.h"#include<QMessageBox>#include<QFile>#include<QDir>// 挂载按钮点击槽函数voidMainWindow::on_btnMountConnect_clicked(){// 获取界面输入框内用户填写的PC局域网IPQString inputPcIp=ui->editPcIP->text().trimmed();if(inputPcIp.isEmpty()){QMessageBox::warning(this,"输入提示","请填写PC设备局域网IP地址!");return;}SmbShareHelper shareTool;boolmountResult=shareTool.mountPcShare(inputPcIp);if(mountResult){QMessageBox::information(this,"连接成功",QString("PC共享目录挂载完成\n本地访问路径:%1").arg("/mnt/pc_share"));// 挂载成功后自动加载PC端Config下所有ini配置文件,业务逻辑可在此拓展loadAllConfigFile();}else{QMessageBox::critical(this,"挂载失败","");}}// 卸载按钮点击槽函数voidMainWindow::on_btnUmountDisconnect_clicked(){SmbShareHelper shareTool;boolumountResult=shareTool.umountPcShare();if(umountResult){QMessageBox::information(this,"操作完成","PC共享目录已安全卸载");}else{QMessageBox::critical(this,"卸载失败","");}}// 业务拓展:读取PC共享Config目录下ini配置文件示例voidMainWindow::loadAllConfigFile(){QString configDir="/mnt/pc_share/Config";QDirdir(configDir);// 筛选所有ini后缀配置文件QStringList filter;filter<<"*.ini";dir.setNameFilters(filter);QFileInfoList fileList=dir.entryInfoList();for(autofileInfo:fileList){QString filePath=fileInfo.absoluteFilePath();QFileconfigFile(filePath);if(configFile.open(QIODevice::ReadOnly)){QString configContent=configFile.readAll();// 解析配置内容,初始化设备参数parseConfigData(configContent);configFile.close();}}}// 业务拓展:生成PDF报告上传至PC Report目录voidMainWindow::uploadReportToPC(QString localPdfPath,QString pdfName){QString targetPath=QString("/mnt/pc_share/Report/%1").arg(pdfName);QFile::copy(localPdfPath,targetPath);}

3.4 Qt 代码核心逻辑说明

  • 目录自动创建:代码内部先通过 QDir 判断/mnt/pc_share是否存在,缺失自动调用mkdir -p创建,解决调试阶段No such file or directory报错;
  • IP 动态拼接:完全由用户界面输入 IP 生成共享源路径,无需固定写死 IP,适配车间多台 PC 切换使用场景;
  • 精准挂载状态判断:读取系统 /proc/mounts 文件,不会单纯依靠目录是否存在判断,避免目录残留导致状态误判;
  • 超时保护:mkdir、mount、umount 全部设置等待超时,防止网络卡死造成 Qt 界面假死;
  • 完整错误输出:捕获命令标准错误输出,弹窗展示详细报错日志,现场工程师可直接根据提示定位故障;
  • 懒卸载机制:卸载使用umount -l,设备正在读写 PDF 报告时不会出现设备忙卸载失败。

3.5 编译与运行注意事项

  • Qt 程序必须以 root 权限运行,mount、umount 属于 Linux 系统特权命令,普通权限调用会直接执行失败;
  • RK3326 Buildroot 文件系统需要预装 QProcess 依赖,支持调用系统 shell 命令;
  • 固件开机可增加 cifs 模块自动加载脚本,无需手动执行 modprobe cifs;
  • 程序读写共享目录文件时,增加挂载状态判断,未挂载时禁止读写操作,避免程序崩溃。

第四章 全流程故障排查(踩坑汇总)

本章整合 PC 端配置、设备端adb配置调试、Qt 程序运行这几方面的报错,按照现象、根本原因、分步处理方案进行整理,现场调试时可依此参考。

4.1 PC 端共享配置故障

  • 故障 1:运行\127.0.0.1\TTM313提示找不到网络名
    根本原因:
    SMB1 组件勾选后未重启电脑,组件未加载;
    WiFi 网卡未开启 NetBIOS over TCP/IP;
    LanmanServer、LanmanWorkstation 服务未正常运行;
    第三方杀毒软件拦截 139/445 端口。
    处理方案:
    重启电脑,PowerShell 校验 EnableSMB1Protocol=True;
    网卡 IPv4 高级设置开启 NetBIOS;
    管理员 CMD 重启四大共享服务;
    完全退出火绒、360 等安全软件。
  • 故障 2:net use Z: …/user:Guest 提示用户名密码无效,弹窗要求输入密码
    根本原因:
    Guest 账户未执行命令启用;
    注册表 AllowInsecureGuestAuth 数值为 0;
    文件夹 NTFS 安全权限未添加 Guest 用户;
    高级共享未关闭密码保护共享。
    处理方案:
    执行net user Guest /active:yes启用来宾;
    修改注册表参数并重启整机;
    文件夹安全与共享权限双重添加 Guest,授予完全控制;
    所有网络设置关闭密码保护共享;
    弹窗出现直接回车,使用空密码登录。
  • 故障 3:net share 可查询到共享,RK3326 设备无法通过 IP 访问 PC
    根本原因:Windows 防火墙未放行 SMB 端口;路由器 WiFi 开启 AP 客户端隔离。
    处理方案:
    防火墙新建 TCP/UDP 规则放行 139、445、137、138 端口;
    登录路由器后台,关闭 AP 隔离、客户端隔离功能。
  • 故障 4:Z 盘映射成功,但无法向 Report 文件夹写入 PDF 文件
    根本原因:NTFS 本地安全权限缺少 Guest 写入权限;文件夹标记只读属性。
    处理方案:
    文件夹安全标签添加 Guest,勾选修改、写入权限;
    取消文件夹只读,应用到所有子文件、子目录。

4.2 RK3326 设备 adb 挂载故障

  • 故障 1:mount 命令报错 Couldn’t chdir to /mnt/pc_share: No such file or directory
    根本原因:设备本地不存在挂载目录,无法挂载至不存在路径。
    处理方案:adb shell 执行mkdir -p /mnt/pc_share创建目录后再执行挂载。
  • 故障 2:mount 返回 Permission denied 权限拒绝
    根本原因:挂载命令缺少 vers=1.0 参数;PC Guest 权限不足;Windows 未关闭 SMB 强制签名。
    处理方案:
    挂载参数追加 vers=1.0 强制 SMB1 协议;
    PC 端给文件夹 Guest 完全控制读写权限;
    修改注册表关闭 SMB 签名,重启 PC。
  • 故障 3:挂载成功,中文 ini、中文 PDF 文件名乱码
    根本原因:挂载参数缺失 iocharset=utf8 字符集配置。
    处理方案:挂载 - o 参数增加 iocharset=utf8。
  • 故障 4:挂载成功,ls 读取目录卡顿、部分文件丢失
    根本原因:缺少 noserverino 嵌入式兼容参数。
    处理方案:挂载参数追加 noserverino。
  • 故障 5:设备无法 ping 通 PC 局域网 IP
    根本原因:设备与 PC 连接不同 WiFi、路由器 AP 隔离开启、PC 防火墙拦截 ICMP 回显。
    处理方案:
    设备接入与 PC 完全相同 WiFi;
    路由器关闭 AP 隔离;
    Windows 防火墙放行 ping ICMP 请求。

4.3 Qt 程序运行故障

  • 故障 1:界面点击挂载按钮无任何响应,弹窗无报错
    根本原因:Qt 程序无 root 权限,QProcess 调用 mount 命令被系统拦截;固件未加载 cifs 模块。
    处理方案:
    修改程序启动脚本,使用 root 用户启动 Qt 应用;
    开机脚本执行 modprobe cifs 加载内核模块。
  • 故障 2:Qt 挂载提示命令执行超时
    根本原因:PC IP 输入错误、WiFi 断开、PC 关机、路由器网络故障。
    处理方案:
    校验输入 IP 格式正确性;
    adb shell ping PC IP 验证网络连通;
    确认 PC 正常开机、WiFi 在线。
  • 故障 3:isMounted 状态判断异常,目录存在但判定未挂载
    根本原因:仅依靠 QDir 判断目录,未读取 /proc/mounts 真实挂载记录。
    处理方案:沿用代码内读取内核挂载表的判断逻辑,不单纯判断目录是否存在。
  • 故障 4:上传 PDF 文件至 Report 目录失败,文件大小为 0
    根本原因:NTFS 权限未给 Guest 写入权限;共享目录只读。
    处理方案:回到 PC 文件夹权限配置,重新给 Guest 授予完全控制权限。

第五章 优化方案(批量部署长期稳定运行)

5.1 PC 端量产标准化优化

路由器绑定 PC MAC 地址分配静态 IP,制作设备台账记录每台 PC 固定 IP,避免现场 IP 漂移;
批量电脑制作注册表 reg 配置文件,双击导入即可完成来宾、SMB 签名配置,无需手动修改注册表;
电脑统一卸载第三方安全软件,或配置安全软件白名单放行 139、445 端口;
标准化文件夹路径固定 E:\test\TTM313,禁止现场修改文件夹名称、共享名。
禁止公网环境使用 Guest 匿名共享,仅内网局域网使用,规避网络安全风险。

5.2 RK3326 固件底层优化

开机启动脚本自动执行 modprobe cifs,无需手动加载内核模块;
根文件系统永久保留 /mnt/pc_share 目录,省去 Qt 程序自动创建步骤;
关闭 WiFi 休眠策略,防止设备长时间闲置断开局域网 WiFi,导致挂载断开。

5.3 Qt 应用量产功能优化

增加挂载自动重连逻辑:业务读写文件前判断挂载状态,未挂载自动使用界面保存的 IP 重新挂载;
IP 输入框增加历史 IP 记录下拉列表,操作人员无需重复输入;
文件读写增加异常捕获,挂载断开时弹窗提示 “PC 共享连接断开,请检查网络与 IP”;
PDF 上传增加文件完整性校验,复制完成后比对本地与 PC 端文件大小,避免传输中断生成损坏文件;
程序退出时自动执行 umount 卸载共享目录,正常释放 SMB 连接。

结语

本套 SMB/CIFS 双向文件交互方案完美适配 RK3326 嵌入式 Linux 设备与 Windows 的PC 的本地文件交互需求,全程无需 PC 额外安装客户端软件,依靠 Windows 原生共享功能实现零成本部署;设备端 Qt 应用屏蔽底层网络、挂载命令细节,操作人员仅需输入 IP 即可完成连接,大幅降低现场实施门槛。
在我开始调试过程中踩坑集中在 Windows 家庭版来宾匿名权限、SMB1 协议兼容、NTFS 双重权限配置几方面,因此写本文完整记录从 PC 系统配置、固件校验、Qt 上层开发、故障排查到优化全流程,所有命令、代码、注册表修改等各方面的操作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询