在线商城网站怎么做网站建设合同.doc

张小明 2026/1/13 11:26:09
在线商城网站怎么做,网站建设合同.doc,北京海淀区算富人区吗,网站建设 中企动力医院HC32F460/ESP32-S3 对接自带 MQTT 的 NB-IoT 语音聊天系统#xff08;私有云 微信小程序#xff09; 一、核心调整说明#xff1a;选用自带 MQTT 协议栈的 NB-IoT 模组 1.1 模组选型#xff1a;移远 BC35-G#xff08;核心优势#xff09; 移远 BC35-G 是专为物联网设计…HC32F460/ESP32-S3 对接自带 MQTT 的 NB-IoT 语音聊天系统私有云 微信小程序一、核心调整说明选用自带 MQTT 协议栈的 NB-IoT 模组1.1 模组选型移远 BC35-G核心优势移远 BC35-G 是专为物联网设计的 NB-IoT 模组内置 MQTT 3.1.1 协议栈无需主控HC32F460/ESP32-S3封装 MQTT 帧仅需通过 UART 发送 AT 指令即可完成 MQTT 连接、订阅、发布大幅降低主控开发难度减少资源占用提升通信稳定性。1.2 方案对比基于自带 MQTT 的 NB-IoT 模组维度方案 1HC32F460BC35-G方案 2ESP32-S3BC35-G核心架构HC32F460 BC35-G自带 MQTT VS1053ESP32-S3 BC35-G自带 MQTT VS1053MQTT 处理方式主控发 AT 指令模组内置协议栈完成 MQTT 通信主控发 AT 指令模组内置协议栈完成 MQTT 通信开发难度中裸机 简化 AT 指令无需封装 MQTT低框架 简化 AT 指令无需封装 MQTT主控资源占用极低仅处理 AT 指令 / 语音无 MQTT 协议栈开销低仅处理 AT 指令 / 语音无 MQTT 协议栈开销功耗极致低功耗HC32 休眠 BC35-G PSM 模式μA 级中等ESP32 休眠 BC35-G PSM 模式通信稳定性高模组原生 MQTT适配 NB-IoT 低带宽高模组原生 MQTT适配 NB-IoT 低带宽适用场景工业低功耗终端矿用 / 物联网传感器民用 / 快速迭代场景智能家居 / 便携设备1.3 硬件连接调整BC35-G 与主控的 UART 连接BC35-G 的 UART 通信引脚与 BC28 兼容硬件连接无需大幅调整核心引脚如下主控引脚BC35-G 引脚功能说明HC32F460 PD0/ESP32-S3 IO16TXD主控发送→模组接收HC32F460 PD1/ESP32-S3 IO17RXD主控接收→模组发送主控 IO 口PWRKEY模组开关机低电平触发GNDGND共地3.3V 电平匹配二、系统整体设计适配自带 MQTT 的 NB-IoT 模组2.1 核心架构简化版终端侧HC32F460/ESP32-S3 #x20; ├── VS1053采集/播放MP3语音 #x20; ├── BC35-G自带MQTT通过AT指令配置MQTT接入私有云 #x20; ↓ NB-IoT运营商网络 #x20; ↓ 私有云服务器 #x20; ├── EMQ X MQTT Broker接收模组MQTT消息 #x20; ├── Python服务MQTT-WebSocket转发对接微信小程序 #x20; ↓ 微信小程序录音/播放WebSocket接收/发送语音2.2 通信协议优化模组自带 MQTT 适配1终端 -BC35-G AT 指令简化主控仅需发送标准化 AT 指令配置 BC35-G 的 MQTT 参数无需拼接 MQTT 帧示例核心指令ATQMTCFGbroker,0,120.78.xxx.xxx,1883 // 配置私有云MQTT Broker ATQMTCONN0,device\_001,admin,123456 // MQTT登录模组自动封装报文 ATQMTPUB0,0,0,0,iot/voice/device\_001/upload,语音数据 // 发布消息模组自动处理MQTT帧2MQTT 主题 / 数据格式与原方案兼容终端上行iot/voice/device/{dev_id}/upload模组直接发布终端下行iot/voice/device/{dev_id}/down模组订阅后推送至主控语音数据帧保留原帧格式0xAA55设备ID长度语音数据校验和模组仅透传二进制数据不修改内容。三、方案 1HC32F460BC35-G自带 MQTT实现3.1 核心代码调整简化 MQTT AT 指令1头文件与宏定义新增 BC35-G 适配\#include hc32f460\_clk.h \#include hc32f460\_uart.h \#include hc32f460\_spi.h \#include hc32f460\_gpio.h \#include delay.h \#include \string.h // 设备配置 \#define DEV\_ID device\_001 // 终端唯一ID \#define NB\_UART HC32F460\_UART2 // 与BC35-G通信的UART \#define BAUD\_RATE 9600 // BC35-G默认波特率9600 \#define VOICE\_BUF\_LEN 4096 // 语音缓存长度 // 私有云MQTT配置BC35-G直接对接 \#define MQTT\_BROKER 120.78.xxx.xxx // 私有云公网IP \#define MQTT\_PORT 1883 // MQTT端口 \#define MQTT\_USER admin // MQTT账号 \#define MQTT\_PWD 123456 // MQTT密码 // 引脚定义与原方案一致 \#define VS1053\_CS\_PIN GPIO\_PORT\_A, GPIO\_PIN\_8 \#define VS1053\_DREQ\_PIN GPIO\_PORT\_A, GPIO\_PIN\_9 \#define VS1053\_RST\_PIN GPIO\_PORT\_A, GPIO\_PIN\_10 \#define RECORD\_KEY\_PIN GPIO\_PORT\_A, GPIO\_PIN\_0 \#define BC35\_PWRKEY\_PIN GPIO\_PORT\_A, GPIO\_PIN\_2 // BC35-G开关机引脚 // 全局变量 uint8\_t g\_voice\_buf\[VOICE\_BUF\_LEN]; // 语音数据缓存 uint16\_t g\_voice\_len 0; // 语音数据长度 uint8\_t g\_recv\_buf\[2048]; // BC35-G接收缓存 uint16\_t g\_recv\_idx 0; // 接收索引2BC35-G 初始化函数自带 MQTT 适配/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* BC35-G开关机函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void BC35\_PowerOn(void) { #x20; stc\_gpio\_init\_t stcGpioInit; #x20; GPIO\_StructInit(\stcGpioInit); #x20; stcGpioInit.u16PinDir PIN\_DIR\_OUT; #x20; GPIO\_Init(BC35\_PWRKEY\_PIN, \stcGpioInit); #x20; #x20; #x20; // 低电平触发开机持续1.2秒 #x20; GPIO\_ResetPins(BC35\_PWRKEY\_PIN); #x20; delay\_ms(1200); #x20; GPIO\_SetPins(BC35\_PWRKEY\_PIN); #x20; delay\_ms(5000); // 等待模组入网 } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 发送AT指令并等待响应BC35-G适配 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ bool BC35\_SendATCmd(char \*cmd, char \*resp, uint32\_t timeout) { #x20; uint32\_t start millis(); #x20; g\_recv\_idx 0; #x20; memset(g\_recv\_buf, 0, sizeof(g\_recv\_buf)); #x20; // 发送AT指令BC35-G需加\r\n #x20; UART\_SendString(NB\_UART, cmd); #x20; delay\_ms(10); #x20; // 等待响应BC35-G响应格式OK/ERROR/QMTCONN: 0,0 #x20; while(millis() - start timeout) #x20; { #x20; if(g\_recv\_idx 0 strstr((char\*)g\_recv\_buf, resp) ! NULL) #x20; { #x20; printf(AT Success: %s\r\n, cmd); #x20; return true; #x20; } #x20; delay\_ms(10); #x20; } #x20; printf(AT Fail: %s, Recv: %s\r\n, cmd, g\_recv\_buf); #x20; return false; } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* BC35-G MQTT初始化核心自带协议栈 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ bool BC35\_MQTT\_Init(void) { #x20; // 1. 开机并测试AT指令 #x20; BC35\_PowerOn(); #x20; if(!BC35\_SendATCmd(AT\r\n, OK, 1000)) return false; #x20; // 2. 关闭回显、附着NB-IoT网络 #x20; if(!BC35\_SendATCmd(ATE0\r\n, OK, 1000)) return false; #x20; if(!BC35\_SendATCmd(ATCGATT1\r\n, OK, 8000)) return false; // 附着网络最长8秒 #x20; // 3. 配置NB-IoT APN移动cmnbiot联通unilink #x20; if(!BC35\_SendATCmd(ATCGDCONT1,\\IP\\,\\cmnbiot\\\r\n, OK, 2000)) return false; #x20; // 4. 配置MQTT BrokerBC35-G自带MQTT协议栈 #x20; char mqtt\_cfg\_broker\[128]; #x20; sprintf(mqtt\_cfg\_broker, ATQMTCFG\\broker\\,0,\\%s\\,%d\r\n, MQTT\_BROKER, MQTT\_PORT); #x20; if(!BC35\_SendATCmd(mqtt\_cfg\_broker, OK, 2000)) return false; #x20; // 5. 配置MQTT登录参数账号密码 #x20; char mqtt\_cfg\_auth\[128]; #x20; sprintf(mqtt\_cfg\_auth, ATQMTCFG\\auth\\,0,\\%s\\,\\%s\\\r\n, MQTT\_USER, MQTT\_PWD); #x20; if(!BC35\_SendATCmd(mqtt\_cfg\_auth, OK, 2000)) return false; #x20; // 6. 建立MQTT连接模组自动封装MQTT CONNECT报文 #x20; char mqtt\_conn\[128]; #x20; sprintf(mqtt\_conn, ATQMTCONN0,\\%s\\\r\n, DEV\_ID); // 0客户端IDDEV\_ID设备ID #x20; if(!BC35\_SendATCmd(mqtt\_conn, QMTCONN: 0,0, 10000)) return false; // 0,0连接成功 #x20; // 7. 订阅下行语音主题模组自动处理MQTT SUBSCRIBE #x20; char mqtt\_sub\[128]; #x20; sprintf(mqtt\_sub, ATQMTSUB0,1,\\iot/voice/device/%s/down\\,0\r\n, DEV\_ID); #x20; if(!BC35\_SendATCmd(mqtt\_sub, QMTSUB: 0,1,0, 5000)) return false; // 0订阅成功 #x20; return true; }3BC35-G 语音发布函数简化版模组自带 MQTT/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 封装语音帧并通过BC35-G发布自带MQTT \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ bool BC35\_Publish\_Voice(uint8\_t \*voice\_data, uint16\_t voice\_len) { #x20; // 1. 构造语音帧保持原格式AA55设备ID长度数据校验和 #x20; uint8\_t frame\_buf\[VOICE\_BUF\_LEN 12]; #x20; uint16\_t frame\_len 2 8 2 voice\_len 1; #x20; frame\_buf\[0] 0xAA; #x20; frame\_buf\[1] 0x55; #x20; memcpy(\frame\_buf\[2], DEV\_ID, 8); // 设备ID8字节 #x20; frame\_buf\[10] (voice\_len 8) 0xFF; #x20; frame\_buf\[11] voice\_len 0xFF; #x20; memcpy(\frame\_buf\[12], voice\_data, voice\_len); #x20; // 计算校验和 #x20; uint8\_t checksum 0; #x20; for(uint16\_t i2; i12voice\_len; i) checksum ^ frame\_buf\[i]; #x20; frame\_buf\[12voice\_len] checksum; #x20; // 2. 转换为十六进制字符串BC35-G仅支持字符串发布适配NB-IoT低带宽 #x20; char hex\_buf\[VOICE\_BUF\_LEN\*2 24]; #x20; memset(hex\_buf, 0, sizeof(hex\_buf)); #x20; for(uint16\_t i0; i\frame\_len; i) #x20; { #x20; sprintf(\hex\_buf\[i\*2], %02X, frame\_buf\[i]); #x20; } #x20; // 3. MQTT发布BC35-G自动封装MQTT PUBLISH报文 #x20; char mqtt\_pub\[2048]; #x20; sprintf(mqtt\_pub, ATQMTPUB0,0,0,0,\\iot/voice/device/%s/upload\\,\\%s\\\r\n, DEV\_ID, hex\_buf); #x20; return BC35\_SendATCmd(mqtt\_pub, QMTPUB: 0,0, 10000); // QMTPUB:0,0发布成功 }4HC32F460 主函数适配 BC35-Gint main(void) { #x20; System\_Init(); // 时钟/UART/SPI/VS1053初始化与原方案一致 #x20; printf(HC32F460 BC35-G Voice System Start\r\n); #x20; // 初始化BC35-G自带MQTT #x20; if(!BC35\_MQTT\_Init()) #x20; { #x20; printf(BC35-G MQTT Init Fail\r\n); #x20; while(1); #x20; } #x20; while(1) #x20; { #x20; // 录音按键触发PA0按下 #x20; if(GPIO\_GetInputPin(RECORD\_KEY\_PIN) Reset) #x20; { #x20; delay\_ms(20); // 消抖 #x20; if(GPIO\_GetInputPin(RECORD\_KEY\_PIN) Reset) #x20; { #x20; printf(Start Record...\r\n); #x20; // 采集语音VS1053函数与原方案一致 #x20; g\_voice\_len VS1053\_Record\_Voice(g\_voice\_buf, VOICE\_BUF\_LEN); #x20; // 通过BC35-G发布至私有云自带MQTT #x20; if(BC35\_Publish\_Voice(g\_voice\_buf, g\_voice\_len)) #x20; { #x20; printf(Voice Publish Success, Len: %d\r\n, g\_voice\_len); #x20; } #x20; else #x20; { #x20; printf(Voice Publish Fail\r\n); #x20; } #x20; while(GPIO\_GetInputPin(RECORD\_KEY\_PIN) Reset); // 等待按键释放 #x20; } #x20; } #x20; // 处理BC35-G下行数据订阅的语音消息 #x20; if(g\_recv\_idx 0 strstr((char\*)g\_recv\_buf, QMTRECV:) ! NULL) #x20; { #x20; // 解析模组推送的下行语音数据与原方案一致 #x20; Parse\_BC35\_DownData(g\_recv\_buf); #x20; g\_recv\_idx 0; #x20; memset(g\_recv\_buf, 0, sizeof(g\_recv\_buf)); #x20; } #x20; delay\_ms(10); #x20; } }四、方案 2ESP32-S3BC35-G自带 MQTT实现4.1 核心代码调整Arduino 框架1头文件与宏定义BC35-G 适配\#include \Arduino.h \#include \SPI.h \#include \HardwareSerial.h // 设备配置 \#define DEV\_ID device\_001 \#define VOICE\_BUF\_LEN 4096 // 私有云MQTT配置BC35-G直接对接 \#define MQTT\_BROKER 120.78.xxx.xxx \#define MQTT\_PORT 1883 \#define MQTT\_USER admin \#define MQTT\_PWD 123456 // 引脚定义 \#define VS1053\_CS 5 \#define VS1053\_DREQ 6 \#define VS1053\_RST 7 \#define RECORD\_KEY 0 \#define BC35\_PWRKEY 8 // BC35-G开关机引脚 \#define NB\_UART Serial2 // 与BC35-G通信 \#define BAUD\_RATE 9600 // BC35-G默认波特率 // 全局变量 HardwareSerial \bc35Serial NB\_UART; uint8\_t g\_voice\_buf\[VOICE\_BUF\_LEN]; uint16\_t g\_voice\_len 0; String bc35\_recv\_buf ;2BC35-G MQTT 初始化函数简化版/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* BC35-G开关机 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void BC35\_PowerOn() { #x20; pinMode(BC35\_PWRKEY, OUTPUT); #x20; digitalWrite(BC35\_PWRKEY, LOW); #x20; delay(1200); // 触发开机 #x20; digitalWrite(BC35\_PWRKEY, HIGH); #x20; delay(5000); // 等待入网 } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* BC35-G AT指令发送 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ bool BC35\_SendATCmd(String cmd, String resp, uint32\_t timeout) { #x20; bc35\_recv\_buf ; #x20; bc35Serial.flush(); #x20; bc35Serial.print(cmd); #x20; uint32\_t start millis(); #x20; while(millis() - start timeout) #x20; { #x20; while(bc35Serial.available()) #x20; { #x20; bc35\_recv\_buf char(bc35Serial.read()); #x20; } #x20; if(bc35\_recv\_buf.indexOf(resp) ! -1) #x20; { #x20; Serial.printf(AT OK: %s\r\n, cmd.c\_str()); #x20; return true; #x20; } #x20; delay(10); #x20; } #x20; Serial.printf(AT Fail: %s, Recv: %s\r\n, cmd.c\_str(), bc35\_recv\_buf.c\_str()); #x20; return false; } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* BC35-G MQTT初始化自带协议栈 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ bool BC35\_MQTT\_Init() { #x20; bc35Serial.begin(BAUD\_RATE, SERIAL\_8N1, 17, 16); // RX, TX #x20; BC35\_PowerOn(); #x20; // 基础配置与HC32逻辑一致简化为Arduino语法 #x20; if(!BC35\_SendATCmd(AT\r\n, OK, 1000)) return false; #x20; if(!BC35\_SendATCmd(ATE0\r\n, OK, 1000)) return false; #x20; if(!BC35\_SendATCmd(ATCGATT1\r\n, OK, 8000)) return false; #x20; if(!BC35\_SendATCmd(ATCGDCONT1,\\IP\\,\\cmnbiot\\\r\n, OK, 2000)) return false; #x20; // 配置MQTT Broker自带协议栈 #x20; String mqtt\_cfg String(ATQMTCFG\\broker\\,0,\\) MQTT\_BROKER \\, String(MQTT\_PORT) \r\n; #x20; if(!BC35\_SendATCmd(mqtt\_cfg, OK, 2000)) return false; #x20; // MQTT登录 #x20; String mqtt\_auth String(ATQMTCFG\\auth\\,0,\\) MQTT\_USER \\,\\ MQTT\_PWD \\\r\n; #x20; if(!BC35\_SendATCmd(mqtt\_auth, OK, 2000)) return false; #x20; // 建立MQTT连接 #x20; String mqtt\_conn String(ATQMTCONN0,\\) DEV\_ID \\\r\n; #x20; if(!BC35\_SendATCmd(mqtt\_conn, QMTCONN: 0,0, 10000)) return false; #x20; // 订阅下行主题 #x20; String mqtt\_sub String(ATQMTSUB0,1,\\iot/voice/device/) DEV\_ID /down\\,0\r\n; #x20; if(!BC35\_SendATCmd(mqtt\_sub, QMTSUB: 0,1,0, 5000)) return false; #x20; return true; }3语音发布函数BC35-G 自带 MQTT/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 发布语音至私有云BC35-G适配 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ bool BC35\_Publish\_Voice(uint8\_t \*voice\_data, uint16\_t voice\_len) { #x20; // 构造语音帧与HC32一致 #x20; uint8\_t frame\[VOICE\_BUF\_LEN 12]; #x20; frame\[0] 0xAA; #x20; frame\[1] 0x55; #x20; memcpy(\frame\[2], DEV\_ID, 8); #x20; frame\[10] (voice\_len 8) 0xFF; #x20; frame\[11] voice\_len 0xFF; #x20; memcpy(\frame\[12], voice\_data, voice\_len); #x20; // 计算校验和 #x20; uint8\_t checksum 0; #x20; for(uint16\_t i2; i12voice\_len; i) checksum ^ frame\[i]; #x20; frame\[12voice\_len] checksum; #x20; // 转十六进制字符串BC35-G发布要求 #x20; String hex\_str ; #x20; for(int i0; i12voice\_len1; i) #x20; { #x20; hex\_str String(frame\[i], HEX); #x20; } #x20; // MQTT发布模组自动封装报文 #x20; String mqtt\_pub String(ATQMTPUB0,0,0,0,\\iot/voice/device/) DEV\_ID /upload\\,\\ hex\_str \\\r\n; #x20; return BC35\_SendATCmd(mqtt\_pub, QMTPUB: 0,0, 10000); }4ESP32-S3 主函数void setup() { #x20; Serial.begin(115200); #x20; pinMode(RECORD\_KEY, INPUT\_PULLUP); #x20; VS1053\_Init(); // 语音模块初始化与原方案一致 #x20; Serial.println(ESP32-S3 BC35-G Voice System Start); #x20; if(!BC35\_MQTT\_Init()) #x20; { #x20; Serial.println(BC35-G MQTT Init Fail); #x20; while(1); #x20; } } void loop() { #x20; // 录音按键触发 #x20; if(digitalRead(RECORD\_KEY) LOW) #x20; { #x20; delay(20); #x20; if(digitalRead(RECORD\_KEY) LOW) #x20; { #x20; Serial.println(Start Record...); #x20; g\_voice\_len VS1053\_Record\_Voice(g\_voice\_buf, VOICE\_BUF\_LEN); #x20; if(BC35\_Publish\_Voice(g\_voice\_buf, g\_voice\_len)) #x20; { #x20; Serial.printf(Publish Success, Len: %d\r\n, g\_voice\_len); #x20; } #x20; else #x20; { #x20; Serial.println(Publish Fail); #x20; } #x20; while(digitalRead(RECORD\_KEY) LOW); #x20; } #x20; } #x20; // 处理BC35-G下行语音数据 #x20; Parse\_BC35\_DownData(); #x20; delay(10); }五、私有云服务器Python与微信小程序无调整5.1 服务器端代码完全兼容BC35-G 仅作为 MQTT 客户端发布 / 订阅的主题和数据格式与原方案一致因此 Python 服务代码无需修改核心逻辑EMQ X 接收 BC35-G 发布的语音数据Python 服务解析语音帧通过 WebSocket 推送给微信小程序接收小程序上传的语音转发至 BC35-G 订阅的下行主题。5.2 微信小程序完全兼容小程序仅与私有云 WebSocket 通信无需感知终端侧的 NB-IoT 模组类型因此页面结构、逻辑层、样式层代码均无需修改。六、BC35-G自带 MQTT调试关键指令指令功能说明正常响应AT测试模组通信OKATCGATT?查看网络附着状态CGATT: 1附着成功ATCSQ查看 NB-IoT 信号强度CSQ: 15,99≥10 正常ATQMTCONN?查看 MQTT 连接状态QMTCONN: 0,0已连接ATQMTPUB…发布 MQTT 消息QMTPUB: 0,0发布成功ATQMTSUB…订阅 MQTT 主题QMTSUB: 0,1,0订阅成功七、核心优势总结自带 MQTT 的 NB-IoT 模组开发难度大幅降低主控无需封装 MQTT 协议栈无需处理固定头、可变头、报文标识符等仅需发送标准化 AT 指令主控资源占用极低HC32F460/ESP32-S3 仅需处理语音采集 / 播放和 AT 指令无需分配资源给 MQTT 协议栈通信稳定性提升模组原生适配 NB-IoT 低带宽、高延迟特性MQTT 报文重传、心跳由模组自动处理功耗优化BC35-G 支持 PSM省电模式配合主控休眠终端整体功耗可降至 μA 级适配电池供电场景。八、扩展建议MQTT 心跳优化通过ATQMTCFGkeepalive,0,300配置 BC35-G 的 MQTT 心跳300 秒降低功耗数据加密通过ATQMTCFGssl,0,1开启 BC35-G 的 SSL/TLS 加密保护语音数据传输多模组适配自带 MQTT 的 NB-IoT 模组如有人 NB73、中移物联 M5310均可复用本方案仅需调整 AT 指令前缀离线缓存利用 BC35-G 的本地缓存功能在网络中断时暂存语音数据恢复后自动补发。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

