如何在Node.js

时间:2019-01-01 14:04:08

标签: javascript node.js typescript udp dji-sdk

我正在编写一个Node.js应用程序来控制小型无人机。这是SDK的说明:


使用Wi-Fi在Tello与PC,Mac或移动设备之间建立连接。

发送命令并接收响应

电话IP:192.168.10.1 UDP端口:8889 <<->> PC / Mac /移动

步骤1:在PC,Mac或移动设备上设置UDP客户端,以通过同一端口从Tello发送和接收消息。

步骤2:在发送任何其他命令之前,请先通过UDP PORT 8889将“命令”发送到Tello,以启动SDK模式。

接收Tello状态

电话IP:192.168.10.1->> PC / Mac /移动UDP服务器:0.0.0.0 UDP端口:8890

第3步:在PC,Mac或移动设备上设置UDP服务器,并通过UDP PORT 8890检查来自IP 0.0.0.0的消息。在尝试第3步之前,必须完成第1步和第2步。

接收Tello视频流

电话IP:192.168.10.1->> PC / Mac /移动UDP服务器:0.0.0.0 UDP端口:11111

步骤4:在PC,Mac或移动设备上设置UDP服务器,并通过UDP端口11111检查IP 0.0.0.0中的消息。

第5步:通过UDP PORT 8889将“ streamon”发送到Tello以开始流式传输。在尝试步骤5之前,必须先完成步骤1和2。


“命令与接收”部分的工作方式就像一个超级按钮,我正在通过端口8889向无人机发送数据报/从无人机接收数据报。我的问题是,看起来我在其他端口上没有收到任何状态或视频流消息而且我很确定这不是无人机问题,但我没有使用Node正确设置某些问题。谁能看到问题在我的实现中。这是我的代码:

tello.ts

import dgram from 'dgram';

export class Tello {
  private LOCAL_IP_ = '0.0.0.0';
  private TELLO_IP_ = '192.168.10.1';

  private COMMAND_PORT_ = 8889;
  private commandSocket_ = dgram.createSocket('udp4');

  private STATE_PORT_ = 8890;
  private stateSocket_ = dgram.createSocket('udp4');

  private VIDEO_PORT_ = 11111;
  private videoSocket_ = dgram.createSocket('udp4');

  constructor() {}

  startCommandSocket() {
    this.commandSocket_.addListener('message', (msg, rinfo) => {
      const message = msg.toString();
      console.log(`from ${rinfo.address}: ${message}`);
    });
    this.commandSocket_.bind(this.COMMAND_PORT_, this.LOCAL_IP_, () => {
      console.log('Started listening on the command socket');
    });
  }

  startStateSocket() {
    this.stateSocket_.addListener('message', (msg, rinfo) => {
      const message = msg.toString();
      console.log(`from ${rinfo.address}: ${message}`);
    });
    this.stateSocket_.bind(this.STATE_PORT_, this.LOCAL_IP_, () => {
      console.log('Started listening on the state socket');
    });
  }

  startVideoSocket() {
    this.videoSocket_.addListener('message', (msg, rinfo) => {
      console.log('receiving video');      
      const message = msg.toString();
      console.log(`from ${rinfo.address}: ${message}`);
    });
    this.videoSocket_.bind(this.VIDEO_PORT_, this.LOCAL_IP_, () => {
      console.log('Started listening on the video socket');
    });
  }

  private sendCommand_(command: string) {
    // As this is sent over UDP and we have no guarantee that the packet is received or a response given
    // we are sending the command 5 times in a row to add robustess and resiliency.
    //for (let i = 0; i < 5; i++) {
    this.commandSocket_.send(command, this.COMMAND_PORT_, this.TELLO_IP_);
    //}
    console.log(`sending command: ${command} to ${this.TELLO_IP_}`);
  }

  /**
   * Enter SDK mode.
   */
  command() {
    this.sendCommand_('command');
  }

  /**
   * Auto takeoff.
   */
  takeoff() {
    this.sendCommand_('takeoff');
  }

  /**
   * Auto landing.
   */
  land() {
    this.sendCommand_('land');
  }

  streamVideoOn() {
    this.sendCommand_('streamon');
  }

  streamVideoOff() {
    this.sendCommand_('streamoff');
  }

  ...

}

index.ts

import { waitForSeconds } from './utils';
import { Tello } from './tello'

const main = async () => {
  const tello = new Tello();

  tello.startCommandSocket();
  await waitForSeconds(1);
  tello.command();
  await waitForSeconds(1);  
  tello.startStateSocket();
  await waitForSeconds(1);
  tello.startVideoSocket();
  await waitForSeconds(1);
  tello.streamVideoOn();
  await waitForSeconds(1);

  tello.takeoff();
  await waitForSeconds(10);
  tello.land(); 
};

main();

2 个答案:

答案 0 :(得分:1)

以下是使用“ streamon”命令接收和解码Tello SDK团队提供的h264视频流的示例代码。 https://github.com/dji-sdk/Tello-Python。 有关接收到的视频流数据的具体处理方法,请参考doc / reademe.pdf和h264解码器路径下的源代码。

在运行示例代码之前,应使用安装脚本安装一些依赖项。

答案 1 :(得分:1)

您是否打开防火墙接受UDP端口8890/11111吗?

在笔记本电脑防火墙中打开端口8890 / udp和11111 / udp,以接收Tello遥测数据。

在Linux上

$ sudo firewall-cmd --permanent --add-port = 8890 / udp

$ sudo firewall-cmd --permanent --add-port = 11111 / udp

在Mac上,使用“系统偏好设置”打开端口。

Open System Preferences > Security & Privacy > Firewall > Firewall Options
Click the + / Add button
Choose 'node' application from the Applications folder and click Add.
Ensure that the option next to the application is set to Allow incoming connections.
Click OK.