一、ollama部署deepseek模型
1、Ollama 是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。
Ollama 教程:从 0 到 1 全面指南 教程【全文两万字保姆级详细讲解】 -CSDN博客
1.下载ollama
但是一般都下载不成功,因为服务器是国外的服务器。(需要翻墙)
2.安装ollama部署工具
gec@PC-20240429TQJF:003-deepseek服务器与cjson解析$ sudo tar -xvf ollama-linux-amd64.tgz -C / #解压部署工具到根目录
gec@PC-20240429TQJF:003-deepseek服务器与cjson解析$ ollama serve
3.下载deepseek 模型
deepseek-r1:1.5b #使用最小的模型测试即可,若不满足,可再升级。
ollama run deepseek-r1:1.5b
⚠️注意:下载模型前必须运行ollama服务器
下载界面如下👇
4.开启远程通信功能
#开启监听所有网卡
echo 'export OLLAMA_HOST="0.0.0.0"' >> ~/.bashrc
echo 'export OLLAMA_ORIGINS="*"' >> ~/.bashrc
#重启加载脚本
source ~/.bashrc
#重启服务器
ollama serve
提示:修改端口使用下述语句
ollama serve --port 8080
提示:启动gpu加速
ollama serve --gpu
测试远程远程服务器是否开启

二、ollama API接口使用
ollama/docs/api.md at main · ollama/ollama · GitHub ⭐官方手册
API 参考文档 -- Ollama 中文文档|Ollama官方文档 中文文档
普通流式请求
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2", 👈请求模型
"prompt": "Why is the sky blue?"
}'
包体参数说明
model: (required) the model name 请求的模型
prompt: the prompt to generate a response for 问题
修改为请求deepseek模型
curl http://localhost:11434/api/generate -d '{
"model": "deepseek-r1:1.5b", 👈请求模型
"prompt": "为什么天空是蓝色的?" 👈请求的问题
}'
-----------------------非流式请求-------------------------------
curl http://localhost:11434/api/generate -d '{
"model": "deepseek-r1:1.5b",
"prompt": "如何提升篮球技术",
"stream": false 👈关闭流式输出
}'
----------以json数据返回-------------
curl http://localhost:11434/api/generate -d '{
"model": "deepseek-r1:1.5b",
"prompt": "What color is the sky at different times of the day? Respond using JSON",
"format": "json", 👈json格式
"stream": false
}'
在线API接口 首次调用 API | DeepSeek API Docs
三、HTTP_C请求模型
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 11434 // http服务器端口号
#define SERVER_IP "192.168.63.1" // http服务器IP地址
#define BUFFER_SIZE 4096 * 10
int main(int argc, char const *argv[])
{
if (argc != 2)
{
printf("Usage: %s <prompt>\n", argv[0]);
return 1;
}
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[BUFFER_SIZE] = {0};
// 1.创建 socket
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT); // 设置端口号
serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP); // 设置IP地址
// 2.连接到服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nConnection Failed \n");
return -1;
}
/*使用命令请求
curl http://192.168.63.1:11434/api/generate -d '{
"model": "deepseek-r1:1.5b",
"prompt": "如何提升篮球技术",
"stream": false 👈关闭流式输出
}'
*/
// 构造 HTTP 请求体(关闭流式响应)
char request_body[1024] = {0};
snprintf(request_body, 1024, "{\"model\": \"deepseek-r1:1.5b\", \"prompt\": \"%s\", \"stream\": false}", argv[1]);
// 请求头
char request_headers[256] = {0};
snprintf(request_headers, sizeof(request_headers),
"POST /api/generate HTTP/1.1\r\n"
"Host: 192.168.128.196:11434\r\n"
"Content-Type: application/json\r\n"
"Content-Length: %zu\r\n"
"\r\n",
strlen(request_body));
// 请求协议
char request[4096] = {0};
snprintf(request, sizeof(request), "%s%s", request_headers, request_body);
// 发送请求
send(sock, request, strlen(request), 0);
printf("Request sent:\n%s\n", request);
while (1)
{
// 接收响应
int valread = read(sock, buffer, BUFFER_SIZE);
if (valread > 0)
{
printf("Response:\n%s\n", buffer);
}
else
{
printf("Failed to receive response.\n");
}
}
// 关闭 socket
close(sock);
return 0;
}
四、⭐json 数据解析
1、json基本概念
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,
但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
目前非常多的动态(PHP,JSP,.NET)编程语言都支持 JSON ,JSON 具有自我描述性,更易理解
json的基本概念:
对象:由一对花括号,括起来的数据就是一个对象 { } ,一个对象中包含,key与value。
键/值: json数据中每一个key(键)对应一个value(值)。
数组:由中括号[],括起来的数据就是数组 ,例如:[1,2,3,4,5];
👉 {"name":"小明"} ,这就是一个json数据,该对象中包含一个key和一个value
👉 {"name":"小明", "age":18,"phone":"1314666"} ,这就是一个json数据,有3个key对应3个value
对象中可以继续包含对象
{
"name": "张三",
"age": 30,
"address": {
"street": "中山路",
"city": "北京",
"postalCode": "100000"
}
}
先看最外层只有 3 个key和3个value
{
"name": "张三",
"age": 30,
"address": Object{...}
}
再看内层,内层中也是3个key和3个value
{
"street": "中山路",
"city": "北京",
"postalCode": "100000"
}
2、json 数据解析
1.下载json库
GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C
2.json源码的使用
3json 函数接口
/*返回json版本信息*/
const char* cJSON_Version(void);
//把字符串数据转换为json对象
cJSON * cJSON_Parse(const char *value); //⭐
value:需要转换的字符串数据
返回值:成功 json对象 失败 NULL
//通过key获取value
cJSON *cJSON_GetObjectItem(const cJSON * const object, const char * const string); //⭐
object:json对象
string:key(键)
返回值:成功 value(值) 失败 NULL
/* Check item type and return its value */
char * cJSON_GetStringValue(const cJSON * const item); //把value转换为字符串 //⭐
double cJSON_GetNumberValue(const cJSON * const item); //把value转换为整形值 //⭐
//获取当前数组元素的个数
int cJSON_GetArraySize(const cJSON *array); //⭐
//获取数组下标对应元素
cJSON * cJSON_GetArrayItem(const cJSON *array, int index); //⭐
例子;
#include <stdio.h>
// 添加json解析头文件
#include "cJSON.h"
int main()
{
// 调用json接口
const char *ver = cJSON_Version();
printf("ver=%s\n", ver);
char str1[] = "{"
"\"person\": {"
"\"name\": \"小明\","
"\"age\": 25,"
"\"city\": \"北京\","
"\"contact\": {"
"\"email\": \"xiaoming@example.com\","
"\"phone\": \"123-456-7890\""
"},"
"\"education\": {"
"\"degree\": \"Bachelor\","
"\"major\": \"Computer Science\","
"\"university\": \"Tsinghua University\""
"},"
"\"residence\": {"
"\"address\": \"北京市朝阳区\","
"\"type\": \"公寓\","
"\"owned\": false"
"}"
"}"
"}";
//外层1个key,第二层有6个key
// 通过key来获取value
//将字符串转换为置json对象
cJSON *str1_obj = cJSON_Parse(str1);
//第一层,通过key提取出来的是一个对象
cJSON *small_obj = cJSON_GetObjectItem(str1_obj, "person");
//第二层,
cJSON *value = cJSON_GetObjectItem(small_obj, "name");
printf("name=%s\n", cJSON_GetStringValue(value));
cJSON *value1 = cJSON_GetObjectItem(small_obj, "age");
printf("age=%.2f\n", cJSON_GetNumberValue(value1));
cJSON *value2 = cJSON_GetObjectItem(small_obj, "city");
printf("city=%s\n", cJSON_GetStringValue(value2));
// 第三层
cJSON *small_obj1 = cJSON_GetObjectItem(small_obj, "contact");
cJSON *value3 = cJSON_GetObjectItem(small_obj1, "email");
printf("email=%s\n", cJSON_GetStringValue(value3));
cJSON *value4 = cJSON_GetObjectItem(small_obj1, "phone");
printf("phone=%s\n", cJSON_GetStringValue(value4));
cJSON *small_obj2 = cJSON_GetObjectItem(small_obj, "education");
cJSON *value5 = cJSON_GetObjectItem(small_obj2, "degree");
printf("degree=%s\n", cJSON_GetStringValue(value5));
cJSON *value6 = cJSON_GetObjectItem(small_obj2, "major");
printf("major=%s\n", cJSON_GetStringValue(value6));
cJSON *value7 = cJSON_GetObjectItem(small_obj2, "university");
printf("university=%s\n", cJSON_GetStringValue(value7));
cJSON *small_obj3 = cJSON_GetObjectItem(small_obj, "residence");
cJSON *value8 = cJSON_GetObjectItem(small_obj3, "address");
printf("address=%s\n", cJSON_GetStringValue(value8));
cJSON *value9 = cJSON_GetObjectItem(small_obj3, "type");
printf("type=%s\n", cJSON_GetStringValue(value9));
cJSON *value10 = cJSON_GetObjectItem(small_obj3, "owned");
printf("owned=%s\n", cJSON_GetStringValue(value10));
}
下面是lvgl和http请求天气的一个简单的天气预报效果。
这里要注意几点:
1.就是要解决中文库的问题(.h文件的中文字库的开启+头文件+字库的绝对路径)
2.通过json获取和处理天气的的数据,并与lvgl的界面结合起来。其实就是把获取的天气信息填入到标签中。