鸿蒙L0软总线demo程序

软总线是鸿蒙特有的功能之一,本篇提供了一个运行于L0的软总线demo程序。

demo的流程:

1.dsoftbus_start()

入口启动函数,启动后循环发布、发现、发现节点后连接节点。

int dsoftbus_start()
{if (init() < 0) {return -1;}if (!dsoftbus_init()) {return -2;}if (dsoftbus_publish() < 0) {return -3;}if (dsoftbus_create_session() < 0) {return -4;}if (dsoftbus_send() < 0) {return -5;}while (1) {osDelay(5000);dsoftbus_undiscover();osDelay(1000);dsoftbus_discovery();osDelay(1000);dsoftbus_node();dsoftbus_connect();}return 0;
}

2.init()

初始化mutex及数据

int init()
{if (pthread_mutex_init(&mutex_device, NULL) != 0)return -1;if (pthread_mutex_init(&mutex_session, NULL) != 0)return -2;pthread_mutex_lock(&mutex_session);for (int i = 0; i < MAX_DEVICE_NUMBER; i++) {allSessionInfos[i].session_id = -1;allSessionInfos[i].opened = false;}pthread_mutex_unlock(&mutex_session);return 0;
}

3.dsoftbus_init()

初始化软总线

bool dsoftbus_init()
{InitSoftBusServer();return GetServerIsInit();
}

4.dsoftbus_publish()

软总线发布

int dsoftbus_publish()
{if (isPublished) {return 0;}PublishInfo pub_info = {.publishId = publishId,.mode = DISCOVER_MODE_ACTIVE,.medium = COAP,.freq = LOW,.capability = g_capabilityMap[SHARE_CAPABILITY_BITMAP].capability,.capabilityData = NULL,.dataLen = 0,};IPublishCb pub_cb = {.OnPublishResult = OnPublishResult,};int32_t ret = PublishLNN(pkgName, &pub_info, &pub_cb);if (ret == SOFTBUS_OK) {isPublished = true;return 0;}printf("PublishService failed %ld\n", ret);return -1;
}

5.dsoftbus_discovery()

软总线发现

int dsoftbus_discovery()
{if (isDiscoveryed) {return 0;}SubscribeInfo sub_info = {.subscribeId = publishId,.mode = DISCOVER_MODE_ACTIVE,.medium = COAP,.freq = LOW,.capability = g_capabilityMap[SHARE_CAPABILITY_BITMAP].capability,.capabilityData = NULL,.dataLen = 0,.isSameAccount = true,.isWakeRemote = true,};IRefreshCallback disc_cb = {.OnDeviceFound = OnDeviceFound,.OnDiscoverResult = OnDiscoverResult,};int32_t ret = RefreshLNN(pkgName, &sub_info, &disc_cb);printf("RefreshLNN ret %ld\n", ret);if (ret == SOFTBUS_OK) {isDiscoveryed = true;return 0;}return -1;
}int dsoftbus_undiscover()
{int32_t ret = StopRefreshLNN(pkgName, publishId);isDiscoveryed = false;printf("StopRefreshLNN ret %ld\n", ret);if (ret == SOFTBUS_OK) {return 0;}return -1;
}

6.dsoftbus_create_session()

创建session

int dsoftbus_create_session()
{INodeStateCb node_cb = {.events = 0xff,.onNodeOnline = OnNodeOnline,.onNodeOffline = OnNodeOffline,.onNodeBasicInfoChanged = OnNodeBasicInfoChanged,.onNodeStatusChanged = OnNodeStatusChanged,};ISessionListener session_cb = {.OnSessionOpened = OnSessionOpened,.OnSessionClosed = OnSessionClosed,.OnBytesReceived = OnBytesReceived,};int32_t ret = 0;ret = RegNodeDeviceStateCb(pkgName, &node_cb);printf("RegNodeDeviceStateCb ret %d \n", ret);if (ret < 0) {return -1;}if (GetLocalNodeDeviceInfo(pkgName, &local_node) != SOFTBUS_OK) {printf("GetLocalNodeDeviceInfo failed!\n");return -2;}ret = CreateSessionServer(pkgName, local_node.networkId, &session_cb);if (ret != SOFTBUS_OK) {return -3;}return 0;
}

7.dsoftbus_node()

更新node信息

