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

Flutter封装Coap

前言

我们根据Coap数据通信流程写一个公共组件,用户只要在原本的组件外嵌套这个公共组件就可以使用Coap的功能,这样做更加的方便便捷。

具体步骤

封装一个udp函数

  • 创建一个工厂函数,工厂函数初始化时监听广播数据
  • 发送广播函数:入参有发送的内容,目标的ip地址(默认是255.255.255.255)、ip端口(默认端口为1234)
  • import 'dart:async';
    import 'dart:io';import 'package:my_app/common/value/serve.dart';class UDPClient {factory UDPClient() => _getInstance();static UDPClient get instance => _getInstance();static UDPClient? _instance;late RawDatagramSocket udpSocket;final StreamController<List<int>> _getDataController =StreamController.broadcast(); //监听数据流的控制器StreamController get getDataController => _getDataController; //获取数据流的控制器//初始化static UDPClient _getInstance() {_instance ??= UDPClient._internal();return _instance!;}//创建一个UDPClient实例UDPClient._internal() {(InternetAddress.lookup('pool.ntp.org')).then((value) {var serverAddress = value.first;// print("获取到的数据:----${serverAddress.type}-----${InternetAddress.anyIPv4}");RawDatagramSocket.bind(serverAddress.type == InternetAddressType.IPv6? InternetAddress.anyIPv6: InternetAddress.anyIPv4,0).then((value) {udpSocket = value;udpSocket.listen(handleUDPDatagram);udpSocket.broadcastEnabled = true;});});}//断开连接void disconnectFromUDP() {udpSocket.close();_instance = null;}//监听到的数据void handleUDPDatagram(RawSocketEvent event) {if (event == RawSocketEvent.read) {Datagram? datagram = udpSocket.receive();if (datagram != null) {List<int> data = datagram.data;// print("广播接收内容:$data");_getDataController.sink.add(data);}}}//发送数据void sendUDPData(List<int> data, {String ip = '255.255.255.255',int port = UDP_PORT,}) {print("${InternetAddress(ip)}");udpSocket.send(data, InternetAddress(ip), port);}
    }

封装一个Coap函数

  • 创建一个Coap的工厂函数,可以传入ip地址和端口号
  • 如果ip、port改变了则会创建一个工厂函数
  • 封装Get、post、postBytes、put函数
import 'dart:async';import 'package:coap/coap.dart';
import 'package:my_app/common/value/serve.dart';
import 'package:typed_data/typed_data.dart';import '../value/coap_config.dart';class CoapClientUtil {factory CoapClientUtil({String? host, int? port}) =>_getInstance(host: host, port: port);static CoapClientUtil get instance => _getInstance(host: _currentHost);static CoapClientUtil? _instance;static CoapClient? client;static String _currentHost = COAP_API_URL;static int _currentPort = COAP_PORT;static CoapClientUtil _getInstance({String? host, int? port}) {String localHost = host ?? COAP_API_URL;int localPort = port ?? COAP_PORT;if (_instance == null ||_currentHost != localHost ||_currentPort != localPort) {_instance = CoapClientUtil._internal(localHost, localPort);_currentHost = localHost;_currentPort = localPort;}return _instance!;}CoapClientUtil._internal(String host, int port) {CoapConfig conf = CoapConfig();var baseUri = Uri(scheme: 'coap', host: host, port: port);client = CoapClient(baseUri, config: conf);}// 发送GET请求Future<CoapResponse?> get(final String path, {final CoapMediaType? accept,final bool confirmable = true,final List<Option<Object?>>? options,final bool earlyBlock2Negotiation = false,final int maxRetransmit = 0,final CoapMulticastResponseHandler? onMulticastResponse,}) async {try {var response = await client!.get(path,accept: accept,confirmable: confirmable,options: options,earlyBlock2Negotiation: earlyBlock2Negotiation,maxRetransmit: maxRetransmit,onMulticastResponse: onMulticastResponse,);return response;} catch (e) {print("错误的内容:${e}");return null;}}// 发送POST请求Future<CoapResponse?> post(final String path, {required final String payload,final CoapMediaType? format,final CoapMediaType? accept,final bool confirmable = true,final List<Option<Object?>>? options,final bool earlyBlock2Negotiation = false,final int maxRetransmit = 0,final CoapMulticastResponseHandler? onMulticastResponse,}) async {try {var response = await client!.post(path,payload: payload,format: format,accept: accept,confirmable: confirmable,options: options,earlyBlock2Negotiation: earlyBlock2Negotiation,maxRetransmit: maxRetransmit,onMulticastResponse: onMulticastResponse,);return response;} catch (e) {print("错误的内容:${e}");return null;}}/// 发送post请求,且携带的参数为二进制数组/// 需要注意的是如果返回的数据也是二进制数组则打印的response中的Payload为<<<< Payload incomplete >>>>>这是因为展示的payload走的是res.payloadString,看下发源码可知,转换成utf8抛出异常了,我们只要拿数据的时候使用res.payload即可/// String get payloadString {///   final payload = this.payload;///   if (payload.isNotEmpty) {///     try {///       final ret = utf8.decode(payload);///       return ret;///     } on FormatException catch (_) {///       // The payload may be incomplete, if so and the conversion///       // fails indicate this.///       return '<<<< Payload incomplete >>>>>';///     }///   }///   return '';/// }Future<CoapResponse?> postBytes(final String path, {required final Uint8Buffer payload,final CoapMediaType? format,final CoapMediaType? accept,final bool confirmable = true,final List<Option<Object?>>? options,final bool earlyBlock2Negotiation = false,final int maxRetransmit = 0,final CoapMulticastResponseHandler? onMulticastResponse,}) async {try {var response = await client!.postBytes(path,payload: payload,format: format,accept: accept,confirmable: confirmable,options: options,earlyBlock2Negotiation: earlyBlock2Negotiation,maxRetransmit: maxRetransmit,onMulticastResponse: onMulticastResponse,);return response;} catch (e) {print("错误的内容:${e}");return null;}}// 发送PUT请求Future<CoapResponse?> put(final String path, {required final String payload,final CoapMediaType? format,final CoapMediaType? accept,final bool confirmable = true,// final List<Uint8Buffer>? etags,final MatchEtags matchEtags = MatchEtags.onMatch,final List<Option<Object?>>? options,final bool earlyBlock2Negotiation = false,final int maxRetransmit = 0,final CoapMulticastResponseHandler? onMulticastResponse,}) async {try {var response = await client!.put(path,payload: payload,format: format,accept: accept,confirmable: confirmable,// etags: etags,matchEtags: matchEtags,options: options,earlyBlock2Negotiation: earlyBlock2Negotiation,maxRetransmit: maxRetransmit,onMulticastResponse: onMulticastResponse,);return response;} catch (e) {print("错误的内容:${e}");return null;}}close() {client?.close();}disply() {client?.close();client = null;_instance = null;}
}

封装一个通用组件

  • 传参内容:mac地址、Widget、key
    • mac地址:因为通信协议中地址需要使用mac地址
    • Widget:要展示的界面
    • key:根据key值调用封装组件中的函数
  • 初始化逻辑:Coap数据通信流程
  • 如果要进行界面跳转
    • 调用setDispose,关闭coap、udp等信息
    • 同步界面跳转
    • 创建一个定时器,定时器中包含初始化udp、coap
