b***i 发帖数: 3043 | 1 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客
户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222
。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。
面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。
我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里
在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的
地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从
文件里读映射就行了。
一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是
在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个
包。
下面是我的修改:
我在run里面收到了包,我应该修改后转发给设备(修改后)。然后我这个run里面怎么
等待设备的包呢?类似这样行吗?
run(){
do{
request = s_Transport.readRequest();// 截获原包
relayed_request= modify(request); // 修改
c_Transport.writeMessage(relayed_request); // 转发
relayed_response = c_Transport.readResponse(); // 读设备的回答
response = modify(relayed_response); // 修改
s_Transport.writeMessage(response) // 返回给LabView
} while(true);
} |
c****3 发帖数: 10787 | 2 你这个变路由器了,不是这么搞的。直接到raw socket上改吧
买个便宜的路由器,刷OpenWRT做个port forwarding就行了,不用写代码,这个最简单 |
a9 发帖数: 21638 | 3 你这个单线程没有异步更没有错误处理能工作就怪了。
老老实实按改2-4个星期创造点GDP不好吗?
2222
【在 b***i 的大作中提到】 : 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客 : 户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222 : 。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。 : 面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。 : 我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里 : 在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的 : 地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从 : 文件里读映射就行了。 : 一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是 : 在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个
|
b***i 发帖数: 3043 | 4 包的内容是这样的:
前面7个基本没什么用, 然后是 id,功能,寄存器地址,寄存器数量, 读写内容
我要修改的是寄存器地址外加IP地址和端口好要修改
【在 c****3 的大作中提到】 : 你这个变路由器了,不是这么搞的。直接到raw socket上改吧 : 买个便宜的路由器,刷OpenWRT做个port forwarding就行了,不用写代码,这个最简单
|
b***i 发帖数: 3043 | 5 多线程也行啊,用semaphore控制
从LabView那里读和返回
run(){
do{
request = s_Transport.readRequest();// 截获原包
relayed_request= modify(request); // 修改
sema.release() // 让另外一个线程行动
semb.acquire(); //要么接受到了,要末超时了
response = modify(relayed_response); // 修改
s_Transport.writeMessage(response) // 返回给LabView
} while(true);
}
向设备发送和接收
run()){
do{
sema.acquire();
c_Transport.writeMessage(relayed_request); // 转发
try{
relayed_response = c_Transport.readResponse(); // 读设备的回答
}catch(Timeout){}
semb.release();
} while(true);
}
【在 a9 的大作中提到】 : 你这个单线程没有异步更没有错误处理能工作就怪了。 : 老老实实按改2-4个星期创造点GDP不好吗? : : 2222
|
c****3 发帖数: 10787 | 6 你的需求没看懂,反正要改TCP地址,象你这样要两个TCP连接,一个是源设备和你程序
的,一个是你的程序和目标设备的。而且目标设备看到的连接,是来自你程序的IP.
你想要目标设备看到的连接IP还是来自源设备,就得像路由器那样工作,到raw socket
上更改IP然后转发。反正挺麻烦的,还不如用网络结构,做TCP的端口映射简单。是个
路由器都能做端口映射。
【在 b***i 的大作中提到】 : 包的内容是这样的: : 前面7个基本没什么用, 然后是 id,功能,寄存器地址,寄存器数量, 读写内容 : 我要修改的是寄存器地址外加IP地址和端口好要修改
|
b***i 发帖数: 3043 | 7 需要修改IP, port,和数据包的内容。
修改IP是为了不改变Labview程序而可以修改数据包的内容
LabView本来访问IPA, portB,包C
原来
Labview localhost, anyport ---C---> 设备IPA, port B
但是需要修改Labview发送的包的内容成为C1
现在让LabView访问localhost, portB,我的程序在同一个计算机上监听这个端口,然后
修改C成为C1,发给IPA, portB, C1。收到设备返回的包后倒是不需要修改了,直接返
回给LabView,是本机地址,原来socket里面知道的。
LabView localhost, anyport --C--> java, localhost, portB ----C1---> 设备
IPA, portB
不需要修改LabView
socket
【在 c****3 的大作中提到】 : 你的需求没看懂,反正要改TCP地址,象你这样要两个TCP连接,一个是源设备和你程序 : 的,一个是你的程序和目标设备的。而且目标设备看到的连接,是来自你程序的IP. : 你想要目标设备看到的连接IP还是来自源设备,就得像路由器那样工作,到raw socket : 上更改IP然后转发。反正挺麻烦的,还不如用网络结构,做TCP的端口映射简单。是个 : 路由器都能做端口映射。
|
c****3 发帖数: 10787 | 8 还要改包的内容?
如果目标机器不关心源IP的话,你的程序也起码要两个TCP连接。一个是Labview到你的
程序的,一个是你的程序到目标机器的。你的程序把从Labview受到的数据,修改后转
发到另一个TCP连接上去。
这是TCP工作的方式,否则你的程序变成路由器了,而且不是严格的路由器,因为路由
器工作在IP层,你要修改包内容,是工作在TCP层,有点象load balancer
【在 b***i 的大作中提到】 : 需要修改IP, port,和数据包的内容。 : 修改IP是为了不改变Labview程序而可以修改数据包的内容 : LabView本来访问IPA, portB,包C : 原来 : Labview localhost, anyport ---C---> 设备IPA, port B : 但是需要修改Labview发送的包的内容成为C1 : 现在让LabView访问localhost, portB,我的程序在同一个计算机上监听这个端口,然后 : 修改C成为C1,发给IPA, portB, C1。收到设备返回的包后倒是不需要修改了,直接返 : 回给LabView,是本机地址,原来socket里面知道的。 : LabView localhost, anyport --C--> java, localhost, portB ----C1---> 设备
|
b***i 发帖数: 3043 | 9 刚才听说不止要改包的内容,根据Modbus协议,以前在一起的寄存器现在不在一起了,
那么以前的包如果是要读多个连续寄存器现在要改成多个包了。
还不如我用Java重写算了。
【在 c****3 的大作中提到】 : 还要改包的内容? : 如果目标机器不关心源IP的话,你的程序也起码要两个TCP连接。一个是Labview到你的 : 程序的,一个是你的程序到目标机器的。你的程序把从Labview受到的数据,修改后转 : 发到另一个TCP连接上去。 : 这是TCP工作的方式,否则你的程序变成路由器了,而且不是严格的路由器,因为路由 : 器工作在IP层,你要修改包内容,是工作在TCP层,有点象load balancer
|
a9 发帖数: 21638 | 10 用路由器的话可能要改l7 filter
然后
接返
设备
【在 c****3 的大作中提到】 : 还要改包的内容? : 如果目标机器不关心源IP的话,你的程序也起码要两个TCP连接。一个是Labview到你的 : 程序的,一个是你的程序到目标机器的。你的程序把从Labview受到的数据,修改后转 : 发到另一个TCP连接上去。 : 这是TCP工作的方式,否则你的程序变成路由器了,而且不是严格的路由器,因为路由 : 器工作在IP层,你要修改包内容,是工作在TCP层,有点象load balancer
|
c*********e 发帖数: 16335 | 11 ssh tcp forward?
socket
【在 c****3 的大作中提到】 : 你的需求没看懂,反正要改TCP地址,象你这样要两个TCP连接,一个是源设备和你程序 : 的,一个是你的程序和目标设备的。而且目标设备看到的连接,是来自你程序的IP. : 你想要目标设备看到的连接IP还是来自源设备,就得像路由器那样工作,到raw socket : 上更改IP然后转发。反正挺麻烦的,还不如用网络结构,做TCP的端口映射简单。是个 : 路由器都能做端口映射。
|
c*********e 发帖数: 16335 | 12 你在公司里,是做什么的?
2222
【在 b***i 的大作中提到】 : 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客 : 户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222 : 。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。 : 面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。 : 我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里 : 在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的 : 地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从 : 文件里读映射就行了。 : 一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是 : 在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个
|
c*********e 发帖数: 16335 | 13 地址用常量。客户要改的时候,改 常量 的值就可以了。
2222
【在 b***i 的大作中提到】 : 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客 : 户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222 : 。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。 : 面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。 : 我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里 : 在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的 : 地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从 : 文件里读映射就行了。 : 一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是 : 在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个
|
b*******s 发帖数: 5216 | 14 don't use this kind of horrible design
just modify the addresses pls
2222
【在 b***i 的大作中提到】 : 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客 : 户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222 : 。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。 : 面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。 : 我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里 : 在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的 : 地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从 : 文件里读映射就行了。 : 一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是 : 在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个
|