【QuecOpen 实战-005】SIM / 网络 / NTP/NVM 基础功能全实战

news2026/5/6 22:06:01
前言在物联网设备开发中SIM 卡、网络、时间、持久化存储是任何一个蜂窝通信项目都绕不开的四大基础功能。QuecOpen C SDK 提供了比 QuecPython 更底层、更高效的 API 来实现这些功能但很多开发者在实际使用中经常遇到各种坑未处理异步回调导致程序崩溃缓冲区溢出引发的内存错误任务栈大小不足导致的异常中断上下文调用阻塞函数导致死锁本文将通过理论讲解 完整代码 实战踩坑的方式帮你彻底掌握这四大基础功能在 C 语言环境下的正确使用方法。一、开发环境准备硬件移远 EC200U-CN/EC600U-CN/BC25 模块开发板软件QuecOpen C SDK V3.3.0 及以上版本RTOS 平台工具编译工具链arm-none-eabi-gcc下载工具QFlash V5.1.0调试工具串口调试助手、QCOM其他可用的物联网 SIM 卡移动物联网卡 / 联通物联网卡本文所有代码基于EC200U 系列 RTOS 平台编写兼容所有支持 QuecOpen C SDK 的移远 4G/2G 模块。二、SIM 卡状态检测与信息获取SIM 卡是蜂窝通信的基础设备上电后第一步就是检测 SIM 卡状态并获取必要的卡信息。2.1 头文件与 API 说明#include ql_sim.h // 获取SIM卡状态 ql_sim_status_t ql_sim_get_status(void); // 获取ICCID int ql_sim_get_iccid(char *iccid, int len); // 获取IMSI int ql_sim_get_imsi(char *imsi, int len); // 获取手机号部分SIM卡支持 int ql_sim_get_phone_number(char *phone, int len);2.2 SIM 卡状态枚举typedef enum { QL_SIM_STATUS_NOT_READY 0, // SIM卡未就绪 QL_SIM_STATUS_READY 1, // SIM卡正常 QL_SIM_STATUS_NOT_INSERTED 2,// 无SIM卡 QL_SIM_STATUS_PIN_REQUIRED 3,// 需要输入PIN码 QL_SIM_STATUS_PUK_REQUIRED 4,// 需要输入PUK码 QL_SIM_STATUS_ERROR 5 // SIM卡错误 } ql_sim_status_t;2.3 完整 SIM 卡检测代码#include ql_sim.h #include ql_timer.h #include string.h #include stdio.h #define SIM_TIMEOUT 30 // 超时时间(秒) typedef struct { ql_sim_status_t status; char status_desc[32]; char iccid[24]; char imsi[16]; char phone_number[16]; } sim_info_t; // 获取SIM卡详细信息 int ql_sim_get_info(sim_info_t *info) { if (!info) return -1; memset(info, 0, sizeof(sim_info_t)); info-status ql_sim_get_status(); // 状态描述映射 const char *status_map[] { 未就绪, 正常, 未插入, 需要PIN码, 需要PUK码, 错误 }; if (info-status sizeof(status_map)/sizeof(status_map[0])) { strcpy(info-status_desc, status_map[info-status]); } else { strcpy(info-status_desc, 未知状态); } // 如果SIM卡正常获取详细信息 if (info-status QL_SIM_STATUS_READY) { ql_sim_get_iccid(info-iccid, sizeof(info-iccid)); ql_sim_get_imsi(info-imsi, sizeof(info-imsi)); ql_sim_get_phone_number(info-phone_number, sizeof(info-phone_number)); // 处理空手机号 if (strlen(info-phone_number) 0) { strcpy(info-phone_number, 未知); } } return 0; } // 等待SIM卡就绪 int ql_sim_wait_for_ready(void) { int timeout SIM_TIMEOUT; sim_info_t info; printf(正在检测SIM卡...\n); while (timeout-- 0) { ql_sim_get_info(info); if (info.status QL_SIM_STATUS_READY) { printf(SIM卡就绪\n); printf(ICCID: %s\n, info.iccid); printf(IMSI: %s\n, info.imsi); printf(手机号: %s\n, info.phone_number); return 0; } printf(SIM卡状态: %s1秒后重试...\n, info.status_desc); ql_timer_sleep(1000); // 休眠1秒 } printf(SIM卡检测超时(%d秒)\n, SIM_TIMEOUT); return -1; }2.4 实战踩坑记录上电后立即检测 SIM 卡会返回未就绪模块上电后 SIM 卡需要 2-3 秒初始化时间建议延迟 3 秒后再开始检测缓冲区大小必须足够ICCID 最长 20 位IMSI 最长 15 位缓冲区必须预留足够空间get_phone_number () 经常返回空大部分物联网卡没有写入手机号信息不要依赖这个函数热插拔 SIM 卡QuecOpen C SDK 默认不支持 SIM 卡热插拔热插拔后需要重启模块才能重新识别三、网络状态管理与数据业务SIM 卡正常后下一步就是进行网络注册和数据业务激活。3.1 头文件与 API 说明#include ql_net.h #include ql_data_call.h // 获取网络注册状态 ql_net_reg_state_t ql_net_get_reg_state(void); // 获取信号强度 int ql_net_get_csq(void); // 设置APN参数 int ql_data_call_set_profile(int profile_id, const char *apn, const char *username, const char *password); // 激活数据业务 int ql_data_call_start(int profile_id, ql_data_call_ip_type_t ip_type); // 获取数据业务信息 int ql_data_call_get_info(int profile_id, ql_data_call_info_t *info);3.2 网络状态枚举typedef enum { QL_NET_REG_STATE_NOT_REGISTERED 0, // 未注册 QL_NET_REG_STATE_REGISTERED_HOME 1, // 已注册本地网络 QL_NET_REG_STATE_SEARCHING 2, // 正在搜索 QL_NET_REG_STATE_REGISTRATION_DENIED 3, // 注册被拒 QL_NET_REG_STATE_UNKNOWN 4, // 未知状态 QL_NET_REG_STATE_REGISTERED_ROAMING 5 // 已注册漫游网络 } ql_net_reg_state_t; typedef enum { QL_DATA_CALL_TYPE_IPV4 0, QL_DATA_CALL_TYPE_IPV6 1, QL_DATA_CALL_TYPE_IPV4V6 2 } ql_data_call_ip_type_t;3.3 完整网络管理代码#include ql_net.h #include ql_data_call.h #include ql_timer.h #include string.h #include stdio.h #define NET_TIMEOUT 60 // 网络超时时间(秒) #define PROFILE_ID 1 // 默认PDP上下文ID typedef struct { ql_net_reg_state_t reg_state; char reg_state_desc[32]; int csq; char ip_address[16]; char net_mode[16]; } net_info_t; // 获取网络详细信息 int ql_net_get_info(net_info_t *info) { if (!info) return -1; memset(info, 0, sizeof(net_info_t)); info-reg_state ql_net_get_reg_state(); info-csq ql_net_get_csq(); // 注册状态描述映射 const char *reg_state_map[] { 未注册, 已注册(本地), 正在搜索, 注册被拒, 未知, 已注册(漫游) }; if (info-reg_state sizeof(reg_state_map)/sizeof(reg_state_map[0])) { strcpy(info-reg_state_desc, reg_state_map[info-reg_state]); } else { strcpy(info-reg_state_desc, 未知状态); } // 获取IP地址 ql_data_call_info_t data_call_info; if (ql_data_call_get_info(PROFILE_ID, data_call_info) 0) { if (data_call_info.state QL_DATA_CALL_STATE_CONNECTED) { strcpy(info-ip_address, data_call_info.ipv4_addr); } else { strcpy(info-ip_address, 未获取); } } else { strcpy(info-ip_address, 获取失败); } return 0; } // 激活数据业务 int ql_net_activate_data_call(const char *apn, const char *username, const char *password) { int ret; ql_data_call_info_t info; // 先检查是否已经激活 ret ql_data_call_get_info(PROFILE_ID, info); if (ret 0 info.state QL_DATA_CALL_STATE_CONNECTED) { printf(数据业务已激活IP: %s\n, info.ipv4_addr); return 0; } // 设置APN参数 if (apn strlen(apn) 0) { ret ql_data_call_set_profile(PROFILE_ID, apn, username, password); if (ret ! 0) { printf(设置APN失败错误码: %d\n, ret); return -1; } } // 激活数据业务 printf(正在激活数据业务...\n); ret ql_data_call_start(PROFILE_ID, QL_DATA_CALL_TYPE_IPV4); if (ret ! 0) { printf(激活数据业务失败错误码: %d\n, ret); return -1; } // 等待IP获取 for (int i 0; i 10; i) { ret ql_data_call_get_info(PROFILE_ID, info); if (ret 0 info.state QL_DATA_CALL_STATE_CONNECTED) { printf(数据业务激活成功IP: %s\n, info.ipv4_addr); return 0; } ql_timer_sleep(1000); } printf(数据业务激活超时\n); return -1; } // 等待网络就绪 int ql_net_wait_for_ready(const char *apn, const char *username, const char *password) { int timeout NET_TIMEOUT; net_info_t info; printf(正在连接网络...\n); while (timeout-- 0) { ql_net_get_info(info); printf(网络状态: %s信号强度: %d\n, info.reg_state_desc, info.csq); // 检查是否已注册 if (info.reg_state QL_NET_REG_STATE_REGISTERED_HOME || info.reg_state QL_NET_REG_STATE_REGISTERED_ROAMING) { // 激活数据业务 if (ql_net_activate_data_call(apn, username, password) 0) { printf(网络准备就绪\n); return 0; } } ql_timer_sleep(2000); // 休眠2秒 } printf(网络连接超时(%d秒)\n, NET_TIMEOUT); return -1; }3.4 实战踩坑记录APN 设置问题大部分物联网卡使用默认 APN 即可不要随意设置 APN 参数。如果需要设置务必咨询运营商获取正确的 APN信号强度判断CSQ 值范围 0-3199 表示无信号。一般来说 CSQ10 可以正常通信CSQ20 通信质量良好网络重连机制实际项目中需要注册网络状态回调函数检测到网络断开后自动重连漫游网络处理如果设备可能在漫游环境使用需要确保 SIM 卡开通了漫游功能并且代码中处理状态 5不要在中断上下文调用网络函数所有网络相关函数都是阻塞的不能在中断服务程序中调用四、NTP 时间同步物联网设备通常没有 RTC 电池上电后时间会重置为出厂时间必须通过 NTP 服务器同步准确的时间。4.1 头文件与 API 说明#include ql_ntp.h #include ql_rtc.h // 同步NTP时间 int ql_ntp_sync(const char *server, int timeout, int timezone); // 获取RTC时间 int ql_rtc_get_time(ql_rtc_time_t *time); // 设置RTC时间 int ql_rtc_set_time(ql_rtc_time_t *time);4.2 完整 NTP 同步代码#include ql_ntp.h #include ql_rtc.h #include ql_timer.h #include stdio.h #include string.h #define NTP_SERVER ntp.aliyun.com #define NTP_TIMEOUT 10 // 超时时间(秒) #define TIMEZONE 8 // 东八区 // 格式化时间字符串 void ql_time_format(ql_rtc_time_t *time, char *buf, int len) { if (!time || !buf || len 20) return; snprintf(buf, len, %04d-%02d-%02d %02d:%02d:%02d, time-year, time-month, time-day, time-hour, time-minute, time-second); } // 同步NTP时间 int ql_ntp_sync_time(void) { int ret; ql_rtc_time_t rtc_time; printf(正在同步NTP时间服务器: %s\n, NTP_SERVER); // 同步NTP时间 ret ql_ntp_sync(NTP_SERVER, NTP_TIMEOUT, TIMEZONE); if (ret ! 0) { printf(NTP时间同步失败错误码: %d\n, ret); return -1; } // 获取同步后的时间 ql_rtc_get_time(rtc_time); char time_str[20]; ql_time_format(rtc_time, time_str, sizeof(time_str)); printf(NTP时间同步成功: %s\n, time_str); return 0; } // 获取当前时间戳(秒) unsigned int ql_time_get_timestamp(void) { ql_rtc_time_t time; ql_rtc_get_time(time); // 简单的时间戳计算不考虑闰年和月份天数差异仅供参考 // 实际项目中建议使用标准的mktime函数 unsigned int timestamp 0; timestamp (time.year - 1970) * 31536000; timestamp (time.month - 1) * 2592000; timestamp (time.day - 1) * 86400; timestamp time.hour * 3600; timestamp time.minute * 60; timestamp time.second; return timestamp; }4.3 实战踩坑记录NTP 服务器选择推荐使用国内 NTP 服务器如ntp.aliyun.com、ntp1.aliyun.com、cn.ntp.org.cn避免使用国外服务器导致同步失败同步时机必须在网络连接成功后再进行 NTP 同步否则会直接失败时区处理ql_ntp_sync()函数已经包含了时区参数不需要手动调整同步失败处理实际项目中应该添加重试机制同步失败后每隔一段时间重试一次RTC 精度问题模块内部 RTC 精度有限长时间运行会有偏差建议每天同步一次 NTP 时间五、NVM 非易失性存储NVMNon-Volatile Memory是模块内部的非易失性存储可以用来保存设备配置、运行参数等需要掉电不丢失的数据。5.1 头文件与 API 说明#include ql_nvm.h // 写入数据到NVM int ql_nvm_write(const char *key, const void *value, int len); // 从NVM读取数据 int ql_nvm_read(const char *key, void *value, int len); // 删除指定键 int ql_nvm_delete(const char *key); // 检查键是否存在 int ql_nvm_exists(const char *key); // 获取所有键 int ql_nvm_list(char *keys, int len);5.2 完整 NVM 操作代码#include ql_nvm.h #include string.h #include stdio.h #define NVM_NAMESPACE device_config // 命名空间 // 写入字符串到NVM int ql_nvm_write_string(const char *key, const char *value) { if (!key || !value) return -1; return ql_nvm_write(key, value, strlen(value) 1); } // 从NVM读取字符串 int ql_nvm_read_string(const char *key, char *value, int len, const char *default_value) { if (!key || !value || len 0) return -1; if (!ql_nvm_exists(key)) { if (default_value) { strncpy(value, default_value, len - 1); value[len - 1] \0; } return -1; } int ret ql_nvm_read(key, value, len); if (ret 0) { if (default_value) { strncpy(value, default_value, len - 1); value[len - 1] \0; } return -1; } value[ret] \0; return 0; } // 写入整数到NVM int ql_nvm_write_int(const char *key, int value) { if (!key) return -1; return ql_nvm_write(key, value, sizeof(int)); } // 从NVM读取整数 int ql_nvm_read_int(const char *key, int default_value) { if (!key) return default_value; int value; if (ql_nvm_read(key, value, sizeof(int)) ! sizeof(int)) { return default_value; } return value; } // 写入结构体到NVM int ql_nvm_write_struct(const char *key, const void *struct_ptr, int struct_size) { if (!key || !struct_ptr || struct_size 0) return -1; return ql_nvm_write(key, struct_ptr, struct_size); } // 从NVM读取结构体 int ql_nvm_read_struct(const char *key, void *struct_ptr, int struct_size) { if (!key || !struct_ptr || struct_size 0) return -1; if (!ql_nvm_exists(key)) { return -1; } return ql_nvm_read(key, struct_ptr, struct_size); }5.3 实战踩坑记录NVM 容量限制QuecOpen C SDK 的 NVM 总容量约为 64KB不要存储大量数据数据类型限制NVM 支持任意类型的数据但写入和读取时必须保证数据长度一致频繁写入问题NVM 有擦写次数限制约 10 万次避免频繁写入同一个键掉电保护写入 NVM 过程中如果掉电可能导致数据损坏重要数据建议写入后立即读取验证键名长度限制键名长度不能超过 32 个字符六、综合实战示例下面是一个完整的设备初始化流程整合了上面所有的功能#include ql_app.h #include ql_timer.h #include ql_system.h #include stdio.h // 设备配置结构体 typedef struct { char device_id[32]; int report_interval; char mqtt_host[64]; int mqtt_port; char apn[32]; char apn_username[32]; char apn_password[32]; char ntp_server[64]; } device_config_t; // 全局设备配置 device_config_t g_device_config; // 加载设备配置 void load_device_config(void) { // 先尝试从NVM读取配置 if (ql_nvm_read_struct(device_config, g_device_config, sizeof(device_config_t)) 0) { printf(从NVM加载设备配置成功\n); return; } // 如果读取失败使用默认配置 printf(使用默认设备配置\n); memset(g_device_config, 0, sizeof(device_config_t)); strcpy(g_device_config.device_id, EC200U-20240520001); g_device_config.report_interval 60; strcpy(g_device_config.mqtt_host, 192.168.1.100); g_device_config.mqtt_port 1883; strcpy(g_device_config.ntp_server, ntp.aliyun.com); // 保存默认配置到NVM ql_nvm_write_struct(device_config, g_device_config, sizeof(device_config_t)); } // 设备初始化 int device_init(void) { printf(\n); printf(设备开始初始化...\n); printf(\n); // 1. 加载设备配置 printf(\n[1/4] 加载设备配置...\n); load_device_config(); printf(设备配置加载完成\n); // 2. 检测SIM卡 printf(\n[2/4] 检测SIM卡...\n); if (ql_sim_wait_for_ready() ! 0) { printf(SIM卡检测失败设备初始化失败\n); return -1; } printf(SIM卡检测通过\n); // 3. 连接网络 printf(\n[3/4] 连接网络...\n); if (ql_net_wait_for_ready(g_device_config.apn, g_device_config.apn_username, g_device_config.apn_password) ! 0) { printf(网络连接失败设备初始化失败\n); return -1; } printf(网络连接成功\n); // 4. 同步NTP时间 printf(\n[4/4] 同步NTP时间...\n); if (ql_ntp_sync_time() ! 0) { printf(NTP时间同步失败将使用默认时间\n); } else { printf(NTP时间同步成功\n); } printf(\n\n); printf(设备初始化完成\n); ql_rtc_time_t now; ql_rtc_get_time(now); char time_str[20]; ql_time_format(now, time_str, sizeof(time_str)); printf(当前时间: %s\n, time_str); net_info_t net_info; ql_net_get_info(net_info); printf(IP地址: %s\n, net_info.ip_address); printf(\n); // 保存初始化时间 ql_nvm_write_string(last_init_time, time_str); return 0; } // 主任务 void main_task(void *arg) { // 延迟3秒等待模块完全上电 ql_timer_sleep(3000); if (device_init() 0) { printf(\n设备初始化成功进入主循环\n); // 主业务循环 while (1) { // 这里添加你的主业务逻辑 ql_timer_sleep(1000); } } else { printf(\n设备初始化失败5秒后重启...\n); ql_timer_sleep(5000); ql_system_reset(); } } // 应用入口 int ql_app_main(void *arg) { // 创建主任务 ql_task_create(main_task, main_task, 4096, NULL, 5, NULL); return 0; }七、常见问题与解决方案Q1: SIM 卡状态显示正常但网络注册一直失败A: 可能的原因和解决方案检查 SIM 卡是否欠费或已过期确认模块所在位置有运营商信号覆盖尝试手动设置 APN 参数检查 SIM 卡是否开通了数据业务重启模块重试Q2: NTP 同步一直失败A: 可能的原因和解决方案确保网络连接正常能访问互联网更换 NTP 服务器推荐使用阿里云 NTP 服务器增加同步超时时间检查防火墙是否阻止了 NTP 协议UDP 123 端口Q3: NVM 写入的数据重启后丢失A: 可能的原因和解决方案确保写入后没有立即掉电NVM 写入需要一定时间写入后立即读取验证数据是否正确检查是否超过了 NVM 容量限制尝试格式化 NVM 后重新写入Q4: 程序运行一段时间后崩溃A: 可能的原因和解决方案检查是否有缓冲区溢出检查任务栈大小是否足够检查是否有内存泄漏确保没有在中断上下文调用阻塞函数八、总结与下节预告本文详细讲解了 QuecOpen C SDK 四大基础功能的实现方法包括SIM 卡状态检测与信息获取网络状态管理与数据业务激活NTP 时间同步与时区处理NVM 非易失性存储的使用这些功能是所有物联网项目的基础掌握了它们你就可以开始开发真正的物联网应用了。后续预告下一篇文章【QuecOpen 实战-006】FreeRTOS 多任务编程实战原创不易如果本文对你有帮助欢迎点赞、收藏、关注三连有任何问题都可以在评论区留言我会及时回复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2589510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…