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

基于CW32F030与EC-01G模块的NBIoT+GPS定位与心知天气API接入实战

基于CW32F030与EC-01G模块的NBIoTGPS定位与心知天气API接入实战最近在做一个户外环境监测的小项目需要把GPS定位数据和传感器信息上传到云端同时还想获取当地的天气信息。我选择了国产的CW32F030C8T6单片机搭配安信可的EC-01G NBIoTGPS模块这个组合性价比很高特别适合对成本敏感但又需要稳定物联网连接的项目。今天我就来手把手教大家如何让这套系统跑起来从硬件连接到AT指令驱动再到通过HTTP协议从心知天气API获取数据并解析最后把天气信息显示出来。整个过程我会详细讲解包括我踩过的坑和调试技巧保证你跟着做一遍就能掌握。1. 硬件准备与连接1.1 硬件清单咱们先来看看需要哪些硬件CW32F030C8T6开发板这是主控芯片基于ARM Cortex-M0内核性价比很高EC-01G模块安信可的NBIoTGPS二合一模块支持全网通内置GPS/北斗定位NBIoT天线确保模块能连接到运营商网络GPS天线用于接收卫星信号注意GPS定位必须在室外进行USB转串口工具用于调试和查看打印信息杜邦线若干用于连接注意EC-01G模块的工作电压是3.0V-3.6V千万不要接5V否则会烧坏模块1.2 引脚连接EC-01G模块通过串口与CW32F030通信接线很简单CW32F030引脚EC-01G模块引脚功能说明PA2 (TX)RX单片机发送数据到模块PA3 (RX)TX单片机接收模块数据3.3VVCC电源必须是3.3VGNDGND地线这里我使用的是CW32F030的串口2UART2对应引脚就是PA2和PA3。如果你要用其他串口记得在代码里修改相应的配置。1.3 物联网卡准备NBIoT模块需要物联网卡才能上网。你可以在淘宝上搜索NBIoT物联网卡选择一家信誉好的商家购买。买回来后按照商家说明激活并插入EC-01G模块的SIM卡槽。2. 软件环境搭建与代码移植2.1 获取资料首先需要下载EC-01G模块的资料官方文档在这里https://docs.ai-thinker.com/nb-iot这个页面里有模块的数据手册、AT指令集、应用笔记等建议把nb-iot系列模组AT指令集v1.0.pdf下载下来后面调试AT指令时会用到。2.2 创建工程文件我在项目中创建了两个文件来管理EC-01G模块的驱动bsp_ec01g.c- 驱动程序源文件bsp_ec01g.h- 驱动程序头文件头文件里主要定义了一些宏和数据结构#ifndef _BSP_EC01G_H_ #define _BSP_EC01G_H_ #include string.h #include board.h // 是否开启串口调试查看模块回显数据 #define DEBUG 1 /**************************** 心知天气配置 ****************************/ // 秘钥需要修改为你自己的密钥 #define API_KEY SpUFyXp2YvP12yxQR // 要查询的城市输入城市拼音免费版只支持部分城市 #define QUERIED_CITY shenzhen // 天气实况API #define WEATHER_FACTS_API \/v3/weather/now.json?key API_KEY location QUERIED_CITY languageenunitc\ // 接收的数据保存结构体 typedef struct{ char city[20]; // 查询的城市 char country[20]; // 查询的国家 char path[50]; // 具体地址 char weather[10]; // 天气状态 char weather_code[5]; // 天气代码 char temperature[5]; // 温度 char last_update[50]; // 天气数据更新时间 }WEATHER_DATA; /**************************** 串口配置 ****************************/ #define RCC_EC01G_GPIO_ENABLE() __RCC_GPIOA_CLK_ENABLE() // GPIO时钟 #define RCC_EC01G_USART_ENABLE() __RCC_UART2_CLK_ENABLE() // 串口2时钟 #define BSP_GPS_AF_UART_TX() PA02_AFx_UART2TXD() // PA2复用为UART2_TX #define BSP_GPS_AF_UART_RX() PA03_AFx_UART2RXD() // PA3复用为UART2_RX #define PORT_EC01G_GPIO CW_GPIOA // GPIO端口 #define GPIO_EC01G_TX GPIO_PIN_2 // 发送引脚 #define GPIO_EC01G_RX GPIO_PIN_3 // 接收引脚 #define EC01G_USART CW_UART2 // 使用串口2 #define EC01G_USART_IRQ UART2_IRQn // 串口2中断号 #define EC01G_USART_IRQHandler UART2_IRQHandler // 串口2中断服务函数 #define EC01G_RX_LEN_MAX 4096 // 串口接收缓冲区大小 // 函数声明 void EC01G_Init(void); uint8_t EC01G_Seniverse_Init(void); void Get_Weather_Data(WEATHER_DATA* data); #endif重要记得把API_KEY和QUERIED_CITY改成你自己的心知天气的API密钥需要注册获取后面会讲到。3. 串口驱动与AT指令基础3.1 串口初始化EC-01G模块默认的通信波特率是9600所以我们需要先初始化串口。下面是串口初始化的代码void EC01G_USART_Init(unsigned int bund) { GPIO_InitTypeDef GPIO_InitStruct; // 1. 使能时钟 RCC_EC01G_GPIO_ENABLE(); // 使能GPIOA时钟 RCC_EC01G_USART_ENABLE(); // 使能UART2时钟 // 2. 配置TX引脚PA2为推挽输出 GPIO_InitStruct.Pins GPIO_EC01G_TX; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Speed GPIO_SPEED_HIGH; // 高速输出 GPIO_Init(PORT_EC01G_GPIO, GPIO_InitStruct); // 3. 配置RX引脚PA3为上拉输入 GPIO_InitStruct.Pins GPIO_EC01G_RX; GPIO_InitStruct.Mode GPIO_MODE_INPUT_PULLUP; // 上拉输入 GPIO_Init(PORT_EC01G_GPIO, GPIO_InitStruct); // 4. 引脚复用为串口功能 BSP_GPS_AF_UART_TX(); // PA2复用为UART2_TX BSP_GPS_AF_UART_RX(); // PA3复用为UART2_RX // 5. 配置串口参数 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate bund; // 波特率9600 USART_InitStructure.USART_Over USART_Over_8; // 8倍过采样 USART_InitStructure.USART_Source USART_Source_PCLK; // 时钟源 USART_InitStructure.USART_UclkFreq 64000000; // 时钟频率64MHz USART_InitStructure.USART_StartBit USART_StartBit_FE; // 起始位检测 USART_InitStructure.USART_StopBits USART_StopBits_1; // 1位停止位 USART_InitStructure.USART_Parity USART_Parity_No; // 无校验位 USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; // 无硬件流控 USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; // 收发模式 USART_Init(EC01G_USART, USART_InitStructure); // 6. 配置串口接收中断 NVIC_SetPriority(EC01G_USART_IRQ, 0); // 设置中断优先级 NVIC_EnableIRQ(EC01G_USART_IRQ); // 使能中断 // 7. 使能接收中断 USART_ITConfig(EC01G_USART, USART_IT_RC, ENABLE); }这里有几个关键点需要注意引脚复用一定要配置正确否则数据发不出去也收不到中断优先级根据实际需求设置我这里设为0最高优先级记得使能接收中断这样模块返回的数据才能被及时处理3.2 AT指令发送与接收AT指令是模块通信的基础。我写了一个通用的发送指令并等待响应的函数char EC01G_Send_Cmd(char *cmd, char *ack, unsigned int waitms, unsigned char cnt) { Clear_EC01G_RX_BUFF(); // 先清空接收缓冲区 EC01G_USART_send_String((unsigned char*)cmd); // 发送AT指令 while(cnt--) { // 等待模块响应通过中断接收 if(EC01G_RX_FLAG 1) { // 在接收到的数据中查找期望的应答 if(strstr((char*)EC01G_RX_BUFF, ack) ! NULL) { return 1; // 找到了期望的应答 } } delay_ms(waitms); // 等待一段时间 } return 0; // 超时或未收到期望应答 }这个函数的参数说明cmd要发送的AT指令比如AT\r\nack期望模块返回的应答比如OKwaitms每次等待的毫秒数cnt重试次数实际使用中我一般这样调用// 测试模块是否正常 if(EC01G_Send_Cmd(AT\r\n, OK, 1000, 3) 0) { printf(模块无响应\r\n); return 1; }3.3 串口中断服务函数串口中断负责接收模块返回的数据。这里有个小技巧EC-01G模块返回的HTTP数据最后会有SPC字符我们可以利用这个来判断是否收到了完整的API响应。void EC01G_USART_IRQHandler(void) { if(USART_GetITStatus(EC01G_USART, USART_IT_RC) ! RESET) { // 接收一个字节 EC01G_RX_BUFF[EC01G_RX_LEN] USART_ReceiveData(EC01G_USART); // 防止缓冲区溢出 if(EC01G_RX_LEN EC01G_RX_LEN_MAX) EC01G_RX_LEN 0; // 字符串结尾补\0 EC01G_RX_BUFF[EC01G_RX_LEN] \0; EC01G_RX_FLAG 1; // 设置接收完成标志 // 检查是否收到API响应结束标志SPC if(EC01G_RX_BUFF[EC01G_RX_LEN - 1] C EC01G_RX_BUFF[EC01G_RX_LEN - 2] P EC01G_RX_BUFF[EC01G_RX_LEN - 3] S) { EC01G_RX_API_FLAG 1; // 设置API接收完成标志 } // 清除中断标志 USART_ClearITPendingBit(EC01G_USART, USART_IT_RC); } }4. 连接心知天气API实战4.1 获取心知天气API密钥首先需要注册心知天气账号访问心知天气官网https://www.seniverse.com注册账号并登录进入控制台在API密钥页面创建一个新的密钥免费版每天有1000次调用额度对于学习和测试完全够用4.2 初始化网络连接连接心知天气需要几个步骤我把它封装成了一个函数uint8_t EC01G_Seniverse_Init(void) { uint8_t ret 0; uint8_t i 0; // 1. 测试模块是否存在 if(EC01G_Send_Cmd(AT\r\n, OK, 1000, 3) 0) { return 1; // 模块无响应 } // 2. 关闭飞行模式 if(EC01G_Send_Cmd(ATCFUN1\r\n, OK, 1000, 3) 0) { return 2; // 关闭飞行模式失败 } // 3. 检查网络附着状态 if(EC01G_Send_Cmd(ATCEREG?\r\n, CEREG: 0,1, 5000, 3) 0) { // 第一次失败再试一次 ret EC01G_Send_Cmd(ATCEREG?\r\n, CEREG: 0,1, 1000, 3); if(ret 0) { return 1; // 网络附着失败 } } // 4. 创建HTTP客户端实例 again: // 先断开之前的连接如果有 EC01G_Send_Cmd(ATHTTPDESTROY0\r\n, OK, 1000, 10); i 0; while(EC01G_Send_Cmd(ATHTTPCREATE0,\http://116.62.81.138:80\\r\n, OK, 5000, 3) 0) { #if DEBUG printf(ATHTTPCREATE FAIL\r\n); #endif i; if(i 3) return 2; // 创建失败 goto again; } // 5. 连接服务器 i 0; while(EC01G_Send_Cmd(ATHTTPCON0\r\n, OK, 5000, 3) 0) { #if DEBUG printf(ATHTTPCON FAIL\r\n); #endif i; if(i 3) return 3; // 连接失败 goto again; } return 0; // 初始化成功 }这里有几个关键点需要注意网络附着检查ATCEREG?指令返回CEREG: 0,1表示网络附着成功。如果返回其他值可能是物联网卡没插好或没激活NBIoT天线没接好所在区域没有NBIoT信号覆盖HTTP连接心知天气的服务器地址是116.62.81.138:80。如果连接失败可以尝试检查网络信号强度确认服务器地址和端口是否正确等待几秒后重试4.3 发送HTTP请求获取天气数据连接建立后就可以发送HTTP GET请求获取天气数据了void Get_Weather_Data(WEATHER_DATA* data) { int timeout 10; // 10秒超时 unsigned char send_buff[250] {0}; char parse_buff[512] {0}; char *rev_buff NULL; // 1. 构造HTTP请求 sprintf((char*)send_buff, ATHTTPSEND0,0,%d,%s\r\n, strlen(WEATHER_FACTS_API)-2, WEATHER_FACTS_API); // 2. 发送请求 EC01G_USART_send_String((unsigned char*)send_buff); // 3. 等待响应带超时 while(timeout--) { delay_ms(1000); if(EC01G_RX_API_FLAG 1) { EC01G_RX_API_FLAG 0; // 找到HTTP响应数据开始位置 rev_buff strstr((const char*)EC01G_RX_BUFF, HTTPRESPC:); #if DEBUG printf(\r\nAPI响应\r\n); printf(%s\r\n, rev_buff); printf(\r\n\r\n); #endif break; } } // 4. 处理响应数据 if(rev_buff ! NULL) { int i 0; // 跳过HTTPRESPC:前缀 rev_buff 11; // 跳过前面的4个逗号分隔的参数 while(i 4) { if(*rev_buff ,) { i; } rev_buff; } // 5. 将16进制字符串转换为普通字符串 // 模块返回的JSON数据是16进制格式的需要转换 Hex_To_Text(rev_buff, parse_buff); #if DEBUG printf(\r\n转换后的JSON数据\r\n); printf(\r\n); printf(%s\r\n, parse_buff); printf(\r\n); #endif // 6. 解析JSON数据 Weather_Data_Analysis(parse_buff, data); } }这里有个重要的细节EC-01G模块返回的HTTP响应数据中JSON部分是以16进制字符串形式传输的。比如字符会被转换成22{会被转换成7B。所以我们需要先把这些16进制字符串转换回普通字符串。4.4 16进制字符串转换转换函数如下void Hex_To_Text(char *hex, char *text) { int string_length strlen((char*)hex) / 2; int i 0; // 每两个16进制字符转换成一个字节 for(i 0; i string_length; i) { char HEX[3]; memcpy(HEX, hex[i * 2], 2); HEX[2] \0; text[i] strtol(HEX, NULL, 16); // 16进制转十进制 } text[i] \0; // 字符串结束符 }4.5 JSON数据解析心知天气返回的JSON数据格式是这样的{ results: [{ location: { id: WS10730EM8EV, name: Shenzhen, country: CN, path: Shenzhen,Shenzhen,Guangdong,China, timezone: Asia/Shanghai, timezone_offset: 08:00 }, now: { text: Sunny, code: 0, temperature: 32 }, last_update: 2023-06-02T16:10:1508:00 }] }我写了一个简单的解析函数来提取需要的信息uint8_t Search_Data(char *original_data, char *weather_data, char *find_what) { char *buff; uint16_t i 0; if(strstr(original_data, find_what) ! NULL) { // 找到目标字段的开始位置 buff strstr(original_data, find_what); // 跳过字段名如name: buff strlen(find_what); // 找到结束的双引号 while(buff[i] ! ) { i; } // 复制字段值 strncpy(weather_data, buff, i); weather_data[i] \0; // 添加结束符 return 1; } return 0; } void Weather_Data_Analysis(char *original_data, WEATHER_DATA* weather_data) { // 提取各个字段 Search_Data(original_data, weather_data-city, name\:\); Search_Data(original_data, weather_data-country, country\:\); Search_Data(original_data, weather_data-path, path\:\); Search_Data(original_data, weather_data-weather, text\:\); Search_Data(original_data, weather_data-weather_code, code\:\); Search_Data(original_data, weather_data-temperature, temperature\:\); Search_Data(original_data, weather_data-last_update, last_update\:\); }这个解析方法虽然简单但对于这种结构固定的JSON数据完全够用。如果你需要处理更复杂的JSON可以考虑使用cJSON这样的库。5. 主程序与调试5.1 主函数实现最后在主函数中调用这些功能#include board.h #include stdio.h #include bsp_uart.h #include bsp_ec01g.h int32_t main(void) { WEATHER_DATA weather_data {0}; // 初始化系统 board_init(); uart1_init(115200); // 调试串口 printf(系统启动...\r\n); printf(API请求%s\r\n, WEATHER_FACTS_API); // 初始化EC-01G模块 EC01G_Init(); // 连接心知天气平台 if(EC01G_Seniverse_Init() 0) { printf(连接心知天气成功\r\n\r\n); // 获取天气数据 Get_Weather_Data(weather_data); // 打印解析结果 printf( 天气信息 \r\n); printf(城市%s\r\n, weather_data.city); printf(国家%s\r\n, weather_data.country); printf(详细地址%s\r\n, weather_data.path); printf(天气状况%s\r\n, weather_data.weather); printf(天气代码%s\r\n, weather_data.weather_code); printf(温度%s°C\r\n, weather_data.temperature); printf(更新时间%s\r\n, weather_data.last_update); printf(\r\n); } else { printf(连接心知天气失败\r\n); } while(1) { delay_ms(100); } }5.2 常见问题与调试技巧问题1模块无响应检查电源是否为3.3V检查TX、RX线是否接反检查波特率是否正确默认9600尝试发送AT\r\n看是否有OK返回问题2网络附着失败检查物联网卡是否已激活检查NBIoT天线是否连接良好尝试到窗口或室外信号好的地方用ATCSQ指令查看信号强度问题3HTTP连接失败检查服务器地址和端口是否正确检查网络是否正常ATCEREG?返回0,1尝试增加等待时间NBIoT网络连接较慢问题4API返回错误检查API密钥是否正确检查城市名称拼音是否正确查看心知天气控制台确认API调用是否成功调试技巧开启DEBUG宏定义可以看到详细的通信过程使用串口助手同时监听单片机和模块的通信分步测试先测试AT指令再测试网络最后测试HTTP6. 实际应用扩展这个基础框架搭建好后你可以根据自己的需求进行扩展定时获取天气添加RTC或定时器每隔一段时间如1小时获取一次天气数据。结合GPS定位EC-01G模块本身支持GPS你可以先获取当前位置坐标然后根据坐标查询天气实现真正的当前位置天气。数据上传将获取的天气数据通过NBIoT上传到你自己的服务器或物联网平台。低功耗优化NBIoT模块支持PSM省电模式在不需要通信时可以进入深度睡眠大幅降低功耗。错误重试机制网络不稳定时添加自动重试逻辑提高系统可靠性。这个项目最让我有成就感的地方是用国产的CW32F030和EC-01G模块只花了很少的成本就实现了一个完整的物联网天气站。虽然NBIoT的速率不如4G/5G但对于这种小数据量的应用完全够用而且功耗低、覆盖广特别适合户外或偏远地区的应用。如果你在实现过程中遇到问题可以多看看EC-01G的AT指令手册里面有很多有用的指令和示例。实际项目中网络稳定性是需要重点考虑的问题建议添加心跳包和断线重连机制。

