整体架构
在本地电脑部署好Ollama服务,安装qwen大模型和llama3.1大模型。
ESP32接入局域网,用户通过串口给esp32发送问题,esp32打包json后向ollama服务发送请求,ollama返回响应,esp32解析结果并通过串口打印出来。
运行效果
串口输入问题后,会打印出回答的结果。
完整代码
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>const char* ssid = "EzhanNet";
const char* password = "11111111";
const char* serverUrl = "http://192.168.0.121:9998/api/generate";void sendPostRequest(const String& prompt) {if (WiFi.status() == WL_CONNECTED) {HTTPClient http;http.begin(serverUrl);http.addHeader("Content-Type", "application/json");// 创建 JSON 数据StaticJsonDocument<200> jsonDoc;jsonDoc["model"] = "llama3.1";jsonDoc["prompt"] = prompt;jsonDoc["stream"] = false;// 将 JSON 转换为字符串String jsonString;serializeJson(jsonDoc, jsonString);// 发送 HTTP-POST 请求int httpResponseCode = http.POST(jsonString);// 检查响应代码if (httpResponseCode > 0) {String response = http.getString();Serial.println("Response code: " + String(httpResponseCode));// 解析 JSON 响应DynamicJsonDocument docJson(1024);DeserializationError error = deserializeJson(docJson, response);if (!error) {const char* response_info = docJson["response"];Serial.println("Ollama 回答: " + String(response_info));} else {Serial.println("解析 JSON 失败: " + String(error.c_str()));}} else {Serial.println("发送 POST 时出错: " + String(httpResponseCode));}http.end();} else {Serial.println("WiFi 未连接");}
}void setup() {Serial.begin(115200);// 连接到 WiFiWiFi.begin(ssid, password);int attempts = 0;while (WiFi.status() != WL_CONNECTED && attempts < 10) {delay(500);Serial.println("连接到 WiFi...");attempts++;}if (WiFi.status() == WL_CONNECTED) {Serial.println("已连接到 WiFi");Serial.print("IP: ");Serial.println(WiFi.localIP());} else {Serial.println("连接 WiFi 失败");}
}void loop() {if (Serial.available() > 0) {String userInput = Serial.readStringUntil('\n'); // 读取串口输入直到换行sendPostRequest(userInput); // 发送给 Ollama}
}