2301_76166353 2025-03-31 19:52 采纳率: 0%
浏览 13

modelica实现udp通信

我现在再利用modelica实现udp通信 ,我发数据使用了一个cjson的库,但是在 modelica的仿真里面会出现找不到cjson的问题,下面是我出现的问题和modelica代码

img

img

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")  // Winsock库
#include "cJSON.h"  // 确保cJSON头文件路径正确

#define PUB_SERVER_UDP_PORT 5554
#define PUB_SERVER_UDP_IP "127.0.0.1"
#define PUB_BUFFER_UDP_SIZE 4096

static SOCKET pubsockfd;  // 改为Windows套接句柄类型
static struct sockaddr_in pubservaddr;
static int IsPubSocketCreated = 0;

void initialize_pub_sockets() {
    // 初始化Winsock
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        fprintf(stderr, "WSAStartup failed: %d\n", WSAGetLastError());
        exit(1);
    }

    // 创建UDP套接字
    pubsockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (pubsockfd == INVALID_SOCKET) {
        fprintf(stderr, "socket creation failed: %d\n", WSAGetLastError());
        WSACleanup();
        exit(1);
    }

    // 配置服务器地址
    memset(&pubservaddr, 0, sizeof(pubservaddr));
    pubservaddr.sin_family = AF_INET;
    pubservaddr.sin_port = htons(PUB_SERVER_UDP_PORT);
    if (InetPtonA(AF_INET, PUB_SERVER_UDP_IP, &pubservaddr.sin_addr) != 1) {
        fprintf(stderr, "Invalid address: %d\n", WSAGetLastError());
        closesocket(pubsockfd);
        WSACleanup();
        exit(1);
    }

    IsPubSocketCreated = 1;
}

void cleanup_pubsockets() {
    closesocket(pubsockfd);  // Windows专用关闭函数
    WSACleanup();           // 清理Winsock资源
}

void pubdata(char* keyname, int array_length, const double* pubarray) {
    if (IsPubSocketCreated == 0) {
        initialize_pub_sockets();
    }

    // 创建JSON对象
    cJSON *jsonArray = cJSON_CreateArray();
    for (int i = 0; i < array_length; ++i) {
        cJSON_AddItemToArray(jsonArray, cJSON_CreateNumber(pubarray[i]));
    }

    cJSON *jsonRoot = cJSON_CreateObject();
    cJSON_AddItemToObject(jsonRoot, keyname, jsonArray);

    // 生成JSON字符串
    char *jsonStr = cJSON_PrintUnformatted(jsonRoot);
    if (!jsonStr) {
        fprintf(stderr, "JSON serialization failed\n");
        cJSON_Delete(jsonRoot);
        exit(1);
    }

    // 发送数据(Windows使用int表示地址长度)
    int addr_len = sizeof(pubservaddr);
    if (sendto(pubsockfd, jsonStr, strlen(jsonStr), 0,
              (struct sockaddr*)&pubservaddr, addr_len) == SOCKET_ERROR) {
        fprintf(stderr, "sendto failed: %d\n", WSAGetLastError());
        free(jsonStr);
        cJSON_Delete(jsonRoot);
        exit(1);
    }

    // 清理资源
    cJSON_Delete(jsonRoot);
    free(jsonStr);
}

// 测试主函数(重命名为main)
int main(int argc, char* argv[]) {
    double test_data[] = {1.23, 4.56, 7.89};
    pubdata("test_data", 3, test_data);
    
    // 等待2秒确保数据发送
    Sleep(2000);
    cleanup_pubsockets();
    return 0;
}

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2025-03-31 19:52
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    模型化 UDP 通信的解决方案

    你遇到的问题是 Modelica 仿真环境中找不到 CJSON 库的问题。Modelica 仿真环境中不支持使用外部库,因此你需要将 CJSON 库集成到 Modelica 代码中。

    一种解决方案是使用 Modelica 的内置 JSON 库,例如 Modelica.Utilities.Json。你可以使用这个库来将 JSON 数据转换为 Modelica 的数据结构。

    以下是一个简单的示例代码,演示如何使用 Modelica.Utilities.Json 库来将 JSON 数据转换为 Modelica 的数据结构:

    import Modelica.Utilities.Json;
    
    // 定义一个 JSON 数据
    string jsonStr = "{\"key\":\"value\"}";
    
    // 将 JSON 数据转换为 Modelica 的数据结构
    Json.JsonObject jsonObject = Json.parse(jsonStr);
    
    // 获取 JSON 数据中的值
    string value = jsonObject.getString("key");
    
    // 使用 value
    model MyModel
      extends Modelica.Icons.Record;
      string value;
      equation
        value = jsonObject.getString("key");
    end MyModel;
    

    在上面的代码中,我们使用 Json.parse 函数将 JSON 数据转换为 Json.JsonObject 对象,然后使用 getString 函数获取 JSON 数据中的值。

    如果你需要使用 CJSON 库,可以尝试使用 Modelica 的外部库支持,例如使用 Modelica.Utilities.ExternalFunctions 库来调用 CJSON 库的函数。

    请注意,Modelica 仿真环境中可能会存在一些限制和限制,例如不能使用外部库或函数等。因此,在选择解决方案时需要考虑这些限制。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月31日