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 0struct timeval timedelay = {timeout / 1000, (timeout % 1000) * 1000};if(NULL== uf){return ret;}fd = (int)(intptr_t)ctx;  ///< socket could be zeroif (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;
#elseint 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 zeroif (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 热点发送到设备。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:https://qr21.cn/FV7h05

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr21.cn/FV7h05

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

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

相关文章

皇冠测评:网络电视盒子哪个品牌好?电视盒子排行榜

欢迎各位来到我们的测评频道&#xff0c;本期我们要分享的产品是电视盒子&#xff0c;因很多网友留言不知道网络电视盒子哪个品牌好&#xff0c;我们通过为期一个月的测评后整理了电视盒子排行榜&#xff0c;想买电视盒子的可以看看下面这五款产品&#xff0c;它们各方面表现非…

【JGit 】一个完整的使用案例

需求 生成一系列结构相同的项目代码&#xff0c;将这些项目的代码推送至一个指定的 Git 仓库&#xff0c;每个项目独占一个分支。 推送时若仓库不存在&#xff0c;则自动创建仓库。 分析 生成代码使用 Java 程序模拟&#xff0c;每个项目中模拟三个文件。Project.cpp 、Pro…

更改elementui的箭头图片以及位置

//更改箭头位置 .el-tree-node__content > .el-tree-node__expand-icon {position: absolute;right: 12px; }//更改箭头图片 .el-tree-node__expand-icon {transform: rotate(-90deg); } .el-tree-node__expand-icon.expanded {transform: rotate(0deg); } // 有子节点 且已…

QEMU之内存虚拟化

内存虚拟化方案 最直观的方案&#xff0c;将QEMU进程的虚拟地址空间的一部分作为虚拟机的物理地址。但该方案有一个问题&#xff1a; 在物理机上&#xff0c;CPU对内存的访问在保护模式下是通过分段分页实现的&#xff0c;在该模式下&#xff0c;CPU访问时使用的是虚拟地址&am…

Unity绘制六边形体

现在steam上面有很多下棋类/经营类的游戏都是用六边形的地形&#xff0c;比较美观而且实用&#xff0c;去年在版本末期我也自己尝试做了一个绘制六边体的demo&#xff0c;一年没接触unity竟然都要忘光了&#xff0c;赶紧在这边记录一下。 想cv代码可以直接拉到代码章节 功能 …

音频转换器哪个好?3款电脑软件+3款手机应用

在当今的数字时代&#xff0c;音频转换已成为许多用户日常的需求。为了帮助您找到最佳的音频转换工具&#xff0c;我们将介绍3款电脑软件和3款手机应用。这些工具都各有特点&#xff0c;能够满足不同用户的需求。 1.电脑软件篇 1.1金舟音频大师 金舟音频大师是一款多功能的音…

【LabVIEW 】串口如何读取长度不一致的字符串

工程经验 1、在循环中&#xff0c;加入定时器&#xff0c;这样可以一段时间读取一次。 2、只要获取完整的一帧数据&#xff0c;就可以进行过滤筛选。

力扣128. 最长连续序列(哈希表)

Problem: 128. 最长连续序列 文章目录 题目描述思路复杂度Code 题目描述 思路 1.先将数组中的元素存入到一个set集合中&#xff08;去除重复的元素&#xff09; 2.欲找出最长连续序列&#xff08;先定义两个int变量longestSequence和currentSequence用于记录最长连续序列和当前…

Adobe Acrobat DC中如何合并pdf并生成目录

一、利用 Acrobat 合成pdf目录 &#xff08;一&#xff09;新建标签&#xff08;更改标签等级等&#xff09; 1&#xff0c;用Adobe acrobat 软件打开待添加书签的pdf文档。 2&#xff0c;打开之后点击软件左边栏的书签&#xff08;有时被隐藏了&#xff0c;点击一下界面左边…

第一节 数据操作+数据处理

本系列文章为李沐老师《动手学深度学习》Pytorch版实践学习笔记&#xff0c;相关课程教学、书籍、代码均为开源&#xff0c;可通过以下链接参考学习&#xff1a; 跟李沐学AI的个人空间-跟李沐学AI个人主页-哔哩哔哩视频 (bilibili.com) 前言 — 动手学深度学习 2.0.0 documenta…

高校物品捐赠管理系统|基于springboot高校物品捐赠管理系统设计与实现(源码+数据库+文档)

高校物品捐赠管理系统目录 目录 基于springboot高校物品捐赠管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、捐赠信息管理 3、论坛信息管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算…

RabbitMQ讲解与整合

RabbitMq安装 类型概念 租户 RabbitMQ 中有一个概念叫做多租户&#xff0c;每一个 RabbitMQ 服务器都能创建出许多虚拟的消息服务器&#xff0c;这些虚拟的消息服务器就是我们所说的虚拟主机&#xff08;virtual host&#xff09;&#xff0c;一般简称为 vhost。 每一个 vhos…

NLP-词向量、Word2vec

Word2vec Skip-gram算法的核心部分 我们做什么来计算一个词在中心词的上下文中出现的概率&#xff1f; 似然函数 词已知&#xff0c;它的上下文单词的概率 相乘。 然后所有中心词的这个相乘数 再全部相乘&#xff0c;希望得到最大。 目标函数&#xff08;代价函数&#xff0…

如何用CDH+Apache DolphinScheduler开启Kerberos

搭建环境 多台linux主机搭建集群CDH 6.3.2 (Parcel)版本Apache DolphinScheduler1.3.2版本&#xff0c;本流程在CDH已搭建完成并可正常使用后&#xff0c;开启kerberos功能&#xff0c;Apache DolphinScheduler用于大数据任务管理与执行&#xff0c;是很不错的任务调度平台&am…

ZYNQ--MIG核配置

文章目录 MIG核配置界面多通道AXI读写DDR3MIG核配置界面 Clock Period: DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关。本实验选择 1250ps,对应 800M,这是本次实验所采用芯片可选的最大频率。注意这个时钟是 MIG IP 核产生,并输出给…

压缩视频大小的软件有哪些?5款软件推荐

压缩视频大小的软件有哪些&#xff1f;随着高清摄像设备的普及和网络速度的不断提升&#xff0c;视频文件变得越来越庞大&#xff0c;动辄数百兆甚至数GB的大小常常让用户在分享和存储时感到头疼。幸运的是&#xff0c;市面上有许多优秀的视频压缩软件可以帮助我们轻松应对这一…

NFS服务器挂载失败问题

问题 mount.nfs: requested NFS version or transport protocol is not supported背景&#xff1a;现在做嵌入式开发&#xff0c;需要在板端挂载服务器&#xff0c;读取服务器文件。挂载中遇到该问题。 挂载命令长这样 mount -t nfs -o nolock (XXX.IP):/mnt/disk1/zixi01.ch…

vue实现水印功能

目录 一、应用场景 二、实现原理 三、详细开发 1.水印的实现方式 2.防止用户通过控制台修改样式去除水印效果&#xff08;可跳过&#xff0c;有弊端&#xff09; 3.水印的使用 &#xff08;1&#xff09;单页面/全局使用 &#xff08;2&#xff09;全局使用个别页面去掉…

绘制窗口及窗口位置变化

为了方便窗口的移动 &#xff0c;及相交窗口关闭之后被遮挡窗口的重绘&#xff0c;因此给每个窗口建立一个内存BUF&#xff0c;等到不涉及内容变更的重绘&#xff0c;只需要将该BUF复制到显存之中。 然而&#xff0c;重绘时存在一个被遮挡时如何操作的问题。比如下图中依次为从…

【QT+JS】QT和JS 中的正则表达式 、QT跑JS语言

【QTJS】QT和JS 中的正则表达式 、QT跑JS语言 前言正则表达式QT 中的使用QRegExp自带的cap方法怎么用&#xff1f;QRegExp的非贪婪模式与贪婪模式 JS 中的使用 QT 跑JS 语言 前言 在看大佬的系统代码时候&#xff0c;对其中灵活用到的正则表达式和QT 跑JS 语言部分感觉很陌生&…