OpenHarmony 项目实战:智能体重秤

一、简介

本 demo 基于 OpenHarmony3.1Beta 版本开发,该样例能够接入数字管家应用,通过数字管家应用监测体重秤上报数据,获得当前测量到的体重,身高,并在应用端形成一段时间内记录的体重值,以折线图的形式表现出来,根据计算的 BMI 值来提醒当前身体健康状态,推送健康小知识。

1. 交互流程

如上图所示,智能体重称整体方案原理图可以大致分成:智能体重称设备、数字管家应用、云平台三部分。智能体重称通过 MQTT 协议连接华为 IOT 物联网平台,从而实现命令的接收和属性上报。 关于智能设备接入华为云 IoT 平台的详细细节可以参考 连接 IOT 云平台指南;智能设备同数字管家应用之间的设备模型定义可以参考 profile .

2. 实物简介

如上图示,左边为全志 xr806 模组,右边为超声波测距模块,echo 脚连接 PA19,Triq 脚连接 PA20,Vcc 脚连接 5V 电源,Gnd 脚接地,

如上图示,右边为称重模块,clk 脚接 PB15,dt 脚接 PB14,vcc 脚接 5V,gnd 脚接地,称重传感器红色线接 E+,黑色线接 E-,白色线接 A-,绿色线接 A+

左边 xr806 模块左下角 k1 按键,长按 k1 按键不放,同时上电,4-5 秒后松开按键,可以清除已保存得配网信息

xr806 模块,在设备正常工作后,按 k1 按键,可以初始化当前得重量为 0,高度为 0

二、 快速上手

1. 硬件准备

  • 全志 xr806 模组
  • hcsr04 超声波模块
  • hx711 称重模块带支架托盘
  • 预装 HarmonyOS 手机一台

2、环境准备
参照文档:XR806 快速上手指导文档

3、编译前准备

设备侧代码下载
具体仓库地址:https://gitee.com/openharmony-sig/knowledge\_demo\_smart\_home/

下载方式:使用 git 命令下载,指令如下(用户也可以根据需要将该仓库 fork 到自己的目录下后进行下载)

cd ~
git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git

代码拷贝

cp -rfa  ~/knowledge_demo_smart_home/dev/team_x  ~/openharmony/vendor/
cp -rfa  ~/knowledge_demo_smart_home/dev/third_party/iot_link  ~/openharmony/third_party/

SOC 代码下载替换
当前官方 soc 代码由于 DHCP 暂未适配,所以暂时不支持 AP 模式,这时需要下载并替换之前 SOC 代码。如果官方 soc 代码已修复该问题,可忽略此步骤。

git clone https://gitee.com/moldy-potato-chips/xr806_-ap_mode.git
mv ~/openharmony/device/soc/allwinner ~/allwinner.org			// 不建议直接删除,
cp -raf xr806_-ap_mode ~/openharmony/device/soc/allwinner

整合并修改完成后的目录结构如下图

修改文件

  • 修改编译依赖
    打开 device/soc/allwinner/xradio/xr806/BUILD.gn,添加应用依赖 (deps 字段):
module_group(module_name) {
  modules = [
      "src",
      "project",
      "include",
  ]
  configs = [
    ":SdkLdCconfig",
  ]
  deps = [ "//vendor/team_x/smart_weight_scale/demo_smart_weight_scale:smart_weight_scale" ]
}
  • 修改编译方式
    将 demo 依赖的库编译方式 (static_library) 修改为 (source_set):
    具体依赖查看 demo_smart_weight_scale 目录下的 BUILD.gn:
deps = [
       "../../common/iot_wifi_xradio:iot_wifi",
       "../../common/iot_cloud:iot_cloud",
       "//third_party/cJSON:cjson",
       "../../common/iot_boardbutton_xradio:iot_boardbutton",
       "../../common/iot_boardled_xradio:iot_boardled_xradio",
    ]

