网页版的无线飞鼠,使用移动硬件的陀螺仪控制鼠标。
HTML5 网页能获取到移动设备的陀螺仪信息,可以利用这个信息控制屏幕上的鼠标移动。
-
HTML5 能否获取陀螺仪信息(https://blog.csdn.net/qq_30100043/article/details/73323617)
-
陀螺仪信息处理
- 映射方式 1:计算角度和初始的差,直接应用到x/y坐标(三角函数)
- 映射方式 2:(未定)
-
后端能否简便使用 WebSocket
- NodeJS的 WebSocket 原生支持
- Go WebSocket
- GoFrame
- GoFrame WebSocket(https://www.bookstack.cn/read/goframe-1.11/net-ghttp-websocket-index.md)
- 解析 JSON:
encoding/json
包(https://www.cnblogs.com/ycyoes/p/5398796.html)
-
后端能否控制鼠标移动
-
后端能否在屏幕绘图起到提示作用
-
前端跨平台特性
- 判断平台对陀螺仪硬件/软件的支持
-
后端跨平台特性
-
后端软件封装
/**
:静态网页/api/v1/ws
:websocket接口
{
"cmd": "start"
}
服务器返回
{
"cmd": "start_done",
"message": "OK"
}
{
"cmd": "data_angle_frame",
"data": {
"alpha": 120.8,
"beta": 10.64,
"gamma": 100
}
}
{
"cmd": "message",
"data": {
"message": "遇到异常!"
}
}
{
"cmd": "key",
"data": {
"keys": [
]
}
}
0
:左键
1
:右键
2
:滚轮上
3
:滚轮下
{
"cmd": "mouse",
"data": {
"mouse_key": 1
}
}
{
"cmd": "stop_from_client"
}
服务端返回
{
"cmd": "stop_from_server"
}
magic_mouse.go
:主程序/public/**
:前端的静态文件
- 处理映射
- 按照三角函数映射
- 自定义屏幕映射区域
- 控制
- 当控制鼠标移出映射区域的时候,暂时取消对鼠标的控制
- 当点击停止的时候,和服务端断开连接
- 显示
- 前端/服务端显示/提示当前控制状态
- 网络支持
- 本地网络支持
- 在本地服务端建立连接
- 让前端连接本地创建的网络服务
- 远程网络服务
- 本地服务端连接远端服务器
- 前端也连接远端服务器
- 通过服务器进行通讯
- 本地网络支持
需要可操作的功能
- 调试
- 显示传感器信息
- 显示传感器数据
- 显示连接情况
- 修改连接URL
- 操作
- 操作按钮
- 控制开始/停止
- 复位按键,重新设置定位偏移
- 控制按钮
- 在陀螺仪尚不可用时,使用方向键控制鼠标(计划)
- 鼠标点击按钮(短按右键,长按左键,按住移动鼠标为拖动/绘图)
- 绑定的按键
F5
:开始幻灯片放映Esc
:退出幻灯片/退出到播放模式Ctrl+P
:打开/关闭幻灯片书写Ctrl+L
:打开/关闭激光笔模式Ctrl+M
:打开/关闭墨迹Ctrl+S
:切换到某幻灯片W/B
:白/黑屏Win+D
:回到桌面- 方向键
- 空格
- 回车
- 操作按钮
- 自定义
- 修改对应按键码
- 修改按键位置/设置按键排布模板
前端
大概长这样
服务端
普通的单页
使用逻辑
- 维护一个已登录表
- 连接上的设备设定自己是
server
还是client
,提供自己的版本,确定接头暗号(key
),key
应保持不同设备不同 - 设备连接远程服务器,服务器判断来访IP,如果IP一致就返回从同IP来的设备列表
- 选择
连接
之后,标记已经使用状态
API:/api/v1/remote/
HTTP请求
server/
login
:服务端登录,参数:key
:唯一指定辨别方式ip
:本地可用IP,为一个字符串列表
connect
:服务端连接前端- 参数
key
:前端的key
- 返回
token
:WebSocket连接使用的标识
- 参数
client/
login
:前端登录,参数:key
:唯一指定辨别方式
connect
:前端连接服务端- 参数
key
:服务端的key
- 返回
token
:WebSocket连接使用的标识
- 参数
WebSocket接口:ws
,格式:
{
"cmd": "...",
"data": {...}
}
// 返回接近HTTP接口
{
"cmd": "...",
"code": 0,
"message": "...",
"data": {...}
}
WebSocket命令:
connect
:参数:token
;发送/接收
执行connect
之后的命令同内网连接
本项目采用 MIT 许可证。
本项目使用到的其他开源库: