开发BLE蓝牙手机上位机软件竟是如此的简单

2023-11-16

做安卓手机APP通常使用高端大气的Android Studio,开发语言是Java,该开发IDE就是体积大
学习成本高,入手慢,这里给大家推荐一款国产的软件,体积小,运行和编译速度快。最重要的是编程语言是中文
这个软件就是E4A.
本次我将向大家介绍如何使用E4A开发BLE蓝牙手机上位机APP。
当然,该软件自带了丰富的例子,也提供了一个BLE例子,大家可以借鉴。
由于没有提供各种库的说明文档和帮助文件,学这个软件可能有经过一段摸索,这里我将向大家介绍我在开发这个软件中
获得的经验。
中文编程语言:易语言,采用中文作为关键字,但是编程的语法和思想和C语言是类似的
为了方便理解,这里我结合单片机开发的思路简单介绍一下
变量要声明类型
对象操作的函数称为:方法
对象可触发的中断函数称为:事件
对象可设置的参数称为:属性
-----------------------------------------------------------------------------------------
好接下来介绍 BLE蓝牙库
BLE(Bluetooth Low Energe)低功耗蓝牙设备主要用于智能穿戴和物联网。
BLE蓝牙类库,包含两种操作:方法和事件

方法:

        初始化

        置可被发现

        开始搜索

        停止搜索

        连接设备

        断开连接

        释放资源

        是否可读

        是否可写

        是否可通知

        读取数据

        写入数据

事件:

        创建完毕

        发现设备

        信号强度改变

        发现服务

        连接状态改变

        读取数据完毕

        通道数据改变

由于不存在可见的对象,因此蓝牙没有属性设置。
了解方法和事件的用法可通过左侧类库目录选中对应的条目,在下面的提示信息中查看
例如选中BLE蓝牙库的方法 初始化 条目后:
        方法:初始化()为 逻辑型
        分类:BLE蓝牙类库---BLE蓝牙
        注释:初始化BLE蓝牙设备,成功返回真,失败返回假,BLE蓝牙需要安卓4.3以上系统的支持。
另外 事件类似中断函数,因此在代码中没有先后顺序,可以根据易读的排列顺序进行排版。
所有的动作均属于触发的事件,因此,方法通常在事件里面进行调用。
自己创建的函数,需要自己实现该函数的具体过程,因此函数在这里称为:过程
不过我们这里做BLE蓝牙APP可以不用到过程。
好了,基本的概念已经介绍了,我们可以开始整了。
-----------------------------------------------------------------------------------------
第一步,先根据我们的需要完成可视化的组件布局,并给添加的组件起上一个跟操作相关的名字,在组件的属性对话框设置,同时可以设置组件的其他相关属性。


第二步,使用中需要完成单击响应的,我们可以在设计区直接双击组件,即可自动在代码区生成一个空的事件(类似单片机开发中的中断处理函数,用于响应单击事件),例如四个方向键的单击事件。以下代码我已经填充了单击后执行的蓝牙方法:写入数据,即发数据给连接到手机的蓝牙模块。

事件 按钮上.被单击()

                BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("上\n","GBK"))

结束 事件



事件 按钮下.被单击()

                BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("下\n","GBK"))

结束 事件



事件 按钮左.被单击()

                BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("左\n","GBK"))

结束 事件



事件 按钮右.被单击()

                BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("右\n","GBK"))

结束 事件

第三步,完成主窗口的创建工作,因为我们要使用蓝牙库,所以我们可以在APP启动后就申请使用蓝牙的权利,并初始化一个蓝牙对象。
另外就是要实现软件退出的操作,所以我们可以设置一个退出的按钮,实现结束程序。内容如下。

事件 主窗口.创建完毕()

        '安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行

        如果 权限操作1.取系统版本号()>=23 则

                权限操作1.申请全部权限()

        结束 如果        

        变量 结果 为 逻辑型

        结果 = BLE蓝牙1.初始化()

        弹出提示("初始化结果:" & 结果)        

结束 事件



事件 权限操作1.申请完毕(权限数组 为 文本型(),申请结果 为 整数型())

        '可以把需要特殊权限的代码写在此处,当申请权限成功后再执行相关代码

结束 事件



事件 图片框_返回.被单击()

        结束程序()

结束 事件

