ESP32-S3接入大模型API,对话AI

1、先使用python验证可行性

import requests

url = "https://api.siliconflow.cn/v1/chat/completions"

payload = {
"model": "deepseek-ai/DeepSeek-R1",
"messages": [ # 必须包含消息内容
{"role": "user", "content": "请解释量子计算的基本原理"}
],
"stream": False,
"max_tokens": 512,
"temperature": 0.7,
"top_p": 0.7,
"top_k": 50,
"frequency_penalty": 0.5,
"n": 1
}
headers = {
"Authorization": "Bearer "your api_key"",
"Content-Type": "application/json"
} response = requests.request("POST", url, json=payload, headers=headers) print(response.text)
代码
秘钥获取

硅基流动注册送14元免费额度,https://cloud.siliconflow.cn/i/9MqV8tO4

邀请码:9MqV8tO4

2、Postman验证POST请求结构,深化熟悉对接流程

POST请求头(Headers)设置 POST请求主体(Body)设置
Authorization: your api key Content-Type:application/json

Body:

{
"model": "deepseek-ai/DeepSeek-V3",
"messages": [
{"role": "user", "content": "请解释量子计算的基本原理"}//问题
],
// "stream": False,
"max_tokens": 512,
"temperature": 0.7,
"top_p": 0.7,
"top_k": 50,
"frequency_penalty": 0.5,
"n": 1
}

实战!在esp32s3上实现ai对话:

1、使用micro python实现

因为之前验证过python的可行性,而esp32系列可以使用micro python编程,其特点是便捷高效,所以先使用mico python实现。

开发环境

编程调试下载环境:Thonny

编程语言:micro python

前置条件:烧录micro python固件(乐鑫官网中下载)

import network
import time
import urequests
import ujson
from machine import reset # ====== 配置部分 ======
SSID = 'jianzhiji'
PASSWORD = '8765432111'
API_KEY = "你的api密钥"
API_URL = "https://api.siliconflow.cn/v1/chat/completions" def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True) if not wlan.isconnected():
print(f"Connecting to {SSID}...")
wlan.connect(SSID, PASSWORD) timeout = 20
while not wlan.isconnected() and timeout > 0:
print(".", end="")
time.sleep(1)
timeout -= 1 if not wlan.isconnected():
raise RuntimeError("WiFi连接超时") print("\nIP Address:", wlan.ifconfig()[0])
return wlan def api_request():
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
} # 最小化请求参数
payload = {
"model": "deepseek-ai/DeepSeek-V3",
"messages": [{"role": "user", "content": "hello"}],
"max_tokens": 512,
"temperature": 0.7,
"top_p": 0.7
} try:
print("\n[Request]")
print("Payload:", payload) response = urequests.post(
API_URL,
headers=headers,
data=ujson.dumps(payload),
timeout=20
) print(f"\n[Response] Status: {response.status_code}")
if response.status_code == 200:
json_resp = response.json()
print("AI回复:", json_resp['choices'][0]['message']['content'])
else:
print("Error Response:", response.text) response.close() except Exception as e:
print("[Error]", str(e)) try:
print("=== 启动系统 ===")
connect_wifi()
api_request() except Exception as e:
print("\n!!! 错误:", str(e))
print("10秒后重启...")
time.sleep(10)
reset()

2、使用C语言实现

开发环境

编程调试下载环境:VSCOde+espidf插件

编程语言:C

