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

时间:2016-10-26 14:46:23

标签: c++ json linux cloud iot

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

我遇到了类似的情况:通过Web发送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;
}