yanhy的学习记录匣 - 开发 https://yanhy.top/index.php/search/开发/ zh-CN 探索知识的宝箱,记录成长的脚步。欢迎来访Yanhy的博客站,在这里,每一页都是对知识无尽好奇的见证,每个故事都是学习旅程中的珍贵篇章,一起激发灵感,分享进步 Thu, 20 Nov 2025 21:31:00 +0800 Thu, 20 Nov 2025 21:31:00 +0800 FNOS v1.0发布了,回顾我的NAS之旅 https://yanhy.top/index.php/archives/460/ https://yanhy.top/index.php/archives/460/ Thu, 20 Nov 2025 21:31:00 +0800 yanhy2000 简单说点

从接触NAS概念到开始DIY一个自己的NAS,再到稳定日常使用且从生活中“隐身”,我经历了三年。

本文没有啥逻辑,就是看到出正式版系统了,感慨一下我这几年经历,可以说想到哪写到哪,不用太较真

初逢NAS

在一开始,NAS对我来说就是个不需要跟着自己到处跑、随时随地可以访问文件的物理硬件机,它不同于网盘,不仅管理权完全私有、文件完全私有,而且还可以拓展出很多玩法,对于当年还是学生时代预算不足的我来说,买个小小云服务器或者开个网盘会员,远没有属于自己的设备性价比高。因此,当年的我入手了第一个硬件设备:树莓派。

通过USB外接硬盘盒,在里面写好自动化脚本,连接上网线或者无线网,就成为了我第一个NAS。得益于当年校园网策略较为宽松,我可以在全校各种地方无缝通过校园网连接到NAS,刚好覆盖我的活动范围内。但是很快,由于ARM架构的限制、开发板较少的拓展以及低功耗芯片羸弱的性能,快毕业时的我看上了当年低端DIY NAS的“热门U”:J1900 。

还得是X86,虽然工控机小主板可拓展也不多,但是玩法就很多了。装上了黑群系统,虽然感觉系统用起来有一定难度,但是跟着教程慢慢学习,一点一点配置下来还是方便很多。从存储方面来说,我通过内部两个sata接口,加上当年的二手硬盘组了raid0、1,体验了各种阵列玩法;通过mpcie通道拓展了更多sata,硬盘叠叠乐使我体验到大容量存储的乐趣;得益于可插拔内存设计,我换上了更大的内存条,可以运行更多程序,还能开一些简单的游戏服务器和舍友一起联机,存档也不怕丢失直接备份到存储阵列中,还能随时回档;这颗cpu功耗不算特别高,因此也不需要功率特别大的风扇,仅放在宿舍一角平时甚至都察觉不到。

尝试DIY

毕业后,我就进入了一日复一日的工作,时间一久,工作对我来说就开始枯燥且繁琐。但这样的麻木并没有打消我想DIY一台“正经”的NAS的念头,我开始渐渐攒一些积蓄。

在23年的那个夏天,我开始翻阅各大UP的视频,参考各种社区的玩法攻略。当时的我没有多少装机经验,我甚至不确定我组一台设备需要哪些东西,因此为了不踩坑,我开始尝试抄作业。

我最开始选的,是机箱。在当时我的观点里,一个好的机箱能让NAS这样一台死板的设备变的有活力,让人感受到它是“稳定”、“好用”的。因此,我第一眼就看重了这个UP设计的DIY机箱:马里奥问好机箱

![image.png](data/attachment/forum/202511/20/200223j4w4igop1twplnkk.png "image.png")

确定了机箱,我就开始跟着机箱的设计选配件。好在这个机箱在某二手市场已经有人做整套打印+配件+背板方案了,我直接拍下,成功解决了机箱的问题。

然而这只是开始,选主板和电源才是折腾。

当年的我没有什么“ITX MATX”等概念,电源也只知道标准ATX电源,而这个机箱要求FLUX小号电源(虽然我到现在也没太明白哈哈哈)。我找啊找,发现这类电源和主板都好贵:便宜且合适的主板,支持的u太老,而且sata太少,甚至有的不带M2硬盘位等等;电源基本到1块钱1W的价格,想买大一点的电源价格直接起飞。为避嫌就不聊具体厂商了,最终主板是买了一个“为NAS定制”型的ITX主板,原生支持6x sata和2x M2硬盘位,还带有2.5G网口,但是价格也贵了不少。电源则选购了250W功率,在不接显卡情况下6个硬盘同时启动也足够使用了。

![image.png](data/attachment/forum/202511/20/201810yil56elsay7m76fo.png "image.png")

那段时间选配件时没少做功课,好在功课做的好,没遇到什么难题。CPU选用了当年NAS圈还比较火的i3-8100T,看上一个“低功耗 核显解码 性能好”。当年玩NAS时,考虑到这个是7x24小时运作,还担心过很久的功耗问题。第一次装机,完美点亮。当时还在玩黑群系统,反手装好系统,塞进去唯一一块新买的4TB硬盘。从那时开始,我的“正经”NAS之旅开始了。

第一次“踩坑”

结果不出意外,还是踩坑了哈哈哈
但这是不是坑呢

坑来的很快。没过几个月我就发现一件事:这个机箱散热效率疑似有点低了。

虽然以现在成熟的眼光看来,只需要做好风道,散热就不会太差。但对于刚开始玩nas的我来说,或许因为社区功课做的太多,又担心功耗大电费吃不消,又担心散热跟不上容易损坏硬盘,况且当时我又要一直运行一些高负载的程序,那段时间,关于NAS的精神内耗可以说到了极致,整天在社区看别人的方案,然后越看越觉得自己的nas有缺陷,于是开始想办法,换!

