news 2026/10/20 2:07:55

STM32+华为云IoT+Qt实战:从零打通智能家居数据链路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32+华为云IoT+Qt实战:从零打通智能家居数据链路

做智能家居最麻烦的不是单片机那点外设,也不是界面怎么画得漂亮,而是怎么把“设备端、云端、应用端”这三层真正打通。一套STM32+华为云IoT+Qt的跨平台智能家居控制系统,恰好能把这条链路完整走一遍:STM32负责采集温湿度、控制继电器,华为云IoT负责设备接入和消息转发,Qt负责在Windows、Linux乃至手机屏幕上展示状态、下发指令。这篇文章面向正在做课设,或者想从单片机方向往物联网全栈靠的开发者,不预设你懂MQTT,也不预设你做过云平台配置,我会从整体设计一直拆到代码和排错,尽量让你照着就能把数据流跑通。

1. 项目全貌:这套智能家居控制系统到底在做什么

1.1 一句话看懂三个角色的分工

如果用一句话描述这套系统:用户在家里打开一个Qt写的桌面软件,看到当前室温26.5度、湿度55%,点击“开灯”按钮,客厅灯就亮了,这个动作跨越了传感器、单片机、WiFi模块、云平台、桌面软件整整五层。

把三个角色做一个生活化类比:

  • STM32是家里的“手脚和感官”。温湿度传感器像皮肤,红外遮挡开关像眼睛,继电器模块是那只“手”。它负责读懂传感器状态,也负责执行“开”“关”这类动作。
  • 华为云IoT是“邮局加物业中心”。它给每台设备一个唯一的门牌号,设备上线就挂个“在线”标识,收到的数据统一归档,同时把应用侧下发的指令准确投递给指定设备。
  • Qt是“遥控面板”。它不需要知道继电器具体接在哪个引脚,也不需要关心设备是通过WiFi还是网线上网,它只关心一个问题:从云平台拿到状态数据,然后把用户意图变成下发指令。

整个闭环大概是这样的:传感器采集数据 → STM32整理成JSON → ESP8266模组联网上报 → 云平台保存并转发 → Qt查询到温度湿度 → 用户在界面点击开关 → 云平台下发命令 → ESP8266收到消息转发给STM32 → STM32翻转继电器引脚。

很多新手拿到课设题目后容易陷入“我先写单片机程序还是先画界面”的选择困难,其实正确的是先不碰代码,把上面这条数据链路分清楚,后面每一端该做什么就会变得很具体。

1.2 为什么这个组合适合入门又与生产接轨

第一个原因是STM32生态太成熟了。不管是F103还是F407,网上资料、库函数、例程都非常多,你遇到十个报错,基本九个能在社区里找到答案。而且它做端侧控制非常顺手,GPIO、串口、定时器这些都是嵌入式入门的标配技能,学一遍以后做其他项目也能复用。

第二个原因是用云平台而不是自建服务器。如果你自己搭,就要处理MQTT broker部署、公网IP、TLS证书、数据库、消息持久化这些事,那不是智能家居项目,那是运维项目。用IoTDA这种设备接入服务,平台已经帮我们解决了“设备怎么接入、消息怎么路由、数据怎么存”的问题,而且有免费额度让个人项目跑起来。对学习来说,最难得的是不用花一分钱就能接触到商业级的设备和消息管理模型。

第三个原因是Qt的跨平台能力。同一个界面代码,桌面端跑Windows、Linux没问题,稍作配置还能跑Android平板。学校课设通常要求“系统能跨平台运行”,Qt在这方面的优势非常明显,不像某些GUI方案换台机器就要重新调样式。

更实际的一点是,这套架构并不是教学玩具。边缘设备采集、物联网平台接入、应用侧通过OpenAPI做控制,这个模式在商业项目里非常常见。你把这个小项目完整做完,再去接触其他云平台或者其他GUI框架,会发现概念都是相通的。

提示:不要一上来就想自己搭EMQX服务器,先用云平台的免费额度把业务流程跑通,等你能解释清楚“影子设备”“消息下发”“属性上报”这些概念,再考虑自建也不迟。

2. 核心技术拆解:从传感器到界面,数据到底怎么跑

2.1 端侧:STM32如何采集数据并发送到云平台

端侧选型通常有两种路线。