int dsoftbus_node()
{NodeBasicInfo* nodeinfo = NULL;int32_t infoNum = 0;if (GetAllNodeDeviceInfo(pkgName, &nodeinfo, &infoNum) != SOFTBUS_OK) {if (nodeinfo)FreeNodeInfo(nodeinfo);return -1;}printf("GetAllNodeDeviceInfo num %ld\n", infoNum);for (int j = 0; j < infoNum; j++) {pthread_mutex_lock(&mutex_session);for (int i = 0; i < MAX_DEVICE_NUMBER; i++) {if (strcmp(allSessionInfos[i].node.networkId, nodeinfo[j].networkId) == 0) {printf("same session %s\n", allSessionInfos[i].node.networkId);break;}if (allSessionInfos[i].session_id == -1) {printf("add session[%d] %s\n", i, nodeinfo[j].networkId);allSessionInfos[i].session_id = 0;memcpy(&allSessionInfos[i].node, &nodeinfo[j], sizeof(NodeBasicInfo));break;}}pthread_mutex_unlock(&mutex_session);}FreeNodeInfo(nodeinfo);return 0;
}

8.dsoftbus_connect()

连接session

void dsoftbus_connect()
{static SessionAttribute session_attr = {.dataType = TYPE_BYTES,.linkTypeNum = 3,.linkType = { LINK_TYPE_WIFI_WLAN_5G, LINK_TYPE_WIFI_WLAN_2G, LINK_TYPE_WIFI_P2P },};pthread_mutex_lock(&mutex_session);for (int i = 0; i < MAX_DEVICE_NUMBER; i++) {if (allSessionInfos[i].session_id == 0 && allSessionInfos[i].node.networkId[0] != 0) {int32_t id = OpenSession(local_node.networkId, allSessionInfos[i].node.networkId, allSessionInfos[i].node.networkId, groupId, &session_attr);printf("OpenSession [%d] %s id = %d\n", i, allSessionInfos[i].node.networkId, id);if (id > 0) {allSessionInfos[i].session_id = id;allSessionInfos[i].opened = false;}}}pthread_mutex_unlock(&mutex_session);
}

9.dsoftbus_send()

发送数据

void dsoftbus_send_thread(void *arg)
{while(1){osDelay(5000);static int count = 0;char buffer[30];sprintf(buffer, "hello dsoftbus %d", count++);pthread_mutex_lock(&mutex_session);for (int i = 0; i < MAX_DEVICE_NUMBER; i++) {if (allSessionInfos[i].session_id > 0 && allSessionInfos[i].opened) {int32_t ret = SendBytes(allSessionInfos[i].session_id, buffer, strlen(buffer) + 1);printf("SendBytes sessionid %d ret %d str: %s\n", allSessionInfos[i].session_id, ret, buffer);}}pthread_mutex_unlock(&mutex_session);}
}int dsoftbus_send()
{osThreadAttr_t attr;attr.name = "send task";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = 65536;attr.priority = 24;if (osThreadNew(bus_send_thread, NULL, &attr) == NULL) {printf("Falied to create bus_start!\n");return -1;}return 0;
}

10.回调

接收数据回调

static void OnBytesReceived(int sessionId, const void* data, unsigned int len)
{printf("<OnBytesReceived>CB: data=%s datalen=%u sessionId=%d\n", (char *)data, len, sessionId);
}

如需要完整代码,请私信博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年成都市企业技术标准制(修)订申报条件奖励、材料流程须知