第四步,实现蓝牙设备的搜索,从搜索到的蓝牙信号中选出我们要的那个,另外在搜索的过程中显示信号的强度
通过按钮单击实现搜索与停止搜索,并设定搜索时间为10秒,10秒后自动停止搜索。
通过发现设备事件,读取搜到的设备,并匹配名称是否为自己要找的信号。这里我内置了信号名称,也可以通过一个输入框,实现敏感信号名称的修改
如果发现的设备名称是指定名字的信号,就将名称和地址写入到列表框的项目,同时给项目做个编号和标记,方便后面取出
使用信号强度改变事件读取搜索中的信号强度,我们只读取感兴趣的那个名字的信号。
当列表中出现我们感兴趣的那个信号名称和地址时候,我们可以单击列表中的该项,触发连接设备,实现手机与蓝牙模块的连接。
同时通过颜色和文字提示是否连接上或者断开了。这可以使用BLE蓝牙对象的连接状态改变事件实现。

事件 搜索按钮.被单击()

        如果 搜索按钮.标题 = "开始搜索" 则

                位置传感器1.开始监测()

                BLE蓝牙1.开始搜索()

                时钟1.时钟周期 = 10*1000

                搜索按钮.标题 = "停止搜索"

        否则        

                BLE蓝牙1.停止搜索()

                时钟1.时钟周期 = 0

                搜索按钮.标题 = "开始搜索"

        结束 如果

结束 事件



事件 时钟1.周期事件()

        BLE蓝牙1.停止搜索()

        搜索按钮.标题 = "开始搜索"

        时钟1.时钟周期 = 0

结束 事件



事件 BLE蓝牙1.发现设备(名称 为 文本型,地址 为 文本型,MajorID 为 整数型,MinorID 为 整数型,配对状态 为 整数型)

        如果 名称 = "BT24" 则

        '屏蔽掉没有名称的蓝牙设备



                弹出提示("发现设备")

                列表框1.添加项目("名称:" & 名称 & "\n地址:" & 地址)

                列表框1.置项目标记(列表框1.取项目数()-1,地址)        

        结束 如果

结束 事件



事件 BLE蓝牙1.信号强度改变(名称 为 文本型,地址 为 文本型,信号强度 为 整数型)

        如果 名称 = "BT24" 则

                列表框1.置项目内容(0,"名称:" & 名称 & "\n地址:" & 地址 & "\n信号:" & 信号强度)

        结束 如果                        

结束 事件



事件 列表框1.表项被单击(项目索引 为 整数型)

        设备地址 = 列表框1.取项目标记(项目索引)

        BLE蓝牙1.连接设备(设备地址)

        'BLE蓝牙1.连接设备(列表框1.取项目标记(项目索引))

        弹出提示("正在连接")

        连接状态.标题 = "正在连接"



结束 事件



事件 BLE蓝牙1.连接状态改变(状态 为 整数型)

        如果 状态 = 1 则

                连接状态.标题 = "已连接"

                连接状态.背景颜色 = 绿色

        否则 

            连接状态.标题 = "已断开"

                连接状态.背景颜色 = 红色

        结束 如果

结束 事件

第五步,通过服务提供的通道进行数据传输
连接上蓝牙模块后,就要建立通信的通道了,这需要通过服务来完成,因此我们要对连接的蓝牙模块索取服务的操作
这称为发现服务 事件,由于蓝牙模块中有多个服务可选,我们要找到我们可以进行通信的那个,这个通常在模块的手册也给了相关的短ID
称为服务UUID,每个服务又含有若干个通道UUID。因为模块的出厂设定,只有能用的那个服务才能通信,其他的服务是不可完全可读写的
在产生BLE蓝牙的发现服务事件后,会自动获取到服务的所有信心,装载到一个名字叫:服务信息的集合里,这个集合类型你就当类似C语言结构体数组的东西。
接下来为了验证每个服务是否可读写,就要一个一个测试,这类似,从一个结构体数组先一个一个读出来数组的元素,在数组元素的结构体里取结构体成员,
这就需要用到两层的for循环了,E4A 的for循环用一对 判断循环首---判断循环尾,进行包围。为了方便记,你可以给循环的变量起名字:i,j
然后就是测试对应的服务与通道是否可读,可写,可通知。如果三者都满足,那就是我们要找的通道,实际上,在多组的服务中,只有厂家指定的那组是
满足这三个条件的。其他的一般只能满足可读这一条。
找到合适的服务与通道后,想实现数据的接收,要执行 读取数据的方法,如果直接读,那么系统没有准备好呢,会导致读失败,后面就容易卡死。
这里就像初始化完单片机,要给系统以反应时间,等待个几百毫秒,然后再进行后面的操作一样。
这里就要用到定时器了,找到服务与通道后执行一个1000ms定时器的启动操作,在定时器计数满了之后的事件中执行读取数据的方法,
同时接收框显示服务和通道的ID,并关闭定时器。