NAS机箱都挺贵,合适一点的都是四盘位(当年还有存储焦虑,虽然没几个盘但是非要上六盘位)。最后在某二手市场发现了一类机箱,貌似非常符合需求,那就是蜗牛星际。当时我想,既然都能在这么恶劣的环境下使用了,做nas岂不是更合适(?

挑选半天好不容易淘回来一个六盘位的机箱,但是表面已经是战损了,于是又在网上买贴纸。经过一番折腾,表面也是好看了一些了。

![image.png](data/attachment/forum/202511/20/202736dzh6a6dqgi668v3a.png "image.png")

将主板等硬件迁移进去,成功点亮。感受了一下风力,这下满意了。于是,在后面一段时间内,这个就是我NAS的新形态。

还有系统焦虑?

人果然不能闲下来啊(~

在用了好一段时间的黑群系统后,又开始闲不住折腾了。

发现在黑群下用虚拟机好像有点卡,社区说是这个系统的虚拟机做的不好,性能较差。追求拓展和各种玩法的我当然不甘心,好歹也是个酷睿的CPU,性能浪费着不用白不用,于是我又开始搞起了PVE系统。

既然都搞PVE了,那不上点其他的NAS系统玩玩(?于是又开始折腾,为此还特意把硬盘文件都腾出来,开始一周换一次的尝鲜玩法。

当然,最终还是回到了黑群,毕竟这是大多数人验证过的非常稳定的且热门的系统了,试过TrueNAS、UNRaid等各种系统,还是黑群这样“桌面化”的系统让我感觉更方便(应该是用win桌面习惯了导致的,但桌面化确实更容易上手)。

机箱变变变

虽然不知道为什么,但是越看这个机箱越不顺眼,可能因为这货太大了(?

在一段时间后,由于感觉前面那个蜗牛机箱过于笨重,于是再次入手一个新的“蜗牛机箱”!

这次小巧了很多,而且硬盘仓设计的不错,虽然感觉可能缺了前盖,但是没有前盖也挺好看,就是容易风道进孔吃灰。

(过于久远找不到合适图了)

![image.png](data/attachment/forum/202511/20/204700hoktbbbiy0iikylb.png "image.png")

这个机箱当然也有缺点,它的IO背板是定制主板才兼容的,正常ITX主板放进去无法兼容它的开孔,导致有一部分USB是查不了的;另外它的机箱风扇是通过前面板的小控制板来控制转速的,开机时会转速拉满,而正常情况下因为系统没有对应驱动获取不到温度,只能获取外面温度,因此转速很慢。但是不影响整体散热,并且随着工作越来越忙,也就没多少折腾nas的心思了。

在前段时间,我曾经想去提取固件反汇编看看逻辑(好歹也是干嵌入式的哈哈哈),但是工作时不时出差很忙,也就没了多少精力。这个机箱是我用的最久的一个。它散热做到还不错,哪怕风扇转速慢,硬盘温度也能基本压下来。

非常好系统,使我NAS不崩

时间来到24年,我搬到了杭州。机缘巧合下开通的宽带自带公网,我才开始想起来我的NAS。重新收拾了一下机器,清了灰整理了数据,再把系统重装一下,接下来用nas的频率才开始高起来。(此时我的系统仍然是PVE,至于为什么,因为我经常在玩黑群时不知道动了什么就导致系统重启后不开机或者没有IP了,后面我干脆以PVE为底层,崩了就重装,都快习惯了hh)

很巧的是,在去年七八月份,我刚加几块硬盘,准备放弃黑群系统再试试看其他家系统时,飞牛系统出现了。

![image.png](data/attachment/forum/202511/20/210051sfq4pjyo8j5m88yl.png "image.png")

当然不否认第一次看到飞牛系统界面宣传时,我还以为又是什么小众工作室搞了一个魔改的系统,毕竟之前有CaasOS、nextcloud等宣传时,我以为是个系统,然后用了才发现它只是一个程序实现,并非真正独立的系统。

不过仔细了解过后,才发现这个团队与这个系统并不简单。

![image.png](data/attachment/forum/202511/20/210649l05g0igdots4fitg.png "image.png")

反正我NAS处于随时崩溃状态,不如清理一下,直接裸机安装飞牛系统~

使用了一段时间,给我的感受真的很不错。当时它确实有不少小问题,但我感觉这个团队是真有实力的。每周更新不仅能增加新功能还修复不少小问题,无论团队大小如何,这效率是真有在做事的。抱着这样的心态,我也好好把玩了这套系统,还曾提交过一整个文档的反馈信息,当时真心希望这个团队能做的更好。

虽然现在看来当时有点小题大做了哈哈哈,不过当时确实很激动啊,这个系统真的很符合我各种需求

![image.png](data/attachment/forum/202511/20/211138kef8zoluoddx2bud.png "image.png")

于是我就用上了飞牛系统,一用就是一年多。得益于飞牛系统基于debian的开放性,不仅可以在系统内用官方的一些工具,也可以部署一些自己想做的事情。到了24年底,我也将自己的系统进行了一波配置升级,CPU也换成了I5-9600,不带T。

那时的我,已经开始渐渐把NAS当正经办公工具来用了。备份做好本地一备云端一加密备,在公网的加持下,异地办公远程开office(自行安装的)、虚拟机桌面等工作环境非常方便,甚至在这期间,这个系统基本没有崩溃出错过。

最让我感到舒服的一点是,这个团队愿意给飞牛用户出免费的“内网穿透”,尤其是近期还能穿透其他程序,包括docker应用。虽然带宽低,但它保证了基础连接,不失联。和自己配置的内网穿透不同,我感受到这个FN Connect是可以作为我连接的基础保障。哪怕我frp服务掉了、docker里面的tailscale崩了或者失联了,我还可以通过fnc连接到nas进行修复与控制。

最后

写了很多,其实一开始我单纯想展示一下自己的nas来着,而且可能里面也有些地方逻辑不通等,大家就当小故事图一乐,这只是我摸索的经历,一些“系统不稳定”等也是我自己问题,爱折腾是这样的hhh

哦对了,在前几个月,我nas的机箱又换了!

![image.png](data/attachment/forum/202511/20/212154u1dtqd97ht8dot98.png "image.png")

我放弃使用那些蜗牛机箱,在网上淘了一个NAS 6盘款式的机箱,体积比较大,但是已经无大碍了,它散热非常好,甚至给CPU上了单塔散热器,硬盘空间也很足。

现在生活也稳定下来了,NAS成为我办公中的一部分,在平时甚至会忽略到这个机器的存在。另外通过2.5G内网传输,我可以将我主力电脑的很多资料、文件甚至一些软件游戏都可以放到NAS上了,越来越方便喽~

]]>
1 https://yanhy.top/index.php/archives/460/#comments https://yanhy.top/index.php/feed/search/开发/
QuizzerBot 插件Wiki https://yanhy.top/index.php/archives/456/ https://yanhy.top/index.php/archives/456/ Fri, 16 May 2025 13:31:00 +0800 yanhy2000 QuizzerBot 插件Wiki文档

1. 插件概述

1.1 基本介绍

欢迎使用 QuizzerBot!这是一个给服务器增加趣味答题活动的插件。支持Paper/Bukkit/Spigot等服务端核心。当前稳定支持API版本1.21.6及以上(已通过1.21.6-1.21.8版本测试,低于1.21.6尚未测试,但由于低版本不支持对话框API因此可能会出问题)。

本文档会尽量覆盖所有功能进行介绍,并区分新旧版本。当前文档对应版本:1.2.0

1.2 核心功能

QuizzerBot 核心就是“答题”。它提供了两种完全独立的答题模式:

  • 经典聊天答题 (所有版本均可使用)

    • 插件会按你设定的时间间隔,在聊天框自动发起全服答题。
    • 题目和选项会显示在公屏,玩家通过点击选项或输入指令来抢答。
  • 图形界面答题 (1.2.0+ 新增, 需 MC 1.21.6+)

    • 利用 Paper 1.21.6+ 新增的 Dialog API,提供了一个可交互的答题菜单。
    • 玩家可以随时使用 /quiz dialog 指令拉起这个菜单,按自己的节奏答题。
    • 这个功能使用独立的题库和排行榜,适合用来做“背单词CET4\6”、“MC知识问答”等额外挑战。

1.3 运行机制

  • 插件安装后会自动生成:

    • config.yml配置文件
    • quizzerBook.db H2格式数据库文件
  • 数据库存储:

    • 题目数据(QuizzerBook表)
    • 玩家统计数据(PlayerStats表)
    • 附加题目数据(extraQuizBook表)
    • 玩家附加统计数据(PlayerExtraStats表)
警告:请勿手动删除数据库文件,否则将导致数据丢失

1.4 版本兼容性说明

  • 1.2.0+ 版本 (最新):

    • 为了支持“图形界面答题”,此版本必须在 Paper 1.21.6 及更高版本上运行。
    • 如果你是 1.21.6+ 的服务器,请使用这个版本。
  • 1.1.x 版本:

    • 这些版本不包含“图形界面答题”和“CSV导入导出”功能。
    • 它们适用于 1.21 ~ 1.21.5 版本的服务器。
    • 如果你不打算升级服务器到 1.21.6,请继续使用 1.1.x 版本的插件。(备注:1.1.x版本可能存在时常无法自动触发答题bug,如有需求可联系作者更新修复)

2. 安装与初始化

2.1 安装步骤

  1. 将插件jar文件放入服务器plugins目录
  2. 重启服务器
  3. 检查启动日志确认加载成功

2.2 成功加载标志

正常启动时会显示如下日志信息(具体内容可能因版本不同略有差异):

[11:15:17 INFO]: [QuizzerBot] 数据库初始化完成
[11:15:17 INFO]: [QuizzerBot] 配置项:最低玩家限制: 1
[11:15:17 INFO]: [QuizzerBot] 配置项:答题时间: 20
[11:15:17 INFO]: [QuizzerBot] 答题系统已成功启动

插件第一次运行时,会自动在 plugins/QuizzerBot/ 目录下生成 config.yml 配置文件和 quizzerBook.db 数据库文件。1.2.0版本为了读写 .db 数据库,插件会自动从网上下载 H2 数据库驱动,下载速度取决于服务端所在服务器网络情况。


3. 功能详解

3.1 自动答题

3.1.1 触发机制

插件会根据 config.yml 里的 trigger_interval_sec: [最小值, 最大值] 配置,在这个时间范围内随机挑一个秒数,倒计时触发答题。(如果把最小值和最大值设成一样的,就是固定时间触发)。
触发时,会检查当前在线人数是否满足 min_players 的最低要求。

3.1.2 答题过程

条件满足后,题目和选项会发到公屏。
玩家有 answer_reveal_delay_sec 秒的时间来作答(比如配置 60 秒)。
玩家可以通过直接点击聊天框里的选项或使用 /quiz ans <答案> 来提交。

3.1.3 结算与奖励

时间一到,插件停止接收答案并开始结算。
插件会看 player_QuickAnswer_limit (抢答名额) 和 player_reward_limit (奖励名额) 这两个配置。
“抢答成功”: 最先答对的前 player_QuickAnswer_limit 名玩家,会被标记为“抢答成功”。
“获得奖励”: 插件会从“抢答成功”的玩家里,按先后顺序发奖励,最多发 player_reward_limit 份。
特殊情况: 如果抢答名额内的玩家答错了,奖励会顺延给后面答对的玩家 (哪怕他不是抢答玩家),直到发满 player_reward_limit 份奖励为止。

3.2 图形界面答题 (1.2.0+ 新增)

独立题库: 它使用一个叫 extra_questions 的独立题库,管理指令是 /quiz extra ...
独立统计: 它的排行榜、玩家数据也是独立计算的。
玩法: 玩家输入 /quiz dialog 打开菜单,就可以自己选择题库(如果你未来做了分类)或开始答题。
应用场景: 非常适合做服主定制的内容,比如英语四六级单词(就像你开发的初衷!)、服务器趣味知识问答等。

3.3 题库管理 (1.2.0+ 新增)

为了方便服主编辑大量题目,1.2.0 版增加了 CSV 导入导出功能。

数据表列表(区分大小写):QuizzerBook extraQuizBook PlayerStats PlayerExtraStats

导出: /quiz database export <表名>
例如: /quiz database export QuizzerBook (导出自动答题的题库)
例如: /quiz database export PlayerExtraStats (导出附加题库)
导出的 .csv 文件会放在 plugins/QuizzerBot/ 目录下,并与数据表名同名,如“QuizzerBook.csv”

导入: /quiz database import <表名>
导入前需要保证要导入的表格文件名和数据表名一模一样(区分大小写),并放在plugins/QuizzerBot/目录中。
危险操作警告:
导入时,插件会先清空数据库里原有的整张表,然后再把你 .csv 文件里的内容全部写进去!
这意味着任何在游戏里用指令添加的题目都会被覆盖!
操作前建议先备份 quizzerBook.db 文件!

3.4 答题流程概览

  1. 触发机制

    • 服务器启动后开始计时
    • 在配置的随机时间间隔(默认60-70秒)后检查触发条件
    • 满足最低玩家数要求后开始答题活动
  2. 题目展示

    [11:31:02 INFO]: [答题Bot] 答题时间到~
    ===========问题编号: 1================
       工作台需要几个木板合成?
       A: 2         B: 4         C: 5         D: 7
    =======================================
    [11:31:02 INFO]: 答案在10秒后揭晓,【点击选项】即可答题
  3. 作答方式

    • 点击聊天框中的选项
    • 使用命令/quiz ans <选项>
  4. 抢答机制

    • 前N名回答的玩家标记为抢答(N可在配置中设置)
    • 抢答成功后全服公告:

      [11:32:37 INFO]: [答题Bot] yanhy2000 抢答成功![1/3]
  5. 结果公布

    [11:32:41 INFO]: [答题Bot] 答案揭晓: 【B】! 
    抢答正确: 1人, 普通回答正确: 0人, 共发放奖励: 1人

4. 配置详解

4.1 配置文件说明

quiz:
  # 配置文件版本,不要动
  conf_version: 1

  # (旧版配置,1.2.0+ 已移除语言文件,默认为 zh_CN)
  # language: zh

  # 触发聊天答题的最低在线玩家数
  min_players: 1

  # 答题触发间隔时间(秒),[最小值, 最大值]
  # 在这个范围内随机一个时间点触发
  trigger_interval_sec: [60, 120]

  # 聊天答题开始后,玩家有多长时间作答(秒)
  answer_reveal_delay_sec: 60

  # 答对后给的奖励指令,%player% 会被替换成玩家名
  reward_commands:
    - 'say %player% 在答题中获胜!'
    - 'give %player% diamond 1'

  # 每人每天最多从聊天答题中获取多少次奖励
  daily_reward_limit: 5

  # 每轮聊天答题,最多发多少份奖励
  player_reward_limit: 3

  # 每轮聊天答题,前多少个回答的玩家算作“抢答”
  # (答错了也算抢答名额)
  player_QuickAnswer_limit: 3

5. 数据库结构

5.1 题目表(QuizzerBook)

字段类型说明
idINTEGER自增主键
quizTEXT题目内容(必填)
optA-optDTEXT选项内容(可空)
answerTEXT正确答案(A/B/C/D)
isEnableBOOLEAN是否启用(默认TRUE)
showCountINTEGER题目出现次数统计

5.2 玩家统计表(PlayerStats)

字段类型说明
uuidTEXT玩家唯一标识
usernameTEXT玩家名
total_attemptsINTEGER总答题次数
correct_answersINTEGER答对次数
quick_answersINTEGER抢答成功次数
daily_rewardsINTEGER当日获得奖励数
last_played_dateTEXT最后参与日期(YYYY-MM-DD)

5.3 附加题目表(QuizzerBook)

字段类型说明
idINTEGER自增主键
typeTEXT题目类型(必填)
quizTEXT题目内容(必填)
optA-optDTEXT选项内容(可空)
answerTEXT正确答案(A/B/C/D)
isEnableBOOLEAN是否启用(默认TRUE)
showCountINTEGER题目出现次数统计

5.4 玩家附加统计表(PlayerStats)

字段类型说明
uuidTEXT玩家唯一标识
usernameTEXT玩家名
total_attemptsINTEGER总答题次数
correct_answersINTEGER答对次数
last_played_dateTEXT最后参与日期(YYYY-MM-DD)

6. 命令手册

权限:标有 (管理员) 的指令需要 OP 权限。

6.1 玩家命令

命令说明
/quiz ans <答案>提交“聊天答题”的答案 (A/B/C/D)
/quiz me查看你自己的答题统计 (聊天答题)
/quiz query <玩家>查看其他玩家的统计 (聊天答题)
/quiz top [类别]查看聊天答题的排行榜 (类别: total, correct, quick, rewards)
/quiz dialog(1.2.0+) 打开“图形界面答题”菜单

6.2 管理员命令 (通用)

命令说明
/quiz reload(管理员) 重载 config.yml 配置文件
/quiz reset <玩家>(管理员) 重置指定玩家的所有答题数据 (包括聊天和图形界面)
/quiz help(管理员) 显示帮助菜单

6.3 管理员命令 (经典聊天答题)

命令说明
/quiz startnow(管理员) 立即开始一轮聊天答题
/quiz stop(管理员) 停止自动答题的调度器
/quiz enable <true/false>(管理员) 启用或禁用自动答题调度器
/quiz add <问题> <正确答案>(管理员) 添加一道聊天答题 (答案是A/B/C/D)
/quiz delete (管理员) 删除指定 ID 的聊天题目
/quiz modify <字段> <新值>(管理员) 修改聊天题目 (字段如: quiz, optA, answer...)
/quiz toggle <true/false>(管理员) 启用或禁用一道聊天题目
/quiz list [页码](管理员) 列出所有聊天答题的题目
/quiz detail (管理员) 查看聊天题目的详细信息

6.4 管理员命令 (图形界面答题)

命令说明
/quiz extra add ...(管理员) 添加题目到“图形界面”题库 (参数同上)
/quiz extra delete (管理员) 删除“图形界面”题目
/quiz extra modify ...(管理员) 修改“图形界面”题目
/quiz extra toggle ...(管理员) 启用/禁用“图形界面”题目
/quiz extra list(管理员) 列出所有“图形界面”题目
/quiz extra detail (管理员) 查看“图形界面”题目详情

6.5 管理员命令 (数据库)

命令说明
/quiz database export <表名>(管理员) 导出数据表到 CSV (表名: questions 或 extra_questions)
/quiz database import <表名>(管理员) (危险操作) 从 CSV 导入数据,覆盖原表

1.1.x 旧版本不包含 extra, database新指令。


7. 常见问题

7.1 答题未触发

  • 检查min_players设置
  • 确认题库中有启用状态的问题
  • 查看日志是否有错误信息

7.2 题目管理

  • 添加题目示例:

    /quiz add 低版本中Minecraft中钻石在第几层最多? 1-5 5-12 12-20 20+ b
  • 可使用"-"作为空选项占位符

8. 注意事项

数据备份: 插件的数据库文件 quizzerBook.db 存着你所有的题目和玩家数据,建议定期备份
问题反馈: 遇到 Bug 或有啥好建议,欢迎联系 yanhy2000@foxmail.com

本Wiki文档随插件版本更新,最新版请以实际发布为准
]]>
0 https://yanhy.top/index.php/archives/456/#comments https://yanhy.top/index.php/feed/search/开发/
海信HiSense A2Pro 刷国际版系统 刷入面具root https://yanhy.top/index.php/archives/437/ https://yanhy.top/index.php/archives/437/ Sun, 30 Mar 2025 17:12:00 +0800 yanhy2000 前段时间折腾墨水屏,最后发现还不如直接买个成品当阅读器来的快,于是在小黄鱼发现了这个玩意...