其中 //third_party/cJSON 目录下的 BUILD.gn 建议参照下面的修改:

source_set("cJSON") {
  sources = [
    "cJSON.c",
    "cJSON_Utils.c",
  ]
  ldflags = [ "-lm" ]
}

third_party/iot_link 目录下的各级使用到的 BUILD.gn 也需要将编译方式修改为 source_set,或者将所有需要编译的文件放在 iot_link 目录的 BUILD.gn 中,如下:

source_set("iot_link") {
    sources = [
        "link_log/link_log.c",
        "link_misc/link_random.c",
        "link_misc/link_ring_buffer.c",
        "link_misc/link_string.c",
        "network/dtls/dtls_al/dtls_al.c",
        "network/dtls/mbedtls/mbedtls_port/dtls_interface.c",
        "network/dtls/mbedtls/mbedtls_port/mbed_port.c",
        "network/dtls/mbedtls/mbedtls_port/timing_alt.c",
        "network/mqtt/mqtt_al/mqtt_al.c",
        "network/mqtt/paho_mqtt/port/paho_mqtt_port.c",
        "network/mqtt/paho_mqtt/port/paho_osdepends.c",
        "network/mqtt/paho_mqtt/paho/MQTTClient-C/src/MQTTClient.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTConnectClient.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTConnectServer.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTDeserializePublish.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTFormat.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTPacket.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTSerializePublish.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTSubscribeClient.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTSubscribeServer.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTUnsubscribeClient.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTUnsubscribeServer.c",
        "oc_mqtt/oc_mqtt_al/oc_mqtt_al.c",
        "oc_mqtt/oc_mqtt_profile_v5/oc_mqtt_profile.c",
        "oc_mqtt/oc_mqtt_profile_v5/oc_mqtt_profile_package.c",
        "oc_mqtt/oc_mqtt_profile_v5/oc_mqtt_event.c",
        "oc_mqtt/oc_mqtt_tiny_v5/oc_mqtt_tiny.c",
        "oc_mqtt/oc_mqtt_tiny_v5/hmac.c",
        "queue/queue.c",
    ]
    
    cflags = [ "-Wno-unused-variable" ]
    cflags += [ "-Wno-unused-but-set-variable" ]
    cflags += [  "-Wno-sign-compare" ]
    cflags += [  "-Wno-unused-parameter" ]
    cflags += [  "-Wno-unused-function" ]

    ldflags = [ "-Wl,-rpath-link=//device/xradio/xr806/xr_skylark/lib" ]
    ldflags += [ "-lmbedtls" ]

    include_dirs = [
        "inc",
        "link_log",
        "link_misc",
        "queue",
        "oc_mqtt/oc_mqtt_tiny_v5",
        "oc_mqtt/oc_mqtt_profile_v5",
        "oc_mqtt/oc_mqtt_al",
        "network/dtls/mbedtls/mbedtls_port",
        "network/mqtt/paho_mqtt/port",
        "network/mqtt/paho_mqtt/paho/MQTTClient-C/src",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src",
        "//third_party/mbedtls/include/",
        "//third_party/mbedtls/include/",
        "//third_party/cJSON",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//device/xradio/xr806/xr_skylark/include/net/mbedtls-2.2.0/",
    ]

    defines = [
        "MQTTCLIENT_PLATFORM_HEADER=paho_osdepends.h",
        "WITH_DTLS",
        "MBEDTLS_AES_ROM_TABLES",
        "MBEDTLS_CONFIG_FILE=\"los_mbedtls_config_dtls.h\"",
        "CONFIG_DTLS_MBEDTLS_CERT",
        "CONFIG_DTLS_MBEDTLS_PSK",
        "CFG_MBEDTLS_MODE=PSK_CERT",
        "CONFIG_OC_MQTT_TINY_ENABLE=1"
    ]
}
  • 修改 iot_link 中的部分文件
    1.third_party/iot_link/network/mqtt/paho_mqtt/port/paho_mqtt_port.c

测试发现,当 fd 为 0 的时候,在执行 recv 时会立马返回 - 1,因此做下面规避操作。

static int __socket_connect(Network *n, const char *host, int port)
{
	...
	int tmpfd = socket(AF_INET,SOCK_STREAM,0); // to skip fd = 0;
	fd = socket(AF_INET,SOCK_STREAM,0);
	if(fd == -1) {
		return ret;
	}
	close(tmpfd);       // to skip fd = 0;
	...
}

系统 setsockopt 函数未适配,因此需要做下面的修改:

static int __socket_read(void *ctx, unsigned char *buf, int len, int timeout)
{
	int fd;
    int ret = 0;
#if 0
	struct timeval timedelay = {timeout / 1000, (timeout % 1000) * 1000};
    if(NULL== uf)
    {
        return ret;
    }
    
    fd = (int)(intptr_t)ctx;  ///< socket could be zero

    if (timedelay.tv_sec < 0 || (timedelay.tv_sec == 0 && timedelay.tv_usec <= 0))
    {
        timedelay.tv_sec = 0;
        timedelay.tv_usec = 100;
    }
    
    if(0 != setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&timedelay,sizeof(struct timeval)))
    {
        return ret;  //could not support the rcv timeout
    }
    int bytes = 0;
    while (bytes < len) {
        int rc = recv(fd, &buf[bytes], (size_t)(len - bytes), 0);
        printf("[%s|%s|%d]fd = %d, rc = %d\n", __FILE__,__func__,__LINE__, fd, rc);
        if (rc == -1) {
            if (errno != EAGAIN && errno != EWOULDBLOCK) {
                bytes = -1;
            }
            break;
        } else if (rc == 0) {
            bytes = 0;
            break;
        } else {
            bytes += rc;
        }
    }
    return bytes;
#else
	int bytes = 0;
    fd_set fdset;

    struct timeval timedelay = {timeout / 1000, (timeout % 1000) * 1000};
    if(NULL== buf)
    {
        return ret;
    }
    
    fd = (int)(intptr_t)ctx;  ///< socket could be zero

    if (timedelay.tv_sec < 0 || (timedelay.tv_sec == 0 && timedelay.tv_usec <= 0))
    {
        timedelay.tv_sec = 0;
        timedelay.tv_usec = 100;
    }
    timedelay.tv_sec = 2;
    FD_ZERO(&fdset);
    FD_SET(fd, &fdset);

    ret = select(fd + 1, &fdset, NULL, NULL, &timedelay);
    if (ret > 0) {
        while (bytes < len) {
            int rc = recv(fd, &buf[bytes], (size_t)(len - bytes), 0);
 //         printf("[%s|%s|%d]fd = %d, rc = %d, errno=%d(%s)\n", __FILE__,__func__,__LINE__, fd, rc,errno, strerror(errno));
            if (rc == -1) {
                if (errno != EAGAIN && errno != EWOULDBLOCK) {
                    bytes = -1;
                }
                break;
            } else if (rc == 0) {
                bytes = 0;
                break;
            } else {
                bytes += rc;
            }
        }
    }

    return bytes;
#endif
}

2.third_party/iot_link/network/dtls/mbedtls/mbedtls_port/dtls_interface.c

在文件顶部添加打印函数定义以及添加 mbedtls_calloc 以及 mbedtls_free 的定义,否则编译会提示错误:

#define MBEDTLS_LOG LINK_LOG_DEBUG
#ifndef mbedtls_calloc
#define mbedtls_calloc  calloc
#endif
#ifndef mbedtls_free
#define mbedtls_free  free
#endif

系统部分 mbedtls 接口不一致,固需要注释部分接口代码:

