跳转至

RflyADBLib 接口文档

简介

简述:该文件提供无人机集群通信所需的ADB连接、串口通信与WiFi控制功能,支持集群无人机下位机设备的连接管理与指令交互。

本模块是RflySim无人机集群仿真与实飞系统的配套通信工具模块,针对实飞场景下多无人机机载设备的统一管理开发,封装了不同通信方式的基础操作。支持通过ADB、串口、WiFi三种主流通信方式对接机载嵌入式设备,可完成设备连接状态检测、连接启动与断开、网络状态检测、设备地址识别等常用操作,能够为集群任务的下位机指令下发、状态回传提供底层通信支撑。

该模块主要适用于实飞无人机集群的设备调试、任务部署场景,开发者可以基于本模块快速实现多机载设备的批量通信管理,无需从零搭建不同通信方式的底层逻辑,适配RflySim平台的集群开发流程。

快速开始

最简可用示例,复制后修改最少配置即可运行。

import RflyADBLib
import os
import subprocess


def get_adb_devices(adb_executable):
    """启动 ADB 服务并返回状态正常的设备序列号。"""
    subprocess.run(
        [adb_executable, "start-server"],
        check=True,
        capture_output=True,
        text=True,
    )
    result = subprocess.run(
        [adb_executable, "devices"],
        check=True,
        capture_output=True,
        text=True,
    )
    return [
        line.split("\t", 1)[0]
        for line in result.stdout.splitlines()[1:]
        if line.endswith("\tdevice")
    ]


