发现和建立多设备之间的数据通信 | 豌豆荚实验室 孙桥

1,871 views

Published on

安卓数据分享技术实现::《发现和建立多设备之间的数据通信》 | Android DevCamp

话题简介:随着移动应用越来越多的依赖于服务端,开发者对数据通信协议的需求慢慢增多。 而软件版本兼容性的不同、网络环境的不同等原因,都会导致设备之间从发现到传输过程中存在不少问题。豌豆荚自行研发设计的 PMP 协议,并采用 Protobuf 等技术手段都很好的解决了不管是手机与手机还是手机与 PC 之间的通信问题。此次演讲豌豆实验室创始团队成员孙桥将以豌豆荚 PC 客户端对手机的管理及手机之间的分享功能为案例,帮助大家了解豌豆荚是如何高效的解决多设备间通信问题的。

讲师介绍:豌豆荚创始团队成员,专注于 Android 开发,目前负责豌豆荚基于 Android 客户端的数据分享功能的研究和实践。

Published in: Technology, News & Politics
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,871
On SlideShare
0
From Embeds
0
Number of Embeds
115
Actions
Shares
0
Downloads
19
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

发现和建立多设备之间的数据通信 | 豌豆荚实验室 孙桥

  1. 1. AndroidDevCampProduced by CSDNWebsite:http://devcamp.csdn.net/Weibo:http://weibo.com/cmdnclub/
  2. 2. PC与ANDROID设备间的数据通信孙桥,豌豆荚创始团队成员
  3. 3. 豌豆荚的手机管理任务¨  豌豆荚,简单好用的 Android 手机管理软件,管 理超过 5000w 台 Android手机。¨  豌豆荚的 Phone Management Protocol (PMP) ¤  Google Protocol Buffers ¤  协议内容
  4. 4. Google Protocol Buffers¨  Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats.
  5. 5. Google Protocol Buffersexample.protomessage Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; }; message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; }; repeated PhoneNumber phone = 4;}
  6. 6. Google Protocol Buffers¨  序列化public byte[] serialization() { ExampleProto.Person.Builder exampleBuilder = ExampleProto.Person.newBuilder(); exampleBuilder.setId(1); exampleBuilder.setName("sunqiao"); exampleBuilder.setEmail("sunqiao@wandoujia.com"); exampleBuilder.addPhone(PhoneNumber.newBuilder() .setType(PhoneType.WORK).setNumber("1861817****").build()); return exampleBuilder.build().toByteArray();}
  7. 7. Google Protocol Buffers¨  反序列化public ExampleProto.Person deserialization(byte[] personInBytes) { ExampleProto.Person person = null; try { person = ExampleProto.Person.parseFrom(personInBytes); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } return person; }
  8. 8. Google Protocol Buffers¨  序列化时间
  9. 9. Google Protocol Buffers¨  反序列化时间
  10. 10. Google Protocol Buffers¨  序列化后数据大小
  11. 11. Google Protocol Buffers¨  内存使用 - toByteArray()public byte[] toByteArray() { try { final byte[] result = new byte[getSerializedSize()]; final CodedOutputStream output = CodedOutputStream.newInstance(result); writeTo(output); output.checkNoSpaceLeft(); return result; } catch (IOException e) { throw new RuntimeException( "Serializing to a byte array threw an IOException " + "(should never happen).", e); } }
  12. 12. Google Protocol Buffers¨  内存使用 – 嵌套message Parent { optional string content_type = 1; optional bytes content = 2;};message Child1 { optional int32 id = 1; optional string name = 2; optional string des = 3;};message Child2 { optional string title = 1; optional string content = 2; optional bytes icon = 3;};
  13. 13. Google Protocol Buffers¨  运行库大小¨  optimize_for ¤  SPEED ¤  CODE_SIZE ¤  LITE_RUNTIME
  14. 14. Google Protocol Buffers ¨  运行库大小Feature protobuf Protobuf (lite-runtime) Protobuf-j2meRuntime library size 420KB 77KB 22KBGenerated code 100% 73% 26%sizeEnumerations YES YES YESUnknown fields YES YES NOImmutability YES YES NOGroups YES YES NOReflection YES NO NODescriptors YES NO NO
  15. 15. Phone Management Protocol¨  消息格式 ¤  Request n  Header n  Token,用于标识请求,并且Token中包含安全验证信息 n  Service Uri,服务地址,pmp://contact/getContacts n  Client,发起这次请求的客户端 n  Content-Range,请求的数据范围 n  Body n  Parameters,参数为键值对
  16. 16. Phone Management Protocol¨  消息格式 ¤  Response n  Header n  Token,用于标识某个请求的响应 n  Content-Type,用于标识Body中的数据类型 n  Content-Length,用于标识Body中的数据长度 n  Content-Range,用于标识Body中包含的数据在整个请求结果 中的范围 n  StatusCode,类似与Http 1.1 的 StatusCode n  Body
  17. 17. Phone Management Protocol¨  Content-Type ¤  类似于MIMEType,一个字符串对应一个使用 protobuf定义的类型,作为PMP的类型体系 vnd.pmp.item/int -> BaseProto.Int vnd.pmp.dir/int -> BaseProto.Ints
  18. 18. Phone Management Protocol¨  Service Uri ¤  服务地址,例如 pmp://sms/receive¨  目前有四种类型的服务 ¤  普通服务 ¤  支持 Content-Range 的服务 ¤  支持 Partial-Return 的服务 ¤  支持 Keep-Alive 的服务
  19. 19. Phone Management Protocol ¨  普通服务 Respo n Head se er Token t :Reques Conte 12345** r Heade 2345*** vnd.p nt-Type: * 1 mp Token: pmp://sms/ Conte .item/int : n Ser vice unt Statu t-Length:1 SCo getSM DA_PC_XXX X Body sCode:20 0 Client: 1 (pr otobu Body f seri alize d)
  20. 20. Phone Management Protocol ¨  支持 Content-Range 的服务 Respo n Head se er tReques Token : r Heade 2345*** Conte 12345** 1 Token: pmp://file/w rite vnd.p nt-Type: * mp : Ser vice _PC_XXXX /1400 Conte .item/int n DA Client: Range: 0-10 23 Statu t-Length:4 Conten t- Body sCode:20 tr> 0 B ody .pmp.item/s yte> 1024 (prot <pa th, vnd .pmp.dir/b obuf t, vnd seria < conten lized )
  21. 21. Phone Management Protocol ¨  支持 Partial-Return 的服务 Respo n Head se er Token : t Conte 12345**Reques app nt-Type: v * r nd.pm Heade 2345*** Conte p.dir/ 1 list Token: pmp://app/ Statu nt-Le n : Ser vice _PC_XXXX sCod gth:10204 Conte e:2 Client: DA nt-Ra 06 X 30 int> Body nge: Body .pm p.item/ 0-9/ y pe, vnd apps 300 <appT (prot obuf seria lized Conte ) nt-Ty Conte pe nt-Le : vnd.pmp Statu n .dir/i Body sCod gth:4 nt e:200 Body 300 (prot obuf seria lized
  22. 22. Phone Management Protocol ¨  支持 Keep-Alive 的服务 Respo n Head se er Token : Conte 12345**Reques t notifi nt-Type: v * r cat nd.pm Heade 2345*** ait Conte ion p.dir/ 1 c ation/w nt-Le Token: pmp://notifi Statu n : sCod gth:1024 Ser vice _PC_XXXX Conte e:2 DA nt-Ra 06 X ttl Client: Body nge: nt> 0-1/ Body .pmp.item/i notifi catio ttl < ttl, vnd n (pro tobuf seria Conte .. Conte nt-Type: v n n Statu t-Length:4 d.pmp.dir Body sCode:20 /int 0 ttl (p rotob uf se rializ ed
  23. 23. Phone Management Protocol¨  安全性 ¤  使用Token来验证请求是否非法,Token中包含了安 全信息(必须是手机授权的客户端才能访问),具 体算法不详
  24. 24. Phone Management Protocol¨  兼容性 ¤  兼容性问题是由于对协议进行升级导致的出现不同的协议版 本的客户端和服务器端相互请求的问题 ¤  产生兼容性问题的原因 n  修改方法接口定义 n  修改数据结构定义 n  修改安全验证方式 n  性能优化,使用了新的序列化/反序列化方法 ¤  解决方案 n  不修改删除已有方法,只新增方法 n  不修改删除已有数据结构字段,只新增新的字段 n  只有一种安全验证方式 n  只使用protobuf进行序列化和反序列化
  25. 25. Q&A

×