我希望使用构建工具(gradle)运行Unet模拟,我试图复制这篇UnetStack博客文章,其中给出了使用IntelliJ IDE运行模拟的描述:https://blog.unetstack.net/using-idea-with-unetstack
当我使用IntelliJ运行示例时,示例代码在日志文件中打印“Hello world”,并让shell代理运行,正如预期的那样。当我编译Unet并使用gradle插入模拟脚本时,Unet shell代理在模拟启动后启动关机。
最小工作示例。--
通过运行“gradle init”并输入以下内容来启动gradle groovy应用程序项目:application -> groovy -> no -> groovy -> helloworld-> helloworld -> 21 -> no。
根项目结构现在是
app/
gradle/
.gradle/
gradlew
gradlew.bat
settings.gradle
.gitattributes
.gitignore
字符串
下载Unet(https://unetstack.net/)并将“unet-3.4.0”从“unet-community-3.4.0/”复制到项目根目录,并创建文件夹“app/logs/"。
删除“app/src/main/groovy/helloworld/App.groovy”和“app/src/test/groovy/helloworld/AppTest.groovy”。
将“AwesomeAgent.groovy”和“simple_sim.groovy”添加到“app/src/main/groovy/helloworld/",包含以下代码(复制自博客文章):
AwesomeAgent.groovy
import org.arl.fjage.Message
import org.arl.unet.UnetAgent
class AwesomeAgent extends UnetAgent {
void setup() {
log.info("Hello world!")
}
void startup() {
// this method is called just after the stack is running
// look up other agents and services here, as needed
// subscribe to topics of interest here, to get notifications
}
Message processRequest(Message msg) {
// process requests supported by the agent, and return responses
// if request is not processed, return null
return null
}
void processMessage(Message msg) {
// process other messages, such as notifications here
}
}
型
simple_sim.groovy
import org.arl.fjage.RealTimePlatform
import org.arl.unet.link.ReliableLink
import org.arl.unet.sim.channels.ProtocolChannelModel
platform = RealTimePlatform
channel.model = ProtocolChannelModel
simulate {
node '1', address: 1, location: [0, 0, 0], shell: true, stack: { container ->
container.add 'da', new AwesomeAgent()
container.add 'link', new ReliableLink()
}
}
型
将**“app/build.gradle”**的内容替换为
plugins {
// Apply the groovy Plugin to add support for Groovy.
id 'groovy'
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
}
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
// Resolve unet version (folder name) and add library files to project ---------
String unet_dir=''
String root_dir=((String)projectDir)+'/..' // Project root
new File(root_dir).eachFile { file ->
if ( file.name.contains('unet') ){
unet_dir=file.name
}
}
if (unet_dir==''){
println 'unet is missing in project root directory'
}
String unet_lib=unet_dir+'/lib'
// Add all jar files from unet except groovy
println 'looking for unet jars in: ' + root_dir+'/'+unet_lib
new File(root_dir+'/'+unet_lib).eachFile { file ->
if ( file.name.contains('.jar') && !file.name.contains('groovy') ){
implementation files('../'+unet_lib+'/'+file.name) // Relative to this build script
}
}
// Use the latest Groovy version for building this library
implementation libs.groovy.all
// This dependency is used by the application.
implementation libs.guava
// Use the awesome Spock testing and specification framework even with Java
testImplementation libs.spock.core
testImplementation libs.junit
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
application { // "gradle run"
// Define the main class for the application (using run).
mainClass = 'org.arl.fjage.shell.GroovyBoot' // Boots sim script as input
}
run {
standardInput = System.in
// Insert these arguments into the simulator
args=["cls://org.arl.unet.sim.initrc", "src/main/groovy/helloworld/simple_sim.groovy"]
}
型
与博客文章的不同之处在于,构建脚本找到unet/lib jar文件并将其作为实现依赖项添加,并且文件输入在运行配置中定义。
当我运行上面的例子(从项目根目录运行“gradle run”)时,unet成功地加载了AwesomeAgent并在终端中打印了一次shell提示符“>”;然而,shell代理随后意外地启动了关机。以下是日志文件的内容:
1704206651962|INFO|org.arl.fjage.shell.GroovyBoot@1:main|fjage Build: fjage-1.9.1/37c49259/5-09-2021_13:26:12
1704206652270|INFO|org.arl.fjage.shell.GroovyBoot@1:main|Running cls://org.arl.unet.sim.initrc
1704206652273|INFO|org.arl.fjage.remote.EnumTypeAdapter@1:<clinit>|Groovy detected, using GroovyClassLoader
1704206652280|INFO|org.arl.fjage.remote.MessageAdapterFactory@1:<clinit>|Groovy detected, using GroovyClassLoader
1704206652313|INFO|org.arl.fjage.shell.GroovyBoot@1:main|Running src/main/groovy/helloworld/simple_sim.groovy
1704206652419|INFO|org.arl.unet.nodeinfo.NodeInfo@1:setAddress|Node address changed to 1
1704206652423|INFO|Script1@1:call|Starting console shell
1704206652496|INFO|Script1@1:doInvoke|Created static node 1 (1) @ [0, 0, 0]
1704206652506|INFO|Script1@1:doInvoke| --- BEGIN SIMULATION #1 ---
1704206652508|INFO|org.arl.unet.sim.SimulationContainer@1:init|Initializing agents...
1704206652508|INFO|org.arl.fjage.shell.ShellAgent/1@33:init|Agent shell init
1704206652508|INFO|AwesomeAgent/1@34:init|Loading agent da [AwesomeAgent] on 1
1704206652509|INFO|AwesomeAgent/1@34:call|Hello world!
1704206652509|INFO|org.arl.unet.sim.SimulationAgent/1@38:doInvoke|Loading simulator : SimulationAgent
1704206652509|INFO|org.arl.unet.nodeinfo.NodeInfo/1@37:init|Loading agent node v3.4.0/93008cfa/30-10-2021_02:33:22 [org.arl.unet.nodeinfo.NodeInfo] on 1
1704206652509|INFO|org.arl.unet.link.ReliableLink/1@36:init|Loading agent link v3.4.0/93008cfa/30-10-2021_02:33:22 [org.arl.unet.link.ReliableLink] on 1
1704206652509|INFO|org.arl.unet.sim.HalfDuplexModem/1@35:init|Loading agent phy v3.4.0/93008cfa/30-10-2021_02:33:22 [org.arl.unet.sim.HalfDuplexModem] on 1
1704206652609|INFO|org.arl.unet.sim.SimulationContainer@1:init|Agents ready...
1704206652609|INFO|org.arl.unet.sim.SimulationContainer@1:start|Starting container...
1704206652610|INFO|org.arl.unet.link.ReliableLink/1@36:startup|No PHY specified, auto detecting...
1704206652610|INFO|org.arl.unet.nodeinfo.NodeInfo/1@37:obtainAddress|Node name is 1, address is 1, address size is 8 bits
1704206652610|INFO|org.arl.unet.link.ReliableLink/1@36:startup|Using agent 'phy' for PHY
1704206652610|INFO|org.arl.unet.link.ReliableLink/1@36:startup|No MAC specified, auto detecting...
1704206652610|INFO|org.arl.unet.link.ReliableLink/1@36:startup|No MAC detected, continuing without MAC
1704206652614|INFO|org.arl.fjage.shell.ShellAgent/1@33:shutdown|Agent shell shutdown
1704206652614|INFO|org.arl.unet.sim.SimulationContainer@43:shutdown|Initiating shutdown...
1704206652614|INFO|org.arl.unet.sim.SimulationContainer@43:shutdown|All agents have shutdown
型
由于我在“simple_sim.groovy”中使用了platform = RealTimePlatform
,所以模拟不应该终止。如果您能帮助解决这个问题,我将不胜感激。
1条答案
按热度按时间nukf8bse1#
run
任务不会将您的终端连接到已启动的进程。因此,我猜启动的进程看到了stdin的结尾,因此终止了。
如果配置
字符串
它应该最有可能像你想的那样工作。