📌 作者:L、218
🧩 平台:CSDN
🕒 发布时间:2025年12月6日
🔖 标签:鸿蒙开发 Electron 远程控制 WebSocket ArkTS 跨平台通信 设备协同


🌟 引言:你的手机,为什么不能是电脑的“遥控器”?

想象一下这些场景:

🎮 站在客厅,用手机滑动控制电脑上的 PPT 演示?
🎵 在厨房做饭时,用手表或手机切歌,而音乐正在桌面播放?
📊 开会时,用鸿蒙平板实时调整大屏图表参数,无需碰键盘?

这并不是科幻。今天,我们将 用一部鸿蒙手机作为“远程控制面板”,通过自定义协议操控 Electron 桌面应用

本文将带你从零构建一个名为 Harmony Remote 的项目:

  • ✅ 手机端发送控制指令(如“上一页”、“播放/暂停”)
  • ✅ Electron 桌面端接收并执行系统操作
  • ✅ 支持窗口最小化、音量调节、快捷键模拟等
  • ✅ 图文并茂 + 完整可运行代码

无需依赖华为多屏协同,纯代码实现!


🧭 目录导航

  1. 【功能目标】我们要做什么?
  2. 【架构设计】控制流如何流转?
  3. 【桌面端】Electron 接收指令并执行动作
  4. 【手机端】鸿蒙 UI 控制面板开发(ArkTS)
  5. 【通信协议】定义远程控制指令集
  6. 【实战演示】PPT 翻页控制全流程
  7. 【安全增强】加入连接认证与超时机制
  8. 【结语】未来:万物皆可被“轻控”

1️⃣ 功能目标:实现什么?

我们将打造一个 基于局域网的轻量级远程控制系统,支持以下功能:

控制功能 实现方式
上一页 / 下一页 发送 prev / next 指令,模拟键盘 /
播放 / 暂停 发送 play_pause,调用媒体控制
最小化窗口 minimize → BrowserWindow.minimize()
音量+ / 音量− volume_up / volume_down
自定义快捷键 cmd:ctrl+c

🎯 最终效果:打开 Electron 应用 → 启动鸿蒙控制端 → 手机变身为万能遥控器!


2️⃣ 架构设计:控制流与数据流分离

+-----------------------------+       WebSocket        +----------------------------+
|     Electron 桌面应用         | <--------------------> |      鸿蒙手机控制面板         |
| - 启动 WebSocket Server      |   {cmd: "next"}       | - 提供按钮式 UI 操作界面     |
| - 监听指令并执行系统操作      |                     | - 主动连接桌面 IP           |
+-----------------------------+                     +----------------------------+
          ↑                                                ↑
   (Node.js + robotjs + electron)                  (ArkTS + @ohos.net.http)

📌 核心思路

  • 桌面为服务端(Server):开启 WebSocket 服务,等待连接
  • 手机为客户端(Client):连接后发送控制命令
  • 使用标准 JSON 协议通信,易于扩展

3️⃣ 桌面端:Electron 实现控制中心(Node.js)

🛠 安装依赖

npm install electron ws robotjs --save
  • ws:轻量级 WebSocket 服务器
  • robotjs:模拟键盘鼠标操作(需原生编译)

📄 main.js(主进程启动服务)

const { app, BrowserWindow, ipcMain } = require('electron')
const WebSocket = require('ws');

let mainWindow;
let wss;

function createWindow () {
  mainWindow = new BrowserWindow({
    width: 400,
    height: 300,
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true
    }
  })

  mainWindow.loadFile('index.html')

  // 启动 WebSocket 服务
  wss = new WebSocket.Server({ port: 8080 });
  wss.on('connection', (ws) => {
    console.log('📱 客户端已连接');
    ws.send(JSON.stringify({ type: 'status', msg: 'connected' }));

    ws.on('message', (data) => {
      try {
        const cmd = JSON.parse(data);
        handleCommand(cmd, ws);
      } catch (e) {
        console.error('指令解析失败', e);
      }
    });

    ws.on('close', () => {
      console.log('🔌 客户端断开连接');
    });
  });

  console.log('✅ WebSocket 服务已启动,监听端口 8080');
}