相关文章:

基于CW32F030与EC-01G模块的NBIoT+GPS定位与心知天气API接入实战

基于CW32F030与EC-01G模块的NBIoTGPS定位与心知天气API接入实战 最近在做一个户外环境监测的小项目,需要把GPS定位数据和传感器信息上传到云端,同时还想获取当地的天气信息。我选择了国产的CW32F030C8T6单片机搭配安信可的EC-01G NBIoTGPS模块&#xff0…...

SecGPT-14B部署案例:高校网络安全实验室AI教学平台快速搭建实践

SecGPT-14B部署案例:高校网络安全实验室AI教学平台快速搭建实践 1. 项目背景与价值 在网络安全教学领域,学生常常面临复杂的安全概念理解困难、实战案例资源有限等问题。传统教学方式难以提供即时、个性化的学习支持。SecGPT-14B作为专攻网络安全领域的…...

如何解决Rhino到Blender的数据转换难题:import_3dm工具全解析

如何解决Rhino到Blender的数据转换难题:import_3dm工具全解析 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 3大核心突破彻底重塑3D工作流 为什么跨软件协作总是困…...

SecGPT-14B真实案例:某企业WAF日志中0day利用特征的模型辅助研判过程

SecGPT-14B真实案例:某企业WAF日志中0day利用特征的模型辅助研判过程 1. 案例背景与问题描述 某大型互联网企业的安全团队在日常监控中发现,其Web应用防火墙(WAF)日志中出现了一批异常请求。这些请求看似普通的API调用,但都包含某些特定参数…...