事件 BLE蓝牙1.发现服务(服务信息 为 集合)

        如果 服务信息.取项目总数() < 0 则

                退出

        结束 如果

        

        变量 i 为 整数型

        变量 j 为 整数型

        变量 信息数组 为 文本型()



        i = 0



        判断循环首 i < 服务信息.取项目总数()

                信息数组 = 服务信息.取项目(i)

                j = 0

                判断循环首 j < 取数组成员数(信息数组)

                        如果 j >0 则

                                如果 BLE蓝牙1.是否可读(信息数组(0),信息数组(j)) = 真 且 BLE蓝牙1.是否可写(信息数组(0),信息数组(j)) =真 且 BLE蓝牙1.是否可通知(信息数组(0),信息数组(j)) =真 则

                        服务UUID = 信息数组(0)

                                        通道UUID = 信息数组(j)         

                                                'BLE蓝牙1.读取数据(服务UUID,通道UUID)

                                                '接收框.内容 = 服务UUID &"\n"& 通道UUID

                                                时钟2.时钟周期 = 1000

                                结束 如果

                        结束 如果

                        j = j + 1

                判断循环尾                

                i = i + 1

        判断循环尾        

结束 事件



事件 时钟2.周期事件()

        BLE蓝牙1.读取数据(服务UUID,通道UUID)

        接收框.内容 = 服务UUID &"\n"& 通道UUID

        时钟2.时钟周期 = 0

结束 事件

执行完读取操作后,系统会在通道内有数据发送来的时候触发通道数据改变的事件,在该事件中我们读取数据,另外也会触发读取完毕的事件
发送数据是通过单击发送按钮触发写入数据方法实现的,当完成写入后可通过写入数据完毕事件知道是否发送成功。

事件 BLE蓝牙1.读取数据完毕(结果 为 整数型,服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型()) 

        如果 结果 = 1 则

                弹出提示("读取数据成功:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))

                

        否则        

                弹出提示("读取数据失败:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))

        结束 如果        

结束 事件



事件 BLE蓝牙1.通道数据改变(服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型()) 

        弹出提示("通道数据改变" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))

        接收框.加入文本(字节到文本(数据,"GBK")) 

结束 事件



事件 发送按钮.被单击()

        BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节(发送框.内容,"GBK"))

结束 事件



事件 BLE蓝牙1.写入数据完毕(结果 为 整数型) 

        如果 结果 = 1 则

                弹出提示("写入数据成功")

        否则        

                弹出提示("写入数据失败")

        结束 如果

结束 事件

其他的操作可在以下完整代码中查看

变量 服务UUID 为 文本型

变量 通道UUID 为 文本型        

变量 设备地址 为 文本型



事件 主窗口.创建完毕()

        '安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行

        如果 权限操作1.取系统版本号()>=23 则

                权限操作1.申请全部权限()

        结束 如果        

        变量 结果 为 逻辑型

        结果 = BLE蓝牙1.初始化()

        弹出提示("初始化结果:" & 结果)        

结束 事件



事件 权限操作1.申请完毕(权限数组 为 文本型(),申请结果 为 整数型())

        '可以把需要特殊权限的代码写在此处,当申请权限成功后再执行相关代码

结束 事件



事件 图片框_返回.被单击()

        结束程序()

结束 事件



事件 搜索按钮.被单击()

        如果 搜索按钮.标题 = "开始搜索" 则

                位置传感器1.开始监测()

                BLE蓝牙1.开始搜索()

                时钟1.时钟周期 = 10*1000

                搜索按钮.标题 = "停止搜索"

        否则        

                BLE蓝牙1.停止搜索()

                时钟1.时钟周期 = 0

                搜索按钮.标题 = "开始搜索"

        结束 如果