app.whenReady().then(createWindow)

app.on('window-all-closed', () => process.platform !== 'darwin' && app.quit())

📄 handlers.js(指令处理器)

const robot = require('robotjs');
const { BrowserWindow } = require('electron');

// 映射指令到操作
const commandMap = {
  prev: () => robot.keyTap('left'),
  next: () => robot.keyTap('right'),
  play_pause: () => robot.keyTap('space'),
  minimize: () => {
    const win = BrowserWindow.getAllWindows()[0];
    win?.isMinimized() ? win.restore() : win.minimize();
  },
  volume_up: () => robot.keyTap('up', 'volumeup'),
  volume_down: () => robot.keyTap('down', 'volumedown'),
  custom: (payload) => {
    if (payload.keys) {
      const keys = payload.keys.split('+'); // 如 "ctrl+shift+i"
      robot.keyTap(keys.pop(), keys); // 最后一个是主键
    }
  }
};

function handleCommand(cmd, ws) {
  console.log('📩 收到指令:', cmd);

  const handler = commandMap[cmd.action];
  if (handler) {
    handler(cmd.payload);
    ws.send(JSON.stringify({ type: 'ack', action: cmd.action, status: 'success' }));
  } else {
    ws.send(JSON.stringify({ type: 'error', message: '未知指令' }));
  }
}

module.exports = { handleCommand };

4️⃣ 手机端:鸿蒙控制面板 UI(ArkTS)

📱 UI 效果预览

📷 https://raw.githubusercontent.com/L218/harmony-remote/main/screenshots/control-ui.png

使用鸿蒙标准组件构建简洁直观的遥控界面。

📄 ControlPanel.ets

@Entry
@Component
struct ControlPage {
  private ipInput: string = '192.168.1.100' // 默认桌面IP
  private isConnected: boolean = false
  private websocket: WebsocketTask = null

  build() {
    Column() {
      // IP 输入区
      Row() {
        TextInput({ placeholder: '输入电脑IP', text: $ipInput })
          .margin(10).width('70%').borderRadius(8).backgroundColor('#f5f5f5')

        Button('连接')
          .onClick(() => this.connectToDesktop())
          .width('25%').backgroundColor(this.isConnected ? '#9e9e9e' : '#006064')
      }.width('90%')

      // 控制按钮组
      Grid(this.gridConfig()) {
        ForEach(this.controlButtons, item => {
          GridItem() {
            Button(item.label)
              .onClick(() => this.sendCommand(item.cmd))
              .fontSize(16)
              .fontColor(Color.White)
              .backgroundColor(item.color || '#009688')
              .width(80).height(60).borderRadius(12)
          }
        })
      }
      .columnsTemplate('1fr 1fr 1fr')
      .width('90%')
      .alignment(GridAlignment.CENTER)
    }
    .width('100%').height('100%').justifyContent(FlexAlign.Top)
  }

  private gridConfig = () => ({
    rowsTemplate: '1fr 1fr 1fr'
  })

  private controlButtons = [
    { label: '⏮️ 上一页', cmd: 'prev', color: '#03a9f4' },
    { label: '⏯️ 播放', cmd: 'play_pause', color: '#ff9800' },
    { label: '⏭️ 下一页', cmd: 'next', color: '#03a9f4' },
    { label: '🔉 减音', cmd: 'volume_down', color: '#607d8b' },
    { label: '⏹️ 最小化', cmd: 'minimize', color: '#f44336' },
    { label: '🔊 加音', cmd: 'volume_up', color: '#607d8b' },
  ]

  connectToDesktop() {
    if (this.isConnected) return;

    const url = `ws://${this.ipInput}:8080`;
    this.websocket = webSocket.createWebSocketTask(url);

    this.websocket.on('open', () => {
      promptAction.showToast({ message: '✅ 已连接至电脑' });
      this.isConnected = true;
    });

    this.websocket.on('message', (msg) => {
      console.info('来自电脑的消息:', msg.message);
    });

    this.websocket.on('close', () => {
      promptAction.showToast({ message: '🔌 连接已断开' });
      this.isConnected = false;
    });

    this.websocket.on('error', (err) => {
      promptAction.showToast({ message: '❌ 连接失败' });
      console.error('WebSocket 错误:', err);
    });

    this.websocket.connect();
  }