#include <string.h>
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "protocol_examples_common.h"
#include "esp_http_client.h"
#include "esp_sntp.h"
// 在文件开头添加
#include "lwip/apps/sntp.h" #define MAX_HTTP_OUTPUT_BUFFER 2048
static const char *TAG = "HTTP_AI_CLIENT";
#define API_ENDPOINT "http://api.siliconflow.cn/v1/chat/completions" // 添加事件处理函数
static esp_err_t http_event_handler(esp_http_client_event_t *evt)
{
switch (evt->event_id) {
case HTTP_EVENT_ERROR:
ESP_LOGI(TAG, "HTTP_EVENT_ERROR");
break;
case HTTP_EVENT_ON_CONNECTED:
ESP_LOGI(TAG, "HTTP_EVENT_ON_CONNECTED");
break;
case HTTP_EVENT_HEADERS_SENT:
ESP_LOGI(TAG, "HTTP_EVENT_HEADERS_SENT");
break;
case HTTP_EVENT_ON_HEADER:
ESP_LOGI(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value);
break;
case HTTP_EVENT_ON_DATA:
ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
break;
case HTTP_EVENT_ON_FINISH:
ESP_LOGI(TAG, "HTTP_EVENT_ON_FINISH");
break;
case HTTP_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED");
break;
default:
break;
}
return ESP_OK;
} static void http_post_request(void)
{
char output_buffer[MAX_HTTP_OUTPUT_BUFFER] = {0};
esp_http_client_config_t config = {
.url = API_ENDPOINT,
.event_handler = http_event_handler, // 添加事件处理
.timeout_ms = 30000, // 增加超时到30秒
.skip_cert_common_name_check = true, // 跳过证书CN检查
.cert_pem = NULL, // 不指定证书
};
esp_http_client_handle_t client = esp_http_client_init(&config); const char *json_data =
"{"
"\"model\": \"deepseek-ai/DeepSeek-V3\","//选择模型
"\"messages\": ["
"{"
"\"role\": \"user\","
"\"content\": \"你好\""//填入问题内容
"}"
"],"
"\"max_tokens\": 512,"
"\"temperature\": 0.7,"
"\"top_p\": 0.7,"
"\"top_k\": 50,"
"\"frequency_penalty\": 0.5,"
"\"n\": 1"
"}"; esp_http_client_set_method(client, HTTP_METHOD_POST);
esp_http_client_set_header(client, "Content-Type", "application/json");
esp_http_client_set_header(client, "Authorization", "your api key");//key_API esp_err_t err = esp_http_client_open(client, strlen(json_data));
if (err != ESP_OK) {
ESP_LOGE(TAG, "连接失败: %s", esp_err_to_name(err));
goto cleanup;
} int wlen = esp_http_client_write(client, json_data, strlen(json_data));
if (wlen < 0) {
ESP_LOGE(TAG, "数据写入失败");
goto cleanup;
} int content_length = esp_http_client_fetch_headers(client);
if (content_length < 0) {
ESP_LOGE(TAG, "获取头部信息失败");
goto cleanup;
} int data_read = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER);
if (data_read >= 0) {
ESP_LOGI(TAG, "HTTP状态码 = %d, 内容长度 = %"PRIu64,
esp_http_client_get_status_code(client),
esp_http_client_get_content_length(client));
ESP_LOGI(TAG, "响应内容: %s", output_buffer);
} else {
ESP_LOGE(TAG, "读取响应失败");
} cleanup:
esp_http_client_cleanup(client);
} static void http_task(void *pvParameters)
{
http_post_request();
ESP_LOGI(TAG, "HTTP示例完成");
vTaskDelete(NULL);
} void app_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
ESP_ERROR_CHECK(example_connect()); sntp_setoperatingmode(SNTP_OPMODE_POLL);
sntp_setservername(0, "pool.ntp.org"); // 第1个NTP服务器
sntp_setservername(1, "time.nist.gov"); // 第2个NTP服务器(可选)
sntp_init();
// 在 sntp_init() 后添加时间同步等待
int retry = 0;
const int retry_count = 10;
while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry < retry_count) {
printf("Waiting for system time to sync... (%d/%d)\n", retry, retry_count);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
xTaskCreate(&http_task, "http_task", 8192, NULL, 5, NULL);
}

终端输出结果

NTP服务器

NTP服务器(Network Time Protocol Server)的作用是提供精确、统一的时间同步服务,它是互联网中时间同步的核心基础设施。以下是其核心作用:


1. 时间同步

  • 核心功能:NTP服务器通过协议将设备(如计算机、手机、物联网设备)的本地时间与全球标准时间(如UTC)同步。
  • 解决设备时钟漂移:硬件时钟可能因温度、电池等原因产生误差,NTP定期校准时间,确保设备间时间一致。

2. 安全协议的基础

  • SSL/TLS证书验证:HTTPS通信依赖证书的有效期验证。若设备时间错误:

    • 证书可能被误判为“未生效”或“已过期”,导致连接失败。
  • 示例场景:你之前的ESP32代码中,若系统时间未同步,访问HTTPS API时可能因证书时间校验失败而超时。

3. 日志与调试

  • 统一时间戳:设备生成的日志若时间不一致,将难以追踪问题(如分布式系统故障)。
  • 示例:ESP32的日志若时间错误,无法与服务器日志对照,增加调试难度。

4. 协调分布式系统

  • 跨设备协同:物联网、金融交易等场景依赖毫秒级时间同步,避免数据冲突。
  • 示例:多个ESP32设备协同工作时,需严格按时间顺序执行操作。

5. NTP与SNTP的区别

  • NTP:高精度(毫秒/微秒级),适用于服务器、基站等。
  • SNTP(简单NTP):精简版,精度稍低(秒级),适合资源受限设备(如ESP32)。
  • 你的代码:使用esp_sntp_init()即是为ESP32提供轻量级时间同步。

为什么你的ESP32项目需要NTP服务器?