整机参数

百度百科图片

  • 系统:Vision 5
  • 安卓版本:Android 7.1.2
  • 存储配置:LPDDR3 4+64GB
  • 屏幕:5.5英寸(AMOLED 1920x1080) + 5.2英寸(墨水屏 960x540)
  • 电池:约3000mah
  • CPU:高通骁龙625
  • 特性:支持侧边指纹、NFC、红外、双频WIFI、3G/4G移动网络

工具资源

通过网盘分享的文件:海信A2Pro
链接: https://pan.baidu.com/s/1mqOTiOcziVDVPRBFGtoIiA?pwd=afuu 提取码: afuu
--来自百度网盘超级会员v5的分享

工具资源列表:

  • [原始]boot.img
  • [修补]magisk_patched-28100_psVzP.img
  • [刷机软件]QPST.2.7.438.zip
  • [国际版]LA8627E1-Hisense-A2T-A2M_GMS_L1413.6.07.04.GMS_MultiDownload_201804102357_user.zip
  • [Fastboot解锁工具]windows-x86.zip
  • [ADB原版工具]platform-tools-latest-windows.zip
  • [9008驱动]Win10_Qualcomm.rar
  • Magisk-v28.1.apk

其他工具(见文章末尾):

  • 国行卡刷包
  • 提取软件
  • [解包Bin2Img工具]sdat2img-master
  • [提取system.img工具]ext2explore-2.2.71

工具资源列表
简单介绍:

  1. 教程均在Windows系统上运行,理论支持win7\8\10\11
  2. 刷机包为全量国际版刷机包,这个版本内没有人脸解锁,但包含谷歌全家桶。
  3. [Fastboot解锁工具]windows-x86.zip 这个工具来自hisense-a9/unlockbootloader,经过测试,发现A2Pro(A2T)也可以解锁,无需联网验证、登陆账号等任何操作,只需要一条指令即可。
  4. Magisk-v28.1.apk软件来自GitHub项目Magisk
  5. [原始]boot.img[修补]magisk_patched-28100_psVzP.img 为原版国际版包中的boot和面具修补过的boot,面具版本为 Magisk-v28.1.apk,解锁后可直接刷入修改后的boot以获取root,或者自行修补boot。
  6. [刷机软件]QPST.2.7.438.zip 建议使用文章提供的版本,由于网上教程和刷机包都是很多年前的,我自己没试过新版能不能刷入,因此建议和文章的版本一样。

刷机与解锁

我自己的尝试是先刷入国际版系统,然后解锁BootLoader,最后刷入修补后的boot以实现root,因此该教程按我自己尝试路线进行。
刷机包提供的是国际版固件全量刷机包,如想刷其他国行固件,解锁等教程理论上都适用。
国际版系统我认为的几个好处:广告少,预置乱七八糟软件少,安装器很精简没有杀毒等,低耗电等。

一. 刷机

1. 环境部署

  • 安装软件 [刷机软件]QPST.2.7.438.zip
  • 解压刷机包 [国际版]LA8627E1-Hisense-A2T-A2M_GMS_L1413.6.07.04.GMS_MultiDownload_201804102357_user.zipA2T 文件夹
  • 安装驱动 [9008驱动]Win10_Qualcomm.rar
  • 解压工具 [ADB原版工具]platform-tools-latest-windows.zip[Fastboot解锁工具]windows-x86.zip

2. 连接手机

注意:如果手机A2P是二手购买且恢复过出厂设置的,务必在恢复出厂设置后插入一次正常的SIM卡以激活USB(不消耗流量,可以不开数据流量),海信A2Pro手机有USB防护,必须插入一次SIM激活才能连接电脑传数据,否则只支持充电,无法用数据传输、安装驱动、USB调试等功能。
  • 将手机USB连接到电脑(确保USB线材是可以传输数据的,而非仅充电线)
  • 选择连接方式:安装光盘 ,此时电脑出现新的盘,打开后安装驱动(可选是否重启,如后面无法识别手机可以重启)
  • 开启开发者选项,开启USB调试
  • 打开手机拨号,输入 *1973461# ,会跳出一个系统信息(界面),点击调试设置,勾选自动加载USB设备。
    工程模式截图1
    工程模式截图2

3.配置刷机

  • 重新插入手机,选择仅充电,下面确保打开USB调试开关
  • 打开解压后[ADB原版工具]platform-tools-latest-windows 文件夹,在上方地址栏输入cmd并回车
    ADB工具文件夹
  • 在cmd窗口内输入指令确保已经识别到设备 以重启手机到刷机模式(BootLoader Mode)

    adb devices

    查看ADB设备
    如果显示未信任并且手机有弹窗选择是否信任计算机,需勾选信任并确认,然后再次执行指令和上图差不多

  • 在cmd窗口内输入指令以重启手机到9008刷机模式(EDL Mode)

    adb reboot edl
  • 打开软件QFIL(一般安装QPST后会在开始菜单内出现图标,或者在开始菜单-QPST文件夹内)
    QPST文件夹
  • 选择端口,打开软件后一般会自动识别到9008端口,如果未显示可手动点击按钮 SelectPort 来选择端口。
  • 在第一栏 Select Build Type 中选择 Flat Build
  • 在第二栏 Select Programmer 点击按钮 Browse ,选择前面解压刷机包文件夹内的prog_emmc_firehose_8953_ddr_000460e1.mbn
  • 在第四栏 Download 点击按钮 LoadXML ,第一次弹窗选择刷机包文件夹内的rawprogram_000460e1.xml,第二次弹窗选择patch0.xml
  • 注意:在选择配置完成后,拔掉手机的SIM卡与TF卡,断开电脑的互联网连接(如拔掉网线、从路由器那边禁用设备外网等)
  • 点击蓝色的Download按钮,即可开始下载固件。几分钟后下载完成后显示success字样,并确保进度条走满后断开usb,手动长按电源键重启。(按理来说会自动重启,但是刷机时未能重启)

QFIL完整配置

  • 重启后进入国际版系统,可自行选择删除预置软件。

二. 解锁与Root

在开机状态下,打开开发者选项,勾选USB调试,勾选OEM解锁

如果想自己根据刷机包的boot来修补以root可以看下面这段,如果用文章内修补后的boot可跳过这段直接到刷入部分

1. 修补boot

  • 连接手机USB到电脑,选择文件传输,将 Magisk-v28.1.apk[原始]boot.img(或刷机包内的boot.img)复制到手机内,在手机文件管理内安装面具
  • 打开面具,点击Magisk一栏的安装按钮,点击下一步,方式栏点击 选择并修补一个文件 ,使用文件管理器选择boot.img文件,开始修补
  • 修补后的文件会在Downloads文件夹内,使用数据线传到电脑上

2.解锁BootLoader

  • 打开解压后[ADB原版工具]platform-tools-latest-windows 文件夹,在上方地址栏输入cmd并回车
  • 在cmd窗口内输入指令以重启手机到BL模式(BootLoader Mode)(备注:经踩坑测试,发现重启到fastboot会正常开机,只有BootLoader下可以刷机,也就是不存在fastboot)

    adb reboot bootloader
    # 刷机后仍需要插入SIM卡来激活USB,并且需要重新在弹窗勾选信任计算机
    # 等待两秒后,输入指令查看手机是否进入了BootLoader模式
    fastboot devices
    # 如果列表中有设备则为正常

    Fastboot设备列表

  • 打开解压后的文件夹[Fastboot解锁工具]windows-x86 ,进入文件夹\windows-x86\bin,在上方地址栏输入cmd并回车打开
  • 在新的cmd窗口输入指令以解锁手机

    fastboot Hisense unlock
  • 出现OKEY字样即为解锁成功,可关闭该cmd窗口。

3.刷入修补后的Boot

回到之前的CMD窗口,输入指令来刷入修补后的boot镜像

fastboot flash boot <敲空格后将boot镜像文件直接拖入>

刷入Boot镜像

如显示OKEY且没有错误信息,则刷入成功,输入指令重启

fastboot reboot

4.开机验证

开机后,打开Magisk软件,即可看到安装成功的版本信息

面具软件内信息

可正常授权root权限
面具授权MT管理器
MT管理员可正常调用SU权限
DevCheck检测出Root