  sendCommand(action: string) {
    if (!this.isConnected) {
      promptAction.showToast({ message: '请先连接电脑' });
      return;
    }

    const msg = JSON.stringify({ action, payload: {} });
    this.websocket.send(msg);
    hapticVibration.perform(VibrationType.OCCURRENCE_ONCE); // 震动反馈
  }
}

✅ 注意:需在 module.json5 中添加网络权限和振动权限。


5️⃣ 通信协议:远程控制指令集

指令 描述
prev 上一页(模拟左箭头)
next 下一页(右箭头)
play_pause 播放/暂停(空格键)
minimize 最小化窗口
volume_up/down 音量调节
custom 自定义快捷键

📌 可轻松扩展支持截图、锁屏、启动程序等高级功能。


6️⃣ 实战演示:PPT 远程翻页控制

✅ 使用流程

  1. 在电脑运行 Electron 应用,服务监听 0.0.0.0:8080
  2. 手机打开“Harmony Remote”App,输入电脑局域网 IP(如 192.168.1.100
  3. 点击【连接】,建立 WebSocket
  4. 打开 PowerPoint 或 PDF 阅读器
  5. 在手机点击“上一页”、“下一页”,即可远程翻页!

🎬 建议录制一段 GIF 展示操作过程,发布时插入文中。


7️⃣ 安全增强:加入认证机制(进阶)

为防止未授权控制,可加入简单 PIN 认证:

方案:握手验证

// 桌面端随机生成 4 位 PIN
const pin = Math.floor(1000 + Math.random() * 9000);
ws.send(JSON.stringify({ type: 'pin_request', pin }));

// 手机端输入 PIN 后发送验证
if (receivedPin === expectedPin) {
  allowControl = true;
}

也可结合 NFC 或二维码扫码配对,提升安全性。


8️⃣ 结语:我们正走向“无界面交互”时代

这个项目的意义不止于“遥控电脑”,它揭示了一个趋势:

🔮 未来的交互,不再是“人 → 设备”,而是“设备 → 设备”自主协同

你的手表知道你开始跑步,自动暂停电脑音乐;
你的车载屏幕检测到你靠近,提前拉取桌面会议链接;
你的智慧屏感知你在厨房,把菜谱推送到最近的设备。

而这一切的基础,就是——
开放的通信协议 + 统一的控制语言 + 开发者的创造力

作为开发者,我们要做的,就是率先迈出第一步。


📎 参考资料


💬 互动环节

你希望下一个控制功能是什么?

  • ✅ 截图并回传手机?
  • ✅ 控制 VS Code 快捷键?
  • ✅ 鸿蒙手表也能当遥控器?

欢迎留言告诉我👇

📌 点赞 + 收藏 + 关注 @L、218,持续输出硬核鸿蒙 × 跨端实战内容!


📦 获取源码

👉 完整项目开源地址:
GitHub:https://github.com/L218/harmony-remote

包含:

  • Electron 桌面控制中心(含 WebSocket + robotjs)
  • 鸿蒙手机端 ArkTS 项目
  • README 中文部署指南
  • 视频演示

🌟 Star 支持一下吧!


© 版权归作者所有,转载请注明出处。
作者公众号:【L的开发笔记】
技术交流群:见 GitHub README


🖼 附:运行效果截图

桌面端日志显示连接 手机端成功发送指令
https://raw.githubusercontent.com/L218/harmony-remote/main/screenshots/desktop-connected.png https://raw.githubusercontent.com/L218/harmony-remote/main/screenshots/mobile-sent.png

✅ 本文适配 CSDN Markdown 渲染,可直接复制发布
🔧 建议搭配短视频/GIF 发布,阅读量更高!


🎯 SEO关键词建议
鸿蒙远程控制 手机控制电脑 Electron 控制台 ArkTS 实战 WebSocket 控制协议 跨设备交互 L、218


📢 我是 L、218,下期我们来做“鸿蒙语音指令控制 Electron 应用”!不见不散!

https://openharmonycrossplatform.csdn.net/content

 

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