鸿蒙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日期间)。 (二)支持标准 …

Kubernetes安全管理概览

目录 1、认证&#xff08;Authentication&#xff09;2、授权&#xff08;Authorization&#xff09;3、网络策略&#xff08;Network Policies&#xff09;4、Pod安全策略&#xff08;Pod Security Policies, PSP&#xff09;5、机密管理&#xff08;Secrets Management&#…

【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;然后选择最相关的特征。常用的…

Linux内核--设备驱动(七)媒体驱动框架整理--HDMI框架(2)

目录 一、引言 二、drm框架 ------>2.1、画布( FrameBuffer ) ------>2.2、绘图现场(CRTC) ------>2.3、输出转换器(Encoder ) ------>2.4、连接器 (Connector ) ------>2.5、显示面(Planner) 三、VOP部分详解 ------>3.1、dts ------>3.2、v…

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

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

04-程序控制结构

1. 控制结构介绍 决定程序是如何执行的。 三大流程结构 顺序结构选择结构循环结构 顺序结构 程序从上到下依次执行&#xff0c;中间没有任何判断和跳转。 简单示例 public class Main {public static void main(String[] args) {System.out.println("这是第一行&qu…

每日算法之路径总和

题目描述 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到…

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

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

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

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

在Python中获取当前线程的名字

多线程编程是一种常见的编程范式&#xff0c;它允许程序同时执行多个任务。在Python中&#xff0c;​​threading​​模块提供了对多线程编程的支持。了解和管理当前运行的线程是多线程编程中的一个重要方面。本技术博客将介绍如何在Python中获取当前线程的名字&#xff0c;并提…

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年…

传递给组件

React 组件使用 props 相互通信。每个父组件都可以通过为其子组件提供道具来将一些信息传递给子组件。Props 可能会让您想起 HTML 属性&#xff0c;但您可以通过它们传递任何 JavaScript 值&#xff0c;包括对象、数组和函数。 Props 是传递给 JSX 标签的信息。例如&#xff0…