首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >破解Dji robomaster S1使用EP SDK

破解Dji robomaster S1使用EP SDK

作者头像
云深无际
发布2021-09-14 15:52:30
发布2021-09-14 15:52:30
3.5K20
代码可运行
举报
文章被收录于专栏:云深之无迹云深之无迹
运行总次数:0
代码可运行

EP车最便宜9000,S1二手的3000多,现在最重要的问题就是如何用上EP车的SDK,目前靠谱的做法就是root机器对机器内部的文件进行替换。这篇文章就是讲述这个,目前来看是有一点烂尾的。

代码语言:javascript
代码运行次数:0
运行
复制
https://service-adhoc.dji.com/download/app/pc/aa9163ed-66a5-4917-b747-f63933df4038

先把电脑的应用安装上

然后打开以后升级到最新的固件

这个最新的固件是这个时间

在Python的这里执行以下的代码,打开我们的adb通道

代码语言:javascript
代码运行次数:0
运行
复制
def root_me(module):
    __import__=rm_define.__dict__['__builtins__']['__import__']
    return __import__(module,globals(),locals(),[],0)

builtins=root_me('builtins')
subprocess=root_me('subprocess')
proc=subprocess.Popen('/system/bin/adb_en.sh',shell=True,executable='/system/bin/sh',stdout=subprocess.PIPE,stderr=subprocess.PIPE)

我这里还搞了一个名字

adb一下,看看有没有读取到

正常执行

查看对象的属性,元类编程的时候有用。一般不自己写库基本上不会用到元类编程,__dict__的相对用途就小很多

1) 内置的数据类型没有__dict__属性

  2) 每个类有自己的__dict__属性,就算存着继承关系,父类的__dict__ 并不会影响子类的__dict__

  3) 对象也有自己的__dict__属性, 存储http://self.xxx 信息,父子类对象公用__dict__

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash

adb shell rm -rf /data/dji_scratch/sdk
adb push dji_scratch/sdk /data/dji_scratch/.

adb push dji_scratch/bin/dji_scratch.py /data/dji_scratch/bin/.

adb push dji.json /data/.

adb push dji_hdvt_uav /data/.
adb shell chmod 755 /data/dji_hdvt_uav

adb push patch.sh /data/.

这个脚本是为Linux的机器设计的

如果是win系统,就一条一条的执行

如果是执行的话,按说是输出和我一样的

完成

代码语言:javascript
代码运行次数:0
运行
复制
https://developer.android.google.cn/studio/command-line/adb?hl=zh_cn

这就够了

shell

代码语言:javascript
代码运行次数:0
运行
复制
http://landley.net/toybox/

这个是内置的安卓工具箱

后面可能扫描二维码会坏掉,执行下面的命令

755就相当于菊花万人捅了。。。

代码语言:javascript
代码运行次数:0
运行
复制
adb shell chmod 755 /data/dji_hdvt_uav

如果你执行过后连接路由器有问题就使用这个

代码语言:javascript
代码运行次数:0
运行
复制
 pip install robomaster

安装一下官方的SDK,安装没有我这里写的这么简单:

Robomaster SDK安装(Win10+Py3.8)

这里是我以前写的文章:

这里的代码我好像写错了,忘了看和机器人的连接方式了。。。

这个代码是使用机身的热点来连接,所以下面是报错的。

代码语言:javascript
代码运行次数:0
运行
复制
https://robomaster-dev.readthedocs.io/zh_CN/latest/text_sdk/connection.html#wifi-direct
代码语言:javascript
代码运行次数:0
运行
复制
import robomaster
from robomaster import robot


if __name__ == '__main__':
    # 如果本地IP 自动获取不正确,手动指定本地IP地址
    # robomaster.config.LOCAL_IP_STR = "192.168.2.20"
    ep_robot = robot.Robot()

    # 指定连接方式为AP 直连模式
    ep_robot.initialize(conn_type='ap')

    version = ep_robot.get_version()
    print("Robot version: {0}".format(version))
    ep_robot.close()
代码语言:javascript
代码运行次数:0
运行
复制
2021-09-03 12:10:50,537 ERROR conn.py:271 SdkConnection: RECV TimeOut!
2021-09-03 12:10:50,538 ERROR robot.py:1339 Robot: Connection Failed, Please Check Hareware Connections!!! conn_type ap, host ('0.0.0.0', 10114), target ('192.168.2.1', 20020).
2021-09-03 12:10:50,539 ERROR client.py:70 Client: __init__, create Connection, exception: module 'robomaster.config' has no attribute 'DEFAULT_CONN_PROTO'
2021-09-03 12:10:50,543 ERROR client.py:153 Client: send_sync_msg, client recv_task is not running.
2021-09-03 12:10:50,544 ERROR client.py:153 Client: send_sync_msg, client recv_task is not running.
2021-09-03 12:10:50,546 ERROR client.py:153 Client: send_sync_msg, client recv_task is not running.
2021-09-03 12:10:50,547 ERROR client.py:153 Client: send_sync_msg, client recv_task is not running.
2021-09-03 12:10:50,548 ERROR client.py:153 Client: send_sync_msg, client recv_task is not running.
Robot: Can not connect to robot, check connection please.

所以我应该是破解完成来着。。。

这是EP的连接方式

S1目前是可以使用EP的SDK的,这些链接方式需要测试

代码语言:javascript
代码运行次数:0
运行
复制
https://codeload.github.com/dji-sdk/RoboMaster-SDK/zip/refs/heads/master

具体的官方的SDK库,我这里资源管理器坏了,不然就给你分析一手代码

