鸿蒙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://xiahunao.cn/news/3018827.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

定时任务还可以这么玩--基于SpringBoot中的ThreadPoolTaskScheduler实现动态定时任务

Hi,大家好&#xff0c;我是抢老婆酸奶的小肥仔。 最近做了一个需求&#xff1a;将定时任务保存到数据库中&#xff0c;并在页面上实现定时任务的开关&#xff0c;以及更新定时任务时间后重新创建定时任务。 于是想到了SpringBoot中自带的ThreadPoolTaskScheduler。 在Spring…

渗透测试工具--AppInfoScanner 的安装与使用(一)

简洁 ApplicationScanner是一个快速稳定的App代码扫描工具&#xff0c;其主要功能是对ipa和apk文件进行扫描&#xff0c;以快速发现存在风险的代码。这款工具基于Python 3.7实现其主要功能&#xff0c;同时apk检测部分需要JDK 11的支持&#xff0c;因此它具备较好的跨平台特性…

旺店通·企业奇门与金蝶云星空对接集成订单查询打通销售订单新增

旺店通企业奇门与金蝶云星空对接集成订单查询打通销售订单新增 对接源平台:旺店通企业奇门 慧策最先以旺店通ERP切入商家核心管理痛点——订单管理&#xff0c;之后围绕电商经营管理中的核心管理诉求&#xff0c;先后布局流量获取、会员管理、仓库管理等其他重要经营模块。慧策…

邮件群发还能用吗

邮件群发仍然可以使用。不过&#xff0c;在进行邮件群发时&#xff0c;可能会遇到一些问题&#xff0c;如选择合适的邮件群发软件、应对垃圾邮件过滤器的挑战、管理收件人列表、邮件内容的个性化和定制、邮件投递的时间管理以及避免被列入黑名单等。 为了优化邮件群发的效果&a…

五分钟解决Springboot整合Mybaties

SpringBoot整合Mybaties 创建maven工程整合mybaties逆向代码生成 创建maven工程 1.通过idea创建maven工程如下图 2.生成的工程如下 以上我们就完成了一个maven工程&#xff0c;接下来我们改造成springboot项目。 这里主要分为三步&#xff1a;添加依赖&#xff0c;增加配置&…

Oracle-一次TX行锁堵塞事件

问题背景&#xff1a; 接用户问题报障&#xff0c;应用服务出现大量会话堆积现象&#xff0c;数据库锁堵塞严重&#xff0c;需要协助进行问题定位和排除。 问题分析&#xff1a; 登录到数据库服务器上&#xff0c;首先查看一下数据库当前的等待事件情况&#xff0c;通过gv$ses…

SQLSERVER CPU占用过高的优化

有同事反应服务器CPU过高&#xff0c;一看截图基本都是100%了&#xff0c;my god&#xff0c;这可是大问题&#xff0c;赶紧先看看。 让同事查看系统进程&#xff0c;发现是SQLServer的CPU占用比较高。首先想到的是不是报表生成的时候高&#xff0c;因为这块之前出现过问题&…

实例分割——水下垃圾数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

基于大模型的idea提炼:围绕论文和引用提炼idea之ResearchAgent

前言 对本博客比较熟悉的朋友知道&#xff0c;我司论文项目组正在基于大模型做论文的审稿(含CS英文论文审稿、和金融中文论文审稿)、翻译&#xff0c;且除了审稿翻译之外&#xff0c;我们还将继续做润色/修订、idea提炼(包含论文检索)&#xff0c;是一个大的系统&#xff0c;包…

RN封装的toast提示框组件

import React, {useState} from react; import {View,Text,Modal,ActivityIndicator,StyleSheet,TouchableOpacity,Button, } from react-native;// 接收toaseflag为是否显示toast // title为提示内容 const ToastModal ({toastflag, title}) > {return (<Modal animati…

选修选课|基于Springboot+vue的大学生选修选课系统的设计与实现(源码+数据库+文档)

大学生选修选课系统 目录 基于Springboot&#xff0b;vue的大学生选修选课系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 课程信息管理 3排课信息管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

