Android 应用wifi direct连接通信实现
一. 打开Wi-Fi direct
1.必须启用Wi-Fi功能:在设备设置中开启Wi-Fi主开关(即使未连接路由器)
关闭冲突功能:若已开启「热点共享」或连接到其他Wi-Fi网络,需先关闭相关功能以避免硬件占.
<!-- Wi-Fi Direct 核心权限 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Android 10+ 需位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
1.1.代码调用打开WIFI
// 获取Wi-Fi管理器实例
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
// 开启Wi-Fi
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true); // API 28以下可调用,高版本需跳转系统设置页:ml-citation{ref="1,4" data="citationList"}
}
1.2.跳转系统Wi-Fi设置页(适用于无法直接控制Wi-Fi的情况)
startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
2.在系统设置中进入Wi-Fi菜单,点击右上角「高级」选项,找到并启用Wi-Fi Direct(部分设备显示为「WLAN直连」或「附近设备」)
3. 位置权限开关
Android 10及以上版本:需在设置中打开位置信息(GPS)权限,否则Wi-Fi Direct功能可能被禁用或无法扫描设备
动态权限申请:应用需通过弹窗申请ACCESS_FINE_LOCATION权限,用户需手动授
二.连接设备,数据通信
1.客户端设备处理
1.1 客户端注册广播监听
注册广播监听,包括:
#1.启用/禁用 Wi-Fi P2P 功能。
#2.扫描到附近的设备或者当设备处于可发现状态
#3.连接状态变化
WifiP2pManager manager = (WifiP2pManager) MyApplication.getAppContext().getSystemService(Context.WIFI_P2P_SERVICE);
WifiP2pManager.Channel channel = manager.initialize(MyApplication.getAppContext(), getMainLooper(), null);
// 客户端设备(主动发起连接的设备)注册广播接收器监听设备发现
private BroadcastReceiver clientReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {// 检查 Wi-Fi Direct 是否启用int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {// 功能已启用,一般是收到功能已启用执行1.设备发现discoverPeers();} else {// 功能未启用}} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {// 监听扫描到附近的设备或者当设备处于可发现状态(如其他设备开启 P2P 搜索或加入/退出网络)manager.requestPeers(channel, peerList -> {// 处理设备列表Collection<WifiP2pDevice> devices = peerList.getDeviceList();// 更新 UI 显示设备列表for (WifiP2pDevice device : devices) {//选择需要连接的WifiP2pDevice设备,clientConnectP2pDevice(MacAddress.fromString(device.deviceAddress));}});} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {//连接状态变化监听 如服务端接受连接并创建组后manager.requestConnectionInfo(channel, info -> {InetAddress groupOwnerAddress = info.groupOwnerAddress;if (info.groupFormed && !info.isGroupOwner) {// 客户端逻辑:连接群主 IP 的指定端口try {clientSocketConnect(context, groupOwnerAddress.getHostAddress());} catch (IOException e) {throw new RuntimeException(e);}} else if (info.isGroupOwner) {// 群主逻辑:启动服务端 Socket 这里是客户端不会处理这段}});}}
};/*** 客户端步骤1* 注册广播监听,包括:* 1.启用/禁用 Wi-Fi P2P 功能。* 2.扫描到附近的设备或者当设备处于可发现状态* 3.连接状态变化*/
private void clientRegisterWifiListen() {// 注册接收器IntentFilter intentFilter = new IntentFilter();//WIFI_P2P_STATE_CHANGED_ACTION监听 启用/禁用 Wi-Fi P2P 功能intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);MyApplication.getAppContext().registerReceiver(clientReceiver, intentFilter);
}
1.2 主动搜索设备
客户端在检查 Wi-Fi Direct已启用时,主动搜索设备
/*** 客户端步骤2* 客户端在检查 Wi-Fi Direct已启用时,主动搜索设备*/
private void discoverPeers() {manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {// 发现设备成功,客户端会收到WIFI_P2P_PEERS_CHANGED_ACTION广播}@Overridepublic void onFailure(int reason) {// 失败处理}});
}
1.3 选择设备连接
客户端在扫描到附近设备,选择设备连接
/*** 客户端步骤3* 客户端在扫描到附近设备,选择设备连接** @param targetDeviceAddress*/
private void clientConnectP2pDevice(MacAddress targetDeviceAddress) {WifiP2pConfig config = new WifiP2pConfig.Builder().setDeviceAddress(targetDeviceAddress).build();manager.connect(channel, config, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {//连接成功后}@Overridepublic void onFailure(int reason) {}});//发起 connect() 请求后,需验证连接是否成功建立manager.requestConnectionInfo(channel, info -> {InetAddress groupOwnerAddress = info.groupOwnerAddress;if (info.groupFormed && !info.isGroupOwner) {// 客户端逻辑:连接群主 IP 的指定端口try {clientSocketConnect(MyApplication.getAppContext(), groupOwnerAddress.getHostAddress());} catch (IOException e) {throw new RuntimeException(e);}} else if (info.isGroupOwner) {// 群主逻辑:启动服务端 Socket 这里是客户端不会处理这段}});
}
1.4 socket连接数据通信
客户端在监听到连接状态变化(服务端同意连接并创建组)获取到服务端ip地址和服务端创建的socket端口进行数据通信。
/*** 客户端步骤4* 客户端在监听到连接状态变化(服务端同意连接并创建组)获取到服务端ip地址和服务端* 创建的socket端口进行数据通信** @param context* @param serverIP* @throws IOException*/
private void clientSocketConnect(Context context, String serverIP) throws IOException {if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {return;}Socket socket = new Socket();socket.connect(new InetSocketAddress(serverIP, 8888));//连接之后就可以获取输入输出流进行 读写操作了InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();
}
2.服务端设备处理
2.1 服务端注册广播监听
注册广播监听 连接状态变化(监听到客户端连接请求)
// 服务端(等待连接的设备)注册广播接收器
private final BroadcastReceiver p2pConnectReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);WifiP2pInfo p2pInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO);if (networkInfo.isConnected()) {// 连接已建立,处理群组信息(如群组所有者 IP 和角色)可进行数据传输} else {//服务端在收到连接请求后会默认成为组所有者并自动创建组。一般不需要调用acceptConnection//若需要确保服务端始终为组所有者(而非由系统自动协商决定),需手动调用 createGroup()acceptConnection();}}}
};/*** 服务端步骤1* 注册广播监听 连接状态变化(监听到客户端连接请求)*/
private void serverRegisterWifiListen() {// 服务端注册接收器IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);MyApplication.getAppContext().registerReceiver(p2pConnectReceiver, intentFilter);
}
2.2 接受连接创建群组
服务端如果接受连接后调用 WifiP2pManager.createGroup() 创建群组(作为群组所有者)
若设备需自动接受连接(如预配置场景),可直接调用 createGroup() 或响应连接请求
/*** 服务端步骤2* 服务端如果接受连接后调用 WifiP2pManager.createGroup() 创建群组(作为群组所有者)* 若设备需自动接受连接(如预配置场景),可直接调用 createGroup() 或响应连接请求*/
private void acceptConnection() {WifiP2pManager manager = (WifiP2pManager) MyApplication.getAppContext().getSystemService(Context.WIFI_P2P_SERVICE);WifiP2pManager.Channel channel = manager.initialize(MyApplication.getAppContext(), getMainLooper(), null);manager.createGroup(channel, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {//群组创建成功,被连接方成为群组所有者//此时客户端会收到WIFI_P2P_PEERS_CHANGED_ACTION广播,且可以获取到当前服务端的WifiP2pDevice对象//服务端创建socket 等待连接createServiceSocket();}@Overridepublic void onFailure(int reason) {// 处理失败逻辑(如显示错误提示)}});
}
2.3 创建服务端socket 和客户端通信
创建服务端socket等待客户端连接
/*** 服务端步骤3* 创建服务端socket等待客户端连接*/
private void createServiceSocket() {ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(8888);Socket clientSocket = serverSocket.accept();//连接之后就可以获取输入输出流进行 读写操作了InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream();} catch (IOException e) {throw new RuntimeException(e);}
}
相关文章:
Android 应用wifi direct连接通信实现
一. 打开Wi-Fi direct 1.必须启用Wi-Fi功能:在设备设置中开启Wi-Fi主开关(即使未连接路由器) 关闭冲突功能:若已开启「热点共享」或连接到其他Wi-Fi网络,需先关闭相关功能以避免硬件占. <!-- Wi-Fi Direct 核心权限…...
AI写代码工具分享:Cursor 高效使用攻略与实战秘籍
写在前面 在软件开发领域,效率和生产力是永恒的追求。集成开发环境(IDE)作为开发者的核心工具,其能力直接影响着开发速度和质量。近年来,人工智能(AI)的浪潮席卷了各个行业,编程领域也不例外。Cursor IDE 正是这股浪潮中的佼佼者,它以 AI-First 的理念,在广受欢迎的…...
关于viewpager常见的泄漏
在一个页面中 如果有用到tab,有需要进行fragment的切换,经常就看到了private var fragments arrayListOf<Fragment>()private fun initFragment() {arguments?.let {hopeToPosition it.getInt(IntentConstant.MAIN_PAGE_GO, 0)workoutType it.…...
vue3专题1------父组件中更改子组件的属性
理解 Vue 3 中父组件如何引用子组件的属性是一个很重要的概念。 这里涉及到 defineExpose 和 ref 这两个关键点。 方法:使用 defineExpose 在子组件中暴露属性,然后在父组件中使用 ref 获取子组件实例并访问暴露的属性。 下面我将详细解释这个过程&…...
代谢组数据分析(二十四):基于tidymass包从质谱原始数据到代谢物注释结果的实践指南
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据准备原始数据处理导入massDataset数据对象交互图数据探索更新样本表格信息峰分布情况缺失值情况数据清洗数据质量评估去除噪声代谢特征过滤立群样本填补缺失值数据标准化…...
Java使用javacv实现的多种音视频格式播放器
一、前言 最近写了一款图形界面版的音视频播放器,可以支持多种音视频格式的播放,比如MP4、avi、mkv、flv、MP3、ogg、wav等多种格式,非常好用,可以本地打开多种格式音视频。 二、实现 1.通过引入javacv相关依赖实现,如…...
csdn教程
hello,大家好,我是黑名单小羊,今天给大家分享一下csdn怎么换背景喵~ 成品: 首先,点击管理博文喵~ 然后,把任务栏往下翻喵~ 你就会看见博客设置,点击喵~ 再点击等级,如果你开通了 vip࿰…...
React 第三十三节 ReactRouter 中 useSearchParams 使用详解及注意事项
一、useSearchParams 定义 基本用法 定义:用于返回当前 URL 的 URLSearchParams 的元组和用于更新它们的函数。设置 search params 会导致导航。 import { useSearchParams } from react-router-dom export default function orderCenter() {const [searchParams,…...
@EnableAsync+@Async源码学习笔记之四
接上一篇,我们进入 AsyncAnnotationAdvisor 的分析,源码如下: package org.springframework.scheduling.annotation;import java.lang.annotation.Annotation; import java.util.HashSet; import java.util.LinkedHashSet; import java.util…...
【java实现+4种变体完整例子】排序算法中【快速排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是快速排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、快速排序基础实现 原理 通过分治法选择一个基准元素(pivot),将数组分为两部分: 左边元素均小于…...
MAUI项目iOS应用以进 App Store 分发
目录 一.通过Visual Studio分发应用1. 登录Apple 开发者帐户到 Visual Studio2.创建分发证书和配置文件3. 分发应用4. 在App Store Connect 中创建应用程序记录5. 如果你想使用mac发布应用 一.通过Visual Studio分发应用 1. 登录Apple 开发者帐户到 Visual Studio 首先我们要…...
Linux——firewalld防火墙(笔记)
目录 一:Firewalld防火墙的概述 (1)firewalld简介 (2)firewalld&iptables的关系 (3)firewalld与iptables service的区别 1. 规则管理方式 2. 默认策略与设计逻辑 3. 配置文…...
SICAR标准功能块 FB1514 “Robot_request_FB”
1、功能块截图 2、引脚功能描述 输入引脚: EN:使能输入,控制功能块运行。PLANT_IDENTIFIER:工厂或设备标识符(如 #FWO10_RO1_SEGM_201),用于标识操作对象。OPMODE_USER:操作模式输入(用户模式)。INTERFACE_OUT:连接系统数据库的操作模式接口(SYSTEM_DB.OPmode[2].U…...
vue3 watch和watchEffect 的用法和区别
在 Vue 3 里,watch 和 watchEffect 都是用于响应式数据变化的 API,但它们在使用方法和应用场景上存在差异。下面详细介绍它们的用法和区别。 用法 watch watch 用于监听特定的响应式数据源,当数据源发生变化时,会执行相应的回调…...
Linux | I.MX6ULL 使用 Yocto 文件系统开发 QT
01 Yocto 文件系统默认支持了 QT,那么我们要怎么在 Yocto 文件系统来运行我们的 QT 程序呢?本章节我们就来学习上在 yocto 文件系统+Ubuntu 环境来开发 QT 程序。 注意,开发环境是基于“qtcreator-3.5.1”(Ubuntu16.04.6),库文件是Qt5.5.1 02 QT 安装 (1)首先我们…...
论文阅读:2024 ICLR Workshop. A STRONGREJECT for Empty Jailbreaks
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 A STRONGREJECT for Empty Jailbreaks https://arxiv.org/pdf/2402.10260 https://github.com/dsbowen/strong_reject https://strong-reject.readthedocs.io/en/latest/ …...
数据结构实验7.2:二叉树的基本运算
文章目录 一,实验目的二,问题描述三,基本要求四,实验操作五,示例代码六,运行效果 一,实验目的 深入理解树与二叉树的基本概念,包括节点、度、层次、深度等,清晰区分二叉…...
关于一对多关系(即E-R图中1:n)中的界面展示优化和数据库设计
前言 一对多,是常见的数据库关系。在界面设计时,有时为了方便,就展示成逗号分割的字符串。例如:学生和爱好的界面。 存储 如果是简单存储,建立数据库:爱好,课程,存在一张表中。 但…...
Jenkins设置中文显示
1 安装插件 依次进入菜单: Jenkins -> Manage Jenkins -> Plugin Manager -> Avaliable 1.1 安装插件Locale plugin 1.2 安装插件Localization: Chinese(Simplified) 2 修改配置 点击菜单Manage Jenkins进入系统管理 点击菜单C…...
【MATLAB海洋专题】历史汇总
【MATLAB海洋专题】历史汇总 目录 01:海洋专题进阶教学 02:海洋数据处理 03:海洋数据下载 04:海洋配色 05:海洋专题基础教学 06: 其他基础画图 07:python 画海图专题 08:模式相关文件制作 01…...
【java实现+4种变体完整例子】排序算法中【归并排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是归并排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、归并排序基础实现 原理 通过分治法将数组分为两半,递归排序子数组,最后合并有序子数组。 代码示例 public class Mer…...
深入理解前端安全:CSRF与XSS攻击详解
引言 在Web开发的世界里,安全性就像是房子的门锁。你可能觉得它不显眼,但一旦没了它,麻烦可就大了!本文将深入探讨两大前端安全威胁:CSRF(跨站请求伪造)和XSS(跨站脚本攻击…...
spring-batch批处理框架(2)
文章目录 八、作业控制8.1 作业启动8.1.1 SpringBoot 启动8.1.2 Spring 单元测试启动8.1.3 RESTful API 启动 8.2 作业停止方案1:Step 步骤监听器方式方案2:StepExecution停止标记 8.3 作业重启8.3.1 禁止重启8.3.2 限制重启次数8.3.3 无限重启 九、Item…...
[Java · 初窥门径] Java 注释符
🌟 想系统化学习 Java 编程?看看这个:[编程基础] Java 学习手册 0x01:Java 注释符简介 在编写程序时,为了使代码易于理解,通常会为代码加一些注释。Java 注释就是用通俗易懂的语言对代码进行描述或解释&a…...
linux下C++性能调优常用的工具
性能优化的常见流程 发现问题--->定位问题--->解决问题--->验证问题 发现问题的常见工具 1.定位内存问题 top指令,发现占用内存多的线程 asan 发现内存问题。 2.定位cpu问题 top指令,发现占用cpu多的进程,线程 一般对内存和…...
MinnowBoard MAX单板UEFI BIOS代码编译教程
此教程用于UEFI EDK2代码的研究,虽然EDK2框架代码开源,但是都是在模拟器上跑仿真,差点意思,搞过嵌入式大的应该有一个共识,是骡子是马,你得把板子点亮啊。MinnowBoard MAX单板是intel10多年前发布的软硬件全…...
真实波幅策略思路
该策略是一种基于ATR(Average True Range)指标的交易策略,主要用于期货市场中的日内交易。策略的核心思想是利用ATR指标来识别市场的波动范围,并结合均线过滤来确定买入和卖出的时机。 交易逻辑思维 1. 数据准备与初始化 - 集合竞…...
【每天一个知识点】模式识别
“模式识别”是一种从数据中识别出规律、结构或趋势的技术,它广泛应用于人工智能、机器学习、图像处理、语音识别、自然语言处理等领域。简单来说,就是让计算机学会“看出”数据中的规律,比如: 从图像中识别人脸(人脸识…...
Node.js 创建 HTTP 服务端
Node.js 创建 HTTP 服务端的用法总结,内容涵盖了 核心模块、基本用法、Express 简化用法、常见场景、错误处理、以及实用小贴士。 ✅ 一、Node.js 创建 HTTP 服务的方式 Node.js 使用内置的 http 模块即可快速创建一个 Web 服务,无需额外安装依赖。 ✅ …...
深入浅出伯努利分布:从 0‑1 随机世界到统计学习基石
深入浅出伯努利分布:从 0‑1 随机世界到统计学习基石 “当你能把一个问题拆解成一系列“是/否”答案时,伯努利分布就是第一块砖。” 目录 引言:伯努利分布为何如此重要?历史回顾:从赌博到信息论形式化定义与基本表示三…...
x-ui重新申请ssl证书失败
由于某些需要我们重新申请ssl证书,x-ui自动化脚本不能强制更新,根据x-ui仓库源码: https://github.com/vaxilu/x-ui/blob/main/x-ui.sh 在申请ssl证书的地方稍作修改,得到,运行下面的脚本就可以重新申请ssl证书&#…...
Python Requests 库:从安装到精通
摘要 本文详细介绍 Python Requests 库的安装与使用,通过常见示例让你轻松掌握。 一、引言 在当今的互联网时代,与各种 Web 服务进行交互是非常常见的需求。Python 作为一门功能强大且易于学习的编程语言,提供了许多用于网络请求的库&…...
No package docker-ce available问题的解决
安装docker时提示 rootk8s-node3 ~]# yum install -y docker-ce docker-ce-cli containerd.io Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com No packag…...
SRS流媒体服务器
SRS流媒体服务器简介 SRS(Simple RTMP Server)是一个开源的流媒体服务器,主要用于直播和WebRTC场景。以下是关于SRS的关键信息: 主要特性 支持多种协议:RTMP、HTTP-FLV、HLS、WebRTC、SRT等低延迟:特别优化了WebRTC和HTTP-FLV的…...
【后端开发】Spring日志
文章目录 Spring日志日志作用日志测试日志信息日志级别日志配置配置日志级别日志持久化日志文件分割 注解的使用 Spring日志 日志作用 系统监控:可以通过日志记录这个系统的运行状态,对数据进行分析,设置不同的规则,超过阈值时进…...
Nginx 文件上传大小限制及 `client_max_body_size` 最大值详解
一、默认值与错误提示 默认值:client_max_body_size 1m; Nginx 默认允许的请求体最大为 1 MiB,超过该值会返回 413 Request Entity Too Large 错误。错误提示示例:HTTP/1.1 413 Request Entity Too Large Content-Type: text/html二、如何配…...
js day3
for循环打印* let num1prompt("要打印的层数:") for()let i0;i<num1;i){ for(let j1;j<i;j){ doucument.writeln(*) } document.writeln(<br>) } do……while循环 do{ document.writeln(i) i }while(i>20)——先执行再判…...
Nodejs数据库单一连接模式和连接池模式的概述及写法
概述 单一连接模式和连接池模式是数据库连接的两种主要方式: 单一连接模式: 优点:实现简单,适合小型应用缺点:每次请求都需要创建新连接,连接创建和销毁开销大,并发性能差,容易出…...
Java InvalidClassException 深度解析
Java InvalidClassException 深度解析 1. 异常本质 InvalidClassException 是 ObjectStreamException 的子类,在反序列化时抛出,表示序列化ID不匹配或类结构不兼容。 2. 核心触发条件 (1) serialVersionUID 不匹配 java // 版本1(原始类…...
日常开发记录
日常开发记录 1.for循环的打断特定循环示例1:跳出嵌套循环示例2:使用continue跳到外层循环 2.同步请求阻塞主线程 1.for循环的打断特定循环 看到了一段这个代码,第一次见 在 JavaScript 中,当我们需要从嵌套循环中跳出时&#x…...
MLLMs for TSAD ?
项目链接:Multimodal LLMs Advance Time Series Analysis 代码链接:https://github.com/mllm-ts/VisualTimeAnomaly 出处:ICLR 2025 一 文章动机 多模态 LLM (MLLM) 通过 “视觉” 方式处理时序的潜力仍未充分探索; 人类检测 “时序异常” 的自然方式:可视化、文本描…...
【网络原理】UDP协议
目录 一. UDP 报文格式 (1)端口号 (2)UDP长度 (3)校验和 UDP协议属于传输层协议,由操作系统内核内置 一. UDP 报文格式 UDP数据报:无连接,不可靠传输,面…...
Android 热点二维码简单示例
Android 热点二维码简单示例 一、前言 Android 原生设置有热点二维码分享功能,有些系统应用也会有这个需求。 下面看看是如何实现的。 本文是一个比较简单的内容。 二、热点二维码生成实现 1、效果 整个应用就一个普通的Activity,显示一个按钮和二维…...
面向AI时代与数字化转型关键期:中小企业IT人才储备计划研究分析
摘要 本文在为中国中小企业(SME)在当前科技产业(特别是人工智能)爆发和数字化转型加速的背景下,构建一个面向未来的IT人才储备计划框架。深入分析中国科技产业现状、AI与数字化转型对中小企业的影响、关键人才需求、招…...
cv::dnn::NMSBoxes和nms-free的比较
1. 原理与目标 cv::dnn::NMSBoxes 基于传统的非极大值抑制(NMS)算法,通过交并比(IoU)筛选重叠框,保留置信度最高的框,抑制冗余检测。支持变体如 Soft-NMS(通过降低分数而非直接抑制&…...
【开发心得】Dify部署ollama模型的坑[8]
目录 关于一体机 关于特斯拉 AI显卡与游戏显卡 总结 目前我们的私有化部署已经来到了32B的大模型,场景落地了。 在继续评估之前,来说点儿关于硬件的坑。 关于一体机 市面上,一体机很火,不怀疑一体机的算力,也不…...
matlab论文图一的地形区域图的球形展示Version_1
matlab论文图一的地形区域图的球形展示Version_1 图片 此图来源于: ![Jieqiong Zhou, Ziyin Wu, Dineng Zhao, Weibing Guan, Chao Zhu, Burg Flemming, Giant sand waves on the Taiwan Banks, southern Taiwan Strait: Distribution, morphometric relationship…...
velocity模板引擎
文章目录 学习链接 学习链接 velocity模板引擎 freemarker模板引擎 thymleaf模板引擎 Apache Velocity Project 官网 Velocity Engine基础 Velocity 模板引擎使用介绍 黑马程序员Java进阶VelocityTools全套教程...
【Docker项目实战】使用Docker部署NotepadMX笔记本工具
【Docker项目实战】使用Docker部署NotepadMX笔记本工具 一、NotepadMX介绍1.1 工具简介1.2 主要特点 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载NotepadMX镜像五、部署…...
边沿耦合与宽边耦合的串扰
边沿耦合与宽边耦合的串扰 我们知道,如果两条走线位于同一层,由于耦合两条线之间会存在串扰。如果PCB层叠中有相邻的信号层,那么同样存在耦合,这两个相邻信号层的走线之间也会存在串扰。同层走线之间的耦合称为边沿耦合࿰…...