c++ - 如何将 JSON 发布到 Web 服务器?

标签 c++ json linux cloud iot

我正在玩 freeboard.io 并尝试制作一个从 URL [待定] 中提取 JSON 数据的小部件。我的原始数据源来自一个基于 iMX6 的 Wandboard,它运行 Linux 并连接到互联网。我想在 Wandboard 上编写一个 C++ 程序,打开一个到 [TBD] 的套接字并发送 UDP 数据包,例如,包含我的传感器数据。我的 JSON 数据结构是这样的:

{
  "sensor_a": 1100,
  "sensor_b": 247,
  "sensor_c": 0
}

你能帮我在 Ubuntu Linux 上使用 C++ 将我的 JSON 数据结构放入 IP 数据包吗?例如,我知道如何在 ascii 中序列化数据结构并构建一个缓冲区来填充 IP 数据包,但我想知道是否有针对云服务执行此操作的标准方法,或者 Azure 与 AWS 是否有所不同? “放置”数据是否需要某种类型的 header 信息?

最佳答案

这是一个非常简单的问题,就像所有不需要外部库进行序列化的简单问题一样。就像@Galik 上面说的,你的问题是如何从客户端向服务器发送一个字符串。此外,对于您的情况,您需要在服务器上有一个 JSON 解析器(来自 JSON 页面的任何 C 或 C++ 解析器都可以,我使用 gason 因为它既快速又简单)。

在 TCP/IP 套接字编程中,您必须让另一部分知道要读取多少字节(在您的情况下是字符)。

我遇到过类似的情况:通过网络发送 JSON。 这是示例,JSON“消息”

https://github.com/pedro-vicente/lib_netsockets/blob/master/examples/json_message.cc

在这种情况下,消息的大小具有这种标题格式

nbr_bytes#json_string

其中“json_string”是 JSON 文本,“nbr_bytes”是“json_string”的字符数,“#”是分隔符。

服务器如何解析这个? 通过一次读取 1 个字符直到找到“#”分隔符,然后将该字符串转换为数字; 然后让套接字 API 读取“nbr_bytes”个字符并退出

例子

100#{json_txt....}

在这种情况下“json_txt”有 100 个字符

这是解析器的代码

std::string read_response(socket_t &socket)
{
  int recv_size; // size in bytes received or -1 on error 
  size_t size_json = 0; //in bytes
  std::string str_header;
  std::string str;

  //parse header, one character at a time and look for for separator #
  //assume size header lenght less than 20 digits
  for (size_t idx = 0; idx < 20; idx++)
  {
    char c;
    if ((recv_size = recv(socket.m_socket_fd, &c, 1, 0)) == -1)
    {
      std::cout << "recv error: " << strerror(errno) << std::endl;
      return str;
    }
    if (c == '#')
    {
      break;
    }
    else
    {
      str_header += c;
    }
  }

  //get size
  size_json = static_cast<size_t>(atoi(str_header.c_str()));

  //read from socket with known size
  char *buf = new char[size_json];
  if (socket.read_all(buf, size_json) < 0)
  {
    std::cout << "recv error: " << strerror(errno) << std::endl;
    return str;
  }
  std::string str_json(buf, size_json);
  delete[] buf;
  return str_json;
}

关于c++ - 如何将 JSON 发布到 Web 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40265379/

相关文章:

javascript - typescript 错误 TS5014 : Unexpected token u in JSON at position 0

javascript - 根据 JSON 更改图像的 src 属性

linux - 使用 sed 和 cut 命令复制行

c++ - 将自定义 QItemDelegate 与 QSortFilterProxyModel 结合使用

c++ - cl::Image3D 在 nVidia TITAN black 上出现段错误,但在 Intel openCL 设备上没有?

c++ - 实例化特定模板特化时断言

c++ - 是否可以在 cpp >= 11 中使用继承私有(private)构造函数

html - JSON:在 HTML 网站上显示 JSON 字符串

python - 导入错误 : No Module Named 'pysqlite2'

linux - 我应该在提交之前停止容器吗?