Dify企业级部署安全加固实战(零信任架构落地手册):RBAC+SPIFFE+双向mTLS三重防御体系详解

第一章:Dify企业级私有化部署安全加固总览在企业级私有化部署场景中,Dify 的安全性不仅依赖于其内置的鉴权与审计能力,更需深度结合基础设施层、网络策略、运行时环境及数据生命周期进行系统性加固。本章聚焦于构建纵深防御体系,涵…...

如何用ctfileGet解决城通网盘3大下载难题?

如何用ctfileGet解决城通网盘3大下载难题? 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 日常使用城通网盘时,用户常受广告等待、链接解析复杂、下载速度不稳定困扰。ctfileGet…...

虚拟显示驱动技术指南:创新应用与技术突破

虚拟显示驱动技术指南:创新应用与技术突破 【免费下载链接】parsec-vdd ✨ Virtual super display, upto 4K 2160p240hz 😎 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 1️⃣ 虚拟显示技术解析 什么是虚拟显示驱动? 虚…...

同步四开关升降压电源设计:MP28167-A 3A宽输入可编程DC-DC模块

1. 项目概述MPS升降压电源3A适配器是一款面向多场景供电需求的高集成度DC-DC转换模块,核心目标是解决输入源电压波动大、输出负载要求灵活可调的工程痛点。该设计不依赖固定输入电压等级(如仅适配5V或12V),而是覆盖2.8V至22V宽范围…...

