feat: Linux 真实实现层 — 从存根库变为可用生产力工具
新增 _linux_impl.py (800+行): - LinuxNetwork: 真实IP/接口/DNS/网关/MAC (ip命令+/proc/net) - LinuxBluetooth: 真实蓝牙状态/扫描/配对/连接 (bluetoothctl) - LinuxSensors: 真实温度/CPU频率/风扇 (/sys/class/hwmon) - LinuxAudio: 真实音量控制/静音 (amixer) - LinuxClipboard: 真实剪贴板读写 (xclip+tkinter回退) - LinuxPower: 真实CPU/内存/电池 (psutil+/sys/class/power_supply) - LinuxLocation: 真实IP地理定位 (ip-api.com) - LinuxNotify: 真实桌面通知 (notify-send) - LinuxDisplay: 真实屏幕尺寸/截屏/鼠标位置 (xdotool+X11) - LinuxUIAutomation: 真实点击/输入/按键/滚动 (xdotool) - LinuxCamera: 真实摄像头拍照 (opencv/V4L2) - LinuxProcess: 真实进程列表/系统信息/应用管理 (psutil+/proc) - LinuxShell: 真实命令执行 (subprocess) 改造10+核心类使用Linux真实实现: - BluetoothAdapter/SensorManager/AudioManager - ConnectivityManager/WifiManager/TelephonyManager - LocationManager/PowerManager/BatteryManager/Build - ActivityManager/Activity/Toast/Display/ClipboardManager - NotificationManager 15项真实行为测试全部通过: - 真实IP: 10.60.218.244 - 真实位置: 北京 39.9042, 116.407 - 真实主机名: work-41-vci-g427c - 真实内核: 5.15.120.byteatom-ck.14 - 真实内存: 1.8GB/3.8GB - 真实进程列表
This commit is contained in:
1 parent
8c3bd3c415
commit
690022cea3
17 files changed
+2083
-8
No files matched your search
@@ -16,6 +16,13 @@ from .._core import (
|
||||
_sdcard_root, _app_data_dir, _package_name,
|
||||
)
|
||||
|
||||
# Linux 真实实现导入
|
||||
try:
|
||||
from .._linux_impl import IS_LINUX, LinuxNetwork, HAS_IP
|
||||
_USE_LINUX = IS_LINUX
|
||||
except ImportError:
|
||||
_USE_LINUX = False
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# SupplicantState
|
||||
@@ -620,6 +627,8 @@ class WifiManager(Stub):
|
||||
self._p2p_channels: List[int] = []
|
||||
|
||||
def getConnectionInfo(self) -> Optional[WifiInfo]:
|
||||
if _USE_LINUX:
|
||||
return self._get_linux_connection_info()
|
||||
if self._connection_info is None:
|
||||
info = WifiInfo()
|
||||
info._ssid = '"mock_wifi"'
|
||||
@@ -632,6 +641,34 @@ class WifiManager(Stub):
|
||||
self._connection_info = info
|
||||
return self._connection_info
|
||||
|
||||
def getWifiInfo(self) -> Optional[WifiInfo]:
|
||||
"""getWifiInfo — getConnectionInfo 的别名"""
|
||||
return self.getConnectionInfo()
|
||||
|
||||
def _get_linux_connection_info(self) -> WifiInfo:
|
||||
"""从 LinuxNetwork.get_wifi_info() 构造 WifiInfo"""
|
||||
info = WifiInfo()
|
||||
try:
|
||||
data = LinuxNetwork.get_wifi_info() or {}
|
||||
ssid = data.get("ssid", "")
|
||||
info._ssid = f'"{ssid}"' if ssid else "<unknown ssid>"
|
||||
info._bssid = data.get("bssid", "00:00:00:00:00:00")
|
||||
# signal 通常是 0-100, 转换为 RSSI (dBm, 约 -100..0)
|
||||
signal = data.get("signal", 0)
|
||||
if isinstance(signal, (int, float)) and signal > 0:
|
||||
info._rssi = int(-100 + (signal / 100.0) * 60)
|
||||
else:
|
||||
info._rssi = int(signal) if signal else WifiInfo.INVALID_RSSI
|
||||
iface = data.get("interface", "")
|
||||
if iface:
|
||||
info._frequency = 2412 # 默认 2.4GHz
|
||||
info._link_speed = data.get("link_speed", 0) or 0
|
||||
info._network_id = 0
|
||||
info._supplicant_state = SupplicantState(SupplicantState.COMPLETED)
|
||||
except Exception:
|
||||
pass
|
||||
return info
|
||||
|
||||
def getScanResults(self) -> List[ScanResult]:
|
||||
return list(self._scan_results)
|
||||
|
||||
@@ -644,8 +681,26 @@ class WifiManager(Stub):
|
||||
return True
|
||||
|
||||
def isWifiEnabled(self) -> bool:
|
||||
if _USE_LINUX:
|
||||
return self._linux_has_wireless_interface()
|
||||
return self._wifi_enabled
|
||||
|
||||
def _linux_has_wireless_interface(self) -> bool:
|
||||
"""检查是否存在无线网络接口"""
|
||||
try:
|
||||
for iface in LinuxNetwork.get_interfaces():
|
||||
name = iface.get("ifname") or iface.get("name", "")
|
||||
if name and name.startswith(("wl", "wlan", "wlp")):
|
||||
return True
|
||||
# 回退: 检查 /sys/class/net 下的无线接口
|
||||
import os as _os
|
||||
for name in _os.listdir("/sys/class/net/") if _os.path.isdir("/sys/class/net") else []:
|
||||
if name.startswith(("wl", "wlan", "wlp")):
|
||||
return True
|
||||
except Exception:
|
||||
pass
|
||||
return False
|
||||
|
||||
def getWifiState(self) -> int:
|
||||
return self._wifi_state
|
||||
|
||||
|
||||
Reference in new issue
Block a user