【android9】【input系统】【1.工具篇】,Android 9的输入系统工具详解

马肤

温馨提示:这篇文章已超过451天没有更新,请注意相关的内容是否还可用!

摘要:本文是关于Android 9系统的输入系统介绍,重点介绍工具篇。文章简要概述了Android 9输入系统的基本功能和特点,详细描述了各种工具的用途和操作方法,帮助用户更好地理解和使用Android 9的输入系统工具。

getevent

  • 1.Getevent工具使用及参数说明
    • 1.1 getevent指令的使用
      • 1.1.1 getevent
      • 1.1.2 getevent -t
      • 1.1.3 getevent -n
      • 1.1.4 getevent -v
      • 1.1.5 getevent -p
      • 1.1.6 getevent -i
      • 1.1.7 getevent -l
      • 1.1.8 getevent -q
      • 1.1.9 getevent -c
      • 1.1.10 getevent - r
      • 1.2 事件类型格式分析
        • 1.2.1 type
        • 1.2.2 code
        • 1.3 key事件类型分析
          • 1.3.1 安卓9 按键消息和安卓14 按键消息的差异?
          • 1.3.2 安卓9 蓝牙手柄按键消息分析
          • 1.4 motion事件类型分析
            • 1.4.1 多点触摸协议A
            • 1.4.2 多点触摸协议B
              • 1.4.2.1 变量含义
              • 1.4.2.2 协议B举例
              • 1.4.3 getevent -l motion事件分析
                • 1.4.3.1 当两根手指按下时
                • 1.4.3.2 当两根手指移动时
                • 1.4.3.2 当两根手指抬起时
                • 后续

                  1.Getevent工具使用及参数说明

                  当用户触摸屏幕或者按下按键时,首先触发的是硬件驱动,硬件驱动会将事件写入设备节点(/dev/input),这便是内核的原始输入事件,getevent指令的作用便是读取内核中的原始输入事件。

                  1.1 getevent指令的使用

                  首先adb shell进入机器后,输入 getevent -h

                  130|1:/ $ getevent -h
                  Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
                      -t: show time stamps //添加按键发生的时间戳信息
                      -n: don't print newlines //不要打印换行符
                      -s: print switch states for given bits
                      -S: print all switch states //打印所有开关状态
                      -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)//打印硬件的基本信息
                      -d: show HID descriptor, if available
                      -p: show possible events (errs, dev, name, pos. events) //显示所有的事件,如果是按键,则会显示所有key,如果是触摸屏,则会显示绝对坐标系的值
                      -i: show all device info and possible events
                      -l: label event types and names in plain text //用纯文本标记事件类型和名称
                      -q: quiet (clear verbosity mask)//去除所有设备信息和节点信息,只有按键信息
                      -c: print given number of events then exit //打印给定数量的事件,然后退出
                      -r: print rate events are received
                  

                  1.1.1 getevent

                  不带任何参数显示如下:

                  130|:/ $ getevent
                  add device 11: /dev/input/event1 //设备节点
                    name:     "pmic_pwrkey"  //设备名称 手机上的power电源按键
                  /dev/input/event1: 0001 0074 00000001 //按键按下信息
                  /dev/input/event1: 0000 0000 00000000 /同步事件信息
                  /dev/input/event1: 0001 0074 00000000 //按键抬起信息
                  /dev/input/event1: 0000 0000 00000000 /同步事件信息
                  

                  1.1.2 getevent -t

                  携带事件发生的时间戳

                  add device 11: /dev/input/event1 //设备节点
                    name:     "pmic_pwrkey"  //设备名称 手机上的power电源按键
                  [   63641.462544] /dev/input/event1: 0001 0074 00000001 //按键按下信息
                  [   63641.462544] /dev/input/event1: 0000 0000 00000000 //同步事件信息
                  [   63641.547853] /dev/input/event1: 0001 0074 00000000 //按键抬起信息
                  [   63641.547853] /dev/input/event1: 0000 0000 00000000 //同步事件信息
                  

                  1.1.3 getevent -n

                  没有换行符

                  /dev/input/event1: 0001 0074 00000001/dev/input/event1: 0000 0000 00000000/dev/input/event1: 0001 0074 00000000/dev/input/event1: 0000 0000 00000000
                  

                  1.1.4 getevent -v

                  显示硬件的一些供应商等信息

                  add device 11: /dev/input/event1
                    bus:      0000
                    vendor    0000
                    product   0000
                    version   0000
                    name:     "pmic_pwrkey"
                    location: "pmic_pwrkey/input0"
                    id:       ""
                    version:  1.0.1
                  

                  1.1.5 getevent -p

                  add device 4: /dev/input/event8
                    name:     "touchpanel"// 触摸屏
                    events:
                      KEY (0001): 003e  008e  0145  014a
                      ABS (0003): 0000  : value 0, min 0, max 19840, fuzz 0, flat 0, resolution 0
                                  0001  : value 0, min 0, max 44352, fuzz 0, flat 0, resolution 0
                                  0018  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
                                  0021  : value 924, min 0, max 0, fuzz 0, flat 0, resolution 0
                                  0022  : value 148, min 0, max 0, fuzz 0, flat 0, resolution 0
                                  0023  : value 117, min 0, max 0, fuzz 0, flat 0, resolution 0
                                  002f  : value 0, min 0, max 9, fuzz 0, flat 0, resolution 0
                                  0030  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                                  0031  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                                  0032  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
                                  0035  : value 0, min 0, max 19840, fuzz 0, flat 0, resolution 0
                                  0036  : value 0, min 0, max 44352, fuzz 0, flat 0, resolution 0
                                  0037  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
                                  0039  : value 0, min 0, max 65535, fuzz 0, flat 0, resolution 0
                                  003a  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
                  add device 11: /dev/input/event1 
                    name:     "pmic_pwrkey" //手机的电源按键
                    events:
                      KEY (0001): 0074 //电源按键对应的值
                  

                  1.1.6 getevent -i

                  相当于-v和-p的合体

                  add device 11: /dev/input/event1
                    bus:      0000
                    vendor    0000
                    product   0000
                    version   0000
                    name:     "pmic_pwrkey"
                    location: "pmic_pwrkey/input0"
                    id:       ""
                    version:  1.0.1
                    events:
                      KEY (0001): 0074
                    input props:
                  

                  1.1.7 getevent -l

                  /dev/input/event1: EV_KEY       KEY_POWER            DOWN
                  /dev/input/event1: EV_SYN       SYN_REPORT           00000000
                  /dev/input/event1: EV_KEY       KEY_POWER            UP
                  /dev/input/event1: EV_SYN       SYN_REPORT           00000000
                  

                  1.1.8 getevent -q

                  去除了所有设备信息,只有event事件

                  130|:/ $ getevent -q
                  /dev/input/event1: 0001 0074 00000001
                  /dev/input/event1: 0000 0000 00000000
                  /dev/input/event1: 0001 0074 00000000
                  /dev/input/event1: 0000 0000 00000000
                  

                  1.1.9 getevent -c

                  输入指定条数的信息

                  130|:/ $ getevent -c 3
                  add device 11: /dev/input/event1
                    name:     "pmic_pwrkey"
                  /dev/input/event1: 0001 0074 00000001
                  /dev/input/event1: 0000 0000 00000000
                  /dev/input/event1: 0001 0074 00000000
                  

                  1.1.10 getevent - r

                  输出信息产生的速度,例如:按下或抬起的速度很快 rate值就越高

                  /dev/input/event1: 0001 0074 00000001
                  /dev/input/event1: 0000 0000 00000000 rate 7
                  /dev/input/event1: 0001 0074 00000000
                  /dev/input/event1: 0000 0000 00000000 rate 0
                  

                  1.2 事件类型格式分析

                  格式是 :/dev/input/eventX type code value

                  例如:/dev/input/event1: 0001 0074 00000001

                  1.2.1 type

                  其中type的内容如下:

                  #define EV_SYN 0x00 //代表同步事件
                  #define EV_KEY 0x01 //按键事件
                  #define EV_REL 0x02 //相对坐标,用来描述相对坐标轴上数值的变化,例如:鼠标向左方移动了5个单位。
                  #define EV_ABS 0x03 //绝对坐标,用来描述相对坐标轴上数值的变化,例如:描述触摸屏上坐标的值。
                  #define EV_MSC 0x04 //杂项事件,当不能匹配现有的类型时,使用该类型进行描述。
                  #define EV_SW 0x05 //开关事件, 用来描述具备两种状态的输入开关。
                  #define EV_LED 0x11 //EV_LED事件类型通常与设备上的物理LED指示灯相关,例如键盘背光灯、通知LED等
                  #define EV_SND 0x12 //描述声音事件
                  #define EV_REP 0x14 //用于可以自动重复的设备
                  #define EV_FF 0x15 //强力回馈事件,如打游戏时的震动事件
                  #define EV_PWR 0x16 //特别用于电源开关的输入
                  

                  1.2.2 code

                  code事件会跟随type事件的不同而代表不同的含义

                  1.当type是EV_KEY,则code KEY_POWER代表电源按键。

                  详情可以看下列网址指向的地点

                  http://aospxref.com/android-14.0.0_r2/xref/bionic/libc/kernel/uapi/linux/input-event-codes.h

                  1.3 key事件类型分析

                  声明:由于本人之前是在安卓9进行蓝牙手柄的开发,所以此篇分析是当时基于安卓9进行的分析,而上面的指令是笔者用安卓14的手机进行内容获取。其中笔者发现按键的信息发生了变化。为何不用安卓9?因为本人最近整理的时候没有安卓9的环境。

                  1.3.1 安卓9 按键消息和安卓14 按键消息的差异?

                  安卓9:

                  按下和抬起一共6条消息

                  按下:
                  /dev/input/event4: 0004 0004 00090001
                  /dev/input/event4: 0001 0130 00000001
                  /dev/input/event4: 0000 0000 00000000
                  抬起:
                  /dev/input/event4: 0004 0004 00090001
                  /dev/input/event4: 0001 0130 00000000
                  /dev/input/event4: 0000 0000 00000000
                  

                  安卓14:

                  按下和抬起是4条消息

                  /dev/input/event1: 0001 0074 00000001
                  /dev/input/event1: 0000 0000 00000000
                  /dev/input/event1: 0001 0074 00000000
                  /dev/input/event1: 0000 0000 00000000
                  

                  1.3.2 安卓9 蓝牙手柄按键消息分析

                  按下:
                  /dev/input/event4: 0004 0004 00090001  //第一条消息
                  /dev/input/event4: 0001 0130 00000001 //第二条消息
                  /dev/input/event4: 0000 0000 00000000 //第三条消息
                  抬起:
                  /dev/input/event4: 0004 0004 00090001 //第四条消息
                  /dev/input/event4: 0001 0130 00000000 //第五条消息
                  /dev/input/event4: 0000 0000 00000000 //第六条消息
                  

                  参数说明:

                  /dev/input/event4:代表产生事件的设备节点

                  0004:代表事件类型

                  0004:代表事件代码

                  00090001:事件的值

                  使用getevent -l指令如下:

                  【android9】【input系统】【1.工具篇】,Android 9的输入系统工具详解 第1张

                  第一条数据包分析:

                  /dev/input/event4: 0004 0004 00090001

                  0004=EV_MSC,004=MSC_SCAN value=00090001

                  EV_MSC代表是杂项事件,MSC_SCAN代表是杂项事件中的扫描事件,Value代表值是00090001,说明扫描到BTN_GAMEPAD这个按键有变化

                  第二条数据包分析:

                  是一个按键事件,并表示按了什么键,是否按下

                  /dev/input/event4: 0001 0130 00000001

                  0001=EV_KEY 0130=BTN_GAMEPAD 00000001=DOWN

                  EV_KEY代表这是按键类型事件,BTN_GAMEPAD代表手柄注册中的按键是BTN_GAMEPAD,DOWN表示按下

                  第三条数据包分析:

                  /dev/input/event4: 0000 0000 00000000

                  0000= EV_SYN 0000= SYN_REPORT value=00000000

                  同步包,在应用层和驱动层做信息同步,标识一个独立的事件的发生,它与另一个同步包夹中间的一组的打印就是一个事件的发生

                  EV_SYN代表,是同步类型,

                  SYN_REPORT:当多个输入数据在同一时间发生变化时,SYN_REPORT用于把这些数据进行打包和包同步。例如,一次鼠标的移动可以上报REL_X和REL_Y两个数值,然后发出一个SYN_REPORT。

                  Value就是扫描到的值。

                  第四条数据包分析:

                  /dev/input/event4: 0004 0004 00090001

                  也是一个扫描事件,同第一条

                  第五条数据包分析:

                  /dev/input/event4: 0001 0130 00000000

                  0001=EV_KEY 0130=BTN_GAMEPAD 00000000=UP

                  表示是一个按键事件,是BTN_GAMEPAD键,00000000表示抬起

                  第六条数据包分析:

                  也是一个同步事件

                  1.4 motion事件类型分析

                  一次触摸产生的motion事件其实是三个动作

                  1.手指按下

                  2.手指移动

                  3.手指抬起

                  此时需要先了解Linux的多点触摸协议

                  1.4.1 多点触摸协议A

                  主要用于匿名的设备,,硬件对于触摸点不能被区分和追踪,(大多已经淘汰,故此处不再赘述)

                  type A设备的驱动程序,需要一次性将当前触摸屏上的所有触摸点的信息全部上报。

                  1.4.2 多点触摸协议B

                  硬件有能力追踪并区分触摸点,type B协议和type A协议相比,最大的区别是能够识别某一个触摸点,因此能够减少发送给用户空间的数据。协议B使用的是slot来区分触摸点,要使用ABS_MT_TRACKING_ID消息,此消息不为-1,代表是一个可用的触摸点,如果是-1则代表此触摸点销毁(即手指离开屏幕)

                  1.4.2.1 变量含义
                  ABS_MT_POSITION_X //触摸中心位置的X轴坐标
                  ABS_MT_POSITION_Y ///触摸中心位置的X轴坐标,ABS_MT_POSITION_X 和ABS_MT_POSITION_Y 是多点触摸协议的最小事件集,是最基本的事件,也是必须的事件。
                  ABS_MT_TOOL_TYPE //触摸工具类型。如手指,触摸笔等
                  ABS_MT_TRACKING_ID //用来追踪和识别压下到提起期间的某一个触摸点
                  ABS_MT_TOUCH_MAJOR //触摸点椭圆形最长的那个方向的直径
                  ABS_MT_TOUCH_MINOR //触摸点椭圆形短一点的那个方向的直径,如果是圆形,ABS_MT_TOUCH_MINOR可以省略
                  ABS_MT_WIDTH_MAJOR //触摸工具的椭圆的最长的那个方向的直径
                  ABS_MT_WIDTH_MINOR //触摸工具的圆形短一点的那个方向的直径
                  ABS_MT_PRESSURE //触摸点的压力大小
                  

                  此处,应该会有读者疑问ABS_MT_TOUCH_MAJOR和ABS_MT_WIDTH_MAJOR 的区别是什么呢?

                  答:假定我们的手指按在玻璃上,那么ABS_MT_TOUCH_MAJOR描述的是我们真正手指接触的面积,而ABS_MT_WIDTH_MAJOR代表我们手指头的面积,随着我们按压玻璃用力的加深,ABS_MT_TOUCH_MAJOR会接近于ABS_MT_WIDTH_MAJOR。

                  问:那么为什么要设置这两个参数呢?

                  答:这两个参数的可以反应触摸点压力的大小。

                  ABS_MT_PRESSURE =ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR。

                  设备的压力值大小计算方法由设备本身决定。并不相同。只是提供一种可能。

                  1.4.2.2 协议B举例

                  手指按下

                  此时有两个手指触摸屏幕,表示按下,即产生两个触摸点

                          ABS_MT_SLOT 0 //用slot 0表示第一个触摸点
                          ABS_MT_TRACKING_ID 45 //记录触摸点ID,用于区分触摸点
                          ABS_MT_POSITION_X x[0] //第一个触摸点按下的x位置。ABS_MT_POSITION_X和ABS_MT_POSITION_Y是多点触摸协议的最小事件集,
                          ABS_MT_POSITION_Y y[0] //第一个触摸点按下的y的位置。
                          ABS_MT_SLOT 1 //用slot 0表示第二个触摸点
                          ABS_MT_TRACKING_ID 46 //记录触摸点ID,用于区分触摸点
                          ABS_MT_POSITION_X x[1] //第二个触摸点按下的x位置。
                          ABS_MT_POSITION_Y y[1] //第二个触摸点按下的y位置。
                          SYN_REPORT //上报消息
                  

                  手指移动

                  情况1:只有第一个触点45 移动x方向,如何报告?

                          ABS_MT_SLOT 0 //表示第一个触摸点
                          ABS_MT_POSITION_X x[0] //表示此时x的位置
                          SYN_REPORT //事件上报
                  

                  情况2:两个触点都移动了x方向,如何报告?

                          ABS_MT_SLOT 0 //表示第一个触摸点
                          ABS_MT_POSITION_X x[0] //表示此时第一个触点x的位置
                          ABS_MT_SLOT 1 //表示第二个触摸点
                          ABS_MT_POSITION_X x[0] //表示此时第二个触点x的位置
                          SYN_REPORT //事件上报
                  

                  此时可以看出,协议A是所有触点都上报,而协议B只上报变化的触点,因此减少了许多消息

                  手指抬起

                  情况1:第一跟手指抬起,第二根手指仍在滑动,如何报告?

                  ABS_MT_SLOT 0 //表示第一个触摸点
                  ABS_MT_TRACKING_ID -1 //表示第一个触点销毁
                  SYN_REPORT //事件上报
                  ABS_MT_SLOT 1 
                  ABS_MT_POSITION_X x[0]
                  SYN_REPORT
                  

                  情况二:两根手指都抬起,如何报告?

                  ABS_MT_SLOT 0 //表示第一个触摸点
                  ABS_MT_TRACKING_ID -1 //表示第一个触点销毁
                  SYN_REPORT //事件上报
                  ABS_MT_SLOT 1 //表示第二个触摸点
                  ABS_MT_TRACKING_ID -1 //表示第二个触点销毁
                  SYN_REPORT //事件上报
                  

                  1.4.3 getevent -l motion事件分析

                  此处基于笔者手机获取信息如下:

                  1.4.3.1 当两根手指按下时
                  /dev/input/event8: EV_ABS       ABS_MT_SLOT          00000000 //第一个触摸点   00000000 
                  /dev/input/event8: EV_ABS       ABS_MT_TRACKING_ID   00000010 //第一个触摸点 对应的id
                  /dev/input/event8: EV_KEY       BTN_TOUCH            DOWN // 当设备驱动报告了BTN_TOUCH键值,Android系统将认为BTN_TOUCH总是被用于指示触摸工具是否真正地接触触摸屏或仅仅在上方盘旋。
                  /dev/input/event8: EV_KEY       BTN_TOOL_FINGER      DOWN //BTN_TOOL_FINGER表示的是按键类型为手指
                  /dev/input/event8: EV_ABS       ABS_MT_WIDTH_MAJOR   00000005  //触摸工具的主轴
                  /dev/input/event8: EV_ABS       ABS_MT_TOUCH_MINOR   00000005 //触摸点最小轴
                  /dev/input/event8: EV_ABS       ABS_MT_PRESSURE      00000005 //触摸压力大小
                  /dev/input/event8: EV_ABS       ABS_MT_POSITION_X    000010fc //触摸点的x坐标
                  /dev/input/event8: EV_ABS       ABS_MT_POSITION_Y    000075cc //触摸点的y坐标
                  /dev/input/event8: EV_ABS       ABS_PROFILE          0000084e //ABS_PROFILE在多指触控协议中主要用于描述输入设备(如触摸屏)的一些物理特性。它可能包括设备的分辨率、尺寸、形状等参数
                  /dev/input/event8: EV_SYN       SYN_REPORT           00000000 //事件上报
                  /dev/input/event8: EV_ABS       ABS_MT_SLOT          00000001 //第二个触摸点   00000001
                  /dev/input/event8: EV_ABS       ABS_MT_TRACKING_ID   00000011 //第二个触摸点 对应的id
                  /dev/input/event8: EV_ABS       ABS_MT_TOUCH_MINOR   00000009 //触摸点最小轴
                  /dev/input/event8: EV_ABS       ABS_MT_PRESSURE      00000009 //触摸压力大小
                  /dev/input/event8: EV_ABS       ABS_MT_POSITION_X    000011f7 //触摸点的x坐标
                  /dev/input/event8: EV_ABS       ABS_MT_POSITION_Y    000085d8 //触摸点的y坐标
                  /dev/input/event8: EV_ABS       ABS_PROFILE          0000046a //ABS_PROFILE在多指触控协议中主要用于描述输入设备(如触摸屏)的一些物理特性。它可能包括设备的分辨率、尺寸、形状等参数
                  /dev/input/event8: EV_SYN       SYN_REPORT  //事件上报
                  
                  1.4.3.2 当两根手指移动时
                  /dev/input/event8: EV_ABS       ABS_MT_SLOT          00000000 //第一个触摸点
                  /dev/input/event8: EV_ABS       ABS_MT_POSITION_X    0000110f //触摸点的x坐标
                  /dev/input/event8: EV_ABS       ABS_MT_POSITION_Y    000075d4 //触摸点的y坐标
                  /dev/input/event8: EV_ABS       ABS_MT_SLOT          00000001 //第二个触摸点
                  /dev/input/event8: EV_ABS       ABS_MT_POSITION_X    00001237 //触摸点的x坐标
                  /dev/input/event8: EV_ABS       ABS_MT_POSITION_Y    000085f6 //触摸点的y坐标
                  /dev/input/event8: EV_SYN       SYN_REPORT           00000000 //事件上报
                  
                  1.4.3.2 当两根手指抬起时
                  /dev/input/event8: EV_ABS       ABS_MT_SLOT          00000000 //第一个触摸点
                  /dev/input/event8: EV_ABS       ABS_MT_TRACKING_ID   ffffffff //值为-1,代表第一个触摸点销毁
                  /dev/input/event8: EV_SYN       SYN_REPORT           00000000
                  /dev/input/event8: EV_ABS       ABS_MT_SLOT          00000001 //第二个触摸点
                  /dev/input/event8: EV_ABS       ABS_MT_TRACKING_ID   ffffffff //值为-1,代表第二个触摸点销毁
                  /dev/input/event8: EV_KEY       BTN_TOUCH            UP //当设备驱动报告了BTN_TOUCH键值,Android系统将认为BTN_TOUCH总是被用于指示触摸工具是否真正地接触触摸屏或仅仅在上方盘旋。
                  /dev/input/event8: EV_KEY       BTN_TOOL_FINGER      UP //表示按键类型为手指
                  /dev/input/event8: EV_SYN       SYN_REPORT           00000000 //同步事件
                  

                  后续

                  那么这些消息,input是如何处理的呢?后续的篇幅会根据源码进行逐行分析。欢迎关注。


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码