硬件


用于模拟USB-HID键盘鼠标的控制器

软件架构

产品特点:

● 模拟USB接口HID键盘鼠标(双类型设备)
● 控制台通过串口指令模拟键盘鼠标事件动作
● 键盘最多支持6键同时触发
● 5个LED指示:键盘状态(大写/数字/滚动锁)和消息事件(键盘/鼠标)
● 可替换USB接口A/B/Mini/Micro/Type-C等
● 串口交互式控制,开放式通讯协议,自带命令帮助
● 不限制编程语言(推荐Python)
● 提供配套上位机“测试台软件”,自带众多示例代码
● 用pip安装mcush库(支持windows/linux/mac),编写python脚本

应用场景:

● 硬件产品测试自动化(通用/嵌入式PC、手机、平板、专用设备等)
● 软件产品测试自动化(Win/Linux/Mac/Android应用程序、小程序、网页等)
● 辅助调试

接线方式:

● 上行:PC控制端口(USB转串口)
● 下行:被测设备(USB2.0全速)

软件

串口通讯常见问题
C语言编程常见问题

串口指令:

HID模拟指令:
=>hid --help
usage: hid [-c < command >] [-i < index >] [-v < value >]
options:
 -c/--cmd        info|m|md|mu|k|kp|kr|kl|km
 -i/--idx        index param
 -v/--val        value param
=> 

示例:

检查当前USB状态,是否连接:
=>hid
usb_state: configured  (已连接)
=> 
鼠标
移动
=>hid -c m -v 0x01     (向右移动一个像素)
=>hid -c m -v 0x0100   (向下移动一个像素)
=>hid -c m -v 0x0101   (向右下移动一个像素)
=>hid -c m -v 0xFF     (向左移动一个像素)
=>hid -c m -v 0xFF00   (向上移动一个像素)
=>hid -c m -v 0xFFFF   (向左上移动一个像素)
=> 
按键
=>hid -c md -i 1  (按下左键)
=>hid -c mu -i 1  (松开左键)
=>hid -c md -i 2  (按下右键)
=>hid -c mu -i 2  (松开右键)
=>hid -c md -i 4  (按下中键)
=>hid -c mu -i 4  (松开中键)
=>hid -c m -i 1 -v 100  (左键按下,并向右拖拽100个像素)
=>hid -c m -i 0         (拖拽后释放按键)
=> 

键盘
=>hid -c k -v 0x2C    (按下空格键并松开)
=>hid -c kp -v 0x04   (按下A键不释放,会引起按键连发)
=>hid -c kr -v 0x04   (释放A键)
=>hid -c kl           (查询锁定状态)
0                     (无任何状态锁定)
=>hid -c km           (查询特殊键状态)
0                     (无任何特殊键按下)
=>
(模拟WINDOWS下切换输入法)
=>hid -c km -v 1   (按下左CTRL键)
=>hid -c km -v 3   (按下左SHIFT键)
=>hid -c km -v 1   (松开左SHIFT键)
=>hid -c km -v 0   (松开左CTRL键
=>
(模拟ALT-F4关闭窗口)
=>hid -c km -v 4   (按下左ALT键)
=>hid -c k -v 0x3d (点击F4键)
=>hid -c km -v 0   (松开左ALT键)
=> 

Python封装:

安装:pip3 install mcush
升级:pip3 install -U mcush
class ShellLabHID(mcush.Mcush.Mcush):
    def hid(self, cmd=None, idx=None, val=None ):
        # 底层的串口命令封装

    def mouse(self, left=True, right=None, middle=None, dx=0, dy=0):
        # 底层鼠标消息

    def down( self, left=True, right=None, middle=None ):
        # 鼠标按下

    def up( self, left=True, right=None, middle=None ):
        # 鼠标松开

    def move( self, dx=0, dy=0, step=1, step_delay=0.05 ):
        # 鼠标移动

    def click( self, left=True, right=None, middle=None, delay=0.1 ):
        # 鼠标单击(发送按下松开两个消息)

    def getKeyCode( self, kval ):
        # 查询按键码

    def key( self, kval ):
        # 发送单个按键点击消息

    def keyPress( self, kval ):
        # 发送单个按键按下消息

    def keyRelease( self, kval ):
        # 发送单个按键抬起消息

    def keys( self, string ):
        # 发送多个按键点击消息(输入字符串)

    def keyIsNumLocked( self ):
        # 检查键盘是否锁定数字模式

    def keyIsCapsLocked( self ):
        # 检查键盘是否锁定大写模式

    def keyIsScrollLocked( self ):
        # 检查键盘是否锁定滚动模式

    def keyNumLock( self, lock=True ):
        # 锁定数字模式

    def keyCapsLock( self, lock=True ):
        # 锁定大写模式

    def keyScrollLock( self, lock=True ):
        # 锁定滚动模式

    def keyGetModifier( self ):
        # 查询键盘的特殊功能键

    def keySetModifier( self, lctrl=None, lshift=None, lalt=None, lgui=None,
                              rctrl=None, rshift=None, ralt=None, rgui=None ):
        # 设置键盘的特殊功能键

示例:

import mcush
from mcush.linkong.ShellLab import ShellLabHID
s = ShellLabHID('COM10')  # 填入对应的串口号
s.move(100,100,step=10)  # 分十步向右下方移动(100,100)个像素
s.click()  # 点击鼠标左键
s.keys('HELLO')  # 依次输入按键“HELLO”

Shell Lab 测试台软件


CH341虚拟串口驱动(Windows)


应用

Shell Lab自带演示脚本:模拟鼠标沿正方形/平行四边形区域循环移动
s = ShellLabHID(PORT)
s.up(True,True,True)  # all mouse buttons released
#s.move(-1000,-1000,step=10)  # return to up-left corner
#s.move(100,100,step=10)  # goto (100,100)
#s.down()  # left button pressed
while True:
    # rectangle move
    r = 10
    s.move( r, 0 )  # right
    time.sleep(0.1)
    s.move( 0, r )  # down
    time.sleep(0.1)
    s.move( -r, 0 )  # left
    time.sleep(0.1)
    s.move( 0, -r )  # up
    time.sleep(0.1)
    # parallelogram move
    #r = 100
    #s.move( r, r, step=10 )
    #s.move( 0, r, step=10 )
    #s.move( -r, -r, step=10 )
    #s.move( 0, -r, step=10 )

WINDOWS下运行效果

ANDROID下拖拽效果

Shell Lab自带演示脚本:模拟键盘输入字符串
s = ShellLabHID(PORT)
s.keys( '\b'*10 )  # bkspace
#s.keyNumLock(False)  # switch normal
#s.keyScrollLock(False)  # switch normal
s.keyCapsLock(False)  # switch normal

s.keys( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ\n' )
s.keys( '`1234567890-=[]\\;\',./\n' )
s.keySetModifier(lshift=True)
s.keys( '`1234567890-=[]\\;\',./\n' )
s.keySetModifier(lshift=False)

#s.keyPress('A')
#time.sleep(3)  # repeated keys
#s.keyRelease()

while True:
    s.keys( 'ABC\n' )
    time.sleep(0.5)
    s.keyCapsLock(True)  # switch to CAPS mode
    s.keys( ' HELLO\n' )
    s.keyCapsLock(False)  # switch back
    time.sleep(5)
ANDROID下输入效果