在上一篇光电鼠标中,我们分享了鼠标的实现代码,然从底层逻辑上看,那些代码涉及的东西都很坑,它们太贴近底层了,理解起来非常困难,没有多少软件工程师会去了解引脚定义。
这十几年来,ARM开发板发展非常迅猛,在目前已经有上百家开发板厂家,它们大部分是提供原理图和系统代码的,我们可以利用它们来做一些小工具,比如游戏辅助。
单片机/Arm开发板都可以使用,不过每款开发板的侧重点不同,在我反复测试之后终于筛选出几款比较合适的板子。
目前整理如下:
1. 直接使用的开发板系列: Arm 的 Auduino 衍生系列、单片机 的CH341A编程器系列。其中Auduino中有一款直接支持USB鼠标键盘,并直接在系统中给出SDK包zero-system接口;CH341A编程器则是从USB转串口衍生的。
2. 需要自己编程的开发板系列: 主要是水果派的,比如说Raspberry Pi、Orange Pi、banana pi这几种,它们往往是硬件和理论上支持,但是需要自己搞定1.USB鼠标接口的编程;2.主机和设备之间的通讯协议;3.上层的程序调用。
我们先讨论第一种,第二种由于种类繁多,就不会一一去解释如何构建,那是件很费力的事,后续我再做视频去讲解吧。
由于可以直接使用的开发板本身已经定义了鼠标键盘接口,所以我们直接对它们提供的接口编程即可,下面会从串口和网络的角度分别给出对应的定义:
1. 打开/关闭串口
根据实际使用芯片进行调整,目前我使用的是:
波特率 = 119200
停止位 = 1
数据位 = 8
奇偶校验 = None
2. 发送键盘数据:
|0x57|0xAB|0x01|BYTE1~BYTE8|
BYTE1 --
|--bit0: Left Control 是否按下,按下为 1
|--bit1: Left Shift 是否按下,按下为 1
|--bit2: Left Alt 是否按下,按下为 1
|--bit3: Left GUI 是否按下,按下为 1
|--bit4: Right Control 是否按下,按下为 1
|--bit5: Right Shift 是否按下,按下为 1
|--bit6: Right Alt 是否按下,按下为 1
|--bit7: Right GUI 是否按下,按下为 1
BYTE2 -- 设置为 00 即可
BYTE3--BYTE8 -- 这六个为普通按键
案例:
假设需要ctrl + a,那么对串口发送以下数据即可:
57 AB 01 01 00 04 00 00 00 00 00
3. 发送鼠标数据
|0x57|0xAB|0x02|BYTE1~BYTE4|
BYTE1 :按键 0x01 :表示左键按下;0x02 :表示右键按下;0x04 :表示中键按下
BYTE2 :X轴相对位移值
BYTE3 :Y轴相对位移值
BYTE4 :滚轮
重点解释XY的移动,鼠标这里使用的是相对坐标,而不是绝对坐标
X轴相对位移值:
0x00-0x7F 鼠标向右移动,最大像素 127 个像素
0xFF-0x81 鼠标向左移动,最大像素 127 个像素
Y轴相对位移值:
0x00-0x7F 滚轮向上移动,数值越大,滚越多
0x81-0xFF 滚轮向下移动,数值越大,滚越少
案例:
鼠标向右和向下同时移动50像素单位,那么对串口发送以下数据即可:
57 AB 02 00 32 32 00
enum NetType
{
_mouse = 0, // 鼠标命令
_keyboard, // 键盘命令
_command // 系统命令
}
// 注意,此处由于USB和网口都使用HID协议,所以鼠标键盘命令的格式和USB一样
网络命令格式:
|NetType|msg...|
1. 连接设备:
此处使用192.168.1.125地址,12315端口为例;
client = socket(AF_INET, SOCK_STREAM, 0);
//初始化地址包
addrSer.sin_addr.S_un.S_addr = inet_addr("192.168.1.125");
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(12315);
connect(client, (SOCKADDR*)&addrSer, sizeof(addrSer));
2. 发送数据,其中type, msg分别是命令类型和命令内容:
char buff[1024] = {0};
sprintf(buff, "%x%s", type, msg);
send(client, buff, sizeof(buff), 0);
3. 接收数据
int len = recv(client, buff, 1024, 0);
好吧!不是所有人都希望使用官方的SDK,那么也讲解一下如何从开发板开始。
下面是我找到的图和参数:
参数大概如下图:
我们对开发板的需求如下:
1. USB是主从结构,在辅助的结构中,windows系统是从机,设备是主机,我们需要一个除了供电之外的USB/USB OTG接口,用来连接到电脑,对电脑发送键盘/鼠标等消息;
2. 除了USB接口,我们还需要串口和网口,用来和电脑通讯,当然,如果选择全部软件部署在开发板上,那么可以不用这个,但是网口是必须的。幸运的是大部分开发板都提供了网络接口。
3. 系统和编程支持足够,这对于架构来说不是一件容易的事。
根据这些准则,我们对上面那块开发板的评价就是,它也许合适,因为它有网络接口,同时有两个USB type-C接口,也给了开发文档,不过还是建议和官方进一步沟通(实际上经过我的沟通,发现它确实不太合适,因为它的生态是面向大规模定制的,导致编程上很多问题需要自己花额外更多的时间去解决)。
1. 这个系列本身不是直接给可运行的代码,而是讲清楚原理,然后让读者自行实现,在这篇文章中,不可能去贴串口通讯的打开、发送、关闭之类的代码,那些代码都可以在网上找到,如果读者完全没办法做到自行编写单独的串口通讯代码和单独的TCP连接,那么读者应该先去自行学习编程基础。
2. 如果需要对应的硬件可以私信我。