使用 QiSDK 从 Pepper 上的 Android 应用获取 Pepper 的 IP,NAOqi 2.9

Get Pepper's IP using QiSDK from Android app on Pepper, NAOqi 2.9

我有 Pepper 机器人 运行 NAOqi 2.9,这是使用 QiSDK 为其平板电脑创建 Android 应用程序的版本。

我目前必须在我的 Android 应用程序中获取 Pepper 的 head 的 IP,这可以通过手动输入轻松实现,但我想知道是否有以编程方式执行此操作的方法,因为平板电脑知道头部的 IP,因此始终将其与平板电脑的 IP 一起显示在通知栏中。

Connecting to a real robot 的第 5 步,他们说您可以手动执行此操作。

How to find the IP address?

On the tablet of the robot, display the notifications (swipe down from the top of the screen) and look for the following logo:

但这只是入门页面。我也查看了 Javadocs of the qisdk api 但没有找到与头部 IP 相关的任何内容。

我想知道是否有人知道我可以这样做的方法,不一定使用 QiSDK,因为它似乎不支持这个。

这不是最直接的解决方案,但您可以通过 SSH 从平板电脑访问主机,因为主机通过 USB 连接到平板电脑并且具有静态 IP 地址 192.168.100.80。然后你可以使用 ifconfig.

获取头部的IP地址

为了在 Java 中做到这一点,我使用了 JSch,但是任何 java SSH 实现都应该没问题。

正在安装 JSch

here 下载 jsch-0.1.55.jar。在您的应用程序目录中创建一个新文件夹 libs 并将 jar 保存在其中。然后将以下内容添加到您的 build.gradle 下的 dependencies:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
}

获取IP地址的命令

多亏了this answer,你可以对ifconfig输出做一些处理,得到Pepper头在wifi网络上的IP地址。 注意:目前我无法在物理 Pepper 上对此进行测试,因此请先通过 SSH 连接到 Pepper 并使用 运行 命令来进行检查。主要检查wlan0是网络设备的正确名称。

ifconfig wlan0 | grep 'inet addr' | cut -d ':' -f 2 | cut -d ' ' -f 1

运行 这个命令在 Java

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.InputStream;

// Create SSH session
jsch = new JSch();
session = jsch.getSession("nao", "192.168.100.80", 22);
session.setPassword("nao");

// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);

String command = "ifconfig wlan0 | grep 'inet addr' | cut -d ':' -f 2 | cut -d ' ' -f 1";

session.connect();
ChannelExec channelssh = (ChannelExec)session.openChannel("exec");
channelssh.setCommand(command);
InputStream stdout = channelssh.getInputStream();
// Execute command
channelssh.connect();
// Get output
StringBuilder output = new StringBuilder();
int bytesRead = input.read();
while (bytesRead != -1) {
    output.append((char) bytesRead);
    bytesRead = input.read();
}
// close SSH channel
channelssh.disconnect();

// Here's the IP address of the head, formatted as a string
String headIP = output.toString();