落地护眼灯十大品牌哪款性价比高?品牌排行榜前十名全面揭晓!

落地护眼灯十大品牌哪款性价比高&#xff1f;落地护眼灯已经逐渐成为孩子日常使用率较高的电器之一&#xff0c;它的优点非常突出&#xff0c;对于学习、工作、绘画等环境都能够提供良好的健康环境&#xff0c;同时还携带多种智能调节功能&#xff0c;例如&#xff1a;入座感应…

反汇编一个ARM64的机器码

文章目录 使用objdump直接阅读ARM64手册使用反汇编网站 有下面一个机器码&#xff1a;0x929ffee9&#xff0c;如何翻译成汇编呢&#xff1f; 下面介绍几种做法&#xff1a; 使用objdump 将这个机器码写到文件中&#xff0c;然后使用objdump去反汇编 创建一个二进制文件 dd…

言出身随!人情世故:利益交换与人脉的重要性——早读(逆天打工人爬取热门微信文章解读)

巴黎输了&#xff0c;看了比赛还得加班 引言Python 代码第一篇 洞见 认知越高的人&#xff0c;越懂得感恩第二篇 冯站长之家 2024年5月8日&#xff08;周三&#xff09;三分钟新闻早餐结尾 智慧赋予我决策的明灯 勇气则是我行动的盾牌 在细雨中骑行 是我以智慧选择的道路 用勇气…

数据结构复习/学习9--堆/堆实现/升降序建堆/top-k问题

一、堆与完全二叉树 1.堆的逻辑与物理结构 2.父节点与子节点的下标 3.大小根堆 二、堆的实现&#xff08;大根堆为例&#xff09; 注意事项总结&#xff1a; 注意堆中插入与删除数据的位置和方法与维持大根堆有序时的数据上下调整 三、堆排序 1.排升序建大堆效率高 注意事项…

CST电磁仿真查看模型的截面结构和生成Spice模型【入门教程】

通过Logfile查看仿真统计 一次性了解仿真统计! Post-Processing > Manage Results > Logfile 利用CPU Threads、Mesh Cells、Time Steps以及Total Solver Time等Logfile&#xff0c;可以一目了然地了解仿真统计。 &#xff08;1&#xff09;点击Post-Processing选项卡…

Ryght 在 Hugging Face 专家助力下赋能医疗保健和生命科学之旅

本文是 Ryght 团队的客座博文。 Ryght 是何方神圣&#xff1f; Ryght 的使命是构建一个专为医疗保健和生命科学领域量身定制的企业级生成式人工智能平台。最近&#xff0c;公司正式公开了 Ryght 预览版 平台。 Ryght 预览版https://www.ryght.ai/signup?utm_campaignPreview%2…

对于习惯使用ftp传输的企业,如何寻找最佳的替代方案?

FTP协议广泛应用各行业的文件传输场景中&#xff0c;对于很多企业而言&#xff0c;由于FTP应用获取门槛低、使用普遍&#xff0c;因此&#xff0c;有较为稳定的FTP使用习惯&#xff0c;但即便如此&#xff0c;也不得不面对&#xff0c;FTP应用存在着严重缺陷&#xff1a; 传输效…

【八十二】【算法分析与设计】2421. 好路径的数目,928. 尽量减少恶意软件的传播 II,并查集的应用,元素信息绑定下标一起排序,元素通过下标进行绑定

2421. 好路径的数目 给你一棵 n 个节点的树&#xff08;连通无向无环的图&#xff09;&#xff0c;节点编号从 0 到 n - 1 且恰好有 n - 1 条边。 给你一个长度为 n 下标从 0 开始的整数数组 vals &#xff0c;分别表示每个节点的值。同时给你一个二维整数数组 edges &#xff…

Windows PC上从零开始部署ChatGML-6B-int4量化模型

引言 ChatGLM-6B是清华大学知识工程和数据挖掘小组&#xff08;Knowledge Engineering Group (KEG) & Data Mining at Tsinghua University&#xff09;发布的一个开源的对话机器人。6B表示这是ChatGLM模型的60亿参数的小规模版本&#xff0c;约60亿参数。 ChatGML-6B-in…