关于该手机其他资料补充

连接USB到电脑没反应

海信的手机(不确定是不是都这样)在恢复出厂设置后需要 插入一次正常的SIM卡以激活USB (不消耗流量,可以不开数据流量),海信A2Pro手机有USB防护,必须插入一次SIM激活才能连接电脑传数据,否则只支持充电,无法用数据传输、安装驱动、USB调试等功能。

不小心卸载一些软件如何找回

在内置的应用商店-应用恢复可以安装找回
如果为了精简系统禁用了应用商店或者单纯不想使用,可以在拨号盘输入 *#*#20019994#*#* 打开预置应用找回设置

刷了国际版没有天气小工具

刷机后发现墨水屏的天气一栏和主屏幕的时间与天气小组件,无法获取天气,说是要安装,但是安装总会失败,是因为国际版固件没有天气APP,只有Google提供的新闻与天气。在本文提供的资料文件里面已经从国行版固件提取出天气APP了,Chinaweather.apk,直接安装后即可使用,小组件也可以正常获取天气。

提取方法

国行更新包目前只有卡刷OTA包,我找到一个相对全的Full包 A2T_L1467.6.07.01.00_full.zip,里面有Boot.img与更新的system.new.dat(或许也可以通过这个包9008刷入后,通过修补boot来实现国行固件root)。因此需要两个工具,[解包Bin2Img工具]sdat2img-master.zip该工具可以将更新文件合并到system.img,使用方法:

python sdat2img.py system.transfer.list system.new.dat system.img

转换为system.img后,使用工具[提取system.img工具]ext2explore-2.2.71,加载该文件,即可看到内部全部文件。右键文件点击save,可将文件提取到外面。

其他有用的记录

*#*#4636#*#* ——服务菜单
*1973460# - FTMode
*1973461#或*#*#3647#*#* - 系统信息
*1973462# -操作员测试
*#0000# ——系统信息
*#06# -IMEI

参考资料

本文参考资料:

]]>
0 https://yanhy.top/index.php/archives/437/#comments https://yanhy.top/index.php/feed/search/开发/
随身wifi折腾入门(3)-- 简单控制GPIO https://yanhy.top/index.php/archives/334/ https://yanhy.top/index.php/archives/334/ Tue, 11 Apr 2023 17:12:00 +0800 yanhy2000

本章节待慢慢补充...

linux下的GPIO一般可以在/sys/kernel/debug/gpio下查询到信息,但是由于棒子的PCB没有开源,无法得知目前那些GPIO可以使用。但是通过表面可知,至少有3颗LED、2路SIM卡控制端口可用,且板载Uart串口调试点,因此,如果能对其中几个IO进行操作,通过IIC协议,即可可以控制多路外设,成为真正的硬件开发板...

控制LED行为

从最简单的开始,控制一颗LED的亮灭。刷了Debian系统后,板子上只有红色、蓝色灯为启用状态,而绿色灯为None状态。因此,我们可以先拿没用的绿色LED下手。

了解LED控制方法

查询目前棒子上已知的GPIO引用:ls /sys/class/leds/

查询后可得:

蓝色LED默认分配为WIFI状态

绿色LED默认分配为网络状态
红色LED默认为系统运行指示灯
SIM:EN为SIM卡启用状态,该焊盘位于ESIM底座GND处,预测SIM1同理
SIM:SEL为SIM选择状态,物理位置目前未测量

进入green的目录内,可看到以下几个文件:

主要文件为brightness、max_brightness、trigger,这三个文件即为LED引脚的属性

brightness:可读可写; 所以这个属性文件是用于设置 LED的亮度等级或者获取当前 LED 的亮度等级。
max_brightness: 该属性文件只能被读取,不能写,用于获取 LED 设备的最大亮度等级。
trigger: 触发模式,该属性文件可读可写,通过 cat 命令查看该属性文件触发模式

其中,trigger 内有以下的模式:

这里中括号选中为none,即为禁用。常见模式有:

timer:使用系统定时器控制,可用于作为伪PWM控制,定时闪烁等功能

heartbeat:心跳模式,可用于作为监控系统运行状态,定时有规律的闪烁

default-on:默认开启模式,此模式会使LED常亮,可用于寻找板载物理位置使用

mmc:读写存储器(emmc)的时候会闪烁

phy0tx(rx):接收(发送)wifi数据时会闪烁

尝试控制LED行为模式

使用echo的方式写入该文件即可控制LED的状态,如这里使它运行为心跳包闪烁模式:

echo heartbeat > /sys/class/leds/green\:internet/trigger

同理,如果写入 none 则为禁用led灯,指令如下:

echo none > /sys/class/leds/green\:internet/trigger

也可以设置led为wifi状态指示灯:

echo phy0radio > /sys/class/leds/green\:internet/trigger

仅需执行指令,即可控制led状态,重启后恢复原始模式,可写入rc.local让其每次开机都设置为该模式。

制作温控PWM风扇

可以将其设置为 timer 定时器模式,通过手动调整延时开与延时关的方式模拟PWM占空比:

echo timer >  /sys/class/leds/green\:internet/trigger
echo 90 > /sys/class/leds/green\:internet/delay_off
echo 10 > /sys/class/leds/green\:internet/delay_on

同理,可以使用绿色LED的IO用来控制风扇,实现温控风扇。以下代码为即兴发挥,可自行测试,将风扇连接至绿色LED引脚上,或者更改 GPIO_PIN 值为其他IO引脚;可以自行更改 pwm_v 的值,以1000为满值,分4个档位。代码仅供测试,如果有问题可评论区留言。

#python 3
import time
import os
pwm_v = [300,500,700,900] #档位速度设置,满值为1000
GPIO_PIN = "green\:internet"  #IO引脚设置
print("开始初始化GPIO...")
os.system(f"echo timer > /sys/class/leds/{GPIO_PIN}/trigger")
while True:
    time.sleep(1)
    try:
        temp_file=open("/sys/class/thermal/thermal_zone0/temp",'r')
        temp = int(int(temp_file.read())/1000)
        temp_file.close()
        print(f"当前温度为:{temp}")
    except OSError as e:
        print(f"打开文件出错:{str(e)}")
    if temp <25:
        print(f"温度在(0,25)区间内,关闭风扇,PWM占空比0%")
        os.system(f"echo 0 > /sys/class/leds/green\:internet/delay_on")
        os.system(f"echo 1000 > /sys/class/leds/green\:internet/delay_off")
    if temp >= 25 and temp <35:
        print(f"温度在[25,35)区间内,开启第一档,高电平时间{pwm_v[0]},低电平时间{1000-pwm_v[0]},PWM占空比{pwm_v[0]/1000*100}%")
        os.system(f"echo {pwm_v[0]} > /sys/class/leds/green\:internet/delay_on")
        os.system(f"echo {1000-pwm_v[0]} > /sys/class/leds/green\:internet/delay_off")
    if temp >= 35 and temp <45:
        print(f"温度在[35,45)区间内,开启第二档,高电平时间{pwm_v[1]},低电平时间{1000-pwm_v[1]},PWM占空比{pwm_v[1]/1000*100}%")
        os.system(f"echo {pwm_v[1]} > /sys/class/leds/green\:internet/delay_on")
        os.system(f"echo {1000-pwm_v[1]} > /sys/class/leds/green\:internet/delay_off")
    if temp >= 45 and temp <55:
        print(f"温度在[45,55)区间内,开启第三档,高电平时间{pwm_v[2]},低电平时间{1000-pwm_v[2]},PWM占空比{pwm_v[2]/1000*100}%")
        os.system(f"echo {pwm_v[2]} > /sys/class/leds/green\:internet/delay_on")
        os.system(f"echo {1000-pwm_v[2]} > /sys/class/leds/green\:internet/delay_off")
    if temp >= 55 and temp <65:
        print(f"温度在[55,65)区间内,开启第四档,高电平时间{pwm_v[3]},低电平时间{1000-pwm_v[3]},PWM占空比{pwm_v[3]/1000*100}%")
        os.system(f"echo {pwm_v[3]} > /sys/class/leds/green\:internet/delay_on")
        os.system(f"echo {1000-pwm_v[3]} > /sys/class/leds/green\:internet/delay_off")
    if temp >= 65:
        print(f"温度大于65摄氏度,开启最大功率,PWM占空比100%")
        os.system(f"echo 1000 > /sys/class/leds/green\:internet/delay_on")
        os.system(f"echo 0 > /sys/class/leds/green\:internet/delay_off")

除了简单的控制LED的行为以及模拟PWM,这几个引出的IO或许还可以更改输出输入模式,待本文后续更新继续探索...

参考文章

https://github.com/Yushi-Xing/openstick_fan/blob/main/main.cpp
https://gitee.com/anhui1995/ufi_auto-fan/blob/master/autofan.c
https://blog.csdn.net/qq_26226907/article/details/128027533
https://www.kancloud.cn/handsomehacker/openstick/2637560

]]>
0 https://yanhy.top/index.php/archives/334/#comments https://yanhy.top/index.php/feed/search/开发/
ESP32-Micropython-蓝牙串口 https://yanhy.top/index.php/archives/279/ https://yanhy.top/index.php/archives/279/ Thu, 17 Nov 2022 03:10:00 +0800 yanhy2000

还是准备玩esp32加小屏幕了,记录一下开发心得,虽然都做到一半多了,但是为了防止忘记或者是因为习惯性记录,还是准备将新学的给记下来,之前WIFI配网都做好了,那就从蓝牙开始吧...
原文参考链接:https://www.bilibili.com/read/cv15007387

环境配置

硬件:ESP32
编程语言:Micropython
编译器:Thonny

Micropython蓝牙

目标:让esp32模块发出蓝牙信号,手机连接并通过软件发送串口数据,模块接收数据并实现点灯效果

基础测试代码:

from machine import Pin
from time import sleep_ms
import ubluetooth   #导入BLE功能模块

ble = ubluetooth.BLE()  #创建BLE设备
ble.active(True)  #打开BLE

#设置BLE广播数据并开始广播
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')

运行后,可以在手机上搜索到一个蓝牙设备名为“AB"

如要修改蓝牙名称,可这样修改:

name = bytes("aabbcc", 'UTF-8')
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x02\x0A\x08' + bytearray((len(name)+1,0x09))+name)

一个中文占用3字节储存,而广播数据最多只有31字节,除去硬件配置外,命名也要限制一定字数

广播数据格式可参考:https://www.bilibili.com/read/cv15007387

注:由于esp32模块功率很小,发射的蓝牙信号较小,手机经常连接不上,可通过在广播数据格式内修改发射功率调整,对应的数据为x02x0Ax08 ,完整代码为:

name = bytes("aabbcc", 'UTF-8')
print("蓝牙开始广播")
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x02\x0A\x08' + bytearray((len(name)+1,0x09))+name)


蓝牙可连接后,需要让其处理各种事件,如蓝牙断开、连接以及收发等,可参考以下代码
详情:https://www.bilibili.com/read/cv15039837

from machine import Pin
from time import sleep_ms
import ubluetooth   #导入BLE功能模块

ble = ubluetooth.BLE()  #创建BLE设备
ble.active(True)  #打开BLE(此时设备将处于就绪态)

#设置BLE广播数据并开始广播(开始广播后设备将处于广播态)
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')


#定义一个函数,用作蓝牙事件中断
def ble_irq(event, data): # 蓝牙中断函数
    if event == 1: #蓝牙已连接(此时蓝牙将处于连接态)
      print("BLE 连接成功")

    elif event == 2: #蓝牙断开连接(此时蓝牙将从链接态进入就绪态)
      print("BLE 断开连接")
      ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')#再次启动广播

    elif event == 3: # 收到新write消息
      print("BLE 收到新消息")

ble.irq(ble_irq) #注册蓝牙中断函数


有了中断函数后,可以更方便监听到蓝牙状态。接下来就是准备连接手机并交互了

蓝牙服务与特性创建,详情:https://www.bilibili.com/read/cv15049793

通过注册蓝牙服务,可以使用安卓APP nRF Connect或者微信小程序 谷雨蓝牙调试 进行数据传输,其中服务id为9011特性一9012为可读可写,9013为可读与通知,从esp32到手机上的消息就是通过9013 Notify这个权限获取信息的。

完整代码:

from machine import Pin
from time import sleep_ms,sleep
import ubluetooth   #导入BLE功能模块
sleep(1)
ble = ubluetooth.BLE()  #创建BLE设备
ble.active(True)  #打开BLE(此时设备将处于就绪态)


#创建要使用的UUID
SERVER_1_UUID = ubluetooth.UUID(0x9011)
CHAR_A_UUID = ubluetooth.UUID(0x9012)
CHAR_B_UUID = ubluetooth.UUID(0x9013)

#创建特性并设置特性的读写权限
CHAR_A = (CHAR_A_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_WRITE | ubluetooth.FLAG_NOTIFY, )
CHAR_B = (CHAR_B_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_NOTIFY, )

SERVER_1 = (SERVER_1_UUID, (CHAR_A , CHAR_B, ) , ) #把特性A和特性B放入服务1
SERVICES = (SERVER_1, ) #把服务1放入服务集和中
((char_a, char_b), ) = ble.gatts_register_services(SERVICES) #注册服务到gatts


#设置BLE广播数据并开始广播(开始广播后设备将处于广播态)
name = bytes("aabbcc", 'UTF-8')
print("蓝牙开始广播")
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x02\x0A\x08' + bytearray((len(name)+1,0x09))+name)

#定义一个函数,用作蓝牙事件中断
def ble_irq(event, data): # 蓝牙中断函数
    if event == 1: #蓝牙已连接(此时蓝牙将处于连接态)
      print("BLE 连接成功")
    
    elif event == 2: #蓝牙断开连接(此时蓝牙将从链接态进入就绪态)
      print("BLE 断开连接")
      ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x02\x0A\x08' + bytearray((len(name)+1,0x09))+name)#再次启动广播

    elif event == 3: # 收到新write消息
      onn_handle, char_handle = data #判断是来自那个特性的消息
      buffer = ble.gatts_read(char_handle) #读取接收到的消息
      print(char_handle, buffer) #打印消息内容
      ble.gatts_notify(0, char_handle, 'Hello') #回复Hello

ble.irq(ble_irq) #注册蓝牙中断函数

这段代码运行后,通过蓝牙调试软件连接模块后,监听9012特性,可对其发送数据,同时在thonny终端内也可以看到发送的数据,并且每发送一条数据,都会收到来自模块的Notify通道的”Hello"回复。

上述为读写数据创建特定的uuid,下面是较为常用的两种实际应用:
注册电池服务

#创建电池服务和特性的UUID
BATTERY_SERVER_UUID = ubluetooth.UUID(0x180F)
BATTERY_CHAR_UUID = ubluetooth.UUID(0x2A19)

#创建特性并设置特性的读写权限
BATTERY_CHAR = (BATTERY_CHAR_UUID, ubluetooth.FLAG_READ , )

BATTERY_SERVER = (BATTERY_SERVER_UUID, (BATTERY_CHAR, ) , ) #把电量特性放入电池服务
SERVICES = (BATTERY_SERVER, ) #把电池服务服务放入服务集和中

((battery_char,), ) = ble.gatts_register_services(SERVICES) #注册服务到gatts

ble.gatts_write(battery_char, b'\x50') #设置电池电量为80%

注册温湿度服务

#创建环境传感器服务和特性的UUID
ENV_SERVER_UUID = ubluetooth.UUID(0x181A) #环境传感器服务
TEM_CHAR_UUID = ubluetooth.UUID(0x2A6E)   #温度特性
HUM_CHAR_UUID = ubluetooth.UUID(0x2A6F)   #湿度特性

#创建特性并设置特性的读写权限
TEM_CHAR = (TEM_CHAR_UUID, ubluetooth.FLAG_READ , )
HUM_CHAR = (HUM_CHAR_UUID, ubluetooth.FLAG_READ , )

ENV_SERVER = (ENV_SERVER_UUID, (TEM_CHAR, HUM_CHAR, ) , ) #把温湿度特性放入环境服务
SERVICES = (ENV_SERVER, ) #把环境服务放入服务集和中

((tem_char, hum_char, ), ) = ble.gatts_register_services(SERVICES) #注册服务到gatts

ble.gatts_write(tem_char, b'\x06\x08') #设置温度为20.54度(0x0806 = 2054)
ble.gatts_write(hum_char, b'\x09\x07') #设置湿度为18.01%(0x0709 = 1801)

对于一些常用的功能,蓝牙组织联盟已经为其定义好了UUID,我们在开发产品的时候直接使用即可。
16BitUUID定义文档下载地址:https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf

最后把上面代码结合一起,就可以愉快用蓝牙点灯了!