mbedtls_ssl_context dtls_ssl_new(dtls_establish_info_s *info, char plat_type)
{
	...
	if (info->psk_or_cert == VERIFY_WITH_PSK)
    {
/*
        if ((ret = mbedtls_ssl_conf_psk(conf,
                                        info->v.p.psk,
                                        info->v.p.psk_len,
                                        info->v.p.psk_identity,
                                        strlen((const char *)info->v.p.psk_identity))) != 0)
        {
            MBEDTLS_LOG("mbedtls_ssl_conf_psk failed: -0x%x", -ret);
            goto exit_fail;
        }
*/
    }
    ...
}

int dtls_shakehand(mbedtls_ssl_context *ssl, const dtls_shakehand_info_s *info)
{
	...
	if (MBEDTLS_SSL_IS_CLIENT == info->client_or_server)
    {
        ret = mbedtls_net_connect(server_fd, info->u.c.host, info->u.c.port, info->udp_or_tcp);
        if( 0 != ret)
        {
            ret = MBEDTLS_ERR_NET_CONNECT_FAILED;
            goto exit_fail;
        }
    }
    else
    {
        //server_fd = (mbedtls_net_context*)atiny_net_bind(NULL, info->u.s.local_port, MBEDTLS_NET_PROTO_UDP);
        ///< --TODO ,not implement yet
    }
	...
}

void dtls_init(void)
{
    (void)mbedtls_platform_set_calloc_free(calloc, free);
    (void)mbedtls_platform_set_snprintf(snprintf);
//    (void)mbedtls_platform_set_printf(printf);
}

在 iot_link/network/dtls/mbedtls/mbedtls_port/mbed_port.c 文件中的 dtls_imp_init () 函数中,也需要注释掉未实现的接口,否则编译报错:

int dtls_imp_init(void)
{
    int ret =-1;

    // (void)mbedtls_platform_set_calloc_free(calloc, free); 
    // (void)mbedtls_platform_set_snprintf(snprintf);
    // (void)mbedtls_platform_set_printf(printf);
    ret = dtls_al_install(&s_mbedtls_io);

    return ret;
}

3. 在文件 iot_link/network/mqtt/paho_mqtt/port/paho_osdepends.c 中添加对应 timersub 和 timeradd 的实现 (系统中未实现该函数):

// add this for "timersub" && "timeradd"
#ifndef	timersub
#define timersub(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec - (t)->tv_sec, \
        ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && \
        ((a)->tv_usec += 1000000, (a)->tv_sec--) )
#endif
#ifndef	timeradd
#define timeradd(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec + (t)->tv_sec, \
        ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && \
        ((a)->tv_usec -= 1000000, (a)->tv_sec++) )
#endif

4. 编译中会有部分头文件提示找不到,这个时候直接将其注释即可

(iot_link/network/mqtt/paho_mqtt/port/paho_osdepends.h):

#define INVALID_SOCKET SOCKET_ERROR
// #include <sys/socket.h>
#include <sys/param.h>
#include <sys/time.h>
// #include <netinet/in.h>
// #include <netinet/tcp.h>
// #include <arpa/inet.h>
// #include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#endif

#if defined(WIN32)
#include <Iphlpapi.h>
#else
// #include <sys/ioctl.h>
// #include <net/if.h>
#endif

5. 因为弱引用导致无法链接相关符号,因此需要注释以下几个文件中的弱引用。

文件一 third_party/iot_link/network/dtls/dtls_al/dtls_al.c
#if 0
__attribute__((weak))  int dtls_imp_init(void)
{
    LINK_LOG_DEBUG("%s:###please implement dtls by yourself####",__FUNCTION__);
    return -1;
}
#endif
extern int dtls_imp_init(void);

文件二 third_party/iot_link/network/mqtt/mqtt_al/mqtt_al.c
#if 0
__attribute__((weak))  int mqtt_imp_init(void)
{
    LINK_LOG_DEBUG("%s:###please implement mqtt by yourself####",__FUNCTION__);
    return -1;
}
#endif
extern int mqtt_imp_init(void);