路线A是“STM32 + ESP8266串口AT指令”。STM32负责业务逻辑,ESP8266刷AT固件后负责WiFi联网和MQTT协议,两者通过UART串口通信。开发时,STM32只需要按格式发AT+MQTTPUB这样的指令,模组就会帮我们把数据处理成MQTT报文并发送出去。

路线B是“STM32上移植协议栈”。比如用FreeRTOS加LWIP,再移植Paho MQTT客户端,让STM32自己完成TCP连接和MQTT报文处理。这条路更接近工业级做法,但需要芯片资源更充裕,学习曲线也陡得多。

我强烈建议入门阶段走路线A,原因有三个。

第一,STM32的资源本来就有限,云平台接入又涉及TCP长连接、心跳保活、TLS握手这些容易出错的协议细节,把这些全部压在单片机上,一旦出问题很难定位。第二,ESP8266模组本身就是一个可以独立跑协议栈的SoC,让它专注网络,STM32专注业务,分工更清晰。第三,调试AT指令比调试协议栈直观得多,你能在串口助手里看到模组返回的OK、ERROR、CONNECT这些信息,问题出在哪一层一眼就能看到。

传感器方面,入门最常见的是DHT11温湿度模块,便宜、模块化、三根线就能接,缺点是精度一般且读取时序敏感,每次读取之间至少要间隔1到2秒。继电器模块用来模拟控制家电,实验阶段接一个LED就行,千万不要直接接220V强电验证。

端侧上报数据的载荷格式,云平台通常要求JSON。STM32这边最简单的办法是用sprintf拼接:

char json[128]; snprintf(json, sizeof(json), "{\"services\":[{\"service_id\":\"smarthome\"," "\"properties\":{\"temperature\":%d,\"humidity\":%d,\"relay\":%d}}]}", temp, humi, relay_state);

