diff --git a/src/MaaCore/Config/GeneralConfig.cpp b/src/MaaCore/Config/GeneralConfig.cpp index d4578c22a8..936d7ad7ba 100644 --- a/src/MaaCore/Config/GeneralConfig.cpp +++ b/src/MaaCore/Config/GeneralConfig.cpp @@ -83,6 +83,8 @@ bool asst::GeneralConfig::parse(const json::value& json) const AdbCfg& base_cfg = base_name.empty() ? AdbCfg() : m_adb_cfg.at(base_name); AdbCfg& adb = m_adb_cfg[cfg_json.at("configName").as_string()]; + adb.devices = cfg_json.get("devices", base_cfg.devices); + adb.address_regex = cfg_json.get("addressRegex", base_cfg.address_regex); adb.connect = cfg_json.get("connect", base_cfg.connect); adb.display_id = cfg_json.get("displayId", base_cfg.display_id); adb.uuid = cfg_json.get("uuid", base_cfg.uuid); diff --git a/src/MaaCore/Config/GeneralConfig.h b/src/MaaCore/Config/GeneralConfig.h index cae7cfe476..905acf2ed9 100644 --- a/src/MaaCore/Config/GeneralConfig.h +++ b/src/MaaCore/Config/GeneralConfig.h @@ -65,6 +65,8 @@ struct Options struct AdbCfg { /* command */ + std::string devices; + std::string address_regex; std::string connect; std::string display_id; std::string uuid; diff --git a/src/MaaCore/Controller/AdbController.cpp b/src/MaaCore/Controller/AdbController.cpp index 7e812e103f..f8a0e02d69 100644 --- a/src/MaaCore/Controller/AdbController.cpp +++ b/src/MaaCore/Controller/AdbController.cpp @@ -21,6 +21,8 @@ #include "Utils/Platform.hpp" #include "Utils/StringMisc.hpp" +#include + asst::AdbController::AdbController(const AsstCallback& callback, Assistant* inst, PlatformType type) : InstHelper(inst) , m_callback(callback) @@ -754,29 +756,58 @@ bool asst::AdbController::connect( /* connect */ { - m_adb.connect = cmd_replace(adb_cfg.connect); - m_adb.release = cmd_replace(adb_cfg.release); - auto connect_ret = - call_command(m_adb.connect, 60LL * 1000, false /* adb 连接时不允许重试 */); - bool is_connect_success = false; - if (connect_ret) { - auto& connect_str = connect_ret.value(); - // 检查连接字符串是否包含 "connected" 或 "device" - is_connect_success = connect_str.find("connected") != std::string::npos || - connect_str.find("device") != std::string::npos; - if (connect_str.find("daemon started successfully") != std::string::npos - && connect_str.find("daemon still not running") == std::string::npos) { + // 先用 devices 读取输出 + m_adb.devices = cmd_replace(adb_cfg.devices); + m_adb.address_regex = cmd_replace(adb_cfg.address_regex); + auto devices_ret = call_command(m_adb.devices, 60LL * 1000, false); + bool need_connect = true; + if (devices_ret) { + const auto& devices_str = devices_ret.value(); + const std::regex address_regex(m_adb.address_regex); + for (std::sregex_iterator iter(devices_str.begin(), devices_str.end(), address_regex), end; iter != end; ++iter) { + if (iter->size() > 1 && iter->str(1) == address) { + need_connect = false; + break; + } } } - if (!is_connect_success) { + + // 如果不包含 `:` 且需要连接,connect 命令也不会成功 + if (address.find(':') == std::string::npos && need_connect) { json::value info = get_info_json() | json::object { { "what", "ConnectFailed" }, - { "why", "Connection command failed to exec" }, + { "why", "Address does not contain ':' and no devices found" }, }; callback(AsstMsg::ConnectionInfo, info); return false; } + + if (need_connect) { + m_adb.connect = cmd_replace(adb_cfg.connect); + m_adb.release = cmd_replace(adb_cfg.release); + auto connect_ret = + call_command(m_adb.connect, 60LL * 1000, false /* adb 连接时不允许重试 */); + bool is_connect_success = false; + if (connect_ret) { + auto& connect_str = connect_ret.value(); + // 检查连接字符串是否包含 "connected" + is_connect_success = connect_str.find("connected") != std::string::npos; + // NOTE:这玩意啥都没干,有什么用吗? + if (connect_str.find("daemon started successfully") != std::string::npos + && connect_str.find("daemon still not running") == std::string::npos) { + } + } + if (!is_connect_success) { + json::value info = get_info_json() + | json::object { + { "what", "ConnectFailed" }, + { "why", "Connection command failed to exec" }, + }; + callback(AsstMsg::ConnectionInfo, info); + return false; + } + } } if (need_exit()) { diff --git a/src/MaaCore/Controller/AdbController.h b/src/MaaCore/Controller/AdbController.h index bebbbf4150..0408c19ddd 100644 --- a/src/MaaCore/Controller/AdbController.h +++ b/src/MaaCore/Controller/AdbController.h @@ -119,6 +119,8 @@ protected: struct AdbProperty { /* command */ + std::string devices; + std::string address_regex; std::string connect; std::string call_minitouch; std::string call_maatouch;