结束 事件



事件 时钟1.周期事件()

        BLE蓝牙1.停止搜索()

        搜索按钮.标题 = "开始搜索"

        时钟1.时钟周期 = 0

结束 事件



事件 BLE蓝牙1.发现设备(名称 为 文本型,地址 为 文本型,MajorID 为 整数型,MinorID 为 整数型,配对状态 为 整数型)

        如果 名称 = "BT24" 则

        '屏蔽掉没有名称的蓝牙设备



                弹出提示("发现设备")

                列表框1.添加项目("名称:" & 名称 & "\n地址:" & 地址)

                列表框1.置项目标记(列表框1.取项目数()-1,地址)        

        结束 如果

结束 事件



事件 BLE蓝牙1.信号强度改变(名称 为 文本型,地址 为 文本型,信号强度 为 整数型)

        如果 名称 = "BT24" 则

                列表框1.置项目内容(0,"名称:" & 名称 & "\n地址:" & 地址 & "\n信号:" & 信号强度)

        结束 如果                        

结束 事件



事件 列表框1.表项被单击(项目索引 为 整数型)

        设备地址 = 列表框1.取项目标记(项目索引)

        BLE蓝牙1.连接设备(设备地址)

        'BLE蓝牙1.连接设备(列表框1.取项目标记(项目索引))

        弹出提示("正在连接")

        连接状态.标题 = "正在连接"



结束 事件



事件 BLE蓝牙1.连接状态改变(状态 为 整数型)

        如果 状态 = 1 则

                连接状态.标题 = "已连接"

                连接状态.背景颜色 = 绿色

        否则 

            连接状态.标题 = "已断开"

                连接状态.背景颜色 = 红色

        结束 如果

结束 事件



事件 BLE蓝牙1.发现服务(服务信息 为 集合)

        如果 服务信息.取项目总数() < 0 则

                退出

        结束 如果

        

        变量 i 为 整数型

        变量 j 为 整数型

        变量 信息数组 为 文本型()



        i = 0



        判断循环首 i < 服务信息.取项目总数()

                信息数组 = 服务信息.取项目(i)

                j = 0

                判断循环首 j < 取数组成员数(信息数组)

                        如果 j >0 则

                                如果 BLE蓝牙1.是否可读(信息数组(0),信息数组(j)) = 真 且 BLE蓝牙1.是否可写(信息数组(0),信息数组(j)) =真 且 BLE蓝牙1.是否可通知(信息数组(0),信息数组(j)) =真 则

                        服务UUID = 信息数组(0)

                                        通道UUID = 信息数组(j)         

                                                'BLE蓝牙1.读取数据(服务UUID,通道UUID)

                                                '接收框.内容 = 服务UUID &"\n"& 通道UUID

                                                时钟2.时钟周期 = 1000

                                结束 如果

                        结束 如果

                        j = j + 1

                判断循环尾                

                i = i + 1

        判断循环尾        

结束 事件



事件 时钟2.周期事件()

        BLE蓝牙1.读取数据(服务UUID,通道UUID)

        接收框.内容 = 服务UUID &"\n"& 通道UUID

        时钟2.时钟周期 = 0

结束 事件



事件 清空接收按钮.被单击()

        接收框.内容 = 空

结束 事件







事件 BLE蓝牙1.读取数据完毕(结果 为 整数型,服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型()) 

        如果 结果 = 1 则

                弹出提示("读取数据成功:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))

                

        否则        

                弹出提示("读取数据失败:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))

        结束 如果        

结束 事件



事件 BLE蓝牙1.通道数据改变(服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型()) 

        弹出提示("通道数据改变" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))

        接收框.加入文本(字节到文本(数据,"GBK")) 

结束 事件



事件 发送按钮.被单击()

        BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节(发送框.内容,"GBK"))

结束 事件



事件 BLE蓝牙1.写入数据完毕(结果 为 整数型) 

        如果 结果 = 1 则

                弹出提示("写入数据成功")

        否则        

                弹出提示("写入数据失败")

        结束 如果

结束 事件



事件 连接状态.被单击()

        如果 连接状态.背景颜色 = 绿色 则

                BLE蓝牙1.断开连接()

                连接状态.标题 = "正在断开"

        否则

                连接状态.标题 = "正在连接"

                BLE蓝牙1.连接设备(设备地址)        

        结束 如果

