鸿蒙子系统解读-分布式软总线子系统初步研究(上)

鸿蒙子系统解读-分布式软总线子系统初步研究(上)

本文作者:江苏润和软件股份有限公司 郎建中

1.总体描述

1.1.总体介绍

设备通信方式多种多样(USB/WIFI/BT等),不同通信方式使用差异很大且繁琐,同时通信链路的融合共享和冲突无法处理,通信安全问题也不好保证。分布式软总线致力于实现近场设备间统一的分布式通信能力管理,提供不区分链路的设备发现和传输接口。目前实现能力包含:

l 服务发布:服务发布后周边的设备可以发现并使用服务。

l 数据传输:根据服务的名称和设备ID建立一个会话,就可以实现服务间的传输功能。

l 安全:提供通信数据的加密能力。

分布式软总线是多种终端设备的统一基座,为设备之间的互联互通提供了统一的分布式通信能力,能够快速发现并连接设备,高效地分发任务和传输数据。分布式软总线架构示意图如下:

在这里插入图片描述

1.2. 设备发现

在分布式软总线子系统中,设备分为发现端和被发现端。

发现端:请求使用服务的设备。一般指智慧屏设备。

被发现端:发布服务的设备。一般指轻量设备。

约束:目前必须保证发现端和被发现端处于同一个局域网内。

(1) 发现端设备,发起discover请求后,使用coap协议在局域网内发送广播。报文如下:
在这里插入图片描述

(2) 被发现端设备使用****PublishService****接口发布服务,接收端收到广播后,发送coap协议单播给发现端。报文格式如下:

在这里插入图片描述

(3) 发现端设备收到报文会更新设备信息。

被发现端发布服务的例子代码如下:

在这里插入图片描述

发现的流程图如下:

在这里插入图片描述

1.3. 数据传输

软总线提供统一的基于Session的传输功能,业务可以通过sessionId收发数据或获取其相关基本属性。当前本项目只实现被动接收Session连接的功能,业务可根据自身需要及Session自身属性判断是否接受此Session,如不接受,可以主动拒绝此连接。本项目暂未提供打开Session的相关能力。

下面是被发现端(服务提供端)向软总线申请创建Session Server的代码:

// 定义业务自身的业务名称,会话名称及相关回调

const char *g_moduleName = "BUSINESS_NAME";

const char *g_sessionName = "SESSION_NAME";

struct ISessionListener * g_sessionCallback= NULL;

 

// 回调实现:接收对方通过SendBytes发送的数据,此示例实现是接收到对端发送的数据后回复固定消息

void OnBytesReceivedTest(int sessionId, const void* data, unsigned int dataLen)

{

  printf("OnBytesReceivedTest\n");

  printf("Recv Data: %s\n", (char *)data);

  printf("Recv Data dataLen: %d\n", dataLen);

  char *testSendData = "Hello World, Hello!";

  ***\*SendBytes\****(sessionId, testSendData, strlen(testSendData));

  return;

}

 

// 回调实现:用于处理会话关闭后的相关业务操作,如释放当前会话相关的业务资源,会话无需业务主动释放

void OnSessionClosedEventTest(int sessionId)

{

  printf("Close session successfully, sessionId=%d\n", sessionId);

}

 

// 回调实现:用于处理会话打开后的相关业务操作。返回值为0,表示接收;反之,非0表示拒绝。此示例表示只接受其他设备的同名会话连接

int OnSessionOpenedEventTest(int sessionId)

{

  if (strcmp(***\*GetPeerSessionName\****(sessionId), SESSION_NAME) != 0) {

​    printf("Reject the session which name is different from mine, sessionId=%d\n", sessionId);

​    return -1;

  }

  printf("Open session successfully, sessionId=%d\n", sessionId);

  return 0;

}

 

// 向SoftBus注册业务会话服务及其回调

int StartSessionServer()

{

  if (g_sessionCallback == NULL) {

​    g_sessionCallback = (struct ISessionListener*)malloc(sizeof(struct ISessionListener));

  }

  if (g_sessionCallback == NULL) {

​    printf("Failed to malloc g_sessionCallback!\n");

​    return -1;

  }

  g_sessionCallback->onBytesReceived = OnBytesReceivedTest;

  g_sessionCallback->onSessionOpened = OnSessionOpenedEventTest;

  g_sessionCallback->onSessionClos
  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值