03--Deepseek服务器部署与cjson解析

发布于:2025-04-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、ollama部署deepseek模型

1、Ollama 是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。

Ollama 教程:从 0 到 1 全面指南 教程【全文两万字保姆级详细讲解】 -CSDN博客

1.下载ollama

Download Ollama on Linux

但是一般都下载不成功,因为服务器是国外的服务器。(需要翻墙)

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"
}

JSON在线解析格式化验证 - JSON.cn

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的界面结合起来。其实就是把获取的天气信息填入到标签中。


网站公告

今日签到

点亮在社区的每一天
去签到