如何在软件中将两个物理串行端口相互桥接(并记录穿过的数据)?

2024-02-15

基本上,我想将我的计算机放在串行线中间并记录通过它的对话。我正在尝试对这段对话进行逆向工程,并最终模拟对话的一端。

我正在尝试做的事情的粗略图:

通常,我有这个:

__________        __________  
|        |        |        |  
|Device 1|<======>|Device 2|  
|________|        |________|  

我想做这个:

__________     __________     __________  
|        |     |        |     |        |  
|Device 1|<===>|Computer|<===>|Device 2|  
|________|     |________|     |________|  

计算机位于中间,基本上桥接了两个设备之间的连接并记录所传输的数据。

使用任何编程语言的答案可能都是有用的。最好我能够在 Windows 或 Linux 上执行此操作(或者如果有人对此问题有通用解决方案)。


那么,一种编程方法就是打开相关设备,然后开始在它们之间转发数据,同时保存到文件中。

大多数任何语言都可以做到。对于 java 和 python 之类的东西有很好的库。

网络上存在多种实现,我通过谷歌搜索找到了一种名为 Telnet Serial Bridge (TSB) 的 Python 实现,它允许您通过以太网桥接连接,并使用 putty 等 telnet 工具进行日志记录。

虽然在过去,我使用过 java rxtx 串行通信库rxtx.qbang.org http://rxtx.qbang.org/wiki/index.php/Main_Page我自己来做,尽管我怀疑现在有更新的版本,或者可能是 JVM 中内置的东西。