CogVideoX-2b行业落地:制造业设备说明书→3D拆解动画视频自动生成

CogVideoX-2b行业落地:制造业设备说明书→3D拆解动画视频自动生成 让设备说明书"动起来",3D拆解动画一键生成 在制造业,设备说明书往往是厚厚的一沓纸质文档,里面密密麻麻的文字和静态图片,让操作人员看得头…...

Cogito-v1-preview-llama-3B保姆级教程:Ollama模型拉取→加载→提问全链路

Cogito-v1-preview-llama-3B保姆级教程:Ollama模型拉取→加载→提问全链路 Cogito v1 预览版是Deep Cogito推出的混合推理模型系列,在大多数标准基准测试中均超越了同等规模下最优的开源模型,包括来自LLaMA、DeepSeek和Qwen等模型的同类表现…...

Phi-3 Forest Lab部署教程:多用户会话隔离与上下文安全边界设置

Phi-3 Forest Lab部署教程:多用户会话隔离与上下文安全边界设置 1. 项目介绍与环境准备 Phi-3 Forest Lab是一个基于微软Phi-3 Mini 128K Instruct模型构建的轻量级AI对话终端,专注于提供安静、专注的交互体验。这个项目特别适合需要长时间专注工作的研…...

工业物联网数据分析:基于Cosmos-Reason1-7B的时序数据异常检测

