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

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

基础介绍:

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

1 分布式软总线

1.1 应用入口main.c

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

c 复制代码
// 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_OPTION
        osEventFlagsSet(eventId, SCAN_SUCCESS_FLAGS);
#endif
        printf("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 retry
    printf("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 软总线接口调用

c 复制代码
// JoinLnnTransmit.h
#ifndef JONILNN_TRANSMIT_H
#define JONILNN_TRANSMIT_H

void 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
c 复制代码
// 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 其它配置

sh 复制代码
// vendor/bestechnic/display_demo/config.json添加dsoftbus_test
"force_link_libs":[
  ...
  "dsoftbus_test"
]
sh 复制代码
// vendor\bestechnic\display_demo\tests\BUILD.gn注释bes_wifi_test
#   if (bes_wifi_test) {
#     deps += [ "wifi:wifi_test" ]
#     defines += [ "WIFI_TEST" ]
#   }
sh 复制代码
// 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"
  ]
}
相关推荐
坚果派·白晓明10 小时前
通过开源鸿蒙终端工具Termony完成Make 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明11 小时前
通过开源鸿蒙终端工具Termony完成Talloc 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明14 小时前
通过开源鸿蒙终端工具Termony完成PCRE2 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明19 小时前
通过开源鸿蒙终端工具Termony完成Busybox 命令行工具构建过程深度解读
开源·openharmony·开源鸿蒙
坚果派·白晓明2 天前
常用URL语法传输数据开源命令行工具curl鸿蒙化构建过程深度解析
开源·openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明2 天前
通过开源鸿蒙终端工具Termony完成Zlib 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明2 天前
Tree 命令行工具鸿蒙化构建过程问题及解决方法
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明2 天前
开源鸿蒙化构建GNU Tar 1.35:完整过程与验证
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明3 天前
通过开源鸿蒙终端工具Termony完成Libarchive 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明3 天前
通过开源鸿蒙终端工具Termony完成Zstd 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony