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

uniapp小程序连接蓝牙设备

uniapp小程序连接蓝牙设备

      • 一、初始化蓝牙模块
      • 二、开始搜索
      • 三、连接蓝牙
      • 四、监听特征值变化
      • 五、调用示例
      • utils.js文件

一、初始化蓝牙模块

这一步是必须的,在开发项目过程中,初始化蓝牙模块之后,紧接着就要开启一些监听的api,供后续设备读写数据时监听变化。

initBLE(callback) {//提前定义变量,直接在uni的api中使用this是不可以的var self = this;// `第一步:初始化蓝牙模块`uni.openBluetoothAdapter({success: function (e) {utils.toast("初始化蓝牙适配器成功");},fail: function (e) {utils.toast("初始化蓝牙适配器失败 : " + JSON.stringify(e));},});// `检查蓝牙适配器状态变化`// `这一步主要是为了在连接成功蓝牙之后关闭蓝牙搜索,蓝牙搜索非常耗费性能`uni.onBluetoothAdapterStateChange(function (e) {self.bluetooth.available = e.available;if (!e.available) {utils.toast("蓝牙适配器不可用");if (self.bluetooth.startDiscovery) {self.bluetooth.startDiscovery = false;self.stopBluetoothDevicesDiscovery();}}});// `监听搜索到设备`uni.onBluetoothDeviceFound(function (e) {// `当搜索到设备后,可以在e.devices中获取到设备信息列表`if (!e.devices) return;for (var i = 0; i < e.devices.length; i++) {var device = e.devices[i];for (var j = 0; j < self.discoveryList.length; j++) {var item = self.discoveryList[j];// 去重if (item.deviceId === device.deviceId) {return;}}self.discoveryList.push(device);}});// `监听蓝牙设备连接变化`uni.onBLEConnectionStateChange(function (e) {// 该方法回调中可以用于处理连接意外断开等异常情况self.currentDeviceStatus = e.connected ? 1 : 2;// 在连续盘点过程中是不允许断开的,万一因为其他什么原因断开了,则尝试停止连续盘点if (!e.connected && self.inventoryLabelForm.looping) {self.sendStopLoopInventoryCmd(); //停止盘点}});// `读数据`uni.onBLECharacteristicValueChange(function (e) {if (e.deviceId != self.currentDevice.deviceId) return;var value = self.buffer2Hex(e.value);console.log(e); //查看是否有R20固定返回值utils.toast("读数据178:" + JSON.stringify(e));self.lastRcvData += value;self.doRcvData();});self.historyList = utils.getHistoryList();// 如果有cb回调函数,则需要停止下拉刷新if (callback) {// setTimeout这里等待一下上面的异步初始化setTimeout(() => {callback();}, 1000);}},

二、开始搜索

以上只是蓝牙的初始化操作,要想真正实现蓝牙连接从第二步开始

// 开启蓝牙搜索服务startBluetoothDevicesDiscovery() {var self = this;// 小程序环境需要等待一下,不然会报错setTimeout(() => {// 开始搜寻附近的蓝牙外围设备uni.startBluetoothDevicesDiscovery({allowDuplicatesKey: false,success: function (e) {self.bluetooth.discoverying = true;//开启搜索成功,此时初始化中定义的onBluetoothDeviceFound会自动执行},fail: function (e) {utils.toast("开始搜索蓝牙设备失败 : " + JSON.stringify(e));},});}, 1000);},

三、连接蓝牙

目前为止我们已经搜索到蓝牙设备了,下面要做的就是在蓝牙列表中选择对应的蓝牙设备进行连接

// 连接设备onConnectDevice(device) {// `device是选择的设备对象,在这可以取到设备的deviceId供后续使用`var self = this;this.onCloseDiscoveryDialog();this.onCloseHistoryDialog();this.currentDevice = device;this.currentDeviceStatus = 3;this.lastRcvData = "";// 创建一个BLE连接uni.createBLEConnection({deviceId: device.deviceId,//这里使用设备id来创建连接success: function (e) {// 创建完成后获取服务(这在ios中是必须的,否则会导致后面读取数据失败)uni.getBLEDeviceServices({// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接deviceId: device.deviceId,success(res) {// 获取特征值(这在ios中是必须的,否则会导致后面读取数据失败)uni.getBLEDeviceCharacteristics({// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接deviceId: device.deviceId,// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取serviceId: RX_SERVICE_UUID, //因为这里使用的是固定服务所以事先定义过常量了,这里直接使用success(res) {// 创建连接-获取服务-获取特征值之后就可以开启nofity功能了self.enableBleNotify(device);},fail() {},});},});// 开启nofity功能self.enableBleNotify(device);},fail: function (e) {utils.toast("连接蓝牙设备失败 : " + JSON.stringify(e));self.currentDeviceStatus = 2;},});// 保存设备到历史记录里var flag = true;for (var i = 0; i < this.historyList.length; i++) {var item = this.historyList[i];if (item.deviceId === device.deviceId) {this.historyList[i] = device;flag = false;}}if (flag) {this.historyList.push(device);}utils.saveHistoryList(this.historyList);},

四、监听特征值变化

 enableBleNotify(device) {// 这里监听时,ios测试需要有点延迟,安卓的话,只在测试机上测试过,不需要延迟// 这里延迟1秒兼容,反正差距不大setTimeout(function () {uni.notifyBLECharacteristicValueChange({state: true,deviceId: device.deviceId,serviceId: RX_SERVICE_UUID,characteristicId: R_UUID,success: function (e) {//到了此时蓝牙才算真正的连接成功},fail: function (e) {},});}, 1000);},

五、调用示例

这里以单次盘点为例

 // 单步盘点标签async  onOneStepInventory() {var self = this;if (!this.checkDeviceConnect()) return;this.inventoryLabelForm.startTime = utils.currentTimeMillis(); //获取盘点时间的// 单步盘点关闭enableRssithis.inventoryLabelForm.enableRssi = false;// 发送固定值await this.sendR20Hex(); //这里是定制需要没有可以省去var cmd = this.generateUHFProtocl(0x80, utils.number2Hex(5000, 2));self.sendData(cmd);},//发送固定值async sendR20Hex() {await this.sendData("A55A0029F011D75238EE46C3ECFFCE3B9AFC093ACC13F711A6ADF3FF76ACE59A8DF1BA704E22EC0D0A");},//写入操作(发送数据,连续存盘指令自行实现了,不调用该方法)async sendData(hexStr, serviceId, characteristicId) {if (utils.isBlank(hexStr)) return;serviceId = serviceId || RX_SERVICE_UUID;characteristicId = characteristicId || W_UUID;var self = this;var sendData;// ble发送数据时,需要分包,最多20字节if (hexStr.length > 40) {sendData = hexStr.substr(0, 40);hexStr = hexStr.substr(40, hexStr.length - 40);} else {sendData = hexStr;hexStr = null;}this.logSend(sendData);var buffer = new ArrayBuffer(sendData.length / 2);var bufView = new Uint8Array(buffer);for (var i = 0; i < sendData.length; i += 2) {bufView[i / 2] = parseInt(sendData.substr(i, 2), 16);}//这里写了一个promise是为了在执行正常操作之前,先执行固定值操作return new Promise((resolve, reject) => {uni.writeBLECharacteristicValue({deviceId: self.currentDevice.deviceId,serviceId: serviceId,characteristicId: characteristicId,value: buffer,success: async function (e) {if (hexStr) {//超过20字节 递归循环写入await self.sendData(hexStr);}console.log("写入数据成功391" + sendData);// 由于写字节限制,如果还有未发送完的数据,接着继续发送resolve();},fail: function (e) {},});});},

utils.js文件

这里主要存放一些转换方法,上面用到的utils.xx方法可以在此处查看

export default {alert: function (content, title = "提示") {uni.showModal({title,content,showCancel: false,success: function (res) {},});},confirm: function (content, title = "提示") {uni.showModal({title,content,success: function (res) {if (res.confirm) {console.log("用户点击确定");} else if (res.cancel) {console.log("用户点击取消");}},});},toast: function (title, duration = 1000) {uni.showToast({title,icon: "none",duration,});},showWaiting: function (title = "加载中") {uni.showLoading({title,});},closeWaiting: function () {uni.hideLoading();},actionSheet: function (itemList) {uni.showActionSheet({itemList,success: function (res) {console.log("选中了第" + (res.tapIndex + 1) + "个按钮");},fail: function (res) {console.log(res.errMsg);},});},saveHistoryList: function (list) {try {uni.setStorageSync("history_list", JSON.stringify(list));} catch (e) {// error}},getHistoryList: function () {try {const value = uni.getStorageSync("history_list");if (value) {return JSON.parse(value);} else {return [];}} catch (e) {// error}},clearHistoryList: function () {try {uni.removeStorageSync("history_list");} catch (e) {// error}},leftPad: function (value, length, fill) {while (length - value.length > 0) {value = fill + value;}return value;},number2Hex: function (value, byteLength) {value = parseInt(value);var hex = value.toString(16).toUpperCase();byteLength = byteLength || hex.length / 2 + (hex.length % 2);return this.leftPad(hex, byteLength * 2, "0");},bin2Hex: function (value, byteLength) {byteLength = byteLength || 1;byteLength = Math.max(value.length / 8 + (value.length % 8 > 0 ? 1 : 0),byteLength);value = this.leftPad(value, byteLength * 8, "0");var hex = "";for (var i = 0; i < value.length; i += 8) {hex += this.number2Hex(parseInt(value.substr(i, 8), 2), 1);}return hex;},isNull: function (value) {if (value == null) return true;if ("undefined" == typeof value) return true;return false;},isString: function (value) {return "[object String]" === Object.prototype.toString.call(value);},isBlank: function (value) {if (this.isNull(value)) return true;if (!this.isString(value)) return true;if (value.trim().length == 0) return true;return false;},str2Hex: function (str) {var hex = "";for (var i = 0; i < str.length; i++) {hex += this.number2Hex(str.charCodeAt(i), 1);}return hex;},currentTimeMillis: function () {return new Date().getTime();},hex2ByteArray: function (hex) {var result = [];for (var i = 0; i < hex.length; i += 2) {var value = parseInt(hex.substr(i, 2), 16);if (value > 127) {value -= 0x100;}result.push(value);}return result;},/*** hex转字符串* @param {Object} hex* @param {Object} charset	编码格式,默认为utf-8*/hex2Str: function (hex, charset = "utf-8") {var bytesArray = this.hex2ByteArray(hex);try {var str;// 创建一个TextDecoder对象,指定所需的编码格式const decoder = new TextDecoder(charset);// 将ByteArray转换为字符串str = decoder.decode(bytesArray);return str;} catch (e) {this.toast("错误的编码格式");}},
};

相关文章:

uniapp小程序连接蓝牙设备

uniapp小程序连接蓝牙设备 一、初始化蓝牙模块二、开始搜索三、连接蓝牙四、监听特征值变化五、调用示例utils.js文件 一、初始化蓝牙模块 这一步是必须的&#xff0c;在开发项目过程中&#xff0c;初始化蓝牙模块之后&#xff0c;紧接着就要开启一些监听的api&#xff0c;供后…...

AI大模型推理过程与优化技术深度剖析

在人工智能的浩瀚星空中&#xff0c;AI大模型以其卓越的性能和广泛的应用前景&#xff0c;成为了推动技术进步的璀璨明星。本文旨在深入探讨AI大模型的推理过程及其背后的优化技术&#xff0c;为理解这一复杂而精妙的技术体系提供一个清晰的视角。 一、AI大模型的推理过程揭秘 …...

Dubbo 核心概念介绍

Dubbo 是一款阿里巴巴开源的高性能 RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;广泛应用于微服务架构中。它主要解决服务治理、负载均衡、故障转移等分布式系统问题。本文将介绍 Dubbo 的核心概念&#xff0c;包括服务提供者&#xff08;Provider&#xff09;、服…...

练习 6.7:⼈们 在为练习 6.1 编写的程序中,再创建两个表⽰⼈的字典,然后将这三个字典都存储在⼀个名为 people 的列表中。

练习 6.7&#xff1a;⼈们 在为练习 6.1 编写的程序中&#xff0c;再创建两个表⽰⼈的字典&#xff0c;然后将这三个字典都存储在⼀个名为 people 的列表中。 要求 遍历这个列表&#xff0c;将其中每个⼈的所有信息都打印出来。 代码 human {shuicc: {first_name: shui,la…...

星环科技知识平台TKH:引领企业构建高效AI基础设施,加速数智化转型新纪元

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技正式发布其最新人工智能基础设施产品——Transwarp Knowledge Hub星环知识平台&#xff08;以下简称TKH&#xff09;。该平台旨在为企业打通从人工智能基础设施建设到大数据、人工智能等研发应用的完…...

嵌入式板级支持包(BSP)80道面试题及参考答案(3万字长文)

目录 解释什么是通用输入输出(GPIO)接口及其在BSP中的作用。 描述SPI接口的主要特点和用途。 说明IC总线协议的工作原理。 如何在BSP中配置一个UART接口? USB设备控制器在BSP中的初始化步骤是什么? 以太网接口如何在BSP中被支持? 什么是SDIO,它在哪些场景下会被使…...

如何找回误删的文件?4个常用文件恢复方法!

对于许多用户来说&#xff0c;误删文件是一种常见而令人懊恼的情况。恢复误删文件的重要性在于&#xff0c;它可以帮助用户找回宝贵的数据&#xff0c;避免因数据丢失带来的各种不便和损失。 如何找回不小心删除的文件&#xff1f; 误删数据不知道怎么恢复&#xff0c;会给我…...

在大型企业级应用中,如何优化 XML 数据的存储和检索效率,以满足高并发访问需求?

在大型企业级应用中&#xff0c;优化XML数据的存储和检索效率可采取以下措施&#xff1a; 数据库选择&#xff1a;选择适合XML存储和查询的数据库&#xff0c;如Oracle、MySQL、PostgreSQL等。这些数据库提供了专门的XML存储和查询功能&#xff0c;能够更高效地处理XML数据。 …...

win10 A4000 下使用Xinference来进行大模型的推理测试

创建环境 conda remove --name xinference --all conda create --name xinference python3.10 conda activate xinference 安装&#xff1a; conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia pip install tiktoken sentence-transformer…...

【9-2:代码规范】

算法级思想 代码规范&#xff08;java&#xff09; 代码规范&#xff08;java&#xff09; 方法参数必须一致&#xff0c;不要出现自动装箱拆箱操作SimpleDateFormat是线程不安全的使用equals注意空指针异常日志 事务场景中如果出现异常被捕时注意回滚不要再finally中使用retu…...

std::filesystem::current_path().generic_string()的bug

这行指令出来会出来大小写的盘符&#xff0c;如D 或者d&#xff0c;似乎随机 #include <iostream> #include <filesystem>namespace fs std::filesystem;bool arePathsSame(const fs::path& p1, const fs::path& p2) {return p1 p2; }int main() {fs::p…...

Python excel知识库批量模糊匹配的3种方法实例(fuzzywuzzy\Gensim)

前言 当然&#xff0c;基于排序的模糊匹配&#xff08;类似于Excel的VLOOKUP函数的模糊匹配模式&#xff09;也属于模糊匹配的范畴&#xff0c;但那种过于简单&#xff0c;不是本文讨论的范畴。 本文主要讨论的是以公司名称或地址为主的字符串的模糊匹配。 使用编辑距离算法进…...

stm32使用单通道规则组ADC

Driver_ADC.c 如果需要关闭adc转换&#xff0c;只需要设置CNT&#xff0c;将其置为0&#xff0c;后面再转换一次就停止了。 #include "Driver_ADC.h"void Driver_ADC1_Init(void) {/* 1. 时钟配置 *//* 1.1 adc时钟 */RCC->APB2ENR | RCC_APB2ENR_ADC1EN;RCC-&g…...

[python][whl]causal-conv1d的python模块在windows上whl文件下载

【模块介绍】 causal-conv1d&#xff0c;即因果一维卷积&#xff08;Causal 1D Convolution&#xff09;&#xff0c;是一种在深度学习特别是时序数据处理中广泛应用的卷积技术。它主要特点在于其“因果性”&#xff0c;即输出的每个元素仅依赖于输入序列中它之前的元素&#…...

介绍 CM3leon,一个更高效、最先进的文本和图像生成模型

近几个月来&#xff0c;随着让机器理解和表达语言的自然语言处理技术以及可根据文本输入生成图像的系统的进步&#xff0c;人们对生成式人工智能模型的兴趣和研究也在加速。今天&#xff0c;我们要展示的是 CM3leon&#xff08;发音类似于 “变色龙”&#xff09;&#xff0c;它…...

HTTPS和HTTP有哪些区别

两者的主要区别在于安全性和数据加密&#xff1a; 加密层&#xff1a;HTTPS 在HTTP 的基础上增加了SSL/TLS 协议作为加密层&#xff0c;确保数据传输的安全性,即使数据被截获&#xff0c;没有相应的密钥也无法解读数据内容。而HTTP 数据传输是明文的&#xff0c;容易受到攻击。…...

Docker 安装 PostgreSQL

1. 启动 PostgreSQL 容器 docker run --name ffj-postgres -p 5432:5432 -e POSTGRES_PASSWORDCisc0123 -d postgres docker run&#xff1a;启动一个新的容器。--name指定容器名称为 ffj-postgres。-p 5432:5432&#xff1a;将主机的 5432 端口映射到容器的 5432 端口。-e P…...

实践致知第12享:如何新建一个Word并设置格式

一、背景需求 小姑电话说&#xff1a;要新建一个Word文档&#xff0c;并将每段的首行设置空2格。 二、解决方案 1、在电脑桌面上空白地方&#xff0c;点击鼠标右键&#xff0c;在下拉的功能框中选择“DOC文档”或“DOCX文档”都可以&#xff0c;如下图所示。 之后&#xff0…...

Rust vs Go: 特点与应用场景分析

目录 介绍Rust的特点Go的特点Rust的应用场景Go的应用场景总结 介绍 Rust和Go&#xff08;Golang&#xff09;是现代编程语言中两个非常流行的选择。凭借各自的独特优势和广泛的应用场景&#xff0c;吸引了大量开发者的关注。本文将详细介绍Rust和Go的特点&#xff0c;并探讨它…...

2024的开放式耳机排行榜,看这六个耳机选购的小Tips

寻找一款既能聊天又能听歌的耳机并不容易&#xff0c;但是开放式耳机可能会是一个理想的选择。与传统的入耳式耳机相比&#xff0c;开放式耳机可以让你更加自然地与周围环境互动&#xff0c;并且不容易掉落。当然&#xff0c;在市场上选择一款适合自己的开放式耳机也是至关重要…...

JAVA-报表模糊搜索询易实现

背景: 一般文件报表经常会需要搜各个表头对应内容&#xff0c;如果支持全部类型切换搜索&#xff0c;操作起来就不够便捷。而且这个报表是测试自己用的&#xff0c;准确性可以不用太要求&#xff0c;所以更想要那中输入关键字命中任意表记录内容的模糊匹配功能。 方法一:解析搜…...

牛客 7.13 月赛(留 C逆元)

B-最少剩几个&#xff1f;_牛客小白月赛98 (nowcoder.com) 思路 奇数偶数 奇数&#xff1b;奇数*偶数 奇数 所以在既有奇数又有偶数时&#xff0c;两者结合可以同时删除 先分别统计奇数&#xff0c;偶数个数 若偶个数大于奇个数&#xff0c;答案是偶个数-奇个数 若奇个数…...

FPGA之术语

FPGA之术语 IOSTANDARDDIFF_SSTL12:LVCMOS33:sys_clk_p/n:rst_n:UART时钟JTAG:GPIOONFIPCIe IOSTANDARD 在电子工程领域&#xff0c;DIFF_SSTL12和LVCMOS33是两种不同的电气标准&#xff0c;用于定义信号的电压级别和特性。 IOSTANDARD是一个在FPGA&#xff08;现场可编程门阵…...

WPF透明置顶窗口wine适配穿透问题解决

一、透明窗口全屏时&#xff0c;鼠标不穿透 问题描述 我有一个透明窗口&#xff0c;它是一个全屏置顶窗口&#xff0c;窗口里面有一个工具条&#xff0c;可以通过鼠标拖动工具条的位置&#xff0c;程序启动后&#xff0c;在不点击工具条的时候&#xff0c;鼠标是可以穿透的&a…...

浅析Kafka Streams中KTable.aggregate()方法的使用

KTable.aggregate() 方法是 Apache Kafka Streams API 中用于对流数据进行状态化聚合的核心方法之一。这个方法允许你根据一个键值&#xff08;通常是<K,V>类型&#xff09;的流数据&#xff0c;应用一个初始值和一个聚合函数&#xff0c;来累积和更新一个状态&#xff0…...

java word转pdf、word中关键字位置插入图片 工具类

java word转pdf、word中关键字位置插入图片 工具类 1.pom依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><dependency><groupId>org.apa…...

jail内部ubuntu apt升级失败问题解决

在FreeBSD jail 里安装启动Ubuntu jammy系统&#xff0c;每次装好执行jexec ubjammy sh进入Ubuntu系统后&#xff0c;执行apt update报错。 这个问题困惑了好久&#xff0c;突然有一天仔细去看报错信息&#xff0c;查看了(man 5 apt.conf) &#xff0c;才搞定问题。简单来说就是…...

迎接AI新时代:GPT-5的技术飞跃与未来展望

引言 随着人工智能技术的迅猛发展&#xff0c;大语言模型在过去几年取得了显著进步。OpenAI最新的声明表明&#xff0c;GPT-5将在一年半后发布&#xff0c;并将带来从高中生智力水平到博士生智力水平的飞跃。这一突破引起了科技界和公众的广泛关注。本文将从技术突破预测、智能…...

Snap Video:用于文本到视频合成的扩展时空变换器

图像生成模型的质量和多功能性的显著提升&#xff0c;研究界开始将其应用于视频生成领域。但是视频内容高度冗余&#xff0c;直接将图像模型技术应用于视频生成可能会降低运动的保真度和视觉质量&#xff0c;并影响可扩展性。来自 Snap 的研究团队及其合作者提出了 "Snap …...

实验8 视图创建与管理实验

一、实验目的 理解视图的概念。掌握创建、更改、删除视图的方法。掌握使用视图来访问数据的方法。 二、实验内容 在job数据库中&#xff0c;有聘任人员信息表&#xff1a;Work_lnfo表&#xff0c;其表结构如下表所示&#xff1a; 其中表中练习数据如下&#xff1a; 1.‘张明…...

网站后台权限管理怎么做的/国外免费建站网站

基本概述一.什么是设计模式二.设计模式的好处三.设计模式的基本原则1.开闭原则2.里氏替换原则3.依赖倒置原则4.单一职责原则5.接口隔离原则6.合成复用原则7.迪米特法则四.设计模式有哪些分类1.创建型模式2.结构型模式3.行为型模式一.什么是设计模式 在软件工程中&#xff0c;设…...

网站多个用户怎样建设/上海十大营销策划公司

目录 注意点: 一、先搭建好struts2框架 index.jsp struts.xml User.java 二、往值栈压值&#xff0c;前端如何获取值 1.获取值栈 ValueStack1Action.java 2.往值栈压普通值 action2 success.jsp2 3.往值栈中压对象 推荐写法&#xff1a;push() ★ action3 suc…...

linux下wordpress建站/软文营销是什么意思

大家好&#xff0c;这里是捷径手机宝典&#xff0c;我是阿轲iOS 12.4 在历经了 7个 beta测试版后&#xff0c;终于在今天凌晨发布了正式版&#xff0c;不出意外的话&#xff0c;这应该是iOS12系列的最后一个版本iOS12.4正式版更新内容包括修复图片重启BUG过滤未知发件人功能优化…...

九九建筑网官网登录/搜索引擎优化的概念是什么

Source Insight自定义快捷键 鄙人一直用的是Eclipse来开发&#xff0c;如果只是做java的话&#xff0c;这个就够了&#xff0c;但因时不时要查C/C的代码&#xff0c;这个时候这个工具就有点力不从心了&#xff0c;因为C/C的代码非常多&#xff0c;一般放在服务器上&#xff0c…...

清远网站制作/网站搭建外贸

真的很想吐槽一下李航老师后面的附录&#xff0c;看的我是云头雾里&#xff0c;上网查了很多资料才搞懂。 这篇文章主要讲解牛顿法和拟牛顿法一些算法思路上的由来&#xff0c;作为附录的补充&#xff0c;具体算法细节可以参考那本书1.牛顿法首先你需要知道的是牛顿法本身是一个…...

克拉玛依建设局网站6/软件开发公司排名

版权声明&#xff1a;转载请注明出处:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79396415 右击项目——properties——projectFacets——激活或者直接选择dynamic web那一项。应用即可。 参考&#xff1a;https://dzone.com/articl…...