def main():
    psp_path = os.environ.get("PSP_PATH", r"C:\PX4PSP")
    adb_executable = os.path.join(
        psp_path,
        "RflySimAPIs",
        "RflySimSDK",
        "adb",
        "adb.exe",
    )
    if not os.path.isfile(adb_executable):
        print(f"未找到 ADB 程序:{adb_executable}")
        return 1

    try:
        devices = get_adb_devices(adb_executable)
    except (OSError, subprocess.CalledProcessError) as exc:
        print(f"ADB 启动或设备查询失败:{exc}")
        return 1

    if not devices:
        print("未检测到 ADB 设备,请连接板载 Linux 设备后重试")
        return 1
    if len(devices) > 1:
        print(f"检测到多个 ADB 设备({', '.join(devices)}),请只保留一个目标设备")
        return 1

    try:
        adb_comm = RflyADBLib.adb_communication(debug_mode=False)
        wifi_ctrl = RflyADBLib.wifi_command(adb_comm.send_command)

        # nmcli 命令通过 ADB 在板载 Linux 设备上执行
        wifi_ctrl.open_wifi()
        wifi_state = wifi_ctrl.statu_wifi()
        current_wifi = wifi_ctrl.current_wifi()
    except Exception as exc:
        print(f"板载 Wi-Fi 操作失败:{exc}")
        return 1

    print(f"当前 Wi-Fi 状态:{wifi_state}")
    print(f"当前连接的 Wi-Fi:{current_wifi or '未连接'}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

环境与依赖

  • Python 环境>= 3.8.10
  • 依赖库osppadb.clientreserialsignalsubprocesssystime
  • 前置准备:调用此接口前,需要确保已经正确连接设备并完成串口或adb、wifi相关通信环境的配置准备。

核心接口说明

该模块 RflyADBLib.py 包含了配置变量、辅助函数及核心业务类。

全局常量与枚举定义

本节列出模块中所有可直接引用的全局常量和枚举定义。

独立常量


全局/独立函数

extract_specific_mac(text, interface_name="wlan0")

功能说明:从给定文本中提取指定网络接口对应的MAC地址。 参数列表

  • text (Any): 包含网络接口信息的源文本,通常为系统网络配置查询输出
  • interface_name (Any): 目标网络接口名称,默认为wlan0

返回值

  • str | None: 成功提取则返回对应MAC地址字符串,未找到则返回None

异常: 无


ping_ip(ip_address)

功能说明:检测指定IP地址是否能通过ping命令连通。 参数列表

  • ip_address (Any): 待检测连通性的目标IP地址

返回值

  • bool: ping成功返回True,否则返回False

异常: 无


start_adb(path)

功能说明:启动ADB(Android调试桥)服务,可指定ADB工具所在路径。 参数列表

  • path (Any): ADB可执行文件所在的目录路径

返回值

  • None: 无返回值

异常: 无


check_device_connected()

功能说明:检查是否有Android设备通过ADB成功连接。 参数列表: 无 返回值

  • bool: 有设备连接返回True,否则返回False

异常: 无


stop_adb()

功能说明:停止ADB服务,关闭连接。 参数列表: 无 返回值

  • None: 无返回值

异常: 无


signal_handler(sig, frame)

功能说明:信号处理函数,用于捕获处理程序退出信号,执行资源清理操作后退出程序。 参数列表

  • sig (Any): 待处理的信号编号
  • frame (Any): 当前栈帧对象

返回值

  • None: 无返回值

异常: 无


SerialCommunication

用于通过串口实现无人机端与计算机端的通信,支持串口命令发送、数据读取和串口连接关闭,适用于RflySim集群开发场景下的串口通信。

__init__(port, baudrate, debug_mode)

功能说明:初始化串口通信对象,打开指定参数的串口连接 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
port str "COM4" 串口设备名称,Windows系统一般为COMx格式,Linux系统一般为/dev/ttyUSBx格式
baudrate int 115200 串口通信波特率
debug_mode bool False 是否开启调试模式,开启后会输出通信调试信息

返回值 (Returns)

  • SerialCommunication 实例对象

异常 (Raises): 无


send_command(command)

功能说明:向串口发送指定的命令字符串 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
command str - 需要发送的串口命令字符串

返回值 (Returns)

异常 (Raises): 无


read_serial_data()

功能说明:从串口读取返回的响应数据 参数列表 (Args): 无 返回值 (Returns)

  • str: 读取到的串口数据字符串

异常 (Raises): 无


close_serial()

功能说明:关闭当前打开的串口连接,释放串口资源 参数列表 (Args): 无 返回值 (Returns)

异常 (Raises): 无

示例

# 初始化串口通信对象
serial_comm = SerialCommunication(port="COM4", baudrate=115200, debug_mode=True)
# 发送AT指令
serial_comm.send_command("AT")
# 读取串口返回数据
response = serial_comm.read_serial_data()
print(response)
# 关闭串口连接
serial_comm.close_serial()

adb_communication

用于实现基于ADB协议的无人机设备通信,提供ADB命令发送和通信管理功能,适用于群控无人机场景中移动设备的交互通信。

__init__(debug_mode=False)

功能说明:初始化ADB通信对象,配置调试模式选项 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
debug_mode bool False 是否开启调试模式,开启后会输出额外的调试日志信息

返回值 (Returns)

  • adb_communication 实例对象

异常 (Raises): 无


send_command(cmd)

功能说明:向连接的ADB设备发送指定命令,并获取命令执行结果 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
cmd str - 需要发送执行的ADB命令字符串

返回值 (Returns)

  • str: ADB命令执行后的输出结果

异常 (Raises): 无

示例

# 初始化ADB通信对象
adb_comm = adb_communication(debug_mode=True)
# 发送获取设备列表的ADB命令
result = adb_comm.send_command("devices")
print(result)

wifi_command

用于实现基于WiFi通道的集群无人机指令发送管理,依赖传入的发送回调函数完成指令传输。

__init__(send_command_function)

功能说明:构造WiFi指令发送管理对象,传入指令发送的回调处理函数。 参数列表 (Args)

参数名 类型 说明
send_command_function None 实际发送WiFi指令的回调函数,用于执行具体的指令下发操作

返回值 (Returns):无返回值,构造对象实例。 异常 (Raises):无异常抛出。

open_wifi()

功能说明:打开wifi 参数列表 (Args): 无参数 返回值 (Returns):无返回值 异常 (Raises):无


current_wifi()

功能说明:检查无线网络接口(wlan0)的连接状态,并打印出当前连接的无线网络名称(SSID) 参数列表 (Args): 无参数 返回值 (Returns):无返回值 异常 (Raises):无


statu_wifi()

功能说明:获取当前wifi的状态 参数列表 (Args): 无参数 返回值 (Returns):无返回值 异常 (Raises):无


close_wifi()

功能说明:关闭wifi 参数列表 (Args): 无参数 返回值 (Returns):无返回值 异常 (Raises):无


get_ip()

功能说明:获取连接wifi的IP 参数列表 (Args): 无参数 返回值 (Returns):无返回值 异常 (Raises):无


create_wifihot(SSID="AP_150_HOT", PASSWD="droneyee", CHANNEL=11)

功能说明:创建热点 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
SSID Any AP_150_HOT 热点名称
PASSWD Any droneyee 热点密码
CHANNEL Any 11 热点信道

返回值 (Returns):无返回值 异常 (Raises):无


modify_wifihot_ip(IPADDRESS=None)

功能说明:修改热点IP,不建议使用 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
IPADDRESS Any None 热点新IP地址

返回值 (Returns):无返回值 异常 (Raises):无


get_wifihot_passwd()

功能说明:获取热点的密码 参数列表 (Args): 无参数 返回值 (Returns):无返回值 异常 (Raises):无


connect_wifi(WIFI_SSID=None, WIFI_PASSWD=None)

功能说明:连接wifi 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
WIFI_SSID Any None 待连接WiFi的名称(SSID)
WIFI_PASSWD Any None 待连接WiFi的密码

返回值 (Returns):无返回值 异常 (Raises):无


echo_cmd(cmd=None, mode="0")

功能说明:进行相机参数设置,cmd为追加的命令,mode=0为追加,1为覆盖 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
cmd Any None 追加的设置命令
mode Any 0 写入模式,0为追加,1为覆盖

返回值 (Returns):无返回值 异常 (Raises):无


replace_cmd(cmd=None, place=None, path=None)

功能说明:cmd为期望替换的命令,place代表替换内容的行数,path为修改文件的路径 注:对camera_upd/config.yaml修改时,对应位置为: enable:5/13 ip:9/17 compress_rate:8/16 相机路径:/home/marvsmart/camera_udp/config.yaml 自启动路径:/etc/./rc.local 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
cmd Any None 期望替换的目标命令内容
place Any None 需要替换内容所在的行数
path Any None 需要修改的文件的路径

返回值 (Returns):无返回值 异常 (Raises):无


replace_cam_ip(ip=None, cam=None)

功能说明:修改相机IP,其中IP是期望的IP(字符串格式),cam是修改哪个相机(0或1) 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
ip Any None 期望设置的相机IP,字符串格式
cam Any None 需要修改的相机编号,取值为0或1

返回值 (Returns):无返回值 异常 (Raises):无


replace_cam_compress(rate=None, cam=None)

功能说明:修改相机图片压缩率,其中rate是期望的图片压缩率,cam是修改哪个相机(0或1) 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
rate Any None 期望设置的图片压缩率
cam Any None 需要修改的相机编号,取值为0或1

返回值 (Returns):无返回值 异常 (Raises):无


replace_cam_ehable(enable=None, cam=None)

功能说明:修改相机使能状态,其中enable是期望的相机使能状态,cam是修改哪个相机(0或1) 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
enable Any None 期望设置的相机使能状态
cam Any None 需要修改的相机编号,取值为0或1

返回值 (Returns):无返回值 异常 (Raises):无


replace_mav_link(ip=None, port="15502")

功能说明:设置mavlink回传的ip地址和端口 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
ip Any None mavlink回传的目标IP地址
port Any 15502 mavlink回传的目标端口

返回值 (Returns):无返回值 异常 (Raises):无

aotuStartWIFI(SSID="AP_150_HOT", PASSWD="droneyee", CHANNEL=11, enable=1)

功能说明:用于设置自动启动WIFI热点或关闭 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
SSID AP_150_HOT WIFI热点名称
PASSWD droneyee WIFI热点密码
CHANNEL 11 WIFI热点信道
enable 1 1表示开启自动启动热点,0表示关闭

返回值 (Returns):无 异常 (Raises):无


openCam()

功能说明:打开板载相机服务 参数列表 (Args):无参数 返回值 (Returns):无 异常 (Raises):无


getMac()

功能说明:获取开发板无线网卡的MAC地址 参数列表 (Args):无参数 返回值 (Returns):无线网卡的MAC地址字符串 异常 (Raises):无


setStaticIp(SSID, ip)

功能说明:为指定SSID的WIFI连接设置静态IP地址 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
SSID 需要设置静态IP的WIFI名称
ip 要设置的静态IP地址

返回值 (Returns):无 异常 (Raises):无


pingIp(ip)

功能说明:ping指定IP地址,检测网络连通性 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
ip 需要检测连通性的目标IP地址

返回值 (Returns):ping操作的输出结果 异常 (Raises):无

进阶用法示例

展示复杂组合场景(如多类协作、异步控制、批量操作)

import asyncio
import functools
import os

from RflyADBLib import SerialCommunication, wifi_command

# 多类协作+异步批量配置无人机机群WiFi热点场景
async def config_swarm_wifi_async(serial_dev_list, hot_ip_prefix, hot_passwd):
    # 存储所有已连接设备对象,方便后续统一关闭释放资源
    connected_devices = []
    config_tasks = []
    for idx, dev_port in enumerate(serial_dev_list):
        # 同时初始化串口通信和WiFi控制类
        try:
            serial_comm = SerialCommunication(dev_port, baudrate=115200)
        except Exception as exc:
            print(f"串口 {dev_port} 打开失败:{exc}")
            continue

        wifi_comm = wifi_command(serial_comm.send_command)
        connected_devices.append((serial_comm, wifi_comm))

        # 批量配置每个节点的热点IP和密码
        new_hot_ip = f"{hot_ip_prefix}.{idx+10}"
        # 异步提交配置任务,避免单设备阻塞整体流程
        config_tasks.append(
            asyncio.create_task(
                config_single_device(wifi_comm, new_hot_ip, hot_passwd)
            )
        )

    try:
        if config_tasks:
            await asyncio.gather(*config_tasks)
        else:
            print("没有可用的串口设备")
    finally:
        for serial_comm, _ in connected_devices:
            serial_comm.close_serial()

async def config_single_device(wifi_comm: wifi_command, target_ip, passwd):
    loop = asyncio.get_running_loop()
    # 先关闭现有WiFi连接,再创建自定义热点
    await loop.run_in_executor(None, wifi_comm.close_wifi)
    # 修改热点IP后生效配置
    await loop.run_in_executor(None, wifi_comm.modify_wifihot_ip, target_ip)
    # 创建热点并验证配置成功
    create_hotspot = functools.partial(wifi_comm.create_wifihot, PASSWD=passwd)
    await loop.run_in_executor(None, create_hotspot)
    current_passwd = await loop.run_in_executor(None, wifi_comm.get_wifihot_passwd)
    status = await loop.run_in_executor(None, wifi_comm.statu_wifi)
    print(f"热点创建完成,当前密码:{current_passwd},配置IP:{target_ip},当前状态:{status}")

if __name__ == "__main__":
    # 假设有4台无人机,批量初始化热点
    if os.name == "nt":
        device_ports = ["COM4", "COM5", "COM6", "COM7"]
    else:
        device_ports = ["/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2", "/dev/ttyUSB3"]
    asyncio.run(config_swarm_wifi_async(device_ports, "192.168.1", "RflySwarm2024"))

注意事项与避坑指南

  • 串口资源释放:使用SerialCommunication类完成通信后,必须调用close_serial方法释放串口资源,否则会导致后续程序无法打开同一串口设备,引发权限占用报错。
  • WiFi配置操作顺序:修改无人机热点IP前需要先调用close_wifi关闭现有连接或热点,修改完成后再重新调用create_wifihot才能让新IP配置生效,直接修改不会更新生效。
  • WiFi状态读取说明:调用statu_wifi获取WiFi连接状态前,需要先调用current_wifi刷新当前连接信息,否则会返回上一次的缓存状态,导致状态判断错误。
  • ADB通信权限校验:使用adb_communication类的send_command发送无人机控制指令前,需要确保电脑已经开启ADB调试权限、授权了设备访问,否则指令会被设备拒绝,无返回结果。

更新日志

  • 2024-08-29: 修改为自动获取路径方式
  • 2024-08-20: fix:完善API索引
  • 2024-08-15: fix: 更新adb库