高通AR1平台的智能眼镜全检系统
🏗️ 整体系统架构
text
复制
下载
├── 手机端全检APP (Android) │ ├── UI层 │ ├── 业务逻辑层 │ ├── 蓝牙通信层 │ └── 数据管理层 ├── 眼镜端SSP Service (Android/Linux) │ ├── SSP服务层 │ ├── 硬件测试层 │ ├── 产测固件 │ └── 系统服务 └── 云端服务├── MES系统└── 数据分析平台
📱 手机端全检APP架构
1. 模块分层设计
java
复制
下载
// 手机端包结构 app/ ├── src/main/java/com/company/fulltest/ │ ├── ui/ # UI层 │ │ ├── activity/ │ │ │ ├── MainActivity.java # 主界面 │ │ │ ├── PairingActivity.java # 配对界面 │ │ │ └── ResultActivity.java # 结果显示 │ │ ├── dialog/ │ │ │ ├── TestProgressDialog.java │ │ │ └── ResultDialog.java │ │ └── adapter/ │ │ └── TestItemAdapter.java │ ├── bluetooth/ # 蓝牙通信层 │ │ ├── SPPClient.java │ │ ├── BleScanner.java │ │ ├── ConnectionManager.java │ │ └── protocol/ │ │ ├── TestCommand.java │ │ └── TestResult.java │ ├── business/ # 业务逻辑层 │ │ ├── TestEngine.java │ │ ├── PairingManager.java │ │ ├── ResultProcessor.java │ │ └── factoryreset/ │ │ └── FactoryResetManager.java │ ├── data/ # 数据层 │ │ ├── repository/ │ │ │ ├── TestRepository.java │ │ │ └── MesRepository.java │ │ ├── local/ │ │ │ ├── DatabaseHelper.java │ │ │ └── PreferenceManager.java │ │ └── remote/ │ │ └── MesApiClient.java │ └── common/ # 通用层 │ ├── di/ # 依赖注入 │ ├── utils/ │ └── base/
2. 手机端核心实现
🔵 SPP客户端通信
java
复制
下载
/*** 手机端SPP客户端 - 主动连接眼镜端*/
public class SPPClient {private static final String TAG = "SPPClient";private static final UUID SSP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");private BluetoothAdapter bluetoothAdapter;private BluetoothSocket socket;private InputStream inputStream;private OutputStream outputStream;private ConnectThread connectThread;private ConnectedThread connectedThread;// 连接状态回调public interface ConnectionCallback {void onConnecting();void onConnected();void onConnectionFailed(String error);void onDisconnected();void onDataReceived(byte[] data);}/*** 连接到眼镜端SSP服务*/public void connectToGlasses(String deviceAddress, ConnectionCallback callback) {BluetoothDevice device = bluetoothAdapter.getRemoteDevice(deviceAddress);connectThread = new ConnectThread(device, callback);connectThread.start();}/*** 发送测试指令到眼镜端*/public void sendTestCommand(TestCommand command) {if (connectedThread != null && socket.isConnected()) {byte[] data = command.toByteArray();connectedThread.write(data);}}private class ConnectThread extends Thread {private final BluetoothDevice device;private final ConnectionCallback callback;public ConnectThread(BluetoothDevice device, ConnectionCallback callback) {this.device = device;this.callback = callback;}@Overridepublic void run() {callback.onConnecting();try {// 创建RFCOMM Socketsocket = device.createRfcommSocketToServiceRecord(SSP_UUID);// 取消发现设备以加速连接bluetoothAdapter.cancelDiscovery();// 建立连接socket.connect();// 启动数据通信线程connectedThread = new ConnectedThread(socket, callback);connectedThread.start();callback.onConnected();} catch (IOException e) {callback.onConnectionFailed(e.getMessage());cancel();}}public void cancel() {try {if (socket != null) {socket.close();}} catch (IOException e) {Log.e(TAG, "Could not close the client socket", e);}}}private class ConnectedThread extends Thread {private final BluetoothSocket socket;private final ConnectionCallback callback;public ConnectedThread(BluetoothSocket socket, ConnectionCallback callback) {this.socket = socket;this.callback = callback;try {inputStream = socket.getInputStream();outputStream = socket.getOutputStream();} catch (IOException e) {Log.e(TAG, "Error getting streams", e);}}@Overridepublic void run() {byte[] buffer = new byte[1024];int bytes;while (true) {try {// 读取眼镜端返回的数据bytes = inputStream.read(buffer);if (bytes > 0) {byte[] receivedData = Arrays.copyOf(buffer, bytes);callback.onDataReceived(receivedData);}} catch (IOException e) {callback.onDisconnected();break;}}}public void write(byte[] bytes) {try {