文件三 third_party/iot_link/oc_mqtt/oc_mqtt_al/oc_mqtt_al.c
#if 0
__attribute__ ((weak)) int oc_mqtt_imp_init(void)
{
    LINK_LOG_DEBUG("%s:###please implement oc mqtt by yourself####",__FUNCTION__);
    return 0;
}

__attribute__ ((weak)) int oc_mqtt_demo_main(void)
{
    LINK_LOG_WARN("Please implement the oc mqtt v5 demo yourself");
    return -1;
}
#endif
extern int oc_mqtt_demo_main(void);
  • 修改 GPIO 查找方式

因为 GPIO 框架修改了设备驱动注册的管脚号,导致应用无法根据 HCS 的引脚操作对应的 GPIO,此问题已经提 issue,如果该问题已解决,可以忽略此步骤。

打开 drivers/framework/support/platform/src/gpio/gpio_manager.c,将 cntlr->start = start;注释即可。

static int32_t GpioManagerAdd(struct PlatformManager *manager, struct PlatformDevice *device)
{
    uint16_t start;
    struct GpioCntlr *cntlr = CONTAINER_OF(device, struct GpioCntlr, device);

    if ((start = GpioCntlrQueryStart(cntlr, &manager->devices)) >= GPIO_NUM_MAX) {
        PLAT_LOGE("GpioCntlrAdd: query range for start:%d fail:%d", cntlr->start, start);
        return HDF_ERR_INVALID_PARAM;
    }

//    cntlr->start = start;
    DListInsertTail(&device->node, &manager->devices);
    PLAT_LOGI("%s: start:%u count:%u", __func__, cntlr->start, cntlr->count);
    return HDF_SUCCESS;
}
  • 将对应的驱动文件复制到 drvier 对应目录:

因为主仓代码中未将对应的驱动文件合并到 driver/adpater/platform 对应的目录下,固需要手动将文件拷贝到对应目录。若主仓已合入,可忽略此步骤。

// 拷贝gpio驱动
cp -af device/soc/allwinner/xradio/drivers/gpio/gpio_xradio.* driver/adpater/platform/gpio

// 修改driver/adpater/platform/gpio/BUILD.gn文件,加上gpio_xradio的编译

hdf_driver(module_name) {
  sources = []
  if (defined(LOSCFG_SOC_COMPANY_BESTECHNIC)) {
    sources += [ "gpio_bes.c" ]
  }

  if (defined(LOSCFG_SOC_COMPANY_ALLWINNER)) {
    sources += [ "gpio_xradio.c" ]
  }

  include_dirs = [ "." ]
}

为了节省 ram 资源,可以把无用的资源先关闭,如关闭内部 codec,将 device/soc/allwinner/xradio/xr806/project/prj_config.h 中的 PRJCONF_INTERNAL_SOUNDCARD_EN 设置为 0,如下:

/* Xradio internal codec sound card enable/disable */
#define PRJCONF_INTERNAL_SOUNDCARD_EN   0

4、代码编译

首先可以查看一下hb的版本,如果hb版本为0.4.4版本就不需要更新。

查看 hb 版本

hb --version

更新 hb, 以下指令需要在 openharmony SDK 根目录执行

pip3 uninstall ohos_build
pip3 install build/li

编译命令:
hb set // 如果是第一次编译,Input code path 命令行中键入"./" 指定OpenHarmony工程编译根目录后 回车,

如下图所示,使用键盘上下键选中 wifi_skylark

hb build // 如果需要全量编译,可以添加-f 选项

生成的固件保存在 out/xradio/smart_weight_scale 目录下

5、固件烧录

参照文档:XR806 快速上手指导文档

6、设备配网

在设备上电前需准备好安装了数字管家应用的 HarmonyOS 手机,详情见数字管家应用开发 , 并在设置中开启手机的 NFC 功能;

写设备 NFC 标签,详细操作见设备 NFC 标签指导文档 ;

