鸿蒙OS 分布式通信子系统

分布式通信子系统

简介

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

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

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

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

开发者通过使用项目的API实现设备间高速安全的通信,不用关心通信细节管理,进而实现业务开发的跨平台能力。

目录

softbus_lite源代码目录结构如下图所示:

**表1 **softbus_lite源代码目录结构

名称描述

authmanager提供设备认证机制和设备知识库管理。

discovery提供基于coap协议的设备发现机制。

trans_service提供认证和传输通道。

约束

语言限制:C语言。

组网环境:必须确保设备在同一个局域网中。

使用

设备发现

用户使用发现功能时,需要保证发现端设备与被发现端设备在同一个局域网内,并且互相能收到对方以下流程的报文。

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

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

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

被发现端接口使用示例如下:

// 回调函数声明:void onSuccess(int publishId){    printf("publish succeeded, publishId = %d\r\n", publishId);}void onFail(int publishId, PublishFailReason reason){    printf("publish failed, publishId = %d, reason = %d\r\n", publishId, reason);}// 服务发布接口使用PublishInfo info = {0};IPublishCallback cb = {0};cb.onPublishSuccess = onSuccess;cb.onPublishFail = onFail;char a[] = "456";info.capabilityData = a;info.capability = "ddmpCapability";info.dataLen = strlen("456");info.medium = 2;info.publishId = 1;PublishService("cxx", &info, &cb);

传输

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

传输主要代码示例如下:

// 定义业务自身的业务名称,会话名称及相关回调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->onSessionClosed = OnSessionClosedEventTest;    int ret = CreateSessionServer(g_moduleName, g_sessionName, g_sessionCallback);    if (ret < 0) {        printf("Failed to create session server!\n");        free(g_sessionCallback);        g_sessionCallback = NULL;    }    return ret;}// 从SoftBus中删除业务会话服务及其回调void StopSessionServer(){    int ret = RemoveSessionServer(g_moduleName, g_sessionName);    if (ret < 0) {        printf("Failed to remove session server!\n");        return;    }    if (g_sessionCallback != NULL) {        free(g_sessionCallback);        g_sessionCallback = NULL;    }}

涉及仓

communication_frameworks_wifi_lite

communication_frameworks_ipc_lite

communication_hals_wifi_lite

communication_interfaces_kits_ipc_lite

communication_interfaces_kits_softbuskit_lite

communication_interfaces_kits_wifi_lite

communication_services_softbus_lite

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342