import 'dart:async';
import 'dart:convert';import 'package:coap/coap.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'package:my_app/common/utils/coap.dart';
import 'package:my_app/common/utils/fun.dart';
import 'package:my_app/common/utils/udp.dart';
import 'package:my_app/pages/device_settings/time_switch_addtime/bottom_picker.dart';
import 'package:typed_data/typed_data.dart';///macStr 是测试的,后期要改
class CoapClientPackage extends StatefulWidget {const CoapClientPackage({super.key,this.mac = '11:22:33:44:55:66',required this.widget,});final String mac;final Widget widget;@overrideState<CoapClientPackage> createState() => CoapClientPackageState();
}class CoapClientPackageState extends State<CoapClientPackage> {StreamSubscription? _networkStatusSubscription; //监听设备的网络类型CoapClientUtil? coapClient;//udp获取到的数据UDPClient? udpClient;StreamSubscription? _sacnSubscription;bool isCoap = false;Timer? timer;@overridevoid initState() {super.initState();// initUDP();// //监听移动终端联网方式// _listenNetworkStatus();getinitState();}getinitState() {print("初始化");initUDP();//监听移动终端联网方式_listenNetworkStatus();}setDispose() {print("移除");_networkStatusSubscription?.cancel(); //取消监听coapClient?.disply(); //关闭coap连接udpClient?.disconnectFromUDP(); //关闭udp连接_sacnSubscription?.cancel(); //取消监听timer?.cancel(); //取消定时器}@overridevoid dispose() {setDispose();super.dispose();}initUDP() {udpClient = UDPClient.instance;_sacnSubscription?.cancel();_sacnSubscription = udpClient?.getDataController.stream.listen((data) {if (data is List<int>) {print("这是哪个数据:$data");setState(() {isCoap = false;});switch (data[2]) {case 129: //if (data[0] == 170 && data.length == 15 && data[14] == 85) {//将从data[7]开始截取数组// List macArr = data.sublist(3, 9); //截取mac地址// //将十进制数组转换成十六进制mac并添加:// String macStr =//     macArr.map((e) => e.toRadixString(16).padLeft(2, '0')).join(':');// print("macArr:$macArr -----${macStr}");timer?.cancel();String serverIp ="${data[9]}.${data[10]}.${data[11]}.${data[12]}";print("获取到了ip地址:$serverIp");//创建一个coap服务coapClient = CoapClientUtil(host: serverIp,port: 5683,);setState(() {isCoap = true;});}break;default:}}});}//监听移动终端联网方式void _listenNetworkStatus() async {_networkStatusSubscription?.cancel(); //取消之前的监听bool isWif = await isWifi();if (isWif) {isWifiAfter();} else {_networkStatusSubscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {if (result == ConnectivityResult.wifi) {//当前的类型是WiFiisWifiAfter();} else {setState(() {isCoap = false;});}});}}isWifiAfter() {print('当前的类型是WiFi');//这里需要在发送mac地址,这里使用模拟的数据String macStr = widget.mac;// String macStr = '11:22:33:44:55:66';//将macStr装换成List<int>List<int> macArr =macStr.split(':').map((e) => int.parse(e, radix: 16)).toList();List<int> sendData = sendCoapData('01', macArr);print("-----=====------macArr:${sendData},macStr");Timer(Duration(seconds: 1), () {udpClient?.sendUDPData(sendData, port: 1234);});timer?.cancel();timer = Timer.periodic(Duration(seconds: 3), (timer) {if (udpClient != null) {try {udpClient?.sendUDPData(sendData, port: 1234);} catch (e) {print("发送出现了问题:${e}");}} else {print("为空");}});}//发送coap请求Future<CoapResponse?> sendCoap(String payload) async {String macStr = widget.mac;// String macStr = '11:22:33:44:55:66';var res = await coapClient?.post('/api/v1/$macStr/rpc',accept: CoapMediaType.applicationJson, payload: payload);return res;}//发送透传数据Future<CoapResponse?> sendTranCoap(String payload) async {String macStr = widget.mac;// String macStr = '11:22:33:44:55:66';var res = await coapClient?.post('/api/v1/$macStr/trans',accept: CoapMediaType.applicationJson, payload: payload);return res;}//发送透传数据Future<CoapResponse?> sendTranCoap1(Uint8Buffer payload) async {String macStr = widget.mac;// String macStr = '11:22:33:44:55:66';var res = await coapClient?.postBytes('/api/v1/$macStr/trans',accept: CoapMediaType.applicationJson, payload: payload);return res;}@overrideWidget build(BuildContext context) {return widget.widget;}
}

相关文章:

Flutter封装Coap

前言 我们根据Coap数据通信流程写一个公共组件&#xff0c;用户只要在原本的组件外嵌套这个公共组件就可以使用Coap的功能&#xff0c;这样做更加的方便便捷。 具体步骤 封装一个udp函数 创建一个工厂函数&#xff0c;工厂函数初始化时监听广播数据发送广播函数&#xff1a…...