烧录完成后,上电。开发者在观察开发板上状态 LED 灯以8Hz 的频率闪烁时,将手机上半部靠近开发板 NFC 标签处 (无 NFC 标签的可用 NFC 贴纸替代);

碰一碰后手机将自动拉起数字管家应用并进入配网状态;

配网过程中需要 连接设备的 AP 热点,然后填写需要配置的 wifi 的密码;

最后点击配置,手机会将 ssid 以及对应的密码通过 AP 热点发送到设备。

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:https://gitee.com/MNxiaona/733GH

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vivado Aurora 8B/10B IP核(4)-数据流接口(Streaming Interface)

Streaming 接口 Transmitting and Receiving Data&#xff08;发送和接收数据&#xff09; 流式接口允许将Aurora 8B/10B通道用作管道。 初始化后&#xff0c;通道始终可用于写入&#xff0c;除非发送时 钟补偿序列。 核心数据传输符合AXI4-Stream协议。当s_axi_tx_tvalid被取…

OpenHarmony 实战开发——分布式购物车案例展示~

简介 分布式购物车demo 模拟的是我们购物时参加满减活动&#xff0c;进行拼单的场景&#xff1b;实现两人拼单时&#xff0c;其他一人添加商品到购物车&#xff0c;另外一人购物车列表能同步更新&#xff0c;且在购物车列表页面结算时&#xff0c;某一人结算对方也能实时知道结…

基于单片机的多功能电子万年历系统

摘要:该题目要求学生综合运用单片机原理、低频电子线路、数字电路与逻辑设计等相关知识,设计完成多功能电子万年历系统。通过完成设计任务,使学生掌握单片机设计开发的基本流程,增强学生动手实践能力,培养学生分析和解决实际问题的能力,为后续课程的学习和工作打下良好基础。 关…

特征的前期融合与后期融合在召回、粗排、精排应用

前期融合&#xff1a;先对所有特征做concat&#xff0c;再输入DNN&#xff0c;一般常见于精排模型 特点&#xff1a;线上推理代价大&#xff0c;若有n个候选item需要做n次模型计算 后期融合&#xff1a;把用户和物品特征分别输入不同的神经网络&#xff0c;不对用户和物品做融…

基于Springboot的玩具租赁系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的玩具租赁系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

多用户商城系统哪个好,2024多用户商城系统这样选

在2024年选择适合的多用户商城系统是一项至关重要的决策&#xff0c;因为一个优秀的商城系统不仅可以提升用户体验&#xff0c;还能够帮助企业实现业务目标并取得长期成功。然而&#xff0c;在众多的选择中挑选出最适合的一个并不容易&#xff0c;需要综合考虑各种因素&#xf…

static page 项目

static page 项目 作者&#xff1a;不染心 博客地址&#xff1a;https://blog.csdn.net/qq_38234785 源码地址&#xff1a;https://mbd.pub/o/bread/ZpWVlJps 未经允许&#xff0c;不得转载 文档版本v1&#xff0c;还没写完持续更新 一、引言 1. 软件概述和背景 本软件是…

Python-软件设计-“帮助”小孩子自我行为(电脑端看短视频)约束

目录 前言一、方式一&#xff1a;网站访问拦截二、方式二&#xff1a;SW(电脑软件简称)启动拦截三、使用代码的方式将方式一和方式二结合成自动化程序部署四、其他拓展知识1.程序打包2、开机自启文件夹 五、报错的解决方式1、打包成软件后&#xff0c;运行那个软件时不执行或报…

【论文阅读】ViTAE:Vision transformer advanced by exploring intrinsic inductive bias

ViTAE:Vision transformer advanced by exploring intrinsic inductive bias 论文地址摘要&#xff1a;简介&#xff1a;3 方法论3.1 重温视觉变压器3.2 ViTAE3.3 缩减单元3.4 Normal cell3.5 模型细节 4 训练4.1 Implementation details4.2 Comparison with the state-of-the-…

