欧智通恒玄BES2600W基于Openharmony v3.0的分布式软总线测试过程记录

恒玄BES2600W SoC 的欧智通的单板基于Openharmony v3.0的底座,其测试的样例代码是基于恒玄公司开发的轻量带屏显示产品样例代码,主要包括图形、软总线等特性产品的开发。

基础介绍:

​ L0的系统基于Liteos-m的m内核,网络使用lwip,其运行的系统为单进程,添加的应用方式采用APP_FEATURE_INIT宏将应用添加进系统中运行。

1 分布式软总线

1.1 应用入口main.c

// main.c
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "cmsis_os2.h"
#include "ohos_init.h"#include "wifi/connectwifi.h"
#include "bussiness/JoinLnnTransmit.h"#define TEST_PKG_NAME "DSoftBus_APP"
#define MY_SESSION_NAME "mySessionName"
#define PEER_SESSION_NAME "peerSessionName"
extern int g_wifiState;
extern int g_jonLNNState;
extern int g_readySession;void DSoftBus(void)
{printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");IotWifiConnect();while(g_wifiState != 0){printf("----------wifi Is not connected-------------\n");osDelay(100);}InitSoftBusThread();while (GetServerIsInit() == false){printf("----------Server Is not Init-------------\n");sleep(1);}printf("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n");DsoftJonnLNN(TEST_PKG_NAME);while(g_jonLNNState != 0){printf("----------Joni LNN Is not Succ-------------\n");DsoftJonnLNN(TEST_PKG_NAME);sleep(1);}printf("CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n");if(ReadySession(TEST_PKG_NAME, MY_SESSION_NAME, PEER_SESSION_NAME) != 0){return;}while(g_readySession != 0){printf("----------Session Is not Ready-------------\n");sleep(1);}const char *data = "Bestech testdata YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY";uint32_t len = strlen(data);DsoftSendBytes(data, len);DsoftSendMessage(data, len);DsoftCloseSession();
}APP_FEATURE_INIT(DSoftBus);

1.2 wifi连接

通过连接固定的AP名amt-hdc-2022,密码固化为hmg20220905

