如何使用socat将远程BananaPI的SPI字符设备转发至本地?
解决Socat转发BananaPI SPI设备到本地的问题
问题分析
你当前的命令运行后很快终止,核心原因是远程端的Socat进程在无数据传输时会自动退出,且缺少维持会话持久的参数,导致双向转发链路无法保持。同时需要确保本地有可被URH识别的SPI设备节点。
步骤1:本地创建虚拟SPI设备节点
URH需要访问标准SPI设备路径,先在本地创建对应节点(权限不足时可加sudo执行):
# 创建本地SPI设备节点(主设备号153是SPI设备的标准主号) mknod $HOME/dev/spidev0 c 153 0 # 赋予读写权限,确保URH能正常访问 chmod 666 $HOME/dev/spidev0
步骤2:使用持久化的Socat双向转发命令
替换你原来的命令,添加会话保持参数,确保链路不中断:
socat -d -d $HOME/dev/spidev0 EXEC:"ssh me@bananapi socat -d -d - /dev/spidev0.0",pty,setsid,sigint,echo=0
参数说明:
pty:为远程Socat进程分配伪终端,避免无数据时进程自动退出setsid:创建独立会话,提升进程稳定性sigint:传递中断信号到远程进程,方便正常终止转发echo=0:关闭终端回显,避免干扰SPI数据传输
步骤3:验证权限与连接
- 确认BananaPI上的
me用户对/dev/spidev0.0有读写权限:
你的设备信息显示me已在对应权限组,若仍有异常可临时赋予全权限测试:sudo chmod 666 /dev/spidev0.0 - 运行命令后,通过
-d -d输出的调试信息确认链路建立成功,无报错。
替代方案:TCP端口转发(更稳定)
如果上述命令仍有问题,可拆分两步建立转发:
- 在BananaPI上启动Socat监听TCP端口:
socat TCP-LISTEN:8888,reuseaddr,fork /dev/spidev0.0 - 在本地连接到BananaPI的8888端口,映射到本地SPI节点:
socat $HOME/dev/spidev0 TCP:bananapi:8888
若不想开放BananaPI端口,可通过SSH端口转发隐藏端口:
# 先在本地建立SSH端口转发,把BananaPI的8888端口映射到本地8888 ssh -L 8888:localhost:8888 me@bananapi -N & # 再运行本地Socat命令 socat $HOME/dev/spidev0 TCP:localhost:8888
内容的提问来源于stack exchange,提问作者mawe222222
相关产品推荐
相关产品推荐