改编自该网站上的示例:

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TwoWaySerialComm
{
    void bridge( String portName1, String portName2 ) throws Exception
    {
        CommPortIdentifier portIdentifier1 = CommPortIdentifier.getPortIdentifier(portName1);
        CommPortIdentifier portIdentifier2 = CommPortIdentifier.getPortIdentifier(portName2);

        if ( portIdentifier1.isCurrentlyOwned() || portIdentifier2.isCurrentlyOwned())
        {
            System.out.println("Error: Port is currently in use");
        }
        else
        {
            CommPort commPort1 = portIdentifier1.open(this.getClass().getName(),2000);
            CommPort commPort2 = portIdentifier2.open(this.getClass().getName(),2000);

            if ( commPort instanceof SerialPort && commPort2 instanceof SerialPort )
            {
                SerialPort serialPort1 = (SerialPort) commPort1;
                serialPort1.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

                InputStream in1 = serialPort1.getInputStream();
                OutputStream out1 = serialPort1.getOutputStream();

                SerialPort serialPort2 = (SerialPort) commPort2;
                serialPort2.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

                InputStream in2 = serialPort2.getInputStream();
                OutputStream out2 = serialPort2.getOutputStream();

                (new Thread(new SerialReader(in1, out2))).start();
                (new Thread(new SerialReader(in2, out1))).start();
            }
            else
            {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }     
    }

    /** */
    public static class SerialReaderWriter implements Runnable 
    {
        InputStream in;
        OutputStream out;

        public SerialReader ( InputStream in, OutputStream out )
        {
            this.in = in;
            this.out = out;
        }

        public void run ()
        {
            byte[] buffer = new byte[1024];
            int len = -1;
            try
            {
                while ( ( len = this.in.read(buffer)) > -1 )
                {
                    out.write(buffer,0, len);
                    System.out.print(new String(buffer,0,len));
                }
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }            
        }
    }

    public static void main ( String[] args )
    {
        try
        {
            (new TwoWaySerialComm()).bridge("COM1", "COM3");
        }
        catch ( Exception e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在软件中将两个物理串行端口相互桥接(并记录穿过的数据)? 的相关文章

  • RXTX 中是否需要持续轮询?

    在试图弄清楚的同时这个问题 https stackoverflow com questions 1391402 problem receving in rxtx 感谢任何帮助 我在使用 RXTX 监控其活动的同时运行PortMon http
  • 自定义波特率

    我正在尝试通过虚拟 COM 端口与硬件设备通信 主机为PC Windows操作系统PC 设备正在以 921600 波特率工作 这段代码的工作原理 DCB dcb dcb BaudRate CBR 115200 SetCommState hP
  • 在嵌入式c中通过RS232处理ASCII命令

    我的微控制器有一个 RS232 接口 带有一组预定义的命令 有数百个命令 例如PRESSURE 50可设定压力为50 LIMIT 60可以将限制设置为 60 目前 这是使用一系列嵌套的 switch 语句来处理的 但这似乎是一个不优雅的解决
  • 串行端口重定向或拆分[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一本关于如何进行串行端口重定向或端口分割的书和 或代码示例 我编写了很多 com 端口应用程
  • linux C++ 串口回显输出

    在我的程序中 将字节发送到串行端口 我收到发送的字节 我不想接收我发送的字节 并且我不知道该怎么做 include
  • Arduino:使用串口和软件串口与蓝牙模块

    我的目的是使用 Arduino 通过 HC 05 蓝牙模块在 PC 和 Android 设备之间建立通信 我使用 PC 和 Arduino 串行监视器 之间的 USB 通信以及 SoftwareSerial 来连接到 HC 05 我的问题是
  • 如何仅使用串行控制台将二进制闪存文件发送到嵌入式系统?

    我有一个使用 ramdisk 启动的嵌入式 Linux 系统 因此它运行时没有可用的持久存储 它有闪存来存储内核和 ramdisk 唯一的连接是 RS 232 串行登录控制台 所以我受到其内置 busybox 提供的功能的限制 我想检索 r
  • 如何使用 Java 获取我的电脑中可用串行端口的列表?

    我只是运行一些代码来获取计算机上的可用端口列表 当我有 3 个空闲的 com 端口时 它返回 false 我该如何解决这个问题 我的代码 public static void main String args SerialParameter
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 如何找出哪个 USB-RS232 设备位于哪个 tty 上?

    我有两个基于相同 USB RS232 芯片的不同 USB 设备 当我将它们插入 USB 时 它们会安装到 dev ttyUSB0 3 我的问题是 在脚本中 我如何找出哪个脚本位于哪个 tty 上 使用 lsusb 我可以区分它们 gt ls
  • 如何忽略异常并完成尝试

    所以我一直在奋斗这个问题 https stackoverflow com questions 14885288 io exception error when using serialport open大约一周了 我想我知道这个问题 但我不
  • 在Python中快速绘制数据

    我正在尝试使用 arduino 绘制来自 mpu6050 imu 的数据 MPU6050 发送数据的速度比绘图快 Arduino 代码从串口提供 6 个数据 即偏航 俯仰 滚动 轴 ay 和 az 我需要快速情节的建议 Python代码 i
  • 为什么 Thread.Sleep() 在 SerialPort.Open 和 Close 之前?

    我注意到我在 SerialPort 关闭和打开时读到的示例代码 人们会在 SerialPort Open 和 Close 之前添加 Thread Sleep 1000 就像下面这样 Thread Sleep 1000 serialPort1
  • Linux下与CashCode纸币接受器通信

    我已经实现了 CCNET 协议 以便通过 Linux 上的软件与 CashCode 纸币接受器进行通信 最初 我花了很多时间试图弄清楚为什么设备不响应 我发送的命令 使用反复试验的方法 我找到了为串行端口设置以下选项的解决方案 stty F
  • 适用于嵌入式设备的良好串行通信协议/堆栈? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在为各种项目编写了几个不同的自定义串行协议后 我开始对每次重新发明轮子感到沮丧 我一直在寻找更通用的解
  • C#读取Arduino

    我正在尝试制作一个从 Arduino 读取传出信号的应用程序 但我无法使其在 C 中工作Windows 窗体 http en wikipedia org wiki Windows Forms 仅在控制台中 我的 C Windows 窗体代码
  • 使用 Qt 打开 SOCAT 创建的虚拟串口

    我正在 MacOS 上开发 Qt5 应用程序 我想测试我的应用程序串行端口通信 我想用socat http www dest unreach org socat 但我无法打开使用 socat 创建的端口 QSerialPortInfo av
  • 即使在重新启动 Ubuntu 18.04 后,具有拨出组权限的非 root 用户的串行端口权限也会被拒绝

    我编写的 systemd 服务以 root 权限启动 并取消系统帐户 称为 mxdaemon 的权限 这些服务需要访问物理串行端口 dev ttyS0 在电脑上 串行端口ls l Serial port crw rw 1 root dial
  • 读取串行数据而不需要高 CPU 使用率

    我想在 Linux 下用简单的 C 或 C 程序读取通过 FTDI 串行 接口从 Arduino 发送的消息 Arduino 发送两个字符的 标头 一个命令字节 后跟几个字节的数据 具体取决于命令 我的第一次尝试是简单地使用 open 和
  • Python串口通信

    我正在开发一个 Arduino 项目 由于内存限制 我将其与 Python 脚本连接起来 在Python方面 我有一个二维矩阵 其中包含各自的x y坐标值 并且在此列表中有26000个坐标对 因此 为了向大家澄清数据结构 pathlist

随机推荐

  • 如何与本机桌面 (win) 应用程序建立对等连接

    我需要与本机桌面 win 应用程序和网络浏览器建立对等连接 只是为了传输原始数据 从理论上讲 WebRTC 似乎是实现这一目标的唯一方法 如果您想使用 WebRTC 在浏览器和桌面之间交换数据 您可以使用此库将桌面部分编码为 C 语言 ht
  • 在 Android Activity 中从软件键盘监听 Webview 按键事件

    是否可以在 Android 主机应用程序中处理来自 Web 视图的软件键盘事件 例如 我的应用程序的 Activity 是否可以侦听显示 Google 网站的 Web 视图的搜索字段中键入的内容 考虑到下面描述的方法 如果我覆盖它返回 tr
  • 如何在 Python 中使用递归反转列表?

    我想要一个函数 它会使用递归返回给定列表的相反内容 我怎样才能做到这一点 将列表的第一个元素附加到反向子列表 mylist 1 2 3 4 5 backwards lambda l backwards l 1 l 1 if l else p
  • XML 解析使用但元素名称是动态的

    Simple XMLElement Object IpStatus gt 1 ti pid 20642 gt SimpleXmlElement Object 我有一个上面格式的 SimpleXMLElment 这个 XML 是在运行时生成的
  • Sailsjs 是否可以构建更复杂的模型

    我想在我的模型中包含数组或集合 这对于水线 mongoDB 来说是可能的吗 周围还有其他选择吗 example name Bundle col1 name anOtherModel subCol text aString col2 name
  • 在大表上使用 LIKE 操作时 MySQL 查询速度慢

    我有一个相当大的表 6 GB 并且在此查询上遇到性能问题 SELECT f TIME FORMAT f scheme H i as scheme TIME FORMAT f actual H i as actual DATE FORMAT
  • 获取 Matplotlib 绘图标签坐标

    我想访问图中的所有标签坐标 例如 我画两条线并显示图例 import matplotlib pyplot as plt plt plot 1 2 label first image plt plot 2 1 label second ima
  • 如果第一个元素是异常,为什么引发元组有效?

    我很难弄清楚这一点 它是关于在 Python 2 7 中引发异常时可能发生的错误 try raise 1 2 3 4 except Exception as ex print ex 这里的消息是 异常必须是旧式类或派生自 BaseExcep
  • Iron Router 数据触发 3 次

    我在 Router Config 上设置了一个带有加载模板的路由器 Router onBeforeAction loading this route clients path clients template clientsAll wait
  • 设置日期标头以降低 SpamAssassin 分数

    我使用了测试服务 verifier port25 com 来检查从我的 PHP 脚本发送电子邮件时发生的情况 由于某种原因 即使启用了 SPF 和 DKIM 它们最终还是出现在我的 GMail 垃圾邮件文件夹中 事实证明 SpamAssas
  • C# - 对基元数组进行排序并跟踪其索引的最快方法

    我需要一个float 待排序 我需要知道旧索引在新数组中的位置 这就是为什么我不能使用Array Sort 管他呢 因此 我想编写一个函数来对数组进行排序 并记住它从哪个索引获取每个值 float input new float 1 5 2
  • 强制变量仅保存某些值

    我正在使用 vs 2012 我有一个简单的字符串属性 string someString public string MyString get return someString 我希望该属性仅保留某些值 这样 当客户端使用此属性时 只能使
  • Amazon SimpleDB 用于开发环境/本地安装

    有没有一种方法 工具可以模拟Amazon的SimpleDB以进行开发 在我的上述探索中 我发现这个工具 http mac wareseeker com Tools simpledb dev 0 1 5 zip 3000833但这是针对 Ma
  • 通过内联汇编操作c变量[重复]

    这个问题在这里已经有答案了 可能的重复 如何访问 c 变量以进行内联汇编操作 https stackoverflow com questions 14617953 how to access c variable for inline as
  • .net core build 生成本地化文件夹

    我有一个使用 net core 2 0 的 web asp net 解决方案 我正在使用以下命令构建它 dotnet publish MySolution sln configuration release output d test ou
  • `new_root.mainloop()` 不会使主窗口无响应

    假设我有这个 tkinter 脚本 import tkinter as tk def callback new root tk Tk new root mainloop print Done root tk Tk button tk But
  • 由于“仅允许安全来源”而无法使用 navigator.geolocation

    自从我使用以下命令创建网站以来 控制台中出现错误navigator geolocation getCurrentPosition 以下 我意识到这会在未来的某个时候引起问题 而且由于我只玩网络开发 所以我并没有太担心 但它现在已经完全搞砸了
  • 无法与 WPA2 android 连接

    我正在使用以下代码与 Android 中的 WPA2 连接 我可以与 WEP 和 WPA 连接 但我只获得 扫描 状态 我无法连接 WPA2 网络 你能告诉我需要进行哪些更改才能使此代码与 wpa2 WiFi 相关吗 private boo
  • SQLite3如何使用索引?

    我正在研究 SQLite3 索引 这是一个表 COMPANY CREATE TABLE COMPANY ID INT PRIMARY KEY NOT NULL NAME TEXT NOT NULL AGE INT NOT NULL ADDR
  • 如何在软件中将两个物理串行端口相互桥接(并记录穿过的数据)?

    基本上 我想将我的计算机放在串行线中间并记录通过它的对话 我正在尝试对这段对话进行逆向工程 并最终模拟对话的一端 我正在尝试做的事情的粗略图 通常 我有这个 Device 1 lt gt Device 2 我想做这个 Device 1 lt