如何理解blbo 和blobmsg:
blob是一个通用的二进制数据结构,blobmsg是blob的一种特定类型,它用于处理和解析JSON数据。
为什么创建blobmsg 先要创建blob
创建blobmsg之前需要创建blob的原因是,blobmsg是在blob的基础上进行扩展和封装的。
blobmsg根节点是一个纯粹的blob,所以blobmsg解析时需要注意:
(1)第一层解析,data必须取值为blob_data(root_blob),len必须取值为blob_len(root_blob)
(2)第二层及以上解析,data必须取值为blobmsg_data(sub_blob),len必须取值为blobmsg_data_len(sub_blob)
所以,应避免混合使用blob和blobmsg语义,比如第一层使用blob语义,第二层使用blobmsg语义
举例:
struct blob_buf { struct blob_attr *head; // 指向blob_buf的开头,分配一个4字节的blob_attr(仅有id_len),记录已使用的len。最初时等于blob_buf->buf bool (*grow)(struct blob_buf *buf, int minlen); //内存扩展回调函数 int buflen; //buf总长度 void *buf; // 指向buf起始位置(开头) };
blob_buf 管理的是多个blob对象,blob对象由blob_attr 结构体描述。通过blobmsg API可以方便的
构建和解析json包数据。
int main()
{
static struct blob_buf buf; // 管理多个 blob
blobmsg_buf_init(&buf);
fill_message(&buf);
}
static void fill_message(struct blob_buf *buf)
{
void *tbl;
blobmsg_add_string(buf, "message", "Hello, world!"); // 根据理解buf 对应的就是根节点
tbl = blobmsg_open_table(buf, "testdata");
blobmsg_add_u32(buf, "hello", 1);
blobmsg_add_string(buf, "world", "2");
blobmsg_close_table(buf, tbl);
tbl = blobmsg_open_array(buf, "list");
blobmsg_add_u32(buf, NULL, 0);
blobmsg_add_u32(buf, NULL, 1);
blobmsg_add_u32(buf, NULL, 2);
blobmsg_close_table(buf, tbl);
}
通过对blob 的理解, 可以直接写出fill_message 构建的json 如下:
{
"message":"hello,world",
"testdata":
{
"hello":1,
"world":2
},
"list":[0,1,2]
}