微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 UnetSocket

如何解决使用 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,web: 8082,api: 1102,stack:"$home/etc/setup2"
  node 'C',address:3,location: [ 0.8.km,-1.km,web: 8083,api: 1103,stack: "$home/etc/setup"
  node 'D',address:4,location: [ 1.5.km,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 秒创建一个新套接字。您可能不想这样做。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?