我重启电脑了,开始!

Dji RoboMaster Tello SDK封装.1(对视频接口使用cv2.VideoCapture接收))

Dji RoboMaster Tello SDK封装.2

Dji RoboMaster Tello SDK封装.3(回复指令解包类)

Dji RoboMaster Tello SDK封装.4(打包,安装)

Robomaster SDK源码解读.Camera.上

RoboMaster SDK解读.1

RoboMaster SDK解读.2

RoboMaster SDK 解读.3

RoboMaster SDK 解读.4

你可以看看我以前写的东西,找找感觉。

搜索关键词

代码语言:javascript
代码运行次数:0
运行
复制
Robot: Can not connect to robot, check connection please.

方法变成属性调用

注意这个装饰器的使用

接着在这里文本发送类的封装

一开始的init就干了这个事情

就看到这里了

文件系统是安卓4.4

SD卡是可读写的

这个地方我突然悟了

我应该插个内存卡,我回去看看

这里我使用AS打开,确实是可以看到API的版本了

在这里翻到了这样的配置

这个配置像是网络的安全模式

以及本地的回环地址

这里我进行可视化的拖拽文件,报错这个

我看了上面,估计是没有SD卡的毛病

代码语言:javascript
代码运行次数:0
运行
复制
#!/system/bin/sh

# Run adbd for convenience. Not required to get SDK support.
# 方便起见,这里默认开启adbd
/system/bin/adb_en.sh &

# Stop affected services.
stop dji_sys
stop dji_hdvt_uav
stop dji_vision

# Overwrite S1's dji.json with EP's one. Use a bind mount as the file is in the
# 这里进行了覆写操作,用于绑定安装,文件在系统分区
# system partition.
mount -o bind /data/dji.json /system/etc/dji.json

# This allows accessing the robot with DJI's binary protocol on port 20020.
# 允许在20020的端口,使用二进制协议来控制机器人
mount -o bind /data/dji_hdvt_uav /system/bin/dji_hdvt_uav

# Restart services.
start dji_sys
start dji_hdvt_uav
start dji_vision

这里打个补丁,给机器人

adb server需要连接到adbd,这个连接叫adbconnect,这时候就可以通过客户端与设备端进行沟通,如上图

代码语言:javascript
代码运行次数:0
运行
复制
https://blog.csdn.net/viewsky11/article/details/53889143

这个东西也叫超级adb

还有覆写的json文件是7k多行

大致的内容,看不懂

UAV是二进制的打包协议

具体的定义,在源码里面有

可太多了

看一个函数就行,然后是用类封装的

设置摄像头的缩放倍数

上面不是说补丁的二进制传输端口在20020吗?

在这个地方被配置

还有这个,也是指明了所有我们想要的东西

至少是链接方式

代码语言:javascript
代码运行次数:0
运行
复制
ep_conf = Config("RoboMasterEPConfig")
ep_conf.product = "RoboMasterEP"
ep_conf.cmd_proto = "v1"
ep_conf.video_stream_addr = ()
ep_conf.video_stream_proto = "tcp"
ep_conf.video_stream_port = 40921
ep_conf.audio_stream_addr = ()
ep_conf.audio_stream_proto = "tcp"
ep_conf.audio_stream_port = 40922

ROBOT_SDK_PORT_MIN = 10100
ROBOT_SDK_PORT_MAX = 10500
ROBOT_DEVICE_PORT = 20020
ROBOT_PROXY_PORT = 30030
ROBOT_BROADCAST_PORT = 40927

ROBOT_SN_LEN = 14

ROBOT_DEFAULT_RNDIS_ADDR = ('192.168.42.2', ROBOT_DEVICE_PORT)
ROBOT_DEFAULT_WIFI_ADDR = ('192.168.2.1', ROBOT_DEVICE_PORT)

ROBOT_DEFAULT_LOCAL_RNDIS_ADDR = ('192.168.42.3', ROBOT_SDK_PORT_MIN)
ROBOT_DEFAULT_LOCAL_WIFI_ADDR = ('192.168.2.23', ROBOT_SDK_PORT_MIN)

比如这个地方

这个地方的代码也是值得一读

很多地方都可以复用

emmmm,官方也写来着

这个是我们写入机器的代码

继续看各种地址

S1的SDK版本号

直连模式的端口和ip

代码语言:javascript
代码运行次数:0
运行
复制
# -*- encoding: utf-8 -*-
# 测试环境: Python 3.6 版本

import socket
import sys

# 直连模式下,机器人默认 IP 地址为 192.168.2.1, 控制命令端口号为 40923
host = "192.168.2.1"
port = 40923

def main():

        address = (host, int(port))

        # 与机器人控制命令端口建立 TCP 连接
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        print("Connecting...")

        s.connect(address)

        print("Connected!")

        while True:

                # 等待用户输入控制指令
                msg = input(">>> please input SDK cmd: ")

                # 当用户输入 Q 或 q 时,退出当前程序
                if msg.upper() == 'Q':
                        break

                # 添加结束符
                msg += ';'

                # 发送控制命令给机器人
                s.send(msg.encode('utf-8'))

                try:
                        # 等待机器人返回执行结果
                        buf = s.recv(1024)

                        print(buf.decode('utf-8'))
                except socket.error as e:
                        print("Error receiving :", e)
                        sys.exit(1)
                if not len(buf):
                        break

        # 关闭端口连接
        s.shutdown(socket.SHUT_WR)
        s.close()

if __name__ == '__main__':
        main()

直连模式的代码。链接以后,输入command

这个串口我不知道能不能控制

倒是也有

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档