关于alljoyn消息参数的签名的学习

技术菌的blog 2014-12-23 04:34:07
加精
一打开alljoyn-c+ api帮助文档,下方首先显示的就是类型签名,最近在LZ在研究这个,有了点心得,分享给大家

我在alljoyn官方论坛发了个此方面的帖子,有位大神回复了,很感谢他。帖子地址:
https://ask.allseenalliance.org/question/1673/how-should-i-write-the-signature-in-this-case/

当然是主要针对复杂数据结构的封装,特别是结构体里面套结构体或者数组之类的,那MsgArg参数的签名该如何写确实是个头疼事。。参考类MsgArg的Get,Set方法,官方说明并不详细,结果自己试了半天也没试出来。

下面我就一个特定情况来说说该如何写参数签名
客户端
假定客户端这样添加接口:
intf->AddSignal("sig_test", "(sq(sqq))qa(qq)",  "arg1,arg2,arg3", 0);

即信号sig_test有三个参数,每个参数签名分别是:(sq(sqq)), q, a(qq)

在我的客户端发射信号函数中有这样一段代码:
struct A{
uint8_t a;
uint8_t b;
}v1;
struct A test[3] = {{1,2},{3,4},{10,6}};

static int numSended = 0;
MsgArg arg[3];
arg[0].Set("(sq(sqq))",thisdev);
arg[1].Set("q",thisdev.res[0].type);

MsgArg tmp[3];
tmp[0].Set("(qq)",test[0]);
tmp[1].Set("(qq)",test[1]);
tmp[2].Set("(qq)",test[2]);
arg[2].Set("a(qq)",sizeof(test)/sizeof(struct A),tmp);//第二个参数必须给

return Signal(NULL, g_sessionId, *testSigMember, arg, 3, 0, 0);
}


很显然,我把thisdev作为了第一个参数,把thisdev.res[0].type作为了第二个参数,把结构体数组test封装在第三个参数中。thisdev的定义如下:
struct res_info {
// 发现个问题:若把unit写在最后面,客户端产生了异常,所以就改到了最前面
char* unit;
uint8_t __resid;
uint8_t type;

};

struct dev_info {
char* mac;
uint8_t rescnt;
res_info res[MAX_RES_NUM];
}thisdev;


服务端
那在服务端的信号处理函数中,该如何解析这些参数呢?
void MyBusObject::testSigHandler(const InterfaceDescription::Member* member, const char* srcPath, ajn::Message& msg)
{
struct A {
uint8_t a;
uint8_t b;
}v1;

const char* sender = msg->GetSender();
const MsgArg* arg1 = msg->GetArg(0);
const MsgArg* arg2 = msg->GetArg(1);

// 第三个参数,即结构体数组的解析
MsgArg* entries;
const MsgArg* arg3 = msg->GetArg(2);
arg3->Get("a(qq)",&n,&entries);
for (int i=0; i<n; i++) {
entries[i].Get("(qq)",&v1);
printf("a:%d, b:%d\n",v1.a,v1.b);
}

const char* ele1_macstr = arg1->v_struct.members->v_string.str;
uint8_t ele2_rescnt = (arg1->v_struct.members + 1)->v_byte;

MsgArg* tmp = (arg1->v_struct.members + 2)->v_struct.members;
//printf("tmp arg num:%d\n",(arg1->v_struct.members + 2)->v_struct.numMembers);

const char* ele3_1_unit = tmp->v_string.str;
uint8_t ele3_2_resid = (tmp + 1)->v_byte;
uint8_t ele3_3_type = (tmp + 2)->v_byte;//这个返回有问题!!!目前还没查出,所以才将它以第二参数传过来

ele3_3_type = arg2->v_byte;//于是乎将"资源类型域"以第二参数返回

printf("\n[%s msg]\n\tdevice name:%s\n\trescnt:%d\n\tres unit:%s\n\t__resid:%d\n\tres type:%d\n",
sender,ele1_macstr,ele2_rescnt,ele3_1_unit,ele3_2_resid,ele3_3_type);
}


如此之后,客户发给服务的参数完美解析出来了。。呃,,貌似不太完美,ele3_3_type在第一参数中貌似出了点问题
这是LZ的一番心血总结,大家多多指正。
...全文
1511 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
xx_xx_xxx 2015-01-12
  • 打赏
  • 举报
回复
学技术还是学原汁原味的好,软件行业发展都有半个世纪了,最开始很原汁原味的东西正是因为现在的商业性、产品多元化以及“统铜臭味”越来越被掩盖了下去,作为我们是21世纪才开始接触互联网,才开始接触编程,一开始我们就是使用着很上层,很“高级”的编程技术和编程工具,认为学会了这些就已经很OK了。其实我是觉得学任何东西,如果要深入地去了解它,去钻研它,还是应该认识、了解、掌握它的源头,不然一直浮于表面,学任何东西只是雾里看花,你根本就学不透,学不精!你只用vs,只用eclippse,你知道它的底层编译器是什么吗,你知道它们的工程管理文件是怎么写的吗?可能你不知道,因为你觉得你不需要知道,可以说这也是一种悲哀。。
qq_24970885 2015-01-02
  • 打赏
  • 举报
回复
好文章
lt5225262 2014-12-28
  • 打赏
  • 举报
回复
关注楼主的好文章。
kisskk2010 2014-12-27
  • 打赏
  • 举报
回复
可以,值得参考
qq_24835957 2014-12-26
  • 打赏
  • 举报
回复
感谢, 分享. zan!
bdx785 2014-12-26
  • 打赏
  • 举报
回复
很不错 来学习了
宁道奇 2014-12-26
  • 打赏
  • 举报
回复
AllSeen联盟的那个论坛里,大神云集,感谢楼主分享
laoer_2002 2014-12-26
  • 打赏
  • 举报
回复
谢谢楼主分享!
技术菌的blog 2014-12-26
  • 打赏
  • 举报
回复
引用 26 楼 chenxy0312 的回复:
这么多字符,眼睛都花了
哈哈,确实有点花,但每一种签名的界限还是很清晰的,只是嵌套而已
chenxy0312 2014-12-26
  • 打赏
  • 举报
回复
这么多字符,眼睛都花了
bg2abv 2014-12-26
  • 打赏
  • 举报
回复
很不错 来学习了
u010748154 2014-12-25
  • 打赏
  • 举报
回复
厉害厉害真厉害!
qq_24832947 2014-12-25
  • 打赏
  • 举报
回复
厉害
GW786228836 2014-12-25
  • 打赏
  • 举报
回复
a99276 2014-12-25
  • 打赏
  • 举报
回复
超專業的分享~謝謝
x787712772 2014-12-25
  • 打赏
  • 举报
回复
确实不错
Amanda_zhang 2014-12-25
  • 打赏
  • 举报
回复
qq_24805847 2014-12-24
  • 打赏
  • 举报
回复
值得参考 不错
qq_17566571 2014-12-24
  • 打赏
  • 举报
回复
真的 有点 很专业
qq_24799877 2014-12-24
  • 打赏
  • 举报
回复
可以,值得参考
加载更多回复(3)

949

社区成员

发帖
与我相关
我的任务
社区描述
为开发者提供高通丰富的解决方案及全面技术下载内容。本版以AI人工智能、WoS移动笔记本、XR、IoT 物联网、Auto 汽车、生成式AI等核心板块组成,为开发者提供一个便捷及高效的学习交流平台。
人工智能物联网机器学习 企业社区 北京·东城区
社区管理员
  • Qualcomm开发
  • csdnsqst0050
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