// connectwifi.c
#include <stdlib.h>
#include "connectwifi.h"
#include "cmsis_os2.h"
#include "ohos_init.h"
#include "lwip/netif.h"
#include "lwip/netifapi.h"
#include "wifi_device.h"
#include "wifi_device_config.h"
#include "wifi_error_code.h"#define SELECT_WIFI_SSID "amt-hdc-2022"
#define SELECT_WIFI_PASSWORD  "hmg20220905"int g_wifiState = -1;
#define SCAN_OPTION 1
#define SCAN_SUCCESS_FLAGS 1U
osEventFlagsId_t eventId;
WifiEvent g_wifiEventHandler = {0};static void OnWifiScanStateChangedHandler(int state, int size)
{(void)state;if (state > 0) {
#if SCAN_OPTIONosEventFlagsSet(eventId, SCAN_SUCCESS_FLAGS);
#endifprintf("wifi scan result %d\r\n", size);} else {printf("wifi scan failed\r\n");}
}static void OnWifiConnectionChangedHandler(int state, WifiLinkedInfo *info)
{(void)info;if (state > 0) {printf("callback function for wifi connect\r\n");} else {printf("connect error,please check password\r\n");}
}static void OnHotspotStaJoinHandler(StationInfo *info)
{(void)info;printf("STA join AP\n");
}static void OnHotspotStaLeaveHandler(StationInfo *info)
{(void)info;printf("HotspotStaLeave:info is null.\n");
}static void OnHotspotStateChangedHandler(int state)
{printf("HotspotStateChanged:state is %d.\n", state);
}static WifiErrorCode WiFiInit(void)
{g_wifiEventHandler.OnWifiScanStateChanged = OnWifiScanStateChangedHandler;g_wifiEventHandler.OnWifiConnectionChanged = OnWifiConnectionChangedHandler;g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;return RegisterWifiEvent(&g_wifiEventHandler);
}int hi_wifi_start_sta(void)
{WifiDeviceConfig select_ap_config = {0};strcpy(select_ap_config.ssid, SELECT_WIFI_SSID);strcpy(select_ap_config.preSharedKey, SELECT_WIFI_PASSWORD);select_ap_config.securityType = WIFI_SEC_TYPE_PSK;printf("<--WifiSTATask Init-->\r\n");if (WiFiInit() != WIFI_SUCCESS) {printf("WiFiInit failed!\r\n");return - 1;}if (EnableWifi() != WIFI_SUCCESS) {printf("EnableWifi failed\r\n");return -1;}if (IsWifiActive() == WIFI_STA_NOT_ACTIVE) {printf("Wifi station is not activated.\n");return -1;}int networkId = -1;if (AddDeviceConfig(&select_ap_config, &networkId) != WIFI_SUCCESS) {printf("AddDeviceConfig failed!\r\n");return -1;}printf("Connecting to %s...\r\n", SELECT_WIFI_SSID);WifiErrorCode error = ConnectTo(networkId); ///< block and retryprintf("WiFi connect %s!\r\n", (error == WIFI_SUCCESS) ? "succeed" : "failed");g_wifiState = 0;for (;;) {osDelay(100);}printf("g_wifiState: %d\r\n", g_wifiState);sleep(3000);return 0;
}void IotWifiConnect(void)
{printf("\n\n entry wifi connect.\r\n");osThreadAttr_t attr;attr.name = "IotWifiConnect task";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = 10240;attr.priority = 24;if (osThreadNew((osThreadFunc_t)hi_wifi_start_sta, NULL, &attr) == NULL) {printf("Failed to create WifiSTATask!\n");}
}

1.3 软总线接口调用

// JoinLnnTransmit.h
#ifndef JONILNN_TRANSMIT_H
#define JONILNN_TRANSMIT_Hvoid InitSoftBusThread(void);void DsoftJonnLNN(const char* pkgName);int ReadySession(const char* pkgName, const char * mySessionName, const char *peerSessionName);int DsoftSendBytes(const void *data, unsigned int len);int DsoftSendMessage(const void *data, unsigned int len);void DsoftCloseSession(void);
#endif
// JoinLnnTransmit.c
#include "JoinLnnTransmit.h"
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "cmsis_os2.h"
#include "ohos_init.h"
#include "softbus_server_frame.h"
#include "softbus_common.h"
#include "session.h"int g_jonLNNState = -1;
const char* g_networkid;
int g_sessionId = 0;
int g_readySession = -1;void InitSoftBusThread(void)
{osThreadAttr_t attr;attr.name = "dsoftbus 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((osThreadFunc_t)InitSoftBusServer, NULL, &attr) == NULL) {printf("Failed to create WifiSTATask!\n");}
}void OnJoinLNNDone(ConnectionAddr *addr, const char *networkId, int32_t retCode)
{(void)addr;(void)networkId;printf("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ networkId is %s\n", networkId);(void)retCode;printf("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ retCode is %d\n", retCode);if(retCode == 0) {g_jonLNNState = 0;g_networkid = networkId;}
}void DsoftJonnLNN(const char* pkgName)
{int32_t ret = JoinLNN(pkgName, NULL, OnJoinLNNDone);
}int SessionOpened(int sessionId, int result)
{printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX result is %d,sessionId is %d\n", result, sessionId);if(result == 0){g_readySession = 0;g_sessionId = sessionId;}return 0;
}void SessionClosed(int sessionId)
{printf("MMMMMMMMMMMMMMMMMMMMMMMMMMM sessionId is %d\n", sessionId);
}void BytesReceived(int sessionId, const void *data, unsigned int dataLen)
{printf("MMMMMMMMMMMMMMMMMMMMMMMMMMM data is %s,sessionId is %d\n", data, sessionId);
}void MessageReceived(int sessionId, const void *data, unsigned int dataLen)
{printf("MMMMMMMMMMMMMMMMMMMMMMMMMMM data is %s,sessionId is %d\n", data, sessionId);
}void OnStreamReceived(int sessionId, const StreamData *data, const StreamData *ext,const StreamFrameInfo *param)
{}int ReadySession(const char* pkgName, const char * mySessionName, const char *peerSessionName)
{ISessionListener g_sessionlistener = {.OnSessionOpened = SessionOpened,.OnSessionClosed = SessionClosed,.OnBytesReceived = BytesReceived,.OnMessageReceived = MessageReceived,.OnStreamReceived = OnStreamReceived,};int32_t ret = CreateSessionServer(pkgName, mySessionName, &g_sessionlistener);printf("YYYYYYYYYYYYYYYYYYYYYYYYYYYYY ret is %d\n", ret);if(ret == 0){SessionAttribute g_sessionAttr = {.dataType = TYPE_BYTES,};ret = OpenSession(mySessionName, peerSessionName, g_networkid, "g_groupid", &g_sessionAttr);printf("YYYYYYYYYYYYYYYYYYYYYYYYYYYYY ret is %d\n", ret);}return ret;
}int DsoftSendBytes(const void *data, unsigned int len)
{int ret = SendBytes(g_sessionId, data, len);printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ret is %d\n", ret);return ret;
}int DsoftSendMessage(const void *data, unsigned int len)
{int ret = SendMessage(g_sessionId, data, len);printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ret is %d\n", ret);return ret;
}void DsoftCloseSession(void)
{CloseSession(g_sessionId);
}

通过以上示例可以将两台L0的恒玄设备通过分布式软总线进行发布、发现、并组网再发送或接收数据,而且如果将L2设备中软总线关于hichain认证部份进行剥离也可以说不进行认证的情况下,亦可以将一台L0设备与L2设备之间进行发布、发现、组网、数据发送、数据接收。

关于跳过hichain部份在Openharmony的不同版本中处理不同,关于此节会专门做一章节进行描述。

1.4 其它配置

// vendor/bestechnic/display_demo/config.json添加dsoftbus_test
"force_link_libs":[..."dsoftbus_test"
]
// vendor\bestechnic\display_demo\tests\BUILD.gn注释bes_wifi_test
#   if (bes_wifi_test) {
#     deps += [ "wifi:wifi_test" ]
#     defines += [ "WIFI_TEST" ]
#   }
// vendor\bestechnic\display_demo\tests\dsoftbus\BUILD.gn修改后如下:
static_library("dsoftbus_test") {sources = [ "main.c","./wifi/connectwifi.c","./bussiness/JoinLnnTransmit.c"]include_dirs = ["./bussiness","./wifi","//commonlibrary/utils_lite/include","//foundation/communication/wifi_lite/interfaces/wifiservice","//foundation/communication/dsoftbus/interfaces/kits/common","//foundation/communication/dsoftbus/interfaces/kits/transport","//foundation/communication/dsoftbus/core/frame/common/include"]
}

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

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

相关文章

计算机网络--传输层

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 1. 概述 1.1 传输层的意义 网络层可以把数据从一个主机传送到另一个主机&#xff0c;但是没有和进程建立联系。 传输层就是讲进程和…

【中间件系列】浅析redis是否适合做消息队列

文章目录 一、简单的list消息队列1.命令示例2.伪代码示例3.方案优劣 二、Pub/Sub发布订阅1.消息丢失2.消息堆积 三、相对成熟的Stream1.redis命令介绍2.多消费者组测试3.Stream会持久化吗&#xff1f;4.消息堆积如何解决&#xff1f; 总结 用redis也是比较久了&#xff0c;并且…

Unity3d简单对话系统的实现——使用Dialogue editor完成对话系统

目录 前言 使用方法 1.下载dialogue editor 2.新建空物体 3.对对话内容进行编辑 4.对话画布建立 5.触发对话框代码 结束语 前言 今天是坚持写博客的第21天&#xff0c;很高兴自己可以坚持&#xff0c;也希望能与大家一起进步。我们今天来看unity3d当中的一个可以轻松实…

Feign是如何发送http请求的

1、接口定义 首先&#xff0c;开发者使用Feign提供的注解&#xff08;如FeignClient&#xff09;定义接口&#xff0c;并在接口中定义HTTP请求的方法&#xff0c;这些方法将映射到远程服务的具体HTTP请求。 2、动态代理 当应用启动时&#xff0c;Feign会通过动态代理和反射机…

Go select 语句使用场景

1. select介绍 select 是 Go 语言中的一种控制结构&#xff0c;用于在多个通信操作中选择一个可执行的操作。它可以协调多个 channel 的读写操作&#xff0c;使得我们能够在多个 channel 中进行非阻塞的数据传输、同步和控制。 基本语法&#xff1a; select {case communica…

Python中的函数式编程特性深入探讨

Python中的函数式编程特性深入探讨 Python,作为一种多范式编程语言,不仅支持面向对象编程(OOP),同样也对函数式编程(FP)提供了良好的支持。函数式编程是一种编程范式,它将计算机程序看作是一系列函数的求值,并避免使用可变状态和共享状态。本文将深入探讨Python中的函…

数据赋能(112)——体系:监控数据采集——影响因素、直接作用、主要特征

影响因素 影响监控数据采集的主要影响因素如下&#xff1a; 采样率&#xff1a;采样率是指采集数据的频率。采样率决定了监控的实时性与精确度&#xff0c;一般来说&#xff0c;采样率越高&#xff0c;监控的实时性就越高&#xff0c;精确度也越高。但是&#xff0c;过高的采…

2024 cicsn SuperHeap

文章目录 参考沙箱存在protobuf逆向buy_booksee_bookreturn_bookedit_booksearch_book 思路exp 参考 https://hakuya.work/post/7 https://akaieurus.github.io/2024/05/20/2024%E5%9B%BD%E8%B5%9B%E5%88%9D%E8%B5%9Bpwn-wp/#SuperHeap https://blog.csdn.net/m0_63437215/art…

TSINGSEE青犀视频汇聚机房动环智能监控方案,提升机房安全稳定性

一、背景需求 在当今信息化时代&#xff0c;机房作为数据中心的核心设施&#xff0c;承载着重要的网络设备和数据存储设备&#xff0c;其正常运行对于企业的数据安全和业务连续性至关重要。机房内部设备众多&#xff0c;且运行过程中涉及大量的数据交换和传输。一旦发生安全事…

java 类加载器及双亲委派机制

1、 有哪些类加载器 还有自定义类加载器。最上面的为父加载器&#xff0c;加载类的路径是不一样的 2、 什么是双亲委派机制&#xff1a; 1. 加载时&#xff0c;先去找父类&#xff0c;父类无法加载时&#xff0c;在由儿子加载 3、 为什么用双亲委派&#xff1a; 沙箱安全&…

【devops】 Bytebase 一站式开源 数据库DevOps平台

初识 Bytebase 1、安装 安装地址 https://www.bytebase.com/docs/get-started/self-host/#docker 安装指令 docker run --init \--name bytebase \--publish 8080:8080 --pull always \--volume ~/.bytebase/data:/var/opt/bytebase \bytebase/bytebase:2.18.02、登录-dashboa…

OlSoul系统调校程序v2024.06.05

软件介绍 OlSoul是一款能够适配用于Win各个系统的系统调校软件&#xff0c;OlSoul内置有众多调校功能可以直接使用&#xff0c;如有启用无线网络功能、启用打印机功能、系统快速休眠与休眠开关、快捷方式小箭头去除功能等&#xff0c;具体的调校功能多达几十项&#xff0c;可自…

Android SplashActivity runs twice at launch on Android 13 API 33

运行写好的 Android App 到自己手机上&#xff08;显示Xiaomi 23013RK75C Android 13 API 33&#xff09;&#xff0c; 通过 Logcat 发现第一次安装运行时启动页面的 onCreate 被调用两次&#xff0c;第一次 onCreate 函数中的 savedInstanceState 值为空&#xff0c;第二次不…

【Python】selenium使用find_element时解决【StaleElementReferenceException】问题的方法

StaleElementReferenceException 是 Selenium WebDriver 中的一种异常&#xff0c;通常在元素与当前页面的状态不同步时抛出&#xff0c;比如页面已经刷新或导航到另一个页面&#xff0c;但是尝试操作的元素引用仍然是旧页面上的元素。 以下是一些解决 StaleElementReferenceE…

RT-DETR 详解之 Efficient Hybrid Encoder

在先前的博文中&#xff0c;博主介绍了RT-DETR在官方代码与YOLOv8集成程序中的训练与推理过程&#xff0c;接下来&#xff0c;博主将通过代码调试的方式来梳理RT-DETR的整个过程。 整体结构 RT-DETR的代码调试大家可以参考博主这篇文章&#xff1a; 在梳理整个代码之前&…

几何关系运算处理

1. 判断点在线的左边还是右边 要判断一个坐标点在直线的左侧还是右侧&#xff0c;可以使用向量叉积。具体来说&#xff0c;对于给定的直线和点&#xff0c;我们可以计算点到直线的向量与直线的方向向量的叉积。叉积的符号可以用于判断点的位置关系&#xff1a; 如果叉积为正&…

SpringBoot高手之路-原理篇

文章目录 JDK动态代理 JDK动态代理

【docker】仓库、镜像、容器的关系

Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;并发布到任何流行的 Linux 机器上。在 Docker 的生态系统中&#xff0c;有几个核心概念&#xff1a;仓库&#xff08;Repository&#xff09;、镜像&#xff0…

长文预警:自动驾驶の核燃料库!Tesla数据标注系统解析

长文预警&#xff1a;自动驾驶の核燃料库&#xff01;Tesla数据标注系统解析 前言 本文整理自原文链接&#xff0c;写的非常好&#xff0c;给了博主很多启发&#xff0c;投原创是因为平台机制&#xff0c;希望能被更多人看到。 掐指一算&#xff0c;又到了该学习的时间&#…

Python | Leetcode Python题解之第137题只出现一次的数字II

题目&#xff1a; 题解&#xff1a; class Solution:def singleNumber(self, nums: List[int]) -> int:a b 0for num in nums:b ~a & (b ^ num)a ~b & (a ^ num)return b