使用方法:执行代码后,使用谷雨蓝牙连接,并监听9012服务中的read,发送任意数据,收到回复“hello”,发送“led_on”,led打开,收到回复“led on!”;发送“led_off”,led关闭,收到回复“led off!”

from machine import Pin
from time import sleep_ms,sleep
import ubluetooth   #导入BLE功能模块
sleep(1)
ble = ubluetooth.BLE()  #创建BLE设备
ble.active(True)  #打开BLE(此时设备将处于就绪态)
led = Pin(2, Pin.OUT) #led引脚

#创建可读可写可通知的UUID
SERVER_1_UUID = ubluetooth.UUID(0x9011)
CHAR_A_UUID = ubluetooth.UUID(0x9012)
CHAR_B_UUID = ubluetooth.UUID(0x9013)

#创建特性并设置特性的读写权限
CHAR_A = (CHAR_A_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_WRITE | ubluetooth.FLAG_NOTIFY, )
CHAR_B = (CHAR_B_UUID, ubluetooth.FLAG_READ | ubluetooth.FLAG_NOTIFY, )

SERVER_1 = (SERVER_1_UUID, (CHAR_A , CHAR_B, ) , ) #把特性A和特性B放入服务1
SERVICES = (SERVER_1, ) #把服务1放入服务集和中
((char_a, char_b), ) = ble.gatts_register_services(SERVICES) #注册服务到gatts


#设置BLE广播数据并开始广播(开始广播后设备将处于广播态)
name = bytes("aabbcc", 'UTF-8')
print("蓝牙开始广播")
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x02\x0A\x10' + bytearray((len(name)+1,0x09))+name)

#定义一个函数,用作蓝牙事件中断
def ble_irq(event, data): # 蓝牙中断函数
    if event == 1: #蓝牙已连接(此时蓝牙将处于连接态)
      print("BLE 连接成功")
    
    elif event == 2: #蓝牙断开连接(此时蓝牙将从链接态进入就绪态)
      print("BLE 断开连接")
      ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x02\x0A\x08' + bytearray((len(name)+1,0x09))+name)#再次启动广播

    elif event == 3: # 收到新write消息
      onn_handle, char_handle = data #判断是来自那个特性的消息
      buffer = ble.gatts_read(char_handle) #读取接收到的消息
      print(char_handle, buffer,str(buffer, 'UTF-8')) #打印消息内容
      if str(buffer, 'UTF-8')=="led_on":
          led.on()
          ble.gatts_notify(0, char_handle, 'led on!')
      elif str(buffer, 'UTF-8')=="led_off":
          led.off()
          ble.gatts_notify(0, char_handle, 'led off!')
      else:
          ble.gatts_notify(0, char_handle, 'Hello')#回复Hello

ble.irq(ble_irq) #注册蓝牙中断函数
]]>
0 https://yanhy.top/index.php/archives/279/#comments https://yanhy.top/index.php/feed/search/开发/
[Linux系统] Fedora体验 https://yanhy.top/index.php/archives/133/ https://yanhy.top/index.php/archives/133/ Wed, 17 Nov 2021 07:43:00 +0800 yanhy2000

经常为了在linux跑编译去安装虚拟机或者wsl,但其都有共同特征,即虚拟环境...为了更稳定的生产力以及学习linux,我找到了Fedora...2021-11-16 23-58-56屏幕截图.png

前言

为搭建个正常的linux环境,我之前曾尝试了debian系的ubuntu、deepin、raspbian(PC版)、kali等,但因为都是同一系列的,总感觉操作有些乏味,于是找上了红帽系的系统,而Fedora正是红帽系广受欢迎的社区发行版系统,因此准备将其安装为第二系统。
这个系统使用体验不错,之前在搞服务器的时候用过centos,曾了解过yum软件包管理器等,但红帽系的系统操作还需学习,正好是个机会,写在博客上记录自己从安装双系统到优化fedora的日常使用。
安装完成后的截图:
2021-11-17 00-03-32 的屏幕截图.png


安装

因为日常开发还是windows系统,因此我选择从win来安装双系统。

下载镜像

官网链接:https://getfedora.org/

因为考虑到可能日用,基本功能要有,所以这边选择工作站workstation版本下载。

2021-11-16 23-57-56屏幕截图.png

在下载镜像的同时,打开分区软件(如diskgunius),为Fedora系统腾出一些空间(推荐60-80GB),将腾出的空间融为一块,且不创建新分区(后续Fedroa安装时会自动分配)(此文在fedroa系统下所写,因此无法提供截图)

安装镜像

下面操作步骤为回忆内容,至于为啥这么熟练,因为第一次分区分小了,重装了N次...

下载完毕后我选择使用u盘来安装(手头刚好有闲置u盘,其他的方法暂时不考虑),使用ultraiso将镜像写入到u盘,随后插入u盘,重启电脑,并按住F12不放(华为荣耀笔记本是F12选择启动设备,其他电脑自行查询),选择USB启动即可。

进入grub选择页后,直接选择默认的第一条进入即可,会进入到体验版系统,并会弹出系统安装引导软件。

选择中文、时区后,第三个选择硬盘需慎重。一般电脑内仅一块硬盘,选择默认硬盘后下方勾选自定义,再点左上角完成,会进入自定义分区页面

进入自定义分区页面后,确保下面显示空余空间为几十个GB而不是只有MB大小,如果是MB,可能分区的时候自动创建分区了,在下面列表找到目标分区后点下面的“-”号即可删除分区,小心不要把其他有重要数据的分区或者win系统分区删除了;如果是正常的几十GB,直接选择上面自动分区即可,无需多余操作,最后返回到主页面就可以开始安装系统了。

启动系统

安装完成后,点击重启后拔出u盘,再次开机会自动引导到linux的grub启动,正常情况下grub启动项前两个分别是正常启动入口和恢复安全紧急模式入口,第三个引导项则是win的启动入口。(在fedora下,引导项无需且严重不推荐手动修改,系统会通过脚本自动找到可启动的linux内核,如果有安装多个版本,可以在系统内卸载旧内核版本,而不应该直接修改grub)

系统默认的grub可以说是非常简陋的了,因此在后面优化操作体验的时候会提到修改启动页面主题部门...


使用

按照我个人的linux使用习惯,一般情况下没有国内优化的系统开箱第一件事就是换源了,不知道是不是错觉,没有换源总感觉装依赖都特别慢...

换源更新

红帽系系统感觉换源还挺复杂的(之前给centos换源也是头疼了半天),这边就总结一下快捷指令吧,如果有特殊需要请做好备份

sudo sed -e 's|^metalink=|#metalink=|g' \
         -e 's|^#baseurl=http://download.example/pub/fedora/linux|baseurl=https://mirrors.ustc.edu.cn/fedora|g' \
         -i.bak \
         /etc/yum.repos.d/fedora.repo \
         /etc/yum.repos.d/fedora-modular.repo \
         /etc/yum.repos.d/fedora-updates.repo \
         /etc/yum.repos.d/fedora-updates-modular.repo

中科大源帮助文档:https://mirrors.ustc.edu.cn/help/fedora.html