结束 事件



事件 读取按钮.被单击()

        BLE蓝牙1.读取数据(服务UUID,通道UUID)

结束 事件



事件 接收框.创建完毕()

        接收框.置多行模式(真)

结束 事件



事件 按钮上.被单击()

                BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("上\n","GBK"))

结束 事件



事件 按钮下.被单击()

                BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("下\n","GBK"))

结束 事件



事件 按钮左.被单击()

                BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("左\n","GBK"))

结束 事件



事件 按钮右.被单击()

                BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("右\n","GBK"))

结束 事件

技巧:分割线可以使用标签组件制作,如下图所示。


另外就是关于生成后程序的属性设置,比如版本号,设计的分辨率,图标等
 

---------------------
作者:gaoyang9992006
链接:https://bbs.21ic.com/icview-3173112-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发BLE蓝牙手机上位机软件竟是如此的简单 的相关文章

  • Unity3d快速入门

    https www zhihu com question 313621072 Unity3d如何快速入门 前言 进入一个领域 最直接有效的方法就是 寻找相关综述性文章 首先你需要对你入门的领域有个概括性的了解 这些包括 1 主流的学习社区与
  • objectARX 定义块、删除定义块或快参照

    1 如何定义块 2 根据定义删除块 块参照 第一步 通过块定义名称找到实体idlist 当前图形数据库 gt 块表 gt 检查该块定义是否在块表存在 gt 存在 则通过定义名称 找到实体idlist 第二步 遍历块表的实体id 若属于某定义
  • ASP.NET Core3.1 跨平台智能云管理系统源码

    ASP NET Core3 1 跨平台智能云管理系统源码 一个相当不错的系统框架 ASP NET Core3 1 跨平台智能云管理系统 什么是 ASP NET Core ASP NET Core 是一个由微软创建的 用于构建 web 应用
  • 42. 疯狂爬取王者荣耀所有皮肤高清海报(文末源码)

    目录 前言 目的 思路 代码实现 1 导包 部署好环境 2 伪装请求头 3 访问英雄列表 获取英雄ID 4 分别访问各英雄主页 查看图片详情 5 写入本地文件夹 文件夹自动命名 完整源码 运行效果 总结 前言 阔别已久 各位粉丝朋友们 UP
  • MyBatis-Plus的主键策略

    MyBatis Plus的主键策略 我们在为主键挑选生成策略的时候 可以看出有一下几种策略 下面我们一起看看他们的生成方式 值 描述 AUTO 数据库ID自增 NONE 无状态 该类型为未设置主键类型 注解里等于跟随全局 全局里约等于 IN