然后把这段字符串塞进AT指令里发给ESP8266。这里有一个新手很常踩的坑:JSON里的双引号在C字符串里必须转义,如果你直接写{"temperature":26}编译会报错或者数据不完整,要写成{\"temperature\":26}。

MQTT协议层面,周期上报的温湿度数据用QoS0就行,因为丢了下一轮还会再报;控制指令建议用QoS1,保证如果这条消息没有确认,发送端还能重试。上报周期一般设置5到10秒,太频繁既费电也容易被平台限流。

2.2 云端:华为云IoT设备接入平台怎么配置与鉴权

华为云IoT里的设备接入服务(简称IoTDA)是这套系统的云端核心。它的职责很简单:管理设备身份、接收设备上报、保存设备状态、把命令可靠地下发给指定设备。

在配置云平台时,第一件要做的事叫“产品模型定义”。你可以把它理解成一份数据字典,你要告诉平台:“我的设备有温度、湿度、继电器状态这三种属性,温度是0到100之间的整数,湿度是0到100的整数,继电器是0或1。”平台后续在接收上报数据时会校验这些字段,字段对不上就直接丢弃。

第二件事是“注册设备”。每台设备会得到一个唯一的设备ID和密钥。设备ID相当于门牌号,密钥相当于进门密码,这两个信息会参与后续MQTT连接时的鉴权。

MQTT连接参数是很多人第一次搞糊涂的地方。简单说,设备接入不是直接用设备ID和密钥连上去,而是需要组合出MQTT协议要求的ClientId、Username和Password,一般规则是:

  • ClientId:由设备ID、连接类型和一个时间戳组成,具体格式控制台会给出示例;
  • Username:一般就是设备ID;
  • Password:用设备密钥和时间戳通过HMAC-SHA256算法计算出来的一个字符串。

这里最常见的错误是时间戳没有统一。ClientId里用的时间戳和计算Password用的时间戳必须完全一致,否则鉴权会失败。好在控制台的设备详情页通常有一个“设备接入指引”,会直接帮你生成好完整的MQTT连接参数和Topic,新手别自己手工拼,直接复制下来最稳妥。

Topic方面的核心是两个:

  • 属性上报Topic,设备把传感器数据发布到它,格式类似$oc/devices/{设备ID}/sys/properties/report;
  • 命令下发Topic,设备端要订阅它,平台通过它把“开灯”“关灯”这类指令推给设备,格式类似$oc/devices/{设备ID}/sys/commands/#。

平台还有一个很实用的能力叫“设备影子”,云平台会保存设备最新一次上报的属性。就算设备当前不在线,应用侧查询影子仍然能拿到最近一次状态。这个特性后面做离线控制会很有用。

注意:第一次上手时,不要急着把开发板接到云端。先用华为云控制台自带的“设备模拟器”测试产品模型和Topic,通过模拟器上报一条属性,再从控制台下发一条命令,全部成功后再让硬件介入,问题范围会小很多。

2.3 客户端:Qt怎么把云端数据变成可视化和控制操作

Qt在整个系统里扮演“应用侧”的角色。它有两种接入云端的方式。

第一种是标准路线:Qt作为应用端调用云平台开放的HTTPS接口,而不是以设备身份接入。登录接口换取Token,通过Token查询设备影子,通过命令接口下发控制指令。这种方式更贴近真实产品,因为应用端和设备端的边界清晰,权限模型也更好控制。

第二种是调试路线:Qt临时伪装成一个MQTT设备,直接连接设备接入端口,订阅设备Topic。这种方式适合快速验证消息格式,但不适合正式项目。原因很简单:平台会把Qt当成一台设备,如果同时多个客户端都以设备身份接入,设备管理和状态同步都会变得混乱。

我推荐你实际项目走标准路线,也就是Qt通过HTTP接口和云平台通信。这样有一个额外好处:即使Qt界面没有打开,设备数据也照常在云平台积累,不会因为客户端掉线影响设备。

Qt侧的常用技术点包括:

  • 用QNetworkAccessManager发HTTP请求,用QJsonDocument解析返回的JSON数据;
  • 网络请求必须异步处理,不能在UI线程里做同步等待,否则界面会卡死;
  • 用QTimer定时轮询设备影子,实现状态刷新;
  • 用Qt Charts画温度、湿度的历史曲线,界面更有“智能家居控制中心”的感觉;
  • Android平台部署时要额外打包OpenSSL动态库,否则HTTPS请求会直接报错。

一个标准的Qt控制端界面大概分为三个区域:左边是设备列表或房间列表,中间是状态面板和温湿度曲线,底部是控制按钮和日志输出区。界面不必复杂,关键是数据能实时反映设备状态。

3. 实操落地:从云配置到两端开发,一步步搭起来

3.1 准备清单与环境搭建

动手之前,先把硬件和软件列清楚,缺一件都会卡流程。

物品作用备注
STM32F103C8T6最小系统板主控入门最常见的芯片,资料多
ESP8266-01S模块联网与MQTT通信建议配一个USB转TTL调试器
DHT11温湿度模块采集温度湿度三针模块,注意供电电压
继电器模块模拟设备控制实验只接小功率负载,比如LED
面包板、杜邦线连接硬件备几根母对母杜邦线
USB转TTL工具刷固件、看日志一定要能输出3.3V供电

软件方面需要四样:STM32CubeMX用来初始化和生成工程代码,Keil或者STM32CubeIDE用来编译下载,串口调试助手用来观察ESP8266的AT指令返回,以及一个可用的Qt开发环境。Qt装的时候建议勾上Network和Charts模块,后面会用到。

接线方面,STM32和ESP8266之间用的是串口通信,注意TX和RX要交叉连接,也就是STM32的TX接ESP8266的RX,STM32的RX接ESP8266的TX。供电要特别注意,ESP8266-01S对供电比较敏感,如果供电不足会出现反复重启、AT无响应的问题,建议单独供电而不是从板子的引脚硬扯电流。

安全提醒:继电器实验阶段只接LED小灯,不要把家里220V电器直接接到开发板实验电路上,强电调试需要专业隔离和防护,不是课设场景该碰的。

3.2 云平台侧配置步骤拆解

云平台侧配置是整个项目最先要完成的部分,因为它是后面所有调试的基准。按下面顺序走一遍,大约十分钟能搞定:

  1. 登录云平台,开通设备接入服务IoTDA,记录资源空间ID和接入地址。
  2. 创建产品,产品名称比如叫“智能家居终端”,所属行业选智慧家居或通用物联网。
  3. 在“模型定义”页面添加服务和属性。服务ID建议叫smarthome,属性按需加temperature、humidity、relay三个字段,类型分别设为int或bool,取值范围根据传感器精度来定。
  4. 注册设备,保存生成的设备ID和密钥。这一步生成的密钥只显示一次,一定要立刻复制备份。
  5. 从设备详情页找到“设备接入指引”,查看平台自动生成的MQTT连接参数样例。
  6. 用控制台里的设备模拟器完成一次上报和一次命令下发测试,确认平台侧完全正常。

第3步看起来繁琐,但它非常重要。如果产品模型里定义的字段名和STM32上报JSON里的字段名不一致,平台会直接丢弃这条消息或者报数据格式错误。后面Qt下发命令时,命令参数名也必须和模型里的属性名一致,所以这一步定义得越规范,后面问题越少。

3.3 STM32端开发要点与关键代码

STM32端开发的整体思路可以概括成:初始化外设、让ESP8266联网并建立MQTT、循环采集上报、串口接收命令并执行控制。

用STM32CubeMX配置时,需要打开两个串口:一个用于调试打印,一个用于连接ESP8266。连接ESP8266的串口建议开中断接收,因为平台下发的命令是异步的,你不知道它什么时候会到,必须靠中断被动接收。另外再开一个定时器,用于生成5秒周期的上报Tick。继电器控制引脚配置成GPIO输出。

主循环的逻辑大致是:

while (1) { if (定时器5秒标志置位) { 读取DHT11温湿度; 判断当前继电器状态; 打包成JSON; 通过串口发送AT+MQTTPUB指令; 清除标志位; } // 命令解析在串口中断回调里做 }

AT指令序列方面,ESP8266刷完AT固件并分配好串口波特率后,按顺序执行这几条:

AT+CWMODE=1 AT+CWJAP="你的WiFi名","你的WiFi密码" AT+MQTTUSERCFG=0,1,"clientId","username","password",0,0,"" AT+MQTTCONN=0,"接入地址",8883,1 AT+MQTTSUB=0,"$oc/devices/设备ID/sys/commands/#",1 AT+MQTTPUB=0,"$oc/devices/设备ID/sys/properties/report","{\"services\":[{\"service_id\":\"smarthome\",\"properties\":{\"temperature\":26,\"humidity\":55,\"relay\":0}}]}",0,0

这里有个细节要说清楚:AT+MQTTUSERCFG里的clientId、username、password不是让你直接填设备ID和密钥,而是填控制台“设备接入指引”里生成的那一整套鉴权参数,尤其是password已经是经过算法算出来的字符串,直接填设备密钥会鉴权失败。

命令解析这块,平台下发给设备的命令最终会经ESP8266转发到STM32的串口。STM32的串口中断回调收到一帧数据后,先存进缓冲区,等收到完整的消息尾部再判断里面有没有set_relay这样的命令字段,有的话就置一个命令标志位,在等一下轮主循环里执行继电器翻转或者写回响应。注意命令的响应Topic也要主动发布,否则云平台会一直显示命令“超时”。

3.4 Qt客户端开发要点与关键代码

Qt客户端建议直接从Widgets工程开始,不要一上来就用QML,因为控制类界面用传统Widgets组织按钮和布局更直观,QML适合做炫酷动效,但对新手调试不友好。

工程的三个核心模块是:登录模块、状态查询模块、命令下发模块。

登录模块负责调用平台的认证接口,拿到Token。Token相当于整个Qt应用访问云平台的“通行证”,过期后需要重新获取。这里有一个非常容易踩的坑:如果你把Token写在全局变量里,调用接口时发现报401,大概率是Token过期没有重新请求,所以封装一个“请求失败自动刷新Token再重试”的逻辑非常有必要。

状态查询模块负责定时拉取设备影子。用QTimer每3秒触发一次,向平台影子查询接口发GET请求,响应里的temperature、humidity字段解析出来刷新界面控件。注意QTimer触发后,上一次请求如果没有返回,这次要跳过,不然会积累大量未完成请求导致界面卡顿。

命令下发模块的代码逻辑大致是:

// 伪代码,字段以你产品模型为准 QJsonObject paras; paras["relay"] = 1; QJsonObject cmd; cmd["command_name"] = "set_relay"; cmd["paras"] = paras; QJsonDocument doc(cmd); QNetworkRequest req(QUrl("平台命令下发接口地址")); req.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json")); req.setRawHeader("Authorization", token.toUtf8()); manager->post(req, doc.toJson());

写完三个模块后,把界面布局成左侧设备列表、中间状态卡片和曲线图、底部按钮区,项目就基本成型了。跨平台时注意:Windows和Linux桌面端直接用没问题,Android端要记得在打包配置里加入OpenSSL库,并且给应用申请网络权限,否则HTTPS请求会失败。

4. 联调过程与常见问题排查实录

4.1 联调顺序:先让云端闭环

整个项目我第一次做的时候,差点同时调三端,结果到处报错,根本分不清问题在哪。后来经验告诉我,联调顺序应该严格按“云平台 → 设备端 → 应用端”推进。

第一步,云端闭环。用控制台自带模拟器完成属性上报和命令下发,确认产品模型、Topic、消息格式全部正确。这时候云平台就是一个“已知正确”的标准件,后面出现任何问题都能拿它当参照。

第二步,设备端介入。把STM32和ESP8266接上,在云平台后台实时日志页面观察设备上报的数据能不能到达。如果到不了,先检查WiFi模块本身能不能联网,再检查MQTT参数和Topic,这时候你能用串口助手里ESP8266返回的信息做判断。

第三步,Qt应用介入。先用一个HTTP测试工具把平台的接口调通,再把它搬到Qt代码里。如果Qt这边一直失败但工具能通,问题就出在代码细节上,比如请求头没带Token、JSON格式不对、证书问题等。

这个顺序最大的好处是每次只有一个未知数。设备端没通,问题只会在STM32和ESP8266这一层;应用端没通,问题只会在Qt和HTTP请求这一层,排查范围一下就缩小了。

4.2 常见问题排查速查表

把我在实际调试中遇到的高频问题整理成一张速查表,建议直接保存下来对号入座。

故障现象可能原因解决思路
MQTT连接报鉴权失败ClientId、Username、Password组合错误,或时间戳不一致直接用控制台生成的连接参数,不手工改
模块能连接路由器但不上报上报Topic拼错,或JSON字段名与产品模型不一致用设备模拟器对比一次正确的报文
控制台收到数据但Qt查询不到Token过期、接口地址打错先测接口返回,再看Qt代码是否解析了正确字段
命令下发显示成功但设备没动作设备离线、命令Topic没订阅、响应Topic不匹配查看云平台设备日志,确认投递状态
Qt界面请求后卡死在UI线程做了同步网络请求全部改成异步回调,QTimer里检查上次请求状态
ESP8266反复重启或AT无反应供电不足、TX/RX接反、波特率不对单独供电,检查接线和串口配置
Android上Qt无法访问网络缺少OpenSSL库、网络权限没开打包补库,检查AndroidManifest权限
DHT11读数是0或固定值读取频率太快、接线松动、没加上拉电阻降到2秒以上一次,检查硬件连接

4.3 我踩过的几个坑和对应的改法

第一个坑是MQTT鉴权参数。当时我想“不就一个密码嘛”,觉得把设备密钥填进去就行,结果连接一直报错。后来才发现平台需要的是用密钥和时间戳算出来的派生密码,不是原始密钥。这件事给我的教训是:凡是云平台能自动生成的参数,就不要自己手工重造轮子,复制粘贴是最不容易错的。

第二个坑是ESP8266供电。用USB转TTL工具供电的时候,模块偶尔能回AT指令,偶尔直接重启,后来用万用表一量,供电电压在模组启动瞬间被拉低了很多。换了一个独立稳压电源之后,问题彻底消失。如果你发现模块“时好时坏”,优先怀疑供电而不是代码。

第三个坑是Qt界面卡死。我当时图省事,在按钮点击槽函数里直接发同步请求,结果点击“刷新”按钮后整个窗口无响应好几秒。改成异步后,把响应解析放在lambda回调里更新UI,这个问题才解决。在Qt里,任何网络操作都要默认遵守“绝对不阻塞UI线程”这条规则。

第四个坑是DHT11的数据忽然变成固定值。排查了半天,发现是读取间隔太短,传感器还没来得及完成一次转换就被我强行读取。把定时采集周期从1秒改成5秒后,数据稳定性明显好很多。

5. 进阶优化与安全加固建议

5.1 设备影子:离线控制不丢状态

做智能家居,有一个场景很常见:你在公司想远程关掉家里的灯,但家里的设备因为断网不在线,这时候如果你直接给设备下发命令,平台会告诉你“设备离线”,命令下发失败。

解决的思路是用设备影子。云平台的影子机制会保存设备的最新属性和“期望状态”,即使设备不在线,应用侧也能把“希望开灯”这个意图写入影子。等设备重新上线后,平台会主动把期望状态推给设备,设备完成动作后再上报最新属性,状态就同步上了。

在Qt应用里建议这样设计:状态查询优先查影子,命令下发时如果设备在线直接下发;如果设备离线,就把命令写入影子。把“当前状态”和“期望状态”分开处理,用户体验会好很多。

5.2 从单设备扩展到多房间多设备

课设通常做一两个设备就够了,但如果想把这个项目做得更完整,可以考虑多房间模型。

硬件层不必改动太多,关键是产品模型设计时把设备类型分开:温湿度传感器、开关面板、门磁各自定义产品和服务。设备ID命名带上房间语义,比如room1_light、room2_sensor,这样Topic上报和命令下发时,通过设备ID就能区分房间。

Qt界面从单设备卡片升级成设备树,左侧是“客厅”“卧室”“厨房”这样的房间分组,右侧显示对应设备的状态和控制按钮。再往后,如果你要加手机App或者网页控制端,只需要复用同一套云平台接口,不需要改动设备端代码。

5.3 安全与稳定性提升

调试阶段为了方便,很多人会使用1883明文端口,这在实际产品里是非常危险的。设备上报的温湿度是隐私信息,控制指令被截获可能直接控制家中电器,所以生产环境必须走TLS加密,并在设备端做好CA证书校验。

代码层面,设备密钥写死在源码里可以接受,但真实项目要用配置文件或者硬件安全存储来管理。Qt侧的Token也要妥善保存,避免被逆向工程提取。

断线重连建议用指数退避策略:第一次失败等5秒重连,第二次10秒,第三次20秒,最大间隔60秒。这样既不会在服务器抖动时造成全网设备同时冲击,也能在网络恢复后较快恢复连接。

云平台侧还有规则引擎和消息转发的功能。设备数据上报后,可以通过规则引擎把数据转存到数据库、触发告警或者转发到其他业务系统,这部分属于生产架构,对于拓展思路很有帮助。不过对小白来说,先把基础链路跑通,这些进阶能力可以后面慢慢研究。

写到这里,整套系统已经从设计、配置、代码到排错都完整过了一遍。我个人做完这套项目最大的体会是:先打通最小闭环,再考虑功能复杂度。第一次动手的时候,我花了不少时间纠结界面用QML还是Widgets,STM32要不要上RTOS,后来发现这些对验证链路根本不重要。你先把一个温湿度数据从传感器送到Qt界面,再把一个按钮指令从Qt传回继电器,项目的核心价值就成立了,剩下的多房间管理、历史曲线、告警通知,全都只是在这条骨架上做加法。最后分享一个调试习惯:联调时我会同时开着三个窗口,串口日志、云平台在线设备日志、Qt日志输出,哪一层出问题第一眼就能看到。这个习惯帮我省下的排错时间,比任何代码技巧都实在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 2:07:31

主客观观测和层级感知嵌套序言| 赵杰 | 量子感知论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/20 2:06:24

告别单会话限制:RDPWrap 五分钟实现免费多用户并发远程桌面

告别单会话限制:RDPWrap 五分钟实现免费多用户并发远程桌面 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 家里的电脑跑着重要任务,想远程接手时却…

作者头像 李华
网站建设 2026/10/20 2:06:18

大模型API实战:从Token计费到上下文管理,看懂DeepSeek与GLM之争

最近 AI 圈流行一句话:“DeepSeek 又端大号碗筷还无限续杯,最后还把路过的 GLM 给撑死了。”我一开始看到也愣了一下,以为是某个段子手在玩抽象,后来把这句话拆开,和实际的大模型 API 调用经验放在一起对照&#xff0c…

作者头像 李华
网站建设 2026/10/20 2:05:52

开机自启+快捷磁贴:tg-ws-proxy-android常驻后台的3个实用技巧

开机自启快捷磁贴:tg-ws-proxy-android常驻后台的3个实用技巧 tg-ws-proxy-android 是一款运行在 Android 上的本地 MTProto 代理应用,通过 CloudFlare WebSocket 或直接连接 Telegram 数据中心,帮助部分解决 Telegram 加载与连接问题。对需…

作者头像 李华
网站建设 2026/10/20 2:05:47

多路转接原理与应用

目录 一.前言: 1.为什么需要多路转接: a.传统阻塞 I/O 的并发困境: b.多路转接解决了什么: 2.事件探视机制的工作模型: 3.注意事项: 二.Linux 核心多路复用 API 使用: 1.Linux 下基于 se…

作者头像 李华
网站建设 2026/10/20 2:05:38

步进电机精度与细分控制:失步、共振、发热与选型调试全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华