换源后输入sudo dnf makecache即可产生软件包缓存,随后即可yum update(yum、dnf都是软件包管理器)
换源后速度明显提升不少(截图来自fedora系统内置截图软件)(圆角好评
换源后终端.png

在这波更新后,浏览器、文件管理区、应用商店等众多软件都需要重新打开以生效新版本(至少我这个系统版本是这样,而且印象里内核还有个更新

2021-11-17 00-54-03屏幕截图.png

应用商店打开速度也快了起来,软件包也能加载出来

2021-11-17 00-55-38屏幕截图.png

清理缓存、旧内核

一般在大型更新后,我是习惯输入sudo yum clean all来清理更新产生的缓存(原因是因为之前翻目录发现缓存cache目录占用特别大,查了一下发现很多软件包缓存),效果如图:

2021-11-17 01-00-22屏幕截图.png

在较大更新或者应用商店明示你要更新内核时,更新完经常会留下旧内核,这时候就需要手动清理了(也可以不理会,就是开机引导时会有脚本把全部内核启动项给仍到grub,会显得不好看)

查看当前内核版本 uname -r
我这里提示版本为“5.14.10-300.fc35.x86_64”

查看系统内安装的内核相关包 rpm -qa | grep kernel
2021-11-17 01-07-42屏幕截图.png

明显可以看出同一个包(如kernel-core)有两个不同的版本,再根据上面查到的当前内核版本,可以确定要卸载的包:

kernel-headers-5.14.9-300.fc35.x86_64
kernel-core-5.14.10-300.fc35.x86_64(旧版本需卸载)
kernel-modules-5.14.10-300.fc35.x86_64(旧版本需卸载)
kernel-5.14.10-300.fc35.x86_64(旧版本需卸载)
libreport-plugin-kerneloops-2.15.2-6.fc35.x86_64
abrt-addon-kerneloops-2.14.6-9.fc35.x86_64
kernel-modules-extra-5.14.10-300.fc35.x86_64(旧版本需卸载)
kernel-core-5.14.17-301.fc35.x86_64
kernel-modules-5.14.17-301.fc35.x86_64
kernel-5.14.17-301.fc35.x86_64
kernel-modules-extra-5.14.17-301.fc35.x86_64

接下来,输入 sudo yum remove kernel-5.14.10-300.fc35.x86_64等手动移除这四个旧版本即可(-core可能无法移除,可重启后尝试)

最后输入reboot重启即可


结束

至此,fedora已经安装完毕,且软件包等更新完成,可正常使用。想要了解更多玩法,欢迎继续关注本博客!

]]>
0 https://yanhy.top/index.php/archives/133/#comments https://yanhy.top/index.php/feed/search/开发/
用云服务器搭建自己的Frp服务 https://yanhy.top/index.php/archives/21/ https://yanhy.top/index.php/archives/21/ Sat, 03 Apr 2021 23:43:00 +0800 yanhy2000

Frp(Fast Reverse Proxy)是一个用于内网穿透反向代理应用,支持TCP、UDP等多种协议,可以将内网服务通过具有公网IP节点的服务器连接到公网,实际应用于本地服务器、树莓派建站等项目
77548-p3tu90g232.png

前言

前几期我们对树莓派进行了简单配置,但是仍没有将其投入到实际应用中。树莓派4b版性能强大,且运行功率较小,已经可以将其当成一个小型服务器使用了。因此本期内容就是为树莓派搭建个私人的Frp内网穿透服务器,以便于在树莓派上完成建站等项目。本次我们采用了64位系统的raspbian,在社区测试中,64位系统虽然功能尚未完善,但是其性能已经超出了官方原版32位系统很多,正合适用来配置小型服务器。


服务器选购

搭建Frp服务器时,一般使用各个大厂的学生机即可,推荐购买轻量应用服务器,1核2GB内存5M带宽的性能足够网站应用使用了,一般各个大厂的学生机每个月都是9块左右。虽然每个月限制1000GB流量,但是一般小型服务器除了音视频推流之外一般也用不完的。

阿里云学生机:https://developer.aliyun.com/plan/grow-up
腾讯云学生机:https://cloud.tencent.com/act/campus?from=12631
华为云学生机:https://developer.huaweicloud.com/campus?productType=KC1_1&timeType=1&domainItemData=
百度云学生机:https://cloud.baidu.com/campaign/campus-2018/index.html?unifrom=eventpage

注:阿里云的学生机取消入口,只能通过各种活动或者类似于开发者成长计划获取“学生机”;
华为云学生机为鲲鹏云,使用arm架构CPU,开发环境不同,请斟酌选择;
百度云学生机带宽较低,看个人选择;
其他厂商可能也有类似活动,本章暂未列出
购买服务器后安装系统等操作可以直接参考服务商文档,本章不再列出


安装&配置Frp

Frp的官方github开源页,里面可以下载到最新版本:https://github.com/fatedier/frp

Linux服务器配置Frp

1、通过ssh连接到服务器
2、先点击上面的链接前往github页面,找到右侧的Release,点击最新的版本,会看到很多个Frp版本
28538-depjpszrxdl.png

3、确认自己的服务器架构后(一般都是64位x86架构),在合适的版本上右击复制下载链接,一般情况下选择frp_xx.xx.xx_linux_amd64.tar.gz即可

4、在ssh输入 wget 复制的链接并回车即可开始下载,如:
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz

5、下载完后解压tar -zxvf frp_0.36.2_linux_amd64.tar.gz(后面为下载的文件名,如不同请自行替换)

6、简化文件夹名称mv frp_0.36.2_linux_amd64 frp重命名为frp文件夹,并进入文件夹cd frp

7、编辑Frp服务端的配置文件nano frps.ini(frps为服务端,frpc为客户端),如无特殊需要保持默认配置即可,修改完点击键盘上Ctrl+o保存,再点Ctrl+x退出
47178-ulfoi0kbko.png

8、现在服务端的搭建临近尾声,输入sudo ./frps -c ./frps.ini即可运行,按下Ctrl+c停止运行
88992-d7wiuayzico.png

9、在服务器上使用守护进程systemctl:
在/lib/systemd/system文件夹下创建frps.service
29393-mf48abmi0z.png
Sudo vim frps.service
输入如下内容并保存退出

[Unit]
Description=frp service
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=#frp完整路径#/frps -c #frp完整路径#/frps.ini
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

示例:76097-39y69ni9vf6.png

10、启动Frp服务:systemctl start frps,输入systemctl即可查看进程frps正在运行;
设置frps开机启动:systemctl enable frps
31816-vuapf5e7ba.png


windows系统配置frps

在win可视化界面,操作会变得非常简便

1、在服务器内打开浏览器前往https://github.com/fatedier/frp下载最新版本,选择amd64版本下载
42893-ng6obzr12t.png

2、解压后双击打开frps.ini配置文件,修改端口并保存
61714-b0duifi2jzj.png

3、在文件夹地址栏输入cmd并回车,输入frps -c frps.ini即可运行frp服务器
76643-pt9lxjcktrg.png

4、要想设置frps服务器开机启动,只需要在地址栏输入C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp并进入,新建frps.bat并右键进入修改

5、修改bat文件,将以下内容复制进去:路径\frps.exe -c 路径\frps.ini即可实现开机启动,如:
96799-7dgbsd8wdsb.png

服务器端口配置

在配置完frps后,仍需要去服务端网页后台的安全组处开放相应端口,如默认端口为7000,安全组需要添加tcp协议的7000端口;同时还需要再添加一个tcp协议的端口,作为映射出来的端口
62685-hccu3kmwnpu.png


Frp客户端配置

Linux系统客户端(树莓派为例)

按照前面服务端的方法下载frp到树莓派上并解压,这次将会用到压缩包内的frpc...
由于树莓派是arm架构,且本文使用的是树莓派的64位架构系统,因此在github我们下载frp_x.x.x_linux_arm64.tar.gz,下载、解压方法同服务端

84099-gvo7ftrhe8e.png

1、先进入frp文件夹内cd frp
2、配置frpc.ini的相关信息nano frpc.ini

[common]
server_addr = 服务器的公网地址,比如1.1.1.1
server_port = 服务器frp的端口

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22 #22端口在linux里是ssh连接用的,设置为22端口可以通过frp进行远程ssh连接树莓派
remote_port = 6000 #要映射的端口,比如在ssh软件内输入连接 1.1.1.1:6000 即可连接到ssh的22端口

3、保存并退出,输入./frpc -c ./frpc.ini即可连接到frp服务器

服务端:84453-3xpdpv7ha3a.png

客户端:20223-c5ur739npxa.png

如果连接超时,请检查:
服务器网页端控制台有没有放行端口、是否服务器有防火墙或者宝塔等面板二次阻拦、配置文件是否一致、服务器时间是否正确

win系统客户端

下载同上,然后解压后修改frpc.ini配置文件并保存

文件夹地址栏输入cmd回车,打开cmd后输入frpc.exe -c frpc.ini即可


Frp实际应用

Frp到此已经搭建完成了,之后我们就可以挂上frp做一些小项目了...

1、安装宝塔面板建站(64位系统):wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
2、NAS个人网盘:https://shumeipai.nxez.com/2018/11/01/a-raspberry-pi-nas-that-really-look-like-a-nas.html
3、MC游戏服务器(性能较低,联机用,仅java版):https://shumeipai.nxez.com/2013/11/21/how-to-run-low-cost-minecraft-on-a-raspberry-pi-for-block-building-on-the-cheap.html
4、安装远程桌面云办公:https://shumeipai.nxez.com/2013/10/06/windows-remote-desktop-connection-raspberry-pi.html
5、... ...


本篇文章到此结束,需要更多内容请持续关注本博客!

]]>
0 https://yanhy.top/index.php/archives/21/#comments https://yanhy.top/index.php/feed/search/开发/