一、2022 年期间奖励项目 (一)申报条件 2022 年期间主导制(修)订并获批发布国际、国家和行业技术标准的工业和信息化企业(其中:民营企业获批发布时间在2022年1月1日至2022年12月31日期间&#xff0c;其他企业获批发布时间在2022年1月1日至2022年7月7日期间)。 (二)支持标准 …

【QA】Java常见运算符

前言 本文主要讲述Java常见的运算符 运算符的概念 两个基本概念&#xff1a; 运算符&#xff1a;对字面量或者变量进行操作的符号 表达式&#xff1a;用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式 示例&#xff1a; int a 10; int b 20; int …

Selenium——获取元素和操纵元素的方法

1、获取元素的方法 1、通过id获取 element wd.find_element(By.ID,"id")2、通过classname获取 elements wd.find_elements_by_class_name("plant") for element in elements:print(element.text)3、通过tagname获取元素 elements wd.find_elements_…

nacos核心源码深度剖析

文章目录 一、nacos1.4.1版本&#xff1a;服务注册与发现架构原理1、基本原理2、Nacos&Ribbon&Feign核心微服务架构图3、Nacos架构图4、核心功能点5、核心功能源码分析&#xff08;1&#xff09;客户端注册逻辑&#xff08;2&#xff09;服务端注册接口&#xff08;3&a…

python:机器学习特征优选

作者&#xff1a;CSDN _养乐多_ 在Python中进行机器学习特征选择的方法有很多种。以下是一些常用的方法&#xff1a; 过滤法&#xff08;Filter Methods&#xff09;&#xff1a;通过统计方法或者相关性分析来评估每个特征的重要性&#xff0c;然后选择最相关的特征。常用的…

【0DAY】瑞友天翼应用虚拟化系统index.php接口处存在SQL注入漏洞导致程RCE

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

和comate一起,用JavaScript实现一个简易版五子棋小游戏

前言 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。 这次和Baidu Comate智能代码助手共同完成这个小游戏…

HarmonyOS NEXT应用开发之多模态页面转场动效实现案例

介绍 本示例介绍多模态页面转场动效实现&#xff1a;通过半模态转场实现半模态登录界面&#xff0c; 与全屏模态和组件转场结合实现多模态组合登录场景&#xff0c;其中手机验证码登录与账号密码登录都为组件&#xff0c; 通过TransitionEffect.move()实现组件间转场达到近似页…

Linux入门攻坚——22、通信安全基础知识及openssl、CA证书

Linux系统常用的加解密工具&#xff1a;OpenSSL&#xff0c;gpg&#xff08;是pgp的实现&#xff09; 加密算法和协议&#xff1a; 对称加密&#xff1a;加解密使用同一个秘钥&#xff1b; DES&#xff1a;Data Encryption Standard&#xff0c;数据加密标准&…

meshlab: pymeshlab保存物体的横截面(compute planar section)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 # pymeshlab需要导入&#xff0c;其一般被命名为ml import pymeshlab as ml# 本案例所…

05.添加自定义触发器

添加自定义触发器 在系统中找到一个用户登录数量的监控项&#xff0c;用该监控项作为参考实例 测试监控项取值&#xff0c;2代表为登录系统终端数量 创建触发器 表达式设置条件&#xff0c;选择对应的监控项&#xff0c;根据对应的功能函数&#xff0c;在选择触发的结果 添…

简洁大气APP下载单页源码

源码介绍 简洁大气APP下载单页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 效果截图 源码下载 简洁大气APP下载单页源码

Jenkins +配置邮件 centos8.5 安装部署 运维系列一

1 jenkins的war包下载地址: Download and deploy 2 xftp 等方式上传到服务器 #安装jdk tar zxvf jdk-11.0.8_linux-x64_bin.tar.gz mv jdk-11.0.8/ /usr/local/jdk vim /etc/profile export JAVA_HOME/usr/local/jdk export PATH$JAVA_HOME/bin:$PATH CLASSPATH.:$JAVA_…

中国居民消费新特征:中枢回落,即时满足,去地产化

随着收入预期和财富效应的转变&#xff0c;居民更倾向于通过短期集中式的消费来获得即时满足的快乐&#xff0c;服务消费表现出了更强的韧性。服务消费强于商品消费、消费去地产化、汽车挑大梁的特征延续。 特征一&#xff1a;消费倾向高于2020-22年&#xff0c;低于2017-19年…

libcity笔记:详细流程(以DeepMove为例)

1 主调用 python run_model.py --task traj_loc_pred --model DeepMove --dataset gowalla --batch_size5有task、dataset、model三个必须命令行参数batch_size一个可选命令行参数没有confg_file 1.1 libcity/utils/argument_list.py/str2bool 将字符串表示的布尔值转换为 Pyt…

结合kimi chat的爬虫实战思路

背景 想钻研一下项目组件&#xff0c;找找之后的学习方向。不能自以为是&#xff0c;所以借着网开源项目网站上公布的项目内容看一下&#xff0c;那些是我可以努力去学习的&#xff08;入门的&#xff09;。首先需要获取相关内容&#xff0c;于是爬取整理。 任务1&#xff1a…

操作系统实战(二)(linux+C语言)

实验内容 通过Linux 系统中管道通信机制&#xff0c;加深对于进程通信概念的理解&#xff0c;观察和体验并发进程间的通信和协作的效果 &#xff0c;练习利用无名管道进行进程通信的编程和调试技术。 管道pipe是进程间通信最基本的一种机制,两个进程可以通过管道一个在管道一…

[Linux] git工具的安装和使用

目录 前言 安装 1.构建仓库 2.将仓库克隆到本地 使用 1.三板斧 1.git add 新增 2.git commit 提交 3.git push 推送 2.常用指令 前言 git 是一个代码托管平台&#xff0c;它的创始人是大名鼎鼎的 Linux 之父&#xff1a; 林纳斯托瓦兹&#xff0c;git的诞生可以使我们对…

解释 RESTful API 以及如何使用它构建 web 应用程序

RESTful API&#xff08;Representational State Transfer&#xff09;是一种设计风格&#xff0c;用于创建网络应用程序的 API。它基于HTTP协议&#xff0c;通过使用标准的HTTP方法&#xff08;如GET、POST、PUT和DELETE&#xff09;来实现对资源的操作。 RESTful API的设计原…

python turtle

名字动画 #SquareSpiral1.py import turtle t turtle.Pen() turtle.bgcolor("black")my_nameturtle.textinput("输入你的姓名","你的名字&#xff1f;") colors["red","yellow","purple","blue"] for…