我正在玩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"数据?
答案 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;
}