前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tello SDK 2.0使用指南(上)

Tello SDK 2.0使用指南(上)

作者头像
云深无际
发布2020-11-11 11:35:08
2K0
发布2020-11-11 11:35:08
举报
文章被收录于专栏:云深之无迹云深之无迹

这篇文章对SDK2.0的一些使用和命令做一些探索

我们第一页就可以看见官方给出了一个Python文件

我们下载下来简单的看一下

代码语言:javascript
复制
https://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Tello3.py

我把地址放出来,方便大家复制和下载

程序不长,浅显易懂.

还是稍微做一下讲解

这个是程序含有的一些变量信息

代码语言:javascript
复制
#
# Tello Python3 Control Demo
#
# http://www.ryzerobotics.com/
#
import threading
import socket
import sys
import time

host = ''
port = 9000
locaddr = (host, port)

# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # af_inet,sock_dgram

tello_address = ('192.168.10.1', 8889)

sock.bind(locaddr)


def recv():
    count = 0
    while True:
        try:
            data, server = sock.recvfrom(1518)
            print(data.decode(encoding="utf-8"))
        except Exception:
            print('\nExit . . .\n')
            break


print('\r\n\r\nTello Python3 Demo.\r\n')

print('Tello: command takeoff land flip forward back left right \r\n       up down cw ccw speed speed?\r\n')

print('end -- quit demo.\r\n')


# recvThread create
recvThread = threading.Thread(target=recv)
recvThread.start()

while True:

    try:
        msg = input("")

        if not msg:
            break

        if 'end' in msg:
            print('...')
            sock.close()
            break

        # Send data
        msg = msg.encode(encoding="utf-8")
        sent = sock.sendto(msg, tello_address)
    except KeyboardInterrupt:
        print('\n . . .\n')
        sock.close()
        break

因为SDK是基于http中的UDP协议进行通讯的

所以有必要进行一点讲解

代码语言:javascript
复制
https://www.jianshu.com/p/054fe6632bee

创建套接字对象

要进行 Socket 通信,我们需要使用 socket 模块,首先需要创建一个 Socket 对象。下面是两种创建方式:

代码语言:javascript
复制
# 使用 UDP 进行通信
udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 使用 TCP 进行通信
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

这个地方是对程序中的一些地方进行了截图

目标主机的 IP 和端口

如果我们需要向别的主机发送数据,我们需要改主机的 IP 地址和相应的端口号。在使用 Socket 进行通信时,需要将两个信息写在一元组中,元组的第一项为目标主机 IP 地址,第二项为接受数据的端口号:

代码语言:javascript
复制
targetAddr = ("192.168.0.1", 8080)

[(),()]

其中,IP 地址使用字符串类型,端口号使用数字类型.

绑定本机的端口

如果不绑定端口,每次使用 Socket 时都会由操作系统动态分配一个端口,我们也可以绑定为某个固定的端口。这样做的好处是:如果我们想要接受其他主机的信息,其他主机可以直接向这个端口发送数据,如果使用动态端口的话,发送方并不知道目标端口是什么,因此无法向接收方发送数据。 绑定端口需要使用 Socket 对象的 bind 方法:

代码语言:javascript
复制
selfBind = ( [IP], PORT )
socketObj.bind( selfBind )

Python 提供了两个级别访问的网络服务:

  • 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。
  • 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下:

代码语言:javascript
复制
socket.socket([family[, type[, proto]]])
代码语言:javascript
复制

参数

  • family: 套接字家族可以使 AF_UNIX 或者 AF_INET。
  • type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAMSOCK_DGRAM
  • protocol: 一般不填默认为 0。

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  • 程序的运行速度可能加快
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

线程在执行过程中与进程还是有区别的。每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

  • 线程可以被抢占(中断)。
  • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。

线程模块

Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。

threading 模块提供的其他方法:

  • threading.currentThread(): 返回当前的线程变量。
  • threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

  • run(): 用以表示线程活动的方法。
  • start():启动线程活动。
  • join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
  • isAlive(): 返回线程是否活动的。
  • getName(): 返回线程名。
  • setName(): 设置线程名。

关闭套接字

就像使用文件那样,在使用完套接字后,需要关闭它,调用 close 方法即可。

代码语言:javascript
复制
socketObj.close()

把信息进行一次编码

然后用套接字的方法发送出去(信息,目标地址)

下面是except的语句,有了错误该怎么办。

就是这个代码很简单,我重点语句都说出来了。

就是用了协议建立了通道,然后发送一些对目标主机来说有意义的信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建套接字对象
  • 目标主机的 IP 和端口
  • 绑定本机的端口
  • 什么是 Socket?
  • socket()函数
    • 参数
    • 线程模块
    • 关闭套接字
    相关产品与服务
    文档服务
    文档服务(Document Service,DS)是腾讯云数据万象提供云上文档处理服务,支持多种类型的文件生成图片或 html 格式的预览,可以解决文档内容的页面展示问题,满足 PC、App 等多端的文档在线浏览需求。同时,本产品还提供文本隐私筛查能力,可以有效识别文本中的身份证号、银行卡号、手机号等敏感数据,满足数据可用性和隐私保护的各种要求。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档