openharmony napi调试笔记

一、动态库的编译 第一种openharmony交叉编译链配置方法 使用的编译环境是ubuntu20.04 1、使用vscode配置openharmony sdk交叉编译环境 首先下载openharmony的sdk&#xff0c;如native-linux-x64-4.1.7.5-Release.zip 解压后native目录下就是交叉编译用的sdk 在要编译的源…...

C++数据结构与算法

C数据结构与算法 1.顺序表代码模版 C顺序表模版 #include <iostream> using namespace std; // 可以根据需要灵活变更类型 #define EleType intstruct SeqList {EleType* elements;int size;int capacity; };// Init a SeqList void InitList(SeqList* list, int capa…...

MATLAB深度学习(六)——LSTM长短期神经网络原理与应用

LSTM的应用可以参见一个相当好的视频&#xff1a;小车倒立摆最优控制教程 - Part1 Simulink Simscape Multibody仿真建模_哔哩哔哩_bilibili 6.1 序列建模——循环神经网络 循环神经网络RNN是一类专门用于处理序列性数据x&#xff0c;&#xff0c;xn的神经网络结构&#xff0c…...

利用Python爬虫获得1688按关键字搜索商品:技术解析

在电商领域&#xff0c;1688作为中国领先的B2B电商平台&#xff0c;其商品搜索功能对于商家来说具有极高的价值。通过获取搜索结果&#xff0c;商家可以更好地了解市场趋势&#xff0c;优化产品标题&#xff0c;提高搜索排名。本文将介绍如何使用Python编写爬虫&#xff0c;以获…...

Ajax学习笔记,第一节:语法基础

Ajax学习笔记&#xff0c;第一节&#xff1a;语法基础 一、概念 1、什么是Ajax 使用浏览器的 XMLHttpRequest 对象 与服务器通信2、什么是axios Axios是一个基于Promise的JavaScript库&#xff0c;支持在浏览器和Node.js环境中使用。相较于Ajax&#xff0c;Axios提供了更多…...

java基础知识(常用类)

目录 一、包装类(Wrapper) (1)包装类与基本数据的转换 (2)包装类与String类型的转换 (3)Integer类和Character类常用的方法 二、String类 (1)String类介绍 1)String 对象用于保存字符串,也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如:&quo…...

修改bag的frame_id的工具srv_tools

在使用数据集导航或者建图时&#xff0c;bag中的点云或者其他话题的frame_id没有和需要的对应 1.创建工作空间 2.cd xxxx/src 3.git clone https://github.com/srv/srv_tools.git cd .. catkin_make source ./devel/setup.bash rosrun bag_tools change_frame_id.py -t /要改…...

浅谈丨功能安全测试,汽车的守护者

随着新能源汽车迅猛的发展&#xff0c;各类车型频频面世&#xff0c;同时辅助驾驶/自动驾驶等智驾功能也在不断迭代&#xff0c;使得整个汽车系统的复杂性越来越高&#xff0c;最终导致消费者不得不对如今的汽车质量和安全性提出质疑。 如何打破质疑&#xff1f; 那就不得不搬…...

了解M有SQL索引

目录 索引介绍 索引的优缺点 索引底层数据结构选型 Hash表 二叉查找树(BST) AVL树 红黑树 B 树& B树 索引类型总结 主键索引(Primary Key) 二级索引 聚簇索引与非聚簇索引 聚簇索引(聚集索引) 聚簇索引介绍 聚簇索引的优缺点 非聚簇索引(非聚集索引) 非聚簇…...

进程间通信5:信号

引入 我们之前学习了信号量&#xff0c;信号量和信号可不是一个东西&#xff0c;不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的&#xff0c;无法预测信号可以临时保存下来&#xff0c;之后再处理信号是异步发送的…...

Excel把其中一张工作表导出成一个新的文件

excel导出一张工作表 一个Excel表里有多个工作表&#xff0c;怎么才能导出一个工作表&#xff0c;让其生成新的Excel文件呢&#xff1f; 第一步&#xff1a;首先打开Excel表格&#xff0c;然后选择要导出的工作表的名字&#xff0c;比如“Sheet1”&#xff0c;把鼠标放到“She…...

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

Two-Step Vertification required&#xff1a; Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录&#xff0c;也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录&#xff0c;算一次会话…...

微信小程序下拉刷新与上拉触底的全面教程

微信小程序下拉刷新与上拉触底的全面教程 引言 在微信小程序的开发中,用户体验至关重要。下拉刷新和上拉触底是提高用户交互体验的重要功能,能够让用户轻松获取最新数据和内容。本文将详细介绍这两个功能的实现方式,结合实际案例、代码示例和图片展示,帮助开发者轻松掌握…...

第三十九章:Grafana 概述、Docker安装与验证指南

Grafana 概述、Docker安装与验证指南 一、Grafana 概述 Grafana 是一个跨平台的开源可视化分析工具,是目前网络架构和应用分析中最流行的时序数据展示工具。它主要用于大规模指标数据的可视化展示,并支持多种数据源和丰富的可视化插件。Grafana 使用Go语言开发,具备数据监…...

使用go实现流式输出

流式输出的深度剖析 之前一直在调用openai的key&#xff0c;只是照着文档进行流式调用&#xff0c;也只知其确是流式与api有所不同&#xff0c;而未成体系深究其实现原理。 就以openai的官方流式输出为切入。 概述 流式输出&#xff08;Streaming Output&#xff09;是 HTT…...

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议&#xff1a; webSocket协议&#xff1a; 1.2WebSocket协议&#xff1a; 1.3客户端&#xff08;浏览器&#xff09;实现 1.3.2 WebSocket对象的相关事宜&#xff1a; 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…...

元组部分介绍

元组部分 元组的基本格式与特点 #1.元组 #基本格式&#xff1a; 元组名&#xff08;元素1&#xff0c;元素2&#xff0c;元素3&#xff09; #注意&#xff1a;所有元素包含在小括号内&#xff0c;元素与元素之间用逗号隔开&#xff0c;可以是不同的元素类型 #注意&#xff1a…...

mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法

mfc100u.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义&#xff0c;这…...

企业数字化转型现状

国家数字经济战略背景 2018年以来&#xff0c;国家政府不断出台政策规范我国企业数字化治理市场。2018年9月颁布《关于发展数字经济稳定并扩大就业的指导意见》&#xff0c;支持建设一批数字经济创新创业孵化机构。积极推进供应链创新与应用&#xff0c;支持构建以企业为主导。…...

数据治理:在企业数据管理中的关键角色与实现路径——《DAMA 数据管理知识体系指南》读书笔记- 第 3 章

文章目录 1. 数据治理的核心内涵与战略价值2. 数据治理的驱动因素&#xff1a;不仅仅是合规3. 数据治理的组织模型&#xff1a;选择适合企业结构的运营模式4. 实施数据治理的关键步骤&#xff1a;战略、制度和文化5. 数据治理工具的选择&#xff1a;支持业务与流程的高效管理6.…...

树莓派2装FreeBSD14.1 Raspberry Pi2 install FreeBSD14.1 00000121:error:0A000086:SSL

树莓派2代的Model B采用Broadcom BCM2836 900MHz的四核SoC&#xff0c;1GB内存&#xff0c;是新一代开拓者&#xff0c;兼容1代B。相比之下&#xff0c;树莓派2的性能比1代提升6倍&#xff0c;内存翻了一番。Raspberry Pi 2不仅能跑全系列ARM GNU/Linux发行版&#xff0c;而且支…...

uniop触摸屏维修eTOP40系列ETOP40-0050

在现代化的工业与商业环境中&#xff0c;触摸屏设备已成为不可或缺的人机交互界面。UNIOP&#xff0c;作为一个知名的触摸屏品牌&#xff0c;以其高性能、稳定性和用户友好性&#xff0c;广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而&#xff0c;即便如…...

uniapp+vue2重新进入小程序就清除缓存,设备需要重新扫码

代码 app.vue页面 <script>export default {onLaunch: function() {uni.removeStorageSync(equiId)}} </script>...

视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析

在数字科技日新月异的今天&#xff0c;视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台&#xff0c;提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务&#xff0c;广泛应用于…...

论文笔记 网络安全图谱以及溯源算法

​ 本文提出了一种网络攻击溯源框架&#xff0c;以及一种网络安全知识图谱&#xff0c;该图由六个部分组成&#xff0c;G <H&#xff0c;V&#xff0c;A&#xff0c;E&#xff0c;L&#xff0c;S&#xff0c;R>。 1|11.知识图 ​ 网络知识图由六个部分组成&#xff0c…...

抓住鸿蒙生态崛起的机遇,拥抱未来开发挑战

随着华为鸿蒙&#xff08;HarmonyOS&#xff09;的持续发展&#xff0c;鸿蒙生态正在迅速崛起&#xff0c;逐步在智能手机、智能穿戴、车载、家居等领域形成完整闭环。它不仅为开发者带来了新的机遇&#xff0c;还带来了技术上的挑战。如何抓住这些机遇并应对挑战&#xff0c;是…...

STM32WB55RG开发(5)----监测STM32WB连接状态

STM32WB55RG开发----5.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_A…...

ArcGIS应用指南:ArcGIS制作局部放大地图

在地理信息系统&#xff08;GIS&#xff09;中&#xff0c;制作详细且美观的地图是一项重要的技能。地图制作不仅仅是简单地将地理数据可视化&#xff0c;还需要考虑地图的可读性和美观性。局部放大图是一种常见的地图设计技巧&#xff0c;用于展示特定区域的详细信息&#xff…...

浅谈网络 | 传输层之TCP协议

目录 TCP 包头格式TCP 的三次握手TCP 的四次挥手TCP 的可靠性与"靠谱"的哲学TCP流量控制TCP拥塞控制 上一章我们提到&#xff0c;UDP 就像我们小时候一样简单天真&#xff0c;它相信“网之初&#xff0c;性本善&#xff0c;不丢包&#xff0c;不乱序”&#xff0c;因…...

‌Kotlin中的?.和!!主要区别

目录 1、?.和!!介绍 2、使用场景和最佳实践 3、代码示例和解释 1、?.和!!介绍 ‌Kotlin中的?.和!!主要区别在于它们对空指针的处理方式。‌ ‌?.&#xff08;安全调用操作符&#xff09;‌&#xff1a;当变量可能为null时&#xff0c;使用?.可以安全地调用其方法或属性…...

【漏洞复现】代付微信小程序系统 read.php 任意文件读取漏洞

免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…...

Python人工智能项目报告

一、实践概述 1、实践计划和目的 在现代社会&#xff0c;计算机技术已成为支撑社会发展的核心力量&#xff0c;渗透到生活的各个领域&#xff0c;应关注人类福祉&#xff0c;确保自己的工作成果能够造福社会&#xff0c;同时维护安全、健康的自然环境&#xff0c;设计出具有包…...

PyQt6+pyqtgraph折线图绘制显示

1、实现效果 2、环境&#xff1a; 确认已经安装pyqtgraph的模块&#xff0c;如果没有安装&#xff0c;使用命令安装&#xff1a; pip install pyqtgraph 3、代码实现&#xff1a; 绘制折线函数&#xff1a; import sys import random from PySide6.QtWidgets import QAppl…...

1-golang_org_x_crypto_bcrypt测试 --go开源库测试

