使用 UnetSocket 在 unetstack 中创建客户端和服务器节点之间的通信
Creating a communication between client and server node in unetstack using UnetSocket
我是 UnetStack 这个领域的新手,非常感谢专家的帮助。
我创建了一个包含 4 个节点的小型网络。我正在尝试连接我的客户端节点,例如节点 B,到服务器节点 (A)。我试过他们之间通过shell进行通信。我成功了。但是当我通过代理尝试相同的操作时,我遇到了错误。基本上,我的客户端代理持有客户端的套接字代码,同样的情况也适用于我的服务器。我的目标是在客户端和服务器节点之间进行全功能通信。
我创建了一个服务器代理,客户端代理将这些代理添加到相应的节点堆栈中。在上述代理中,我尝试在各自代理的 .groovy 文件中实现我的服务器套接字代码和客户端套接字代码。服务器代理添加到名为 setup1.groovy
的安装文件中,而客户端代理添加到 setup2.groovy
中。这些相应文件的路径在模拟脚本中相应节点的堆栈部分中提到。但是,我仍然面临以下错误:
SEVERE: Client/B > Agent cli died: groovy.lang.MissingMethodException: No signature of method: org.arl.unet.api.UnetSocket.connect() is applicable for argument types: (String, Integer) values: [1, 0]
Possible solutions: connect(int, int), collect(), disconnect(), cancel(), collect(groovy.lang.Closure), collect(java.util.Collection, groovy.lang.Closure)
我附上我的模拟和代理脚本以获得更多见解。
服务器代理文件(server.groovy)
import org.arl.fjage.*
import org.arl.unet.*
import java.lang.String
//import org.arl.fjage.Agent
import org.arl.unet.api.UnetSocket
class server extends UnetAgent {
@Override
void startup() {
def sock = new UnetSocket('localhost',1105)
println('Server is active now!!!!!')
sock.bind(Protocol.DATA)
def rx= sock.receive()
println(rx.from,rx.to,rx.data)
sock.close()
}
}
客户端代理文件(client.groovy)
import org.arl.fjage.*
import org.arl.unet.*
import java.lang.String
import org.arl.fjage.Agent
import org.arl.unet.api.UnetSocket
class Client extends UnetAgent {
@Override
void startup() {
add new WakerBehavior(5000,{
def sock= new UnetSocket('localhost',1102)
//def to = sock.host('A')
println('Client Created!!!!!!')
sock.connect('1', Protocol.DATA)
sock.send('Connected!!!' as byte[])
sock.send('Successfully' as byte[])
sock.close()
})
}
}
模拟脚本
import org.arl.fjage.*
//import org.arl.unet.*
///////////////////////////////////////////////////////////////////////////////
// display documentation
println '''
my-node network
--------------
Node A: tcp://localhost:1105, http://localhost:8081/
Node B: tcp://localhost:1102, http://localhost:8082/
Node C: tcp://localhost:1103, http://localhost:8083/
Node D: tcp://localhost:1104, http://localhost:8084/
'''
///////////////////////////////////////////////////////////////////////////////
// simulator configuration
platform = RealTimePlatform // use real-time mode
// run the simulation forever
simulate {
node 'A', address:1, location: [ 0.km, 0.km, -15.m], web: 8081, api: 1105, stack: "$home/etc/setup1"
node 'B', address:2, location: [ -1.km, 1.7.km, -15.m], web: 8082, api: 1102, stack:"$home/etc/setup2"
node 'C', address:3, location: [ 0.8.km, -1.km, -15.m], web: 8083, api: 1103, stack: "$home/etc/setup"
node 'D', address:4, location: [ 1.5.km, 1.7.km, -15.m], web: 8084, api: 1104, stack: "$home/etc/setup"
}
setup1(服务器端安装文件)setup1.groovy
import org.arl.fjage.Agent
import java.lang.String
boolean loadAgentByClass(String name, String clazz) {
try {
container.add name, Class.forName(clazz).newInstance()
return true
} catch (Exception ex) {
return false
}
}
boolean loadAgentByClass(String name, String... clazzes) {
for (String clazz: clazzes) {
if (loadAgentByClass(name, clazz)) return true
}
return false
}
loadAgentByClass 'arp', 'org.arl.unet.addr.AddressResolution'
loadAgentByClass 'ranging', 'org.arl.unet.localization.Ranging'
loadAgentByClass 'mac', 'org.arl.unet.mac.CSMA'
loadAgentByClass 'uwlink', 'org.arl.unet.link.ECLink', 'org.arl.unet.link.ReliableLink'
loadAgentByClass 'transport', 'org.arl.unet.transport.SWTransport'
loadAgentByClass 'router', 'org.arl.unet.net.Router'
loadAgentByClass 'rdp', 'org.arl.unet.net.RouteDiscoveryProtocol'
loadAgentByClass 'statemanager', 'org.arl.unet.state.StateManager'
container.add 'serv', new server()
container.add 'remote', new org.arl.unet.remote.RemoteControl(cwd: new File(home, 'scripts'), enable: false)
container.add 'bbmon', new org.arl.unet.bb.BasebandSignalMonitor(new File(home, 'logs/signals-0.txt').path, 64)
Setup2.groovy 文件遵循相同的格式,但此时添加的代理是客户端。
谢谢。
此致,
您看到的错误的重要部分是
No signature of method: org.arl.unet.api.UnetSocket.connect() is applicable for argument types: (String, Integer) values: [1, 0]
Possible solutions: connect(int, int),
换句话说,您在 UnetSocket 上调用的 connect
方法的第一个参数类型为 String
,第二个参数类型为 int
。但是,不存在这样的方法,因此出现“无方法签名”错误。
事实上,编译器会提示其他可能有用的方法,包括将 int
作为两个参数的方法,这是您应该使用的方法。
所以更改客户端代码应该有助于解决这个问题。
void startup() {
add new WakerBehavior(5000,{
def sock= new UnetSocket('localhost',1102)
//def to = sock.host('A')
println('Client Created!!!!!!')
sock.connect(1, Protocol.DATA)
sock.send('Connected!!!' as byte[])
sock.send('Successfully' as byte[])
sock.close()
})
}
请注意,您正在 WakerBehaviour 中创建一个新的套接字,因此您将每 5 秒创建一个新的套接字。你可能不想那样做。
我是 UnetStack 这个领域的新手,非常感谢专家的帮助。
我创建了一个包含 4 个节点的小型网络。我正在尝试连接我的客户端节点,例如节点 B,到服务器节点 (A)。我试过他们之间通过shell进行通信。我成功了。但是当我通过代理尝试相同的操作时,我遇到了错误。基本上,我的客户端代理持有客户端的套接字代码,同样的情况也适用于我的服务器。我的目标是在客户端和服务器节点之间进行全功能通信。
我创建了一个服务器代理,客户端代理将这些代理添加到相应的节点堆栈中。在上述代理中,我尝试在各自代理的 .groovy 文件中实现我的服务器套接字代码和客户端套接字代码。服务器代理添加到名为 setup1.groovy
的安装文件中,而客户端代理添加到 setup2.groovy
中。这些相应文件的路径在模拟脚本中相应节点的堆栈部分中提到。但是,我仍然面临以下错误:
SEVERE: Client/B > Agent cli died: groovy.lang.MissingMethodException: No signature of method: org.arl.unet.api.UnetSocket.connect() is applicable for argument types: (String, Integer) values: [1, 0]
Possible solutions: connect(int, int), collect(), disconnect(), cancel(), collect(groovy.lang.Closure), collect(java.util.Collection, groovy.lang.Closure)
我附上我的模拟和代理脚本以获得更多见解。
服务器代理文件(server.groovy)
import org.arl.fjage.*
import org.arl.unet.*
import java.lang.String
//import org.arl.fjage.Agent
import org.arl.unet.api.UnetSocket
class server extends UnetAgent {
@Override
void startup() {
def sock = new UnetSocket('localhost',1105)
println('Server is active now!!!!!')
sock.bind(Protocol.DATA)
def rx= sock.receive()
println(rx.from,rx.to,rx.data)
sock.close()
}
}
客户端代理文件(client.groovy)
import org.arl.fjage.*
import org.arl.unet.*
import java.lang.String
import org.arl.fjage.Agent
import org.arl.unet.api.UnetSocket
class Client extends UnetAgent {
@Override
void startup() {
add new WakerBehavior(5000,{
def sock= new UnetSocket('localhost',1102)
//def to = sock.host('A')
println('Client Created!!!!!!')
sock.connect('1', Protocol.DATA)
sock.send('Connected!!!' as byte[])
sock.send('Successfully' as byte[])
sock.close()
})
}
}
模拟脚本
import org.arl.fjage.*
//import org.arl.unet.*
///////////////////////////////////////////////////////////////////////////////
// display documentation
println '''
my-node network
--------------
Node A: tcp://localhost:1105, http://localhost:8081/
Node B: tcp://localhost:1102, http://localhost:8082/
Node C: tcp://localhost:1103, http://localhost:8083/
Node D: tcp://localhost:1104, http://localhost:8084/
'''
///////////////////////////////////////////////////////////////////////////////
// simulator configuration
platform = RealTimePlatform // use real-time mode
// run the simulation forever
simulate {
node 'A', address:1, location: [ 0.km, 0.km, -15.m], web: 8081, api: 1105, stack: "$home/etc/setup1"
node 'B', address:2, location: [ -1.km, 1.7.km, -15.m], web: 8082, api: 1102, stack:"$home/etc/setup2"
node 'C', address:3, location: [ 0.8.km, -1.km, -15.m], web: 8083, api: 1103, stack: "$home/etc/setup"
node 'D', address:4, location: [ 1.5.km, 1.7.km, -15.m], web: 8084, api: 1104, stack: "$home/etc/setup"
}
setup1(服务器端安装文件)setup1.groovy
import org.arl.fjage.Agent
import java.lang.String
boolean loadAgentByClass(String name, String clazz) {
try {
container.add name, Class.forName(clazz).newInstance()
return true
} catch (Exception ex) {
return false
}
}
boolean loadAgentByClass(String name, String... clazzes) {
for (String clazz: clazzes) {
if (loadAgentByClass(name, clazz)) return true
}
return false
}
loadAgentByClass 'arp', 'org.arl.unet.addr.AddressResolution'
loadAgentByClass 'ranging', 'org.arl.unet.localization.Ranging'
loadAgentByClass 'mac', 'org.arl.unet.mac.CSMA'
loadAgentByClass 'uwlink', 'org.arl.unet.link.ECLink', 'org.arl.unet.link.ReliableLink'
loadAgentByClass 'transport', 'org.arl.unet.transport.SWTransport'
loadAgentByClass 'router', 'org.arl.unet.net.Router'
loadAgentByClass 'rdp', 'org.arl.unet.net.RouteDiscoveryProtocol'
loadAgentByClass 'statemanager', 'org.arl.unet.state.StateManager'
container.add 'serv', new server()
container.add 'remote', new org.arl.unet.remote.RemoteControl(cwd: new File(home, 'scripts'), enable: false)
container.add 'bbmon', new org.arl.unet.bb.BasebandSignalMonitor(new File(home, 'logs/signals-0.txt').path, 64)
Setup2.groovy 文件遵循相同的格式,但此时添加的代理是客户端。
谢谢。 此致,
您看到的错误的重要部分是
No signature of method: org.arl.unet.api.UnetSocket.connect() is applicable for argument types: (String, Integer) values: [1, 0]
Possible solutions: connect(int, int),
换句话说,您在 UnetSocket 上调用的 connect
方法的第一个参数类型为 String
,第二个参数类型为 int
。但是,不存在这样的方法,因此出现“无方法签名”错误。
事实上,编译器会提示其他可能有用的方法,包括将 int
作为两个参数的方法,这是您应该使用的方法。
所以更改客户端代码应该有助于解决这个问题。
void startup() {
add new WakerBehavior(5000,{
def sock= new UnetSocket('localhost',1102)
//def to = sock.host('A')
println('Client Created!!!!!!')
sock.connect(1, Protocol.DATA)
sock.send('Connected!!!' as byte[])
sock.send('Successfully' as byte[])
sock.close()
})
}
请注意,您正在 WakerBehaviour 中创建一个新的套接字,因此您将每 5 秒创建一个新的套接字。你可能不想那样做。