随机推荐

  • 一图读懂JVM架构解析

    每个Java开发人员都知道字节码经由JRE Java运行时环境 执行 但他们或许不知道JRE其实是由Java虚拟机 JVM 实现 JVM分析字节码 解释并执行它 作为开发人员 了解JVM的架构是非常重要的 因为它使我们能够编写出更高效的代码
  • 实验三 虚拟局域网的配置

    一 实验目的和要求 1 理解以太网交换机IEEE802 1q扩展帧的转发 过滤 机制 2 理解虚拟局域网的功能和划分方法 3 理解STP协议工作机制 3 掌握单个交换机和跨交换机的VLAN配置 4 掌握三层交换机的配置 二 实验设备 1 双
  • 高防IP是什么?有什么作用?

    最近不少来咨询的客户都问什么是高防IP 客户接入这个高防IP的话需要做些什么准备 今天就给大家科普一下什么是高防IP 他的原理是什么 客户接入需要做些什么 高防IP是指高防机房所提供的IP段 主要是针对网络中的DDOS攻击进行保护 在网络世
  • CompiledEffect Direct3D9 Sample fxc.exe

    转载于 https www cnblogs com Agravity p 5138141 html
  • 微信小程序——自定义日期时间组件实现

    目前 微信小程序选择器提供了日期选择器 时间选择器等 但没有日期时间一体的选择器 当项目中需要进行日期时间选择时 我们只有自定义组件了 首先 我们需要先了解一下小程序的picker组件 详细使用见链接 https developers we
  • UDP通过广播的形式发送、接收结构体

    UDP是一种无连接的 面向数据包的传输协议 通过广播的方式可以向多个接收方发送数据 在C 中 可以使用socket库来实现UDP广播的发送和接收 下面是一篇CSDN博文 介绍了如何使用C 通过广播的形式发送和接收结构体 一 UDP广播的发送
  • 电商的1000+篇文章总结

    电商的1000 篇文章总结 本文收集和总结了有关电商的1000 篇文章 由于篇幅有限只能总结近期的内容 想了解更多内容可以访问 http www ai2news com 其分享了有关AI的论文 文章 图书 query 6 合并大舞台的背后
  • cocos2dx:瓦片地图加载失败及黑线问题

    问题 1 瓦片地图加载失败 运行时 获取瓦片地图的层失败 调试发现 获取的层是一个 NULL 遇到这个问题 我第一反应是图片路径有问题 但经过检查发现 路径没有问题 然我就怀疑 是我的代码有问题 然而并没有 调试无果 我就把目光转向瓦片地图
  • 23种设计模式之模板方法模式

    文章目录 模板方法模式 模板方法模式的优缺点 使用场景 模板方法模式 模板方法模式法 Template Method 定义一个操作中的算法骨架 而将算法的一些步骤延迟到子类中 使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
  • pushd命令

    1 功能pushd命令常用于将目录加入到栈中 加入记录到目录栈顶部 并切换到该目录 若pushd命令不加任何参数 则会将位于记录栈最上面的2个目录对换位置2 语法 1 格式 pushd 目录 N N n 2 选项目录 将该目录加入到栈顶 并
  • 边界框回归的魔法:揭秘精准高效的MPDIoU损失函数

    文章目录 摘要 1 简介 2 相关工作 2 1 目标检测和实例分割 2 2 场景文本识别 2 3 边界框回归的损失函数 3 点距最小的并集交点 4 实验结果 4 1 实验设置 4 2 数据集 4 3 评估协议 4 4 目标检测的实验结果 4
  • 图神经网络与因果推理

    传统的因果推理基于线性结构方程模型 深度因果推理模型 这是基于图神经网络的模型 利用扁粉自动编码机来学习模型 其中 网络结构 因果推理模型为
  • iOS的终端命令和linux命令,iOS 终端 shell 操作,Mac 操作快捷键

    shell 操作命令 简单的shell 命令操作指令 pwd 当前工作目录 cd 不加参数 进root cd folder 进入文件夹 cd 上级目录 cd 返回root cd 返回上一个访问的目录 rm 文件名 删除 文件 rm 删除当前
  • vscode 配置文件

    将设置放入此文件中以覆盖默认设置 editor fontSize 18 editor fontFamily Source Code Pro Noto Sans CJK SC Consolas editor rulers 120 editor
  • 监听文件读取进度,中断文件读取

  • 使某个dom元素匀速滑动到容器顶部

    需求 我有个侧面的菜单 点击对应的菜单标题 可以让左侧的容易里对应标题滑到最顶上 于是我封装了一个缓动函数 这个函数接受3个参数 需要滚动的最外层的容器 滚动到什么距离 滚动时间 注意点 第一个参数的最外层的容器 需要滚动条 没滚动条是没有
  • Java AOP有5种增强方式注解——前置@Before,后置@After,返回@AfterReturning,异常@AfterThrowing,环绕@Around

    执行顺序 前置增强 gt 目标函数 gt 后置增强 gt 返回增强 异常增强 注意 Before After AfterRunning和 AfterThrowing修饰的方法没有返回值 而 Around修饰的方法必须有返回值 Aspect
  • 使用html制作3D循环相册

    使用 html 制作简单3D循环相册 注 img 标签中的 src 属性为你图片资源路径
  • typescript学习笔记

    typescript学习笔记 一 简介 typescript是js的超集 主要学习ts里面的原始类型 字面量类型 数组类型 函数类型 类类型 接口类型 类型别名 联合交叉类型 枚举类型 泛型等类型元素 以及类型推断 类型断言 类型缩小 类型
  • 开发BLE蓝牙手机上位机软件竟是如此的简单

    做安卓手机APP通常使用高端大气的Android Studio 开发语言是Java 该开发IDE就是体积大 学习成本高 入手慢 这里给大家推荐一款国产的软件 体积小 运行和编译速度快 最重要的是编程语言是中文 这个软件就是E4A 本次我将向