工业物联网数据分析:基于Cosmos-Reason1-7B的时序数据异常检测 1. 引言 想象一下,你负责管理一个工厂里上百台设备,每台设备上都有好几个传感器,比如温度、振动、压力传感器。这些传感器就像设备的“健康监测仪”,每…...

便携式EMI低噪声放大器设计与实现

1. 项目概述 EMC/EMI探头低噪声放大器是一款面向电磁兼容性(EMC)与电磁干扰(EMI)现场检测场景设计的射频前端增益模块。其核心功能是在0.05 GHz至4 GHz宽频带范围内,为微弱电磁辐射信号提供稳定、低噪声、高线性度的20…...

文墨共鸣效果体验:输入两段话,看AI盖上什么等级的朱砂印

文墨共鸣效果体验:输入两段话,看AI盖上什么等级的朱砂印 1. 引言:当AI学会品鉴文字 在文字的世界里,有些句子看似不同却心意相通,有些则形似神离。传统的人工比对方法往往耗时费力,而冰冷的数字评分又缺乏…...

Cosmos-Reason1-7B实操手册:多图上传对比分析机械臂运动轨迹合理性

Cosmos-Reason1-7B实操手册:多图上传对比分析机械臂运动轨迹合理性 1. 引言:当AI学会“看”物理世界 想象一下,你面前有两张机械臂在不同时刻的照片。一张显示机械臂即将抓取一个玻璃杯,另一张显示它已经抓取完毕。你能判断出它…...

Kali Linux下dirsearch安装全攻略:从依赖问题到实战扫描(附常见错误解决方案)

Kali Linux下dirsearch安装与实战指南:从环境配置到高级扫描技巧 在渗透测试和安全评估领域,目录爆破工具是信息收集阶段不可或缺的利器。作为Kali Linux用户,dirsearch以其高效、灵活的特点成为众多安全从业者的首选工具。本文将带你从零开…...

Blender纹理映射避坑指南:从UV拆解到边缘控制的完整工作流

Blender纹理映射避坑指南:从UV拆解到边缘控制的完整工作流 在三维建模领域,纹理映射的质量往往决定了作品的真实感和专业度。许多中级用户在掌握基础操作后,常陷入纹理拉伸、接缝错位、边缘模糊等技术泥潭。本文将分享一套经过实战检验的工作…...

使用UltraISO快速制作再生龙U盘启动盘

1. 为什么选择UltraISO制作再生龙启动盘 每次遇到需要批量部署系统或者修复故障机器时,我都会想起再生龙这个神器。它就像系统维护界的瑞士军刀,能快速克隆、备份和恢复整个磁盘。但要让这把"军刀"发挥作用,首先得把它装进U盘里。试…...

GTE-Base-ZH在ComfyUI中的应用:为AI绘画工作流添加语义搜索节点

