当前位置: 首页 > news >正文

aioice里面candidate固定UDP端口测试

环境:

aioice0.9.0

问题描述:

aioice里面candidate固定UDP端口测试

解决方案:

/miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice

import hashlib
import ipaddress
import random
from typing import Optional
import logging# 配置日志级别,默认为 INFO,可改为 DEBUG 查看详细调试信息
logging.basicConfig(level=logging.INFO)class Candidate:"""表示一个 ICE 候选者,包括固定端口功能和多种优化。"""FIXED_PORT = 59990  # 定义固定端口def __init__(self,foundation: str,component: int,transport: str,priority: int,host: str,port: Optional[int] = None,  # 端口可以是 None,将被替换为固定端口type: str = "host",related_address: Optional[str] = None,related_port: Optional[int] = None,tcptype: Optional[str] = None,generation: Optional[int] = None,) -> None:"""初始化候选者对象,并强制使用固定端口。"""self.foundation = foundationself.component = componentself.transport = transportself.priority = priorityself.host = hostself.port = self.get_fixed_port() if port is None else port  # 设置为固定端口或提供的端口self.type = typeself.related_address = related_addressself.related_port = related_portself.tcptype = tcptypeself.generation = generation# 输出候选者信息到日志logging.info(f"创建候选者:host={self.host}, port={self.port}, type={self.type}")@classmethoddef get_fixed_port(cls) -> int:"""返回固定端口值,并记录日志。"""fixed_port = cls.FIXED_PORTlogging.debug(f"Returning fixed port: {fixed_port}")return fixed_port@classmethoddef from_sdp(cls, sdp: str):"""从 SDP 字符串中解析一个 ICE 候选者。示例 SDP:'6815297761 1 udp 659136 192.168.1.1 12345 typ host'"""bits = sdp.split()if len(bits) < 8:raise ValueError("SDP 描述字段不足")kwargs = {"foundation": bits[0],"component": int(bits[1]),"transport": bits[2],"priority": int(bits[3]),"host": bits[4],"port": cls.get_fixed_port(),  # 使用固定端口"type": bits[7],}# 提取 SDP 中的附加信息for i in range(8, len(bits), 2):if bits[i] == "raddr":kwargs["related_address"] = bits[i + 1]elif bits[i] == "rport":kwargs["related_port"] = int(bits[i + 1])elif bits[i] == "tcptype":kwargs["tcptype"] = bits[i + 1]elif bits[i] == "generation":kwargs["generation"] = int(bits[i + 1])return cls(**kwargs)def to_sdp(self) -> str:"""返回一个适用于 SDP 的字符串表示形式。"""sdp = f"{self.foundation} {self.component} {self.transport} {self.priority} {self.host} {self.port} typ {self.type}"if self.related_address is not None:sdp += f" raddr {self.related_address}"if self.related_port is not None:sdp += f" rport {self.related_port}"if self.tcptype is not None:sdp += f" tcptype {self.tcptype}"if self.generation is not None:sdp += f" generation {self.generation}"return sdpdef can_pair_with(self, other) -> bool:"""判断本地候选者是否可以与远程候选者配对。配对条件:- 组件相同- 使用相同的传输协议- IP 地址版本相同"""a = ipaddress.ip_address(self.host)b = ipaddress.ip_address(other.host)return (self.component == other.componentand self.transport.lower() == other.transport.lower()and a.version == b.version)def __repr__(self) -> str:"""返回候选者的字符串表示形式。"""return f"Candidate({self.to_sdp()})"# 工具函数部分
def candidate_foundation(candidate_type: str, candidate_transport: str, base_address: str) -> str:"""计算候选者的 Foundation(基础标识符)。"""key = f"{candidate_type}|{candidate_transport}|{base_address}"return hashlib.md5(key.encode("ascii")).hexdigest()def candidate_priority(candidate_component: int, candidate_type: str, local_pref: int = 65535) -> int:"""计算候选者优先级。优先级从高到低的顺序为:host > srflx > relay。"""type_preferences = {"host": 126,   # Host 类型优先级最高"srflx": 100,  # Server reflexive 类型"relay": 0,    # Relay 类型优先级最低}type_pref = type_preferences.get(candidate_type, 0)return (1 << 24) * type_pref + (1 << 8) * local_pref + (256 - candidate_component)# 测试代码部分
if __name__ == "__main__":# 测试创建候选者candidate = Candidate(foundation="1",component=1,transport="udp",priority=candidate_priority(1, "host"),host="192.168.168.77",  # 使用你的本地 IP 地址type="host",)print(candidate)  # 打印候选者信息print(candidate.to_sdp())  # 打印 SDP 字符串# 测试从 SDP 创建候选者sdp_example = "1 1 udp 100 192.168.1.1 12345 typ host"candidate_from_sdp = Candidate.from_sdp(sdp_example)print(candidate_from_sdp)  # 打印解析后的候选者print(candidate_from_sdp.to_sdp())  # 打印 SDP 字符串# 模拟 WebRTC 应用程序创建多个候选者candidates = [Candidate(foundation=str(i),component=1,transport="udp",priority=candidate_priority(1, "host"),host=f"192.168.1.{i % 255}",  # 使用不同的 IP 地址模拟不同设备type="host",)for i in range(1, 6)]for c in candidates:print(c)

运行没有成功

在这里插入图片描述

相关文章:

aioice里面candidate固定UDP端口测试

环境&#xff1a; aioice0.9.0 问题描述&#xff1a; aioice里面candidate固定UDP端口测试 解决方案&#xff1a; /miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice import hashlib import ipaddress import random from typing import Optional import…...

Git使用教程-分支使用/合并分支提交

Git使用教程-分支使用 文章目录 Git使用教程-分支使用一、分支&#xff08;branch&#xff09;的基本操作&#xff1a;二、查看分支&#xff1a;参考 一、分支&#xff08;branch&#xff09;的基本操作&#xff1a; git clone https://.git git status …...

单元测试使用记录

什么是单元测试 简单来说就是对一个类中的方法进行测试&#xff0c;对输出的结果检查判断是否符合预期结果 但是在多年的工作中&#xff0c;从来没有哪个项目中真正系统的用到了单元测试&#xff0c;因此对它还是很陌生的&#xff0c;也就造成更加不会在项目中区使用它。 如何…...

LabVIEW实时信号采集与频谱分析

系统通过LabVIEW与PXIe硬件结合&#xff0c;实现高精度模拟信号的实时采集、频谱分析与可视化显示。核心功能包括采样率配置、快速傅里叶变换&#xff08;FFT&#xff09;、功率谱图生成及动态缩放调整&#xff0c;同时支持信号平均与噪声抑制。系统设计灵活&#xff0c;适用于…...

OpenCV(python)从入门到精通——运算操作

加法减法操作 import cv2 as cv import numpy as npx np.uint8([250]) y np.uint8([10])x_1 np.uint8([10]) y_1 np.uint8([20])# 加法,相加最大只能为255 print(cv.add(x,y))# 减法&#xff0c;相互减最小值只能为0 print(cv.subtract(x_1,y_1))图像加法 import cv2 as…...

基础2:值类型与右值引用

1.函数返回 在讲解右值之前&#xff0c;要知道下面这个函数要进行几次拷贝以及为什么&#xff1f; int get_x() {int x 20;return x; }int aget_x(); 答案&#xff1a;两次 # 第一次 int tmpa; # 第二次 int xtmp;2.左值与右值 &#x1f34f;2.1 能取地址操作的就是左值 …...

GitHub年度报告发布!Python首次超越JavaScript

全球开发者数量激增&#xff0c;GenAI 项目呈爆炸式增长趋势&#xff0c;推动编程语言的应用格局也发生了巨大变化&#xff0c;最新的 GitHub Octoverse 报告来了&#xff01; 1、Python 首次超越 JavaScript&#xff0c;成为 GitHub 平台最顶级编程语言 不同于流传“AI 即将取…...

EdgeX Message Bus 消息总线

EdgeX Message Bus 消息总线 一、概述 EdgeX MessageBus 内部消息总线,用于 EdgeX 服务之间的内部通信。 EdgeX 服务是指来自 EdgeX 的任何核心/支持/应用程序/设备服务或使用 EdgeX SDK 构建的任何自定义应用程序或设备服务。 EdgeX MessageBus 用于内部 EdgeX 服务与服务之间…...

【JavaEE进阶】关于Maven

目录 &#x1f334;什么是Maven &#x1f332;为什么要学Maven &#x1f38d;创建一个Maven项目 &#x1f384;Maven核心功能 &#x1f6a9;项目构建 &#x1f6a9;依赖管理 &#x1f38b;Maven Help插件 &#x1f340;Maven 仓库 &#x1f6a9;本地仓库 &#x1f6a…...

YOLOv9-0.1部分代码阅读笔记-autoanchor.py

autoanchor.py utils\autoanchor.py 目录 autoanchor.py 1.所需的库和模块 2.def check_anchor_order(m): 3.def check_anchors(dataset, model, thr4.0, imgsz640): 4.def kmean_anchors(dataset./data/coco128.yaml, n9, img_size640, thr4.0, gen1000, verboseTrue…...

Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)

electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…...

谷歌浏览器 安装谷歌浏览器特定版本后禁止自动更新

问题描述 我们通过离线安装谷歌浏览器后&#xff0c;第一次打开浏览器时会默认下载最新版本&#xff0c;等到我们重启浏览器后它会自动更新。在项目中为了能固定浏览器版本&#xff0c;所以要禁止谷歌浏览器的更新&#xff0c;网上找了好多方法都没用&#xff0c;自己摸索出来…...

Linux计算时间差

Linux计算时间差 1、Linux计算时间差2、时间差的应用 1、Linux计算时间差 在Linux中&#xff0c;计算时间差通常是为了统计、监控或调试。时间差可以用来衡量任务执行的时间&#xff0c;或者两个事件之间的间隔。例如&#xff0c;响应时间、执行时间、定时任务与延时处理等 以…...

Python的3D可视化库【vedo】2-5 (plotter模块) 坐标转换、场景导出、添加控件

文章目录 4 Plotter类的方法4.7 屏幕和场景中的坐标点转换4.7.1 屏幕坐标转为世界坐标4.7.2 世界坐标转为屏幕坐标4.7.3 屏幕坐标取颜色 4.8 导出4.8.1 导出2D图片4.8.2 导出3D文件 4.9 添加控件4.9.1 添加内嵌子窗口4.9.2 添加选择区4.9.3 添加比例尺4.9.4 为对象添加弹出提示…...

【VUE】13、安装nrm管理多个npm源

nrm&#xff08;npm registry manager&#xff09;是一个 npm 源管理器&#xff0c;它允许用户快速地在不同的 npm 源之间进行切换&#xff0c;以提高包管理的速度和效率。以下是对 nrm 使用的详细介绍&#xff1a; 1、安装nrm 在使用 nrm 之前&#xff0c;需要先确保已经安装…...

【SQL/MySQL 如何使用三种触发器】SQL语句实例演示

触发器介绍 – 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义的SQL语句集合。 – 使用别名OLD和NEW来引用触发器中发生变化的记录内容&#xff0c;这与其他的数据库是相似的。现在触发器还只…...

Docker容器五种网络驱动模式详解

Docker 网络用于在容器之间以及容器与外部网络之间提供通信功能。它允许容器在隔离的网络环境中运行&#xff0c;同时也能根据需要与其他容器或外部网络进行交互。通过使用网络驱动&#xff0c;Docker 可以创建不同类型的网络&#xff0c;以满足各种应用场景的需求。 传统上&am…...

netfilter简介及流程图

Netfilter 是 Linux 内核中用于网络包过滤和操作的框架&#xff0c;由 Rusty Russell 于1998年创立&#xff0c;旨在改进旧的 ipchains 和 ipfwadm 实现。它采用模块化设计&#xff0c;具有良好可扩展性&#xff0c;并在2000年3月合并进Linux 2.3.x内核版本。 Netfilter的主要…...

Vue 前端代码规范

在 Vue 前端开发中&#xff0c;遵循代码规范可以提高代码的可读性、可维护性和团队协作效率。以下是一些详细的 Vue 前端代码规范&#xff0c;涵盖了多个方面&#xff1a; ### 1. **项目结构** - **目录结构**:- src/ 目录下应包含 components/、views/、store/、router/、ass…...

JAVA:组合模式(Composite Pattern)的技术指南

1、简述 组合模式(Composite Pattern)是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。它使客户端对单个对象和组合对象的使用具有一致性。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什么是组合模式 组合模式…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...