专业微网站哪家好界面漂亮的网站

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

张小明 2025/12/24 22:04:34 网站建设

学习建网站玩网站建设学习wordpress首页模板文件位置

RRDTool与NagiosGraph:数据可视化与监控的完美搭档 1. RRDTool数据可视化基础 RRDTool是一款强大的工具,它能够自动返回尽可能高分辨率的数据。在进行数据绘图时,不同时间范围的数据会呈现不同的分辨率: - 当绘制一个月以内的数据时,RRDTool返回原始数据,因此能得到高…

张小明 2026/1/12 15:36:29 网站建设

比价网站源码网站功能模块报价

想在Windows电脑上畅享酷安社区的完整体验吗?这款基于UWP平台的第三方酷安客户端为你提供了完美的桌面解决方案。作为专业的酷安UWP使用指南,我们将带你从零开始,全面掌握这款开源应用的核心功能和使用技巧。 【免费下载链接】Coolapk-UWP 一…

张小明 2026/1/10 19:43:58 网站建设

旧衣收购哪个网站做的好佛山logo设计公司

p5.js网页编辑器终极指南:零基础快速上手创意编程 【免费下载链接】p5.js-editor Deprecated desktop editor for p5.js 项目地址: https://gitcode.com/gh_mirrors/p5/p5.js-editor p5.js网页编辑器是一款专为创意编程设计的可视化开发工具,让编…

张小明 2026/1/5 15:38:51 网站建设

微网站建设教程视频大气蓝色律师网站phpcms模板

ElasticJob分布式任务调度终极指南:企业级架构设计与实践 【免费下载链接】shardingsphere-elasticjob 项目地址: https://gitcode.com/gh_mirrors/shar/shardingsphere-elasticjob 在数字化转型浪潮中,企业面临着海量定时任务、批处理作业的高效…

张小明 2026/1/5 1:12:38 网站建设

仙游县建设局网站网站做seo需要些什么软件

在做 Web 自动化时,最根本的就是操作页面上的元素,首先要能找到这些元素,然后才能操作这些元素。工具或代码无法像测试人员一样用肉眼来分辨页面上的元素。那么要如何定位到这些元素,本章会介绍各种定位元素的方法。 web 控件定位…

张小明 2025/12/24 23:59:05 网站建设