GTE-Base-ZH在ComfyUI中的应用:为AI绘画工作流添加语义搜索节点 如果你经常用ComfyUI画图,可能遇到过这样的烦恼:随着收集的LoRA模型、风格模板越来越多,每次创作时,想找到最贴合当前想法的那一个,就像大海…...

Phi-3 Mini 128K部署教程:GPU监控(nvidia-smi)与性能瓶颈定位方法

Phi-3 Mini 128K部署教程:GPU监控(nvidia-smi)与性能瓶颈定位方法 1. 为什么部署后还要关心GPU? 你可能已经成功部署了Phi-3 Forest Laboratory,看着它流畅地回答问题,感觉一切都很完美。但当你开始处理更…...

cv_unet_image-colorization内存泄漏排查与性能调优实战

cv_unet_image-colorization内存泄漏排查与性能调优实战 你是不是也遇到过这种情况?用训练好的图像着色模型处理几张图片时,一切正常,速度快,效果也好。但一旦让它连续处理几百上千张图片,或者部署成服务让它跑上几个…...

手把手教你搭建OpenEuler 24.03本地DNF仓库(含离线安装指南)

OpenEuler 24.03本地DNF仓库搭建全攻略:从零构建企业级离线软件源 在企业IT基础设施管理中,离线环境的软件包部署一直是个令人头疼的问题。想象一下这样的场景:你负责维护的生产服务器位于严格隔离的内网环境中,无法连接外部软件源…...