Linxu系统服务管理,systemd知识/进程优先级/平均负载/php进程CPU100%怎么解决系列知识!

shell脚本&#xff08;命令&#xff09;放后台 sleep 300& 放到后台运行&#xff0c;脚本或命令要全路径 nohup&#xff1a;用户推出系统进程继续工作 【功能说明】 nohup 命令可以将程序以忽略挂起信号的方式运行起来&#xff0c;被运行程序的输出信息将不会显示到终端 如…

华为鸿蒙应用--封装通用标题栏:CommonTitleBar(鸿蒙工具)-ArkTs

0、效果图 自定义通用标题栏 支持左、中、右常规标题栏设置&#xff1b; 支持自定义视图&#xff1b; 支持搜索功能 一、CommTitleBar代码 import router from ohos.router; import { Constants } from ../../constants/Constants; import { StyleConstants } from ../../…

PostgreSQL 把多余字段转JSON

核心SQL&#xff1a; json_agg(json_build_object(kgrq, a.kgrq, jgrq, a.jgrq, sgdd, a.sgdd))

理解与使用Linux设备树编译器(DTC)

这里写目录标题 设备树简介设备树编译器&#xff08;DTC&#xff09;安装DTC使用DTC实例&#xff1a;编辑设备树小结参考资料 Linux设备树编译器&#xff08;DTC&#xff09;是一个关键工具&#xff0c;用于处理嵌入式Linux系统中的设备树文件。本文将介绍设备树的概念、DTC的基…

基于Docker + Locust的数据持久化性能测试系统

前几天给大家分享了如何使用Locust进行性能测试&#xff0c;但是在实际使用中会发现存在压测的结果无法保存的问题&#xff0c;比如在分布式部署情况下进行压测&#xff0c;每轮压测完成需要释放资源删除容器重新部署后&#xff0c;这段时间的压测结果就都丢失了&#xff0c;如…

一文讲解Android车载系统camera架构 - EVS

Android的camera开发中&#xff0c;使用最多的是camera2 以及现在Google主推的cameraX 架构&#xff0c;而这两个架构主要针对的是手机移动端上camera的流程。 而今天介绍的EVS(Exterior View System)架构是不同于camera2上的手机架构&#xff0c;针对Automotive的版本&#x…

【源码阅读】 Golang中的database/sql库源码探究

Note&#xff1a;文章待完结 文章目录 前言一、整体目录结构二、driver包1、驱动相关driver.Driver2、驱动连接&#xff1a;driver.Conn3、预处理结构&#xff1a;Stmt4、执行结果 driver.Result5、查询结果&#xff1a;driver.Rows6、driver.RowsAffected7、driver.Value8、Va…

vue-quill-editor富文本插件控制字数显示

最终效果 富文本编辑框&#xff0c;只统计内容&#xff0c;不包含标签以及样式&#xff0c;超出最大字数限制提示。 具体代码 html <div class"relative"><quillEditorv-model"form.nutriSuggestion"ref"myQuillEditor7":options&quo…

03-JAVA设计模式-策略模式

策略模式 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是行为设计模式之一&#xff0c;它使你能在运行时改变对象的行为。在策略模式中&#xff0c;一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中&#xff0c;…

uniapp微信小程序开发踩坑日记:由于图表数据渲染不出来,我第一次在项目中用watch函数监听数据变化

一、发现问题 在我们团队自己开发的微信小程序中&#xff0c;引入了Echarts图表库 然后突然有一天&#xff0c;后端队友反应图表渲染有问题。后面我去试了一下&#xff0c;确实20次里面必有一次数据渲染不出来 断定代码没问题&#xff0c;于是我们将其鉴定为玄学 二、问题原因…

【GitHub】主页简历优化

【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages&#xff08;GitHub 常用语言统计&#xff09;使用细则 3、Visitor Badge&#xff08;GitHub 访客徽章&#xff09;4、社交统计5、打字特效6、省略展示小猫 &#x1f…
最新文章