在之前的代码中,你遇到HTTP连接超时问题,可能原因之一是:

  1. ESP32系统时间未同步 → SSL证书验证失败 → 服务器拒绝连接。
  2. 初始化SNTP后,设备获取正确时间 → 证书验证通过 → 正常通信。

总结

NTP服务器像互联网的“原子钟”,确保设备时间精准统一。对物联网设备而言,它是安全通信、协同工作的基石。

ESP32-S3接入大模型API,对话AI的更多相关文章

  1. 文心大模型api使用

    文心大模型api使用 首先,我们要获取硅谷社区的连个key 复制两个api备用 获取Access Token 获取access_token示例代码 之后就会输出 作文创作 作文创作:作文创作接口基于文 ...

  2. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  3. AI大模型学习了解

    # 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...

  4. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  5. 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00

    武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...

  6. AI时代大点兵-国内外知名AI公司2018年最新盘点

    AI时代大点兵-国内外知名AI公司2018年最新盘点 导言 据腾讯研究院统计,截至2017年6月,全球人工智能初创企业共计2617家.美国占据1078家居首,中国以592家企业排名第二,其后分别是英国 ...

  7. Amazon S3 对象存储Java API操作记录(Minio与S3 SDK两种实现)

    缘起 今年(2023年) 2月的时候做了个适配Amazon S3对象存储接口的需求,由于4月份自学考试临近,一直在备考就拖着没总结记录下,开发联调过程中也出现过一些奇葩的问题,最近人刚从考试缓过来顺手 ...

  8. 【chrome插件】web版微信接入图灵机器人API实现自动回复

    小贱鸡自动回复API已经不可以用了,现在改良接入图灵机器人API 360chrome浏览器团队翻译了部分谷歌插件开发文档 地址:http://open.chrome.360.cn/extension_ ...

  9. PowerDesigner 学习:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

  10. PowerDesigner 15学习笔记:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

随机推荐

  1. DeepSeek本地安装部署(指南)

    前言 这两天deepseek出圈了. 今天分享一下,如果在本地电脑部署和运行deepseek,实现AI对话的功能. 访问ollama官网: https://ollama.com/ 下载一个合适自己操作 ...

  2. SqlServer还原数据库出现“无法在服务器上访问指定的路径或文件”提示的解决办法

    1.问题描述 出现的错误信息如下图所示: 2.解决办法 打开SqlServer配置管理器,点击SQL Server服务,点击右侧的"SQL Server (MSSQLSERVER)" ...

  3. FLink17--全窗口聚合方法1--ApplyWindowApp

    一.依赖 二.代码 package net.xdclass.class11; import java.util.List; import java.util.stream.Collectors; im ...

  4. Luogu P10869 LCMs 题解 [ 黄 ] [ lcm ] [ 最短路 ]

    LCMs:很好的数论和构造题. 显然我们不可以直接建图跑最短路. 于是考虑分讨. 倍数关系 答案显然为 \(\max(a,b)\). 相等关系 答案显然为 \(0\). \(\gcd(a,b)> ...

  5. flutter-真机调试ios Traceback (most recent call last)

    1 Traceback (most recent call last): 2 File "/tmp/C5FDB25B-C7F4-462E-8AC9-7FF9D1A50F21/fruitstr ...

  6. 精选4款基于.NET开源、功能强大的通讯调试工具

    前言 今天大姚给大家分享4款基于.NET开源.功能强大的通讯调试工具,旨在帮助.NET开发者们更好的应对通讯调试方面的学习和工作,提升调试效率. LLCOM LLCOM是一个.NET开源的.功能强大的 ...

  7. Clean WeChat X 微信垃圾清理工具,提升硬盘空间

    Clean WeChat X是一款专业的微信清理工具,其拥有软件轻巧.干净.高效.免费等等特点,其能识别你电脑里的微信缓存.聊天记录.文件备份.小程序等等信息,方便大家选择性的清理文件. 多账号登录: ...

  8. 洛谷P2701 [USACO5.3] 巨大的牛棚Big Barn 题解

    怎么题解全是清一色的 dp?可以用笛卡尔树啊(虽然麻烦了很多,但是我热爱)! 题目传送门. 笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件: 每个节点的编号满足二叉搜索树的性质. 每个节点 ...

  9. Windows服务器等保审核安全设置

    1.开启账户锁定策略 进入Windows服务器,快捷键"WIN+R"打开运行窗口.输入"gpedit.msc"并点击确定,依次点击"计算机配置&quo ...

  10. AI 实践|零成本生成SEO友好的TDK落地方案

    之前写过一篇文章「Google搜索成最大入口,简单谈下个人博客的SEO」,文章里介绍了网页的描述信息TDK(Title.Description和Keywords)对SEO的重要作用,尽管已经意识到了T ...