1.实例测试 package mainimport ("fmt""golang.org/x/crypto/bcrypt" )func main() {password : []byte("mysecretpassword")hashedPassword, err : bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)if err ! nil {fmt.Println(err)…...

C语言菜鸟入门·关键字·union的用法

目录 1. 简介 2. 访问成员 2.1 声明 2.2 赋值 3. 共用体的大小 4. 与typedef联合使用 5. 更多关键字 1. 简介 共用体&#xff08;union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同的数据类型&#xff0c;但每次只能存储其中一种类型的…...

leetcode hot100【LeetCode 238.除自身以外数组的乘积】java实现

LeetCode 238.除自身以外数组的乘积 题目描述 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 …...

【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!

一、前言 Apache JMeter是纯Java的开源软件&#xff0c;最初由Apache软件基金会的Stefano Mazzocchi开发&#xff0c;旨在加载测试功能行为和测量性能。可以使用JMeter进行性能测试&#xff0c;即针对重负载、多用户和并发流量测试Web应用程序。 我们选择JMeter原因 是否测试过…...

嵌入式驱动开发详解3(pinctrl和gpio子系统)

文章目录 前言pinctrl子系统pin引脚配置pinctrl驱动详解 gpio子系统gpio属性配置gpio子系统驱动gpio子系统API函数与gpio子系统相关的of函数 pinctrl和gpio子系统的使用设备树配置驱动层部分用户层部分 前言 如果不用pinctrl和gpio子系统的话&#xff0c;我们开发驱动时需要先…...

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域&#xff0c;行人检测是一个重要的研究方向&#xff0c;它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先&#xff0c;我们需要安装 OpenCV 库。可以通过以下命令来安装&#…...

py文件转pyd文件的那些坑

当编译py脚本文件发给客户使用时&#xff0c;为了保密源代码防止反编译&#xff0c;可以将py文件转换为pyd文件&#xff0c;然后使用pyinstaller工具转换为exe应用程序&#xff0c;但有时测试发现&#xff0c;py文件可以正常运行&#xff0c;转换为pyd文件后却有各种错误&#…...

go interface(接口)使用

在 Go 语言中&#xff0c;接口&#xff08;interface&#xff09;是一种抽象类型&#xff0c;它定义了一组方法&#xff0c;但是不实现这些方法。接口指定了一个对象的行为&#xff0c;而不关心对象的具体实现。接口使得代码更加灵活和可扩展。 定义接口 接口使用 type 关键字…...

前端---HTML(一)

HTML_网络的三大基石和html普通文本标签 1.我们要访问网络&#xff0c;需不需要知道&#xff0c;网络上的东西在哪&#xff1f; 为什么我们写&#xff0c;www.baidu.com就能找到百度了呢&#xff1f; 我一拼ping www.baidu.com 就拼到了ip地址&#xff1a; [119.75.218.70]…...

unsloth vlm模型Qwen2-VL、Llama 3.2 Vision微调案例

T4卡15G显卡训练 参考: https://github.com/unslothai/unsloth 按自己显卡cuda版本安装 免费colab微调代码: Qwen2-VL: https://colab.research.google.com/drive/1whHb54GNZMrNxIsi2wm2EY_-Pvo2QyKh?usp=sharing from unsloth import FastVisionModel # NEW instead …...

云网络基础- TCP/IP 协议

文章目录 典型服务模式TCP/IP 协议设置和查看IPIP地址的分类:IP地址组成: 网络位主机位组成克隆:产生一台新的虚拟机win2008 典型服务模式 • C/S,Client/Server架构 – 由服务器提供资源或某种功能 – 客户机使用资源或功能 TCP/IP 协议 • TCP/IP是最广泛支持的通信协议集合…...

【数据分享】2001-2023年我国30米分辨率冬小麦种植分布栅格数据(免费获取)

小麦、玉米、水稻等各类农作物的种植分布数据在农业、环境、国土等很多专业都经常用到&#xff01; 本次给大家分享的是我国2001-2023年逐年的30米分辨率冬小麦种植分布栅格数据&#xff01;数据格式为TIFF格式&#xff0c;数据坐标为GCS_WGS_1984。该数据包括我国11个省份的冬…...

前端预览pdf文件流

需求 后端接口返回pdf文件流&#xff0c;实现新窗口预览pdf。 解决方案 把后端返回的pdf文件流转为blob路径&#xff0c;利用浏览器直接预览。 具体实现步骤 1、引入axios import axios from axios;2、创建预览方法&#xff08;具体使用时将axios的请求路径替换为你的后端…...

【Leetcode 每日一题】146. LRU 缓存(c++)

146. LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#x…...

Neural Magic 发布 LLM Compressor:提升大模型推理效率的新工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…...