Unity中使用Best MQTT v3插件实现MQTT通信功能,进行模块拆分
概述
本文将详细介绍如何在Unity中使用Best MQTT v3插件实现MQTT通信功能。将通过模块化设计实现配置加载、连接管理、订阅/发布等功能,并提供完整的代码实现。
重连说明:当意外断开连接的时候,会进行重新连接,重连上之后会再次订阅MqttSubscriptionService 中callbacks 中的主题,并添加回调。重连的次数保存再:MqttConnectionService的MaxReconnectAttempts
使用的MQTT版本是:3.1.1 在配置文件中是 SupportedProtocolVersions =0,SupportedProtocolVersions =1 则使用5.0版本,版本的判断保存在:MqttConnectionService的GetProtocolVersion。
环境准备
- 插件安装
插件名称 | 功能描述 | 下载地址 | 备注 |
---|---|---|---|
Best MQTT v3 | MQTT通信核心插件 | Unity Asset Store | 提供MQTT协议的完整实现 |
LitJson | JSON解析库 | LitJson官网 或使用BestHTTP自带的LitJson | 轻量高效的JSON解析工具 |
DOTween | 动画与延迟工具 | Unity Asset Store | 用于实现重连延迟效果 |
UniTask | 异步编程工具 | GitHub | 提供高性能的异步任务支持 |
- 配置文件
在StreamingAssets/SystemConfig
路径下创建MQTTConfig.json
{"MqttClientHost": "broker.emqx.io","MqttClientPort_TCP": 1883,"MqttClientPort_WebSocket": 8083,"MqttClientUserName": "","MqttClientPassword": "","SupportedProtocolVersions": 0
}
核心模块介绍
MQTT管理器(MqttManager)
public class MqttManager : SingletonMono<MqttManager>
{private async void Start(){var config = await _configLoader.LoadConfigAsync();if (config != null){_connectionService = new MqttConnectionService();_connectionService.Initialize(config);_connectionService.Connect();_connectionService._client.OnConnected += HandleOnConnected;}}private void HandleOnConnected(MQTTClient mqttclient){_subscriptionService = new MqttSubscriptionService(_connectionService);_mqttPublishService = new MqttPublishService(_connectionService);}}
功能说明: 在InitializeServices 初始化各个模块,然后再start中启动连接。
配置加载器(MqttConfigLoader)
public async UniTask<MQTTClientConfig> LoadConfigAsync(){var path = new Uri(Path.Combine(Application.streamingAssetsPath, "SystemConfig","MQTTConfig.json"));using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10))){try{var json = await ReadFileAsyncByWebRequest(path.ToString(), cts.Token);var jsonData = JsonMapper.ToObject<MQTTClientConfig>(json);Debug.Log("MQTT 配置加载成功");return jsonData;}catch (Exception e){Debug.LogError($"读取配置文件失败: {e.Message}");return null; // 或者根据需求抛出异常}}}
功能说明:
跨平台路径处理
异步加载避免卡顿,处理了webgl以及windows下的文件加载
LitJson 对配置文件进行解析
连接服务(MqttConnectionService)
public void Connect(){ var options = new ConnectionOptionsBuilder()
#if UNITY_WEBGL && !UNITY_EDITOR.WithWebSocket(_config.MqttClientHost, _config.MqttClientPort_WebSocket)
#else.WithTCP(_config.MqttClientHost, _config.MqttClientPort_TCP)
#endif.WithProtocolVersion(GetProtocolVersion()).Build();_client = new MQTTClient(options);SetupEventHandlers();_client.BeginConnect(ConfigureConnection);}
功能说明:
自动识别平台选择协议(WebGL使用WebSocket)
随机ClientID避免冲突
重连机制(5次指数退避重试)
订阅服务(MqttSubscriptionService)
/// <summary>/// 订阅主题/// </summary>/// <param name="_topic">主题</param>/// <param name="_callback">回调</param>public void Subscribe(string _topic, Action<string> _callback){if (string.IsNullOrEmpty(_topic)){Debug.Log("Topic cannot be null or empty." + nameof(_topic));}if (!connection.IsConnected){Debug.Log($"Cannot subscribe to topic '{_topic}' because the _connection is not established.");return;}if (callbacks.ContainsKey(_topic)){callbacks.Remove(_topic);}Unsubscribe(_topic);callbacks.Add(_topic, _callback);connection._client.CreateSubscriptionBuilder(_topic).WithMessageCallback(HandleMessageReceived).BeginSubscribe();Debug.Log($"Subscribed to topic :{_topic}.");}
功能说明:
自动重订阅机制
线程安全的消息处理
消息发布服务(MqttPublishService)
/// <summary>/// 发布消息/// </summary>/// <param name="_data"></param>/// <param name="_topic"></param>private void Publish(string _topic, string _data){if (mqttPublishClient.State != ClientStates.Connected){Debug.Log("连接已经断开,不发送消息");return;}mqttPublishClient.CreateApplicationMessageBuilder(_topic).WithPayload(_data).WithQoS(Best.MQTT.Packets.QoSLevels.AtMostOnceDelivery).WithContentType("text/plain; charset=UTF-8").BeginPublish();}
全部代码
MqttManager
using Best.MQTT;
using Manager;
using System;
namespace MQTT
{/// <summary>/// MQTT管理器/// </summary>public class MqttManager : SingletonMono<MqttManager>{// 模块化组件private MqttConfigLoader _configLoader;private MqttConnectionService _connectionService;public MqttSubscriptionService _subscriptionService;public MqttPublishService _mqttPublishService;//mqtt发布服务protected override void Init(){base.Init();}private async void Start(){var config = await _configLoader.LoadConfigAsync();if (config != null){_connectionService = new MqttConnectionService();_connectionService.Initialize(config);_connectionService.Connect();_connectionService._client.OnConnected += HandleOnConnected;}}private void HandleOnConnected(MQTTClient mqttclient){_subscriptionService = new MqttSubscriptionService(_connectionService);_mqttPublishService = new MqttPublishService(_connectionService);}void OnDestroy(){_connectionService.isRightDisConnection = true;_connectionService?.Disconnect();}internal void InitCommpoent(){}}
}
MqttConfigLoader
using Best.HTTP.JSON.LitJson;
using Cysharp.Threading.Tasks;
using System;
using System.IO;
using System.Threading;
using UnityEngine;
using UnityEngine.Networking;namespace MQTT
{/// <summary>/// MQTT 配置加载/// </summary>public class MqttConfigLoader{/// <summary>/// 读取mqtt的配置文件/// </summary>/// <returns>读取到的mqtt配置文件</returns>public async UniTask<MQTTClientConfig> LoadConfigAsync(){var path = new Uri(Path.Combine(Application.streamingAssetsPath, "SystemConfig","MQTTConfig.json"));using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10))){try{var json = await ReadFileAsyncByWebRequest(path.ToString(), cts.Token);var jsonData = JsonMapper.ToObject<MQTTClientConfig>(json);Debug.Log("MQTT 配置加载成功");return jsonData;}catch (Exception e){Debug.LogError($"读取配置文件失败: {e.Message}");return null; // 或者根据需求抛出异常}}}/// <summary>/// 通过webrequest 读取文件/// </summary>/// <param name="path">路径</param>/// <param name="cancellationToken"></param>/// <returns></returns>/// <exception cref="Exception"></exception>private async UniTask<string> ReadFileAsyncByWebRequest(string path, CancellationToken cancellationToken){using (var request = UnityWebRequest.Get(path)){var operation = request.SendWebRequest();while (!operation.isDone){await UniTask.Yield(PlayerLoopTiming.Update, cancellationToken);}if (request.result != UnityWebRequest.Result.Success){throw new Exception(request.error);}return request.downloadHandler.text;}}}
}
MqttConnectionService
using Best.MQTT;
using Best.MQTT.Packets.Builders;
using DG.Tweening;
using System;
using UnityEngine;namespace MQTT
{/// <summary>/// MQTT 连接服务(处理连接/断开/重连)/// </summary>public class MqttConnectionService{/// <summary>/// 是正常的断开链接吗?/// </summary>public bool isRightDisConnection = false;public MQTTClient _client;private MQTTClientConfig _config;private const int MaxReconnectAttempts = 5;private int _reconnectAttempts;public bool IsConnected => _client?.State == ClientStates.Connected;public void Initialize(MQTTClientConfig config){_config = config;}public MqttConnectionService() { }/// <summary>/// 链接/// </summary>public void Connect(){ var options = new ConnectionOptionsBuilder()
#if UNITY_WEBGL && !UNITY_EDITOR.WithWebSocket(_config.MqttClientHost, _config.MqttClientPort_WebSocket)
#else.WithTCP(_config.MqttClientHost, _config.MqttClientPort_TCP)
#endif.WithProtocolVersion(GetProtocolVersion()).Build();_client = new MQTTClient(options);SetupEventHandlers();_client.BeginConnect(ConfigureConnection);}/// <summary>/// 断开链接/// </summary>public void Disconnect(){isRightDisConnection = true;_client?.CreateDisconnectPacketBuilder().BeginDisconnect();_client = null;}private ConnectPacketBuilder ConfigureConnection(MQTTClient client, ConnectPacketBuilder builder){return builder.WithClientID(GenerateClientId()).WithCleanStart();}private void SetupEventHandlers(){_client.OnConnected += HandleConnected;_client.OnDisconnect += HandleDisconnected;_client.OnStateChanged += HandleStateChanged;}private void HandleStateChanged(MQTTClient client, ClientStates oldState, ClientStates newState){Debug.Log($"链接状态改变oldState:{oldState},newState:{newState}");}private void HandleConnected(MQTTClient client){Debug.Log("链接到mqtt服务器");isRightDisConnection = false;}private void HandleDisconnected(MQTTClient client, DisconnectReasonCodes code, string reason){Debug.Log("断开mqtt的链接"+ reason);if (isRightDisConnection == true){}else{TryReconnect();}}private void TryReconnect(){if (_reconnectAttempts >= MaxReconnectAttempts) return;DOTween.Sequence().AppendInterval(1f).AppendCallback(() =>{_reconnectAttempts++;Connect();});}private SupportedProtocolVersions GetProtocolVersion() =>_config.SupportedProtocolVersions == 0 ?SupportedProtocolVersions.MQTT_3_1_1 :SupportedProtocolVersions.MQTT_5_0;private string GenerateClientId() => Guid.NewGuid().ToString();}
}
MqttSubscriptionService
using Best.MQTT;
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;namespace MQTT
{/// <summary>/// 订阅管理服务(处理订阅/取消订阅)/// </summary>public class MqttSubscriptionService{private readonly MqttConnectionService connection;private readonly Dictionary<string, Action<string>> callbacks = new();public MqttSubscriptionService(MqttConnectionService _connection){this.connection = _connection;this.connection._client.OnConnected += ReSubscribeWhenReconnecting;}/// <summary>/// 订阅主题/// </summary>/// <param name="_topic">主题</param>/// <param name="_callback">回调</param>public void Subscribe(string _topic, Action<string> _callback){if (string.IsNullOrEmpty(_topic)){Debug.Log("Topic cannot be null or empty." + nameof(_topic));}if (!connection.IsConnected){Debug.Log($"Cannot subscribe to topic '{_topic}' because the _connection is not established.");return;}if (callbacks.ContainsKey(_topic)){callbacks.Remove(_topic);}Unsubscribe(_topic);callbacks.Add(_topic, _callback);connection._client.CreateSubscriptionBuilder(_topic).WithMessageCallback(HandleMessageReceived).BeginSubscribe();Debug.Log($"Subscribed to topic :{_topic}.");}/// <summary>/// 取消订阅/// </summary>/// <param name="_topic">主题</param>public void Unsubscribe(string _topic){if (!connection.IsConnected || !callbacks.ContainsKey(_topic)) return;connection._client.CreateUnsubscribePacketBuilder(_topic).BeginUnsubscribe();callbacks.Remove(_topic);if (string.IsNullOrEmpty(_topic)){Debug.Log("Topic cannot be null or empty." + nameof(_topic));}if (!connection.IsConnected || !callbacks.ContainsKey(_topic)){Debug.Log($"Cannot unsubscribe from topic '{_topic}' because the _connection is not established or the topic is not subscribed.");return;}connection._client.CreateUnsubscribePacketBuilder(_topic).BeginUnsubscribe();callbacks.Remove(_topic);Debug.Log($"Unsubscribed from topic '{_topic}'.");}/// <summary>/// 收到消息之后的处理/// </summary>/// <param name="_"></param>/// <param name="__"></param>/// <param name="_topic"></param>/// <param name="_message"></param>private void HandleMessageReceived(MQTTClient _, SubscriptionTopic __, string _topic, ApplicationMessage _message){var payload = Encoding.UTF8.GetString(_message.Payload.Data, _message.Payload.Offset, _message.Payload.Count);if (callbacks.TryGetValue(_topic, out var callback)){callback?.Invoke(payload);}}/// <summary>/// 在连接的时候重新订阅之前的主题/// </summary>private void ReSubscribeWhenReconnecting(MQTTClient mqttclient){if (callbacks.Count == 0){return;}foreach (var topic in callbacks.Keys){Subscribe(topic, callbacks[topic]);}}}
}
MqttPublishService
using Best.MQTT;
using UnityEngine;namespace MQTT
{/// <summary>/// MQTT发布服务(发布消息)/// </summary>public class MqttPublishService{private MQTTClient mqttPublishClient;public MqttPublishService(MqttConnectionService mqttConnectionService){mqttPublishClient = mqttConnectionService._client;}/// <summary>/// 发布消息/// </summary>/// <param name="_data"></param>/// <param name="_topic"></param>public void Publish(string _topic, string _data){if (mqttPublishClient.State != ClientStates.Connected){Debug.Log("连接已经断开,不发送消息");return;}mqttPublishClient.CreateApplicationMessageBuilder(_topic).WithPayload(_data).WithQoS(Best.MQTT.Packets.QoSLevels.AtMostOnceDelivery).BeginPublish();}}
}
SingletonMono
单例类
using UnityEngine;namespace Manager
{/// <summary>/// 单例模式/// </summary>/// <typeparam name="T">需要变成单例的class</typeparam>public abstract class SingletonMono<T> : MonoBehaviour where T : SingletonMono<T>{protected static T _Instance = null;public static T Instance{get{if (null == _Instance){//寻找是否存在当前单例类对象_Instance = FindObjectOfType<T>();//不存在的话if (_Instance == null){//new一个并添加一个单例脚本_Instance = new GameObject(typeof(T).Name).AddComponent<T>();}else{_Instance.Init();}//在切换场景的时候不要释放这个对象DontDestroyOnLoad(_Instance.gameObject);}return _Instance;}}private void Awake(){if (_Instance == null) //如果未实例化{_Instance = this as T; //as T 指强转 为 派生类 传递进来的 类型Init(); //为实现 派生类继承 单例模式基类时 无法使用 Awake() 方法采用 Init() 虚方法 代替}}/// <summary>/// MonoSingleton 基类 留给派生类做Awake()初始化的方法[虚方法]/// </summary>protected virtual void Init(){}}
}
MQTTClientConfig
using System;namespace MQTT
{[Serializable]public class MQTTClientConfig{public string MqttClientClientID;public string MqttClientHost;public int MqttClientPort_TCP;public int MqttClientPort_WebSocket;public string MqttClientUserName;public string MqttClientPassword;public int SupportedProtocolVersions;}
}
MqttStart 使用示例
using MQTT;
using UnityEngine;
using UnityEngine.UI;namespace MQTT
{public class MqttStart : MonoBehaviour{public Button btn;private void Start(){MqttManager.Instance.InitCommpoent(); //创建并初始化mqttManager对象btn.onClick.AddListener(SendData2Server);//按钮绑定一个事件用于测试}//发送消息,并订阅一个主题private void SendData2Server(){MqttManager.Instance._mqttPublishService.Publish("test/data/wyw", "1");MqttManager.Instance._subscriptionService.Subscribe("test/data/wyw/get", (str) =>{Debug.Log("收到消息"+str);});}}
}
相关文章:
Unity中使用Best MQTT v3插件实现MQTT通信功能,进行模块拆分
概述 本文将详细介绍如何在Unity中使用Best MQTT v3插件实现MQTT通信功能。将通过模块化设计实现配置加载、连接管理、订阅/发布等功能,并提供完整的代码实现。 重连说明:当意外断开连接的时候,会进行重新连接,重连上之后会再次订…...
NO.14十六届蓝桥杯备战|switch语句|break|default|2道练习(C++)
switch语句 除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。 switch (expression) { case value1: stat…...
探索B-树系列
🌈前言🌈 本文将讲解B树系列,包含 B-树,B树,B*树,其中主要讲解B树底层原理,为什么用B树作为外查询的数据结构,以及B-树插入操作并用代码实现;介绍B树、B*树。 Ǵ…...
【SpringBoot实现全局API限频】 最佳实践
在 Spring Boot 中实现全局 API 限频(Rate Limiting)可以通过多种方式实现,这里推荐一个结合 拦截器 Redis 的分布式解决方案,适用于生产环境且具备良好的扩展性。 方案设计思路 核心目标:基于客户端标识(…...
esxi添加内存条因为资源不足虚拟机无法开机——避坑
exsi8.0我加了6根内存条,然后将里面的ubuntu的内存增加 haTask-2-vim.VirtualMachine.powerOn-919 描述 打开该虚拟机电源 虚拟机 ub22 状况 失败 - 模块“MonitorLoop”打开电源失败。 错误 模块“MonitorLoop”打开电源失败。无法将交换文件 /vmfs/volumes…...
实验8 配置标准访问控制列表IPv4 ACL
实验8 配置标准访问控制列表IPv4 ACL 一.实验目的 1、掌握IPv4 ACL工作方式和工作过程。 2、掌握定义编号和命名的标准 IPv4 ACL 的方法。 3、掌握接口和VTY下应用标准IPv4 ACL的方法。 二.实验内容 配置IPv4 ACL的实验拓扑如下图所示。 图1 实验拓扑…...
5.7.2 进度管理
文章目录 进度管理Gantt图PERT图 进度管理 进度安排:通过将项目分解成多个活动,分析活动间的依赖关系,估算工作量,分配资源,制定活动时序。 Gantt图 Gantt图横坐标表示时间,纵坐标表示不同任务。使用一条条…...
Android新版高斯模糊(毛玻璃)官方实现,Kotlin
Android新版高斯模糊(毛玻璃)官方实现,Kotlin 从Android 12开始,Android官方API支持高斯模糊(毛玻璃)效果。关键是通过RenderEffect实现。 https://developer.android.com/reference/android/graphics/RenderEffecthttps://developer.android.com/refer…...
b站——《【强化学习】一小时完全入门》学习笔记及代码(1-3 多臂老虎机)
问题陈述 我们有两个多臂老虎机(Multi-Armed Bandit),分别称为左边的老虎机和右边的老虎机。每个老虎机的奖励服从不同的正态分布: 左边的老虎机:奖励服从均值为 500,标准差为 50 的正态分布,即…...
使用开源项目xxl-cache构建多级缓存
xxl-cache简介 官网地址:https://www.xuxueli.com/xxl-cache/ 概述 XXL-CACHE 是一个 多级缓存框架,高效组合本地缓存和分布式缓存(RedisCaffeine),支持“多级缓存、一致性保障、TTL、Category隔离、防穿透”等能力;拥有“高性…...
分层解耦-三层架构
controller: 控制层,接收前端发送的请求,对请求进行处理,并响应数据。 service: 业务逻辑层,处理具体的业务逻辑。 dao: 数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改…...
简化的动态稀疏视觉Transformer的PyTorch代码
存一串代码(简化的动态稀疏视觉Transformer的PyTorch代码) import torch import torch.nn as nn import torch.nn.functional as F class DynamicSparseAttention(nn.Module): def __init__(self, dim, num_heads8, dropout0.1): super().__init__()…...
掌握 PHP 单例模式:构建更高效的应用
在 PHP 应用开发中,资源的高效管理至关重要。单例模式是一种能够帮助我们实现这一目标的设计模式。本文将深入探讨单例模式的概念、工作原理以及在 PHP 项目中何时应该(或不应该)使用它。 什么是单例模式? 单例模式是一种设计模…...
今日AI和商界事件(2025-02-11)
今日AI大事件主要包括以下几个方面: 一、行业竞购与合作变动 马斯克组团竞购OpenAI 据《华尔街日报》报道,马斯克率投资者财团出价974亿美元竞购OpenAI,欲使其回归开源公益使命。xAI支持此次竞购,若成功,xAI或与OpenA…...
ArcGIS Pro批量创建离线服务sd包
背景: 主要针对一个工程内有多个地图框项: 处理方法:通过Python脚本处理打包。 运行环境 在Pro的Python环境中去运行编写的Python脚本。 Python 脚本参考 import arcpy import os# Set output file names outdir r"d:\data\out&…...
R语言 文本分析 天龙八部
起因, 目的: 前面有人对 “倚天屠龙记” 进行分析,我这里只是进行模仿而已。 完整的文件, 已经绑定了,反正读者可以找一下。 案例背景 小说《天龙八部》是金庸先生所著的武侠小说,也是“射雕三部曲”的前传。全书共50章,字数超过一百万字。故事发生在北宋末年,以大理…...
【AI论文】Visual Instruction Tuning
文献核心目标 作者的目标是通过多模态指令微调(Visual Instruction Tuning)来训练一个通用的视觉助手,使其能够理解用户的语言指令并与视觉内容结合完成任务。例如,用户可以上传图片并提出问题,模型根据图片内容作出回答。 1. 引言 什么是多模态交互?为什么重要? 人类…...
产品详情页中 品牌官网详情 对应后端的字段是 detail
文章目录 1、在这个Vue代码中,品牌官网详情 对应后端的字段是 detail2、品牌官网详情 功能相关的代码片段3、export const productSave (data: any) >4、ProductController5、ProductDto 类6、ProductApiService 1、在这个Vue代码中,品牌官网详情 对…...
vue知识点2
1.methods和mounted的区别 methods是定义方法,不涉及到调用 mounted涉及到操作 所以methods后面是:,mounted后面是() 2.介绍一下emit的用法 如果子控件要调用父页面的方法,在父页面的子控件引用处&…...
使用 mkcert 本地部署启动了 TLS/SSL 加密通讯的 MongoDB 副本集和分片集群
MongoDB 是支持客户端与 MongoDB 服务器之间启用 TLS/SSL 进行加密通讯的, 对于 MongoDB 副本集和分片集群内部的通讯, 也可以开启 TLS/SSL 认证. 本文会使用 mkcert 创建 TLS/SSL 证书, 基于创建的证书, 介绍 MongoDB 副本集、分片集群中启动 TLS/SSL 通讯的方法. 我们将会在…...
荣耀手机Magic3系列、Magic4系列、Magic5系列、Magic6系列、Magic7系列详情对比以及最新二手价格预测
目录 荣耀Magic系列手机详细对比 最新二手价格预测 性价比分析 总结 以下是荣耀Magic系列手机的详细对比以及最新二手价格预测: 荣耀Magic系列手机详细对比 特性荣耀Magic3系列荣耀Magic4系列荣耀Magic5系列荣耀Magic6系列荣耀Magic7系列处理器骁龙888&#x…...
利用HTML和css技术编写学校官网页面
目录 一,图例展示 二,代码说明 1,html部分: 【第一张图片】 【第二张图片】 【第三张图片】 2,css部分: 【第一张图片】 【第二张图片】 【第三张图片】 三,程序代码 一,…...
易语言Easy Programming Language
E易语言 EF 易语言.飞场 EPL EF 我心易飞扬! Elogo 易乐谷我的程序我来写! Easy Programming Language Elogo 未来的小程序员!易语言运行时环境检验报告 自有编辑器、自带数据库、本土化支持 易语言系统全部自行设计开发。自有编译器。所编译目的程序运…...
支付宝安全发全套解决方案
产品价值 ● 通过支付宝的资金能力,让服务商机构通过信息流驱动资金流,在不碰触客户企业资金的同时,为客户企业完成转账。账目清晰,无合规和资质风险。 ● 为服务商提供全链路的资金流动明细信息,服务商可以将这些信息…...
如何通过腾讯 ima.copilot 训练自己的知识库
如何通过腾讯 ima.copilot 训练自己的知识库 在信息爆炸的时代,拥有一个专属的知识库,能让我们在学习、工作中快速获取所需信息,极大地提升效率。腾讯推出的 AI 智能工作台 ima.copilot,为我们打造个人知识库提供了便利。今天&am…...
本地部署DeepSeek-R1(Mac版)
本地部署DeepSeek-R1(Mac版) 前言:过年这段时间,DeepSeek火遍全球,但遭受黑客攻击,10次对话基本9次都是服务器繁忙,请稍后重试。那么,本地部署整起来 总体来说,本地部署…...
uniapp 编译生成鸿蒙正式app步骤
1,在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件(构建-生成私钥和证书请求文件) 2,华为开发者平台 根据上面生成的csr文件新增cer和p7b文件,分发布和测试 3,在最新版本DevEco-Studio工具 文…...
C++STL与内存管理总结
1:内存管理方面:涉及分配(请求)与释放,主要分为 静态内存,自动存储期(栈内存)、动态内存分配(堆内存)以及智 能指针系列,之所以重要,因…...
【文本处理】如何在批量WORD和txt文本提取手机号码,固话号码,提取邮箱,删除中文,删除英文,提取车牌号等等一些文本提取固定格式的操作,基于WPF的解决方案
企业的应用场景 数据清洗:在进行数据导入或分析之前,往往需要对大量文本数据进行预处理,比如去除文本中的无关字符(中文、英文),只保留需要的联系信息(手机号码、固话号码、邮箱)。…...
算法跟练第十弹——栈与队列
文章目录 part01 逆波兰表达式求值part02 滑动窗口最大值part03 前 K 个高频元素归纳:将字符串转转换成整数:LinkedListMap遍历优先级队列的比较器 跟着代码随想录刷题的第十天。 代码随想录链接:代码随想录 part01 逆波兰表达式求值 题目链接…...
计算机毕业设计——Springboot的校园新闻网站
🎉**欢迎来到琛哥的技术世界!**🎉 📘 博主小档案: 琛哥,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 琛哥在深度学习任务中展现出卓越的能力&a…...
在CT107D单片机综合训练平台上实现外部中断控制LED闪烁
引言 在单片机开发中,外部中断是一个非常重要的功能,它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们将使用两种不同的方式来实现这一功能:一种是在…...
C# ASP.NET 介绍
.NET学习资料 .NET学习资料 .NET学习资料 一、概述 ASP.NET是由微软创建的一个开源 Web 框架,用于使用.NET 构建现代化的 Web 应用程序和服务。它为开发者提供了一套丰富的工具、库和编程模型,使得创建功能强大、高效且安全的 Web 应用变得更加容易。…...
Django中select_related 的作用
Django中这句代码Dynamic.objects.select_related(song)是什么意思? 在 Django 中,这句代码: Dynamic.objects.select_related(song) 的作用是 在查询 Dynamic 模型的同时,预加载 song 关联的外键对象,从而减少数据…...
MyBatis常见知识点
#{} 和 ${} 的区别是什么? 答: ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于原样文本替换,可以替换任意内容,比如${driver}会被原样替换为com.mysql.jdbc. Driver。 一个…...
CentOS 安装 Docker
一、使用官方安装脚本自动安装 安装命令如下: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 也可以使用国内 daocloud 一键安装命令: curl -sSL https://get.daocloud.io/docker | sh 二、手动安装 卸载旧版本 较旧的 Do…...
【sqlite】python操作sqlite3(含测试)
个人小项目或者小团队,sqllite很适用,数据库封装操作如下 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2025-02-08 13:57 # Author : duxiaowei # File : connect_sqllite.py # Software: PyCharm """ sqllite操作, …...
PTC Windchill介绍
以下内容摘自PTC的Windchill介绍材料,确有其用,摘录一些: 存储和搜索产品信息 所有产品信息的中央存储库。同样的,对于产品相关内容,例如 CAD 模型、文档、技术插图、嵌入式软件、计算和要求规范,都有一个…...
3.矩阵分解技术在推荐系统中的应用
接下来我们将深入探讨矩阵分解技术在推荐系统中的应用。矩阵分解是一种强大的技术,可以有效地处理数据稀疏性问题,并提高推荐系统的性能。在这一课中,我们将介绍以下内容: 矩阵分解的基本概念奇异值分解(SVDÿ…...
visual studio 在kylin v10上跨平台编译时c++标准库提示缺少无法打开的问题解决
情况1:提示无法打开 源文件 "string"之类导致无法编译 情况2:能编译,但无法打开这些库文件或标准库使用提示下划红色问题 解决方案: 一、通过工具->选项->跨平台里,在“远程标头IntelliSense管理器”更新下载一下…...
TextWebSocketHandler 和 @ServerEndpoint 各自实现 WebSocket 服务器
TextWebSocketHandler 和 ServerEndpoint 都可以用于实现 WebSocket 服务器,但它们属于不同的技术栈,使用方式和功能有一些区别。以下是它们的对比: 1. 技术栈对比 特性TextWebSocketHandler (Spring)ServerEndpoint (Java EE/JSR-356)所属框…...
一种非完全图下的TSP求解算法
序 旅行商问题(Traveling Salesman Problem,简称TSP)是组合优化中的一个经典问题,就是给定一组城市和城市之间的距离,找到一条最短路径使得每个城市只被访问一次后返回到起点。 一些传统的解法都是基于完全图的,我在网上也很少找到非完全图的解法,非完全图应该在实际应…...
文件操作(1.文件资源上传到MinIO 2.文件资源保存在数据库中)
目录 本文提供文件操作接口的实现(上传下载) 附件资源表实体类 具体代码实现 上传到MinIO服务器 pom依赖 yml配置 MinIO配置 服务实现类 保存到数据库 本文提供文件操作接口的实现(上传下载) 附件资源表实体类 Data AllArgsConstructor NoArgsConstructor EqualsAndHa…...
deepseek模型技术优势研究
1.1 混合专家模型(MoE)架构 DeepSeek 模型采用了混合专家模型(Mixture-of-Experts,MoE)架构,这一架构在大规模预训练与下游应用中展现了显著的计算资源利用效率优势。MoE 架构的基本思想是在传统 Transfor…...
项目6:基于大数据校园一卡通数据分析和可视化
1、项目简介 本项目是基于大数据的清华校园卡数据分析系统,通过Hadoop,spark等技术处理校园卡交易、卡号和商户信息数据。系统实现消费类别、男女消费差异、学院消费排行和年级对比等分析,并通过Web后端和可视化前端展示结果。项目运行便捷&…...
搭建Spark集群(CentOS Stream 9)
零、资源准备 虚拟机相关: VMware workstation 16:虚拟机/vmware_16.zip(建议选择vmware_17版本)CentOS Stream 9:虚拟机/CentOS-Stream-9-latest-x86_64-boot.iso(安装包小,安装时需要联网下载)/ 虚拟机/CentOS-Stream-9-latest-x86_64-dvd1.iso(安装包大)JDK jdk1.8:…...
leetcode 2466. 统计构造好字符串的方案数
题目如下 数据范围 本题就是加了马甲的跳格子问题即一次能选择跳zero格或者one格(注意这两个不是定值,不是翻译成0和1它们只是代表能跳几格)我们令f(i)为从第0格跳到i格的路径数(也就是好串有几个)显然如果存在的话: f(i) f(i - zero) f(i - one)。…...
Jupyter Notebook自动保存失败等问题的解决
一、未生成配置文件 需要在命令行中,执行下面的命令自动生成配置文件 jupyter notebook --generate-config 执行后会在 C:\Users\用户名\.jupyter目录中生成文件 jupyter_notebook_config.py 二、在网页端打开Jupyter Notebook后文件保存失败;运行代码…...
局域网内别的电脑怎么连接到对方的mysql数据库
要让局域网内的其他电脑连接到一台主机上的 MySQL 数据库,你需要进行一些配置,包括 MySQL 服务器的设置、权限调整,以及客户端连接的步骤。以下是详细的步骤说明: 1. 确保 MySQL 服务器允许远程连接 默认情况下,MySQL 服务器可能只允许本地连接(localhost)。你需要修改…...
flask和django的对比
Flask 和 Django 都是流行的 Python Web 框架,尽管它们都用于构建 Web 应用,但它们的设计理念和使用场景有所不同。以下是它们之间的一些对比: 1. 框架类型 Flask:微框架(Micro-framework),意…...