南北阁Nanbeige 4.1-3B实战案例:智能爬虫数据清洗与内容摘要生成

南北阁Nanbeige 4.1-3B实战案例:智能爬虫数据清洗与内容摘要生成 1. 引言 你有没有遇到过这种情况?用爬虫工具吭哧吭哧抓了一大堆网页数据,结果打开一看,头都大了。里面什么都有:重复的新闻、乱七八糟的广告、不完整…...

3个步骤实现毫秒级Android跨平台控制:QtScrcpy开源工具全指南

3个步骤实现毫秒级Android跨平台控制:QtScrcpy开源工具全指南 【免费下载链接】QtScrcpy QtScrcpy 可以通过 USB / 网络连接Android设备,并进行显示和控制。无需root权限。 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 作为一款轻…...

预告 线性代数:入门与全领域展开

【底层数学四部曲第四部重磅预告】 线性代数:入门与全领域展开 ——构筑高维世界的底层结构与系统思维 在《微积分:入门与全领域展开》《第一性原理:入门与全领域展开》《概率与统计:入门与全领域展开》相继完成之后,我将开启本系列的第四部、也是底层知识体系中最后一…...

番外篇 概率与统计:前沿方向、复杂系统与长期未来展望

番外篇 概率与统计:前沿方向、复杂系统与长期未来展望 一、番外篇定位:从成熟体系到前沿视野 本系列正文十章,已经构建了从公理到应用、从理论到工程的完整、自洽、可落地的概率统计体系。本章作为番外,不重复基础,不涉及敏感技术,只聚焦公开、前沿、硬核、高价值的方向…...

Janus-Pro-7B C语言项目辅助:代码审查与注释生成

Janus-Pro-7B C语言项目辅助:代码审查与注释生成 1. 引言 如果你写过C语言,尤其是那种嵌入式或者系统级的项目,肯定有过这样的体验:接手一个几千上万行的老项目,打开一看,函数名是proc_data,变…...

SeqGPT-560M在C语言项目中的应用:代码生成与优化

SeqGPT-560M在C语言项目中的应用:代码生成与优化 1. 引言 作为一名C语言开发者,你是否曾经遇到过这样的困境:面对复杂的算法实现时,需要反复查阅文档;调试内存泄漏问题时,花费数小时却找不到根源&#xf…...

AudioSeal Pixel Studio参数详解:detector threshold动态调整对FP/FN影响分析

AudioSeal Pixel Studio参数详解:detector threshold动态调整对FP/FN影响分析 1. 核心概念与背景 AudioSeal Pixel Studio作为专业级音频水印工具,其核心价值在于平衡水印检测的准确性与误判率。检测器阈值(detector threshold)…...

Zemax OpticStudio 24R1与Speos 2024R1联动实战:AR波导系统光线追踪全流程解析

Zemax OpticStudio 24R1与Speos 2024R1协同设计:AR波导系统光线追踪实战指南 在增强现实(AR)光学系统开发中,波导显示技术因其轻薄特性和大视场角优势,已成为行业主流解决方案。然而从光学设计到系统级仿真的完整流程&…...