OPC UA/DA协议库open62541的源码编译及案例测试

news2024/11/25 0:26:29

目录

一、下载源码

二、编译源码

三、案例编译

        3.1 工程目录

        3.2 server端

        3.3 client端

       3.4 程序运行

四、补充open62541库的linux编译

        4.1 cmake版本升级

        4.2 python3支持

        4.3 open62541源码编译


一、下载源码

        win10系统下,安装git工具,下载open62541库源码,该源码是MPLv2的License

git clone --recursive https://github.com/open62541/open62541.git
#gitee
git clone --recursive https://gitee.com/qihuanweidu007/open62541.git

#如果某些模块无法加载,重新调整网络后,继续加载确保无fail输出
cd open62541
git submodule update --remote --recursive

         系统安装了cmake、MinGW、VC和python3工具,将工作路径加入环境变量path中。

二、编译源码

        进入open62541目录

#本文的源码路径是D:\\workForOrgCode\\open62541
#创建编译目录
mkdir build_mingw
#或cmd指令md指令创建目录
cd build_mingw
cmake -G "MinGW Makefiles" .. -DUA_ENABLE_AMALGAMATION=ON 
#如果提示无法查找到python3包,直接显式指定
cmake -G "MinGW Makefiles" .. -DUA_ENABLE_AMALGAMATION=ON -DPython3_EXECUTABLE="D:\\workForSoftware\\python36\\python.exe"

#编译
mingw32-make -j4 #或cmake --build . --config release

#vc编译
md build_vc
cd build_vc
#本文采用vs2013版本
cmake -G "Visual Studio 12 2013" .. -DUA_ENABLE_AMALGAMATION=ON -DPython3_EXECUTABLE="D:\\workForSoftware\\python36\\python.exe"

cmake --build . --config release
可能会出现 error C2220: 警告被视为错误 - 没有生成“object”文件,
可以通过文本编辑工具将生成的open62541.c文件改为ANSI格式,然后再次编译

       在编译过程中,会显示生成open62541.h和open62541.c文件,然后再编译成库文件,按官方说法,直接引入open62541.h和open62541.c来源码及生成库文件来开发,

        如果不想引入那么大的open62541.h头文件,也可以按需引入各个头文件,这些文件的存放路径例如:

	#"D:\\workForOrgCode\\open62541\\include"
	#"D:\\workForOrgCode\\open62541\\build_mingw\\src_generated"
	#"D:\\workForOrgCode\\open62541\\arch"
	#"D:\\workForOrgCode\\open62541\\deps"
	#"D:\\workForOrgCode\\open62541\\plugins\\include"

        库文件生成输出在build_mingw\bin目录下。

三、案例编译

        3.1 工程目录

#D:\workForOrgCode\open62541目录下
demo
    server_test
        bin
        build_mingw
        build_vc
        src
            main.c
        CMakeLists.txt
    client_test
        bin
        build_mingw
        build_vc
        src
            main.c
        CMakeLists.txt

        3.2 server端

                main.c,这里采用的是直接引入编译生成的open62541.h头文件,也可直接引用仅涉及的头文件,如注释的那样:

#include <signal.h>
//#include <open62541/server.h>
//#include <open62541/server_config_default.h>
#include "open62541.h"

UA_Boolean running = true;
void signalHandler(int sig) {
    running = false;
}

int main(int argc, char** argv)
{
    signal(SIGINT, signalHandler); /* catch ctrl-c */

    /* Create a server listening on port 4840 */
    UA_Server *server = UA_Server_new();
    UA_ServerConfig_setDefault(UA_Server_getConfig(server));

    /* Add a variable node */
    /* 1) Define the node attributes */
    UA_VariableAttributes attr = UA_VariableAttributes_default;
    attr.displayName = UA_LOCALIZEDTEXT("en-US", "the answer");
    UA_Int32 myInteger = 42;
    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);

    /* 2) Define where the node shall be added with which browsename */
    UA_NodeId newNodeId = UA_NODEID_STRING(1, "the.answer");
    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
    UA_NodeId variableType = UA_NODEID_NULL; /* take the default variable type */
    UA_QualifiedName browseName = UA_QUALIFIEDNAME(1, "the answer");

    /* 3) Add the node */
    UA_Server_addVariableNode(server, newNodeId, parentNodeId, parentReferenceNodeId,
                              browseName, variableType, attr, NULL, NULL);

    /* Run the server loop */
    UA_StatusCode status = UA_Server_run(server, &running);

    UA_Server_delete(server);
    return status;
}

        CMakeLists.txt,如果采用了单独引入各个头文件的方式,主要把各个头文件及关联头文件的所在路径添加进来,如这些目录(include_directories)如本文所注释掉的那些:

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (opc_server_test)
#
if(WIN32)
    message(STATUS "windows compiling...")
    add_definitions(-D_PLATFORM_IS_WINDOWS_)
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
    set(WIN_OS true)
else(WIN32)
    message(STATUS "linux compiling...")
    add_definitions( -D_PLATFORM_IS_LINUX_)
    add_definitions("-Wno-invalid-source-encoding")
	  # add_definitions("-O2")
    set(UNIX_OS true)
    set(_DEBUG true)
    
endif(WIN32)

set(UA_IPV6 0)
set(org_dir ${PROJECT_SOURCE_DIR}/../..) #即D:\\workForOrgCode\\open62541
set(build_dir ${PROJECT_SOURCE_DIR}/../../build_mingw)
#set(build_dir ${PROJECT_SOURCE_DIR}/../../build_vc)
#set(build_dir ${PROJECT_SOURCE_DIR}/../../build_linux)
#
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
 
# 指定源文件的目录,并将名称保存到变量
SET(source_h
    #
	#${build_dir}/open62541.h #由于添加了其所在目录,不用直接添加
  )
  
SET(source_cpp
    #
	${PROJECT_SOURCE_DIR}/src/main.c
	${build_dir}/open62541.c
  )
  
#头文件目录
include_directories(
	${build_dir}    #引入open62541.h所在目录
	#${org_dir}/include
	#${build_dir}/src_generated
	#${org_dir}/arch
	#${org_dir}/deps
	#${org_dir}/plugins/include
)
 
if (${UNIX_OS})
 
add_definitions(
  "-DUA_ARCHITECTURE_POSIX"
  )
  set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
 
link_directories()
# 指定生成目标
add_executable(opc_server_test ${source_h} ${source_cpp} )
#link
target_link_libraries(opc_server_test 
  -lpthread
  ${build_dir}/bin/libopen62541.a 
)
 
endif(${UNIX_OS})
 
if (${WIN_OS})

add_definitions(
  "-DUA_ARCHITECTURE_WIN32"
)
 
link_directories(
	"${build_dir}/bin"
)
 
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin)
# 指定生成目标
add_executable(opc_server_testd ${source_h} ${source_cpp} )

#link
target_link_libraries(opc_server_testd 
  ws2_32.lib wsock32.lib Iphlpapi.lib    #win下依赖的基础库
  ${build_dir}/bin/libopen62541.a #mingw
  #${build_dir}/bin/Debug/open62541d.lib  #vc
)

else(CMAKE_BUILD_TYPE)
 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin)
# 指定生成目标
add_executable(opc_server_test ${source_h} ${source_cpp})

#link
target_link_libraries(opc_server_test 
  ws2_32.lib wsock32.lib Iphlpapi.lib
  ${build_dir}/bin/libopen62541.a #mingw
  #${build_dir}/bin/Release/open62541.lib  #vc
  #D:\\workForOrgCode\\open62541\\build_vc\\bin\\Release\\open62541.lib  #vc
)

endif (CMAKE_BUILD_TYPE)

endif(${WIN_OS})

        编译 ,注意mingw和vc编译时,需要在CMakeLists.txt中调整一下配置路径      

#D:\workForOrgCode\open62541\demo\server_test
#工程配置在CMakeLists.txt
set(build_dir ${PROJECT_SOURCE_DIR}/../../build_mingw)
#set(build_dir ${PROJECT_SOURCE_DIR}/../../build_vc)
#link
${build_dir}/bin/libopen62541.a #mingw
#${build_dir}/bin/Release/open62541.lib  #vc

编译
cd build_mingw
cmake -G "MinGW Makefiles" ..
mingw32-make -j4 
#或cmake --build . --config release

#D:\workForOrgCode\open62541\demo\server_test
#工程配置在CMakeLists.txt
#set(build_dir ${PROJECT_SOURCE_DIR}/../../build_mingw)
set(build_dir ${PROJECT_SOURCE_DIR}/../../build_vc)
#link
#${build_dir}/bin/libopen62541.a #mingw
${build_dir}/bin/Release/open62541.lib  #vc

编译
cd build_vc
cmake -G "Visual Studio 12 2013" ..
cmake --build . --config release

        3.3 client端

        main.c,如果不想直接引用open62541.h,可独立引用关联文件,注意在CMakeLists.txt中配置这头文件所在的目录

#include <stdio.h>
//#include <open62541/client.h>
//#include <open62541/client_config_default.h>
//#include <open62541/client_highlevel.h>
#include "open62541.h"

int main(int argc, char *argv[])
{
    /* Create a client and connect */
    UA_Client *client = UA_Client_new();
    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
    UA_StatusCode status = UA_Client_connect(client, "opc.tcp://localhost:4840");
    if(status != UA_STATUSCODE_GOOD) {
        UA_Client_delete(client);
        return status;
    }

    /* Read the value attribute of the node. UA_Client_readValueAttribute is a
     * wrapper for the raw read service available as UA_Client_Service_read. */
    UA_Variant value; /* Variants can hold scalar values and arrays of any type */
    UA_Variant_init(&value);
    status = UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, "the.answer"), &value);
    if(status == UA_STATUSCODE_GOOD &&
       UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_INT32])) {
        printf("the value is: %i\n", *(UA_Int32*)value.data);
    }

    /* Clean up */
    UA_Variant_clear(&value);
    UA_Client_delete(client); /* Disconnects the client internally */
    return status;
}

        CMakeLists.txt

#在D:\workForOrgCode\open62541\demo\client_test目录下
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (opc_client_test)
#
if(WIN32)
    message(STATUS "windows compiling...")
    add_definitions(-D_PLATFORM_IS_WINDOWS_)
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
    set(WIN_OS true)
else(WIN32)
    message(STATUS "linux compiling...")
    add_definitions( -D_PLATFORM_IS_LINUX_)
    add_definitions("-Wno-invalid-source-encoding")
	  # add_definitions("-O2")
    set(UNIX_OS true)
    set(_DEBUG true)
    
endif(WIN32)

set(UA_IPV6 0)
set(org_dir ${PROJECT_SOURCE_DIR}/../..)
set(build_dir ${PROJECT_SOURCE_DIR}/../../build_mingw)
#set(build_dir ${PROJECT_SOURCE_DIR}/../../build_vc)
#set(build_dir ${PROJECT_SOURCE_DIR}/../../build_linux)
#
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
 
# 指定源文件的目录,并将名称保存到变量
SET(source_h
    #
	#${build_dir}/open62541.h
  )
  
SET(source_cpp
    #
	${PROJECT_SOURCE_DIR}/src/main.c
	${build_dir}/open62541.c
  )
  
#头文件目录
include_directories(
	${build_dir}
	#${org_dir}/include    #独立引用关联头文件需要配置各文件目录
	#${build_dir}/src_generated
	#${org_dir}/arch
	#${org_dir}/deps
	#${org_dir}/plugins/include
)
 
if (${UNIX_OS})
 
add_definitions(
  "-DUA_ARCHITECTURE_POSIX"
  )
  set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
 
link_directories()
# 指定生成目标
add_executable(opc_client_test${source_h} ${source_cpp} )
#link
target_link_libraries(opc_client_test
  -lpthread
  ${build_dir}/bin/libopen62541.a 
)
 
endif(${UNIX_OS})
 
if (${WIN_OS})

add_definitions(
  "-DUA_ARCHITECTURE_WIN32"
)
 
link_directories(
	"${build_dir}/bin"
)
 
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin)
# 指定生成目标
add_executable(opc_client_testd ${source_h} ${source_cpp} )

#link
target_link_libraries(opc_client_testd 
  ws2_32.lib wsock32.lib Iphlpapi.lib
  ${build_dir}/bin/libopen62541.a #mingw
  #${build_dir}/bin/Debug/open62541d.lib  #vc
)

else(CMAKE_BUILD_TYPE)
 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin)
# 指定生成目标
add_executable(opc_client_test ${source_h} ${source_cpp})

#link
target_link_libraries(opc_client_test 
  ws2_32.lib wsock32.lib Iphlpapi.lib
  ${build_dir}/bin/libopen62541.a #mingw
  #${build_dir}/bin/Release/open62541.lib  #vc
  #D:\\workForOrgCode\\open62541\\build_vc\\bin\\Release\\open62541.lib  #vc
)

endif (CMAKE_BUILD_TYPE)

endif(${WIN_OS})

        编译类似服务端。

       3.4 程序运行

        程序运行测试,先开启服务端,然后开启客户端,如下,客户端连接上服务端,取回一个数值并打印出来“the value is 42”,如果没有连接上,请检查端口是否被其他程序占用或防火墙隔离:

四、补充open62541库的linux编译

        4.1 cmake版本升级

        本文ubuntu16-64bit环境,先升级cmake工具(原来是3.5.2版本的)

#D:\workForOrgCode\open62541
mkdir cmake_new_version
cd cmake_new_version
#cmake 源码ftp网站https://cmake.org/files/ 下载需要的版本
wget https://cmake.org/files/v3.24/cmake-3.24.2.tar.gz
tar -zxvf cmake-3.24.2.tar.gz 
cd cmake-3.24.2
#apt-get install libssl-dev #OPENSSL依赖 或./configure -DCMAKE_USE_OPENSSL=OFF
./configure
make -j4
#root 用户下
make install
update-alternatives --install /usr/bin/cmake cmake /usr/local/bin/cmake 1 --force
cmake --version

        4.2 python3支持

        再安装python3支持

#root 用户下
apt-get install python python3 python-pip python3-pip
whereis python3
#例如/usr/bin/python3

        4.3 open62541源码编译

        编译过程大致如下:

#确保cmake > 3.15版本,确保安装了python3支持,确保安装了gcc
#进入open62541目录
mkdir build_linux
cd build_linux
cmake .. -DUA_ENABLE_AMALGAMATION=ON -DUA_MULTITHREADING=100 -DPython3_EXECUTABLE="/usr/bin/python3" 
make -j4
#open62541.c:68808:43: error: comparison is always false due to limited range of data type [-Werror=type-limits] if(i < T##_MIN || (i > 0 && (t)i >= T##_MAX))
#修改为:if(i < T##_MIN || (i > 0 && (t)i >= T##_MAX)) ,再次编译
make -j4

        编译结果输出如下:

         案例编译与win类似。

#先调整CMakeLists.txt
#set(build_dir ${PROJECT_SOURCE_DIR}/../../build_mingw)
#set(build_dir ${PROJECT_SOURCE_DIR}/../../build_vc)
set(build_dir ${PROJECT_SOURCE_DIR}/../../build_linux)

#进入open62541目录
cd demo/server_test
mkdir build_linux
cd build_linux
cmake .. -DUA_ENABLE_AMALGAMATION=ON
make -j4

#client端类似

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

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

相关文章

带货主播薪酬大降30%,洗牌潮来袭,直播带货红利是否会消退

近年来&#xff0c;随着直播带货市场的迅猛发展&#xff0c;各种直播平台如同春天的雨后蘑菇一般层出不穷。尤其是那些顶尖主播们&#xff0c;凭借着超强的吸金能力和惊人的收入&#xff0c;吸引了无数人的目光。 然而就在今年&#xff0c;这些主播们的薪酬出现了大幅下滑&…

基于springboot基于Java的超市进销存系统

开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的springboot框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个超市进销存系统。 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring4.…

腾讯云轻量应用服务器使用限制(买前必看)

腾讯云轻量应用服务器和云服务器CVM相比具有一些限制&#xff0c;比如轻量服务器不支持更换内网IP地址&#xff0c;轻量服务器只能套餐整体升级且不支持降配&#xff0c;轻量不支持用户自定义配置私有网络VPC&#xff0c;还有如实例配额、云硬盘配额、备案限制和内网连通性等限…

【OpenCV-Python】——哈里斯/Shi-Tomas角检测FAST/SIFT/ORB特征点检测暴力/FLANN匹配器对象查找

目录 前言&#xff1a; 1、角检测 1.1 哈里斯角检测 1.2 优化哈里斯角 1.3 Shi-Tomasi角检测 2、特征点检测 2.1 FAST特征点检测 2.2 SIFT特征检测 2.3 ORB特征检测 3、特征匹配 3.1 暴力匹配器 3.2 FLANN匹配器 4、对象查找 总结&#xff1a; 前言&#xff1a; 图…

【实战】MySQL百万数据优化

业务场景 一般在项目开发中会有很多的统计数据需要进行上报分析&#xff0c;一般在分析过后会在后台展示出来给运营和产品进行「分页查看」&#xff0c;「最常见的一种就是根据日期进行筛选」。这种统计数据随着时间的推移数据量会慢慢的变大&#xff0c;达到百万、千万条数据只…

即时通讯APP开发费用成本多少?

移动互联网的发展&#xff0c;为人们的通讯交流提供了非常多的便利&#xff0c;一些即时通讯APP的出现&#xff0c;将人与人的距离再一次缩短。通过即时通讯APP软件&#xff0c;人们可以随时随地了解身边发生的新鲜事物&#xff0c;以及和朋友探讨各类趣事&#xff0c;甚至可以…

Kubernetes高可用集群

Kubernetes高可用集群 0、服务器信息 服务器为腾讯云服务器&#xff08;按需计费&#xff0c;按流量计费&#xff0c;并且将IP转换为弹性IP&#xff0c;使用结束可关机仅收取硬盘等固定资源费用&#xff09; 服务器名称IP描述Kuernetes-149.235.103.143master1Kuernetes-249…

黑熊“光临”美国小学,校长惊慌失措,转身就跑

最近&#xff0c;一则有趣的视频在网络上传播。一个平凡的清晨&#xff0c;美国西维吉尼亚州尼古拉斯县的萨拉小学校长马什遭遇了一次前所未有的惊险经历。 这位校长本想打开垃圾桶&#xff0c;却突然发现一头黑熊钻出了垃圾桶&#xff0c;这让他吓得跑得飞快。与此同时&#…

K8S通过Ansible安装集群

K8S通过Ansible安装集群 K8S集群安装可参考https://gitee.com/open-hand/kubeadm-ha.git、https://github.com/easzlab/kubeasz.git 安装高可用集群 git clone https://gitee.com/open-hand/kubeadm-ha.git && cd kubeadm-ha升级内核,非必需&#xff0c;默认不升级&…

二叉树原理

二叉树原理TOC 二叉树是公认的难解型数据结构&#xff0c;这里试着系统化的讨论一些与二叉树有关的内容&#xff1a; 二叉树的数据标记方法&#xff1a;层次数据&#xff08;int t[N];&#xff09;,左右树标记&#xff08;bool lr:0standForL, 1standForR&#xff09;&#xf…

算法之路--冒泡排序算法

写在前面 很早就想系统梳理所接触的所有算法&#xff0c;但是只是存在于一个想法阶段&#xff0c;懒惰使人遗忘不是么。作为一个软件开发人员&#xff0c;绕不开算法与数据结构&#xff0c;既然绕不开&#xff0c;何不逐一分析学习透彻&#xff0c;与君共勉之。 冒泡排序算法&a…

单片机c51中断 — 中断嵌套实例IE0的置位和撤销

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章&#xff0c;中断 根据下原理图&#xff0c;编程验证二级外部中断嵌套效果。其中K0定为低优先级中断源&#xff0c;K1为高优先级中断源。此外&#xff0c;利用发光二极管D1验证外部中断请求标志IE0在脉…

Minio(minio-20221029062133.0.0.x86_64.rpm) Linux 环境安装

Minio Linux 环境安装 资源下载 镜像下载地址&#xff1a;http://dltest.minio.org.cn/server/minio/release/linux-amd64/archive/ 资源包下载地址&#xff08;与献文匹配&#xff09;&#xff1a;https://download.csdn.net/download/scdncby/87769604 安装 上传rpm安装…

React+Antd+Vite+TypeScript 项目实战教程

本教程属于react入门教程&#xff0c;课程围绕如何搭建一个项目框架展开&#xff0c;会带你快速了解react、redux、redux-devtool、react-router-dom、axiox这些常见技术的使用方式&#xff0c;教程最后会附上项目源码。 一、创建项目 在搭建项目时&#xff0c;我们通常会使用…

day38_JDBC

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、数据库连接池 二、反射 三、封装DBUtil 零、 复习昨日 SQL注入 预处理语句 String sql "select * from user where id ?"; PreparedStat…

Spring Boot访问数据库

SpringBoot访问数据库时&#xff0c;我们可以使用以下三种&#xff0c;JdbcTemplate、Spring Boot Data Jpa、mybatis。 JdbcTemplate是Spring自己提供的&#xff0c;但是其操作不方便&#xff0c;甚至有些繁琐&#xff0c;在实际应用中也是很少会使用&#xff0c;所以这里就不…

使用MobaXterm在Windows系统远程Ubuntu系统

使用场景 通常大部分办公软件都安装在Windows系统上&#xff0c;使用Windows系统办公更便捷&#xff0c;并且大多办公软件在Ubuntu系统上不兼容&#xff0c;即使进行处理&#xff0c;使用体验也不好&#xff0c;下面针对在同一局域网使用Windows远程Ubnuntu进行ssh、VNC和打开…

Nature -- 空间表观组学与转录组学联合分析,揭示基因表达的精准调控

为充分理解组织中单细胞的基因表达调控&#xff0c;需要在单细胞水平以空间分辨率的方式集成不同分子信息的不同层面&#xff0c;包括表观基因组和转录组数据。虽然单细胞多组学方法可以捕捉来自不同分子层的信息&#xff0c;但是空间组学方法到目前为止主要局限于一层分子。张…

MATLAB的无人机遥感数据预处理与农林植被性状估算实践

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…

ASP.NET core WebApi Cors跨域解决

前言 我用了最新版的Asp.net webapi &#xff0c;在csdn上面搜跨域如何解决的时候&#xff0c;发现csdn上面对于.NET技术讨论不是很多。没办法&#xff0c;只能面向官方文档和GitHub编程了。 项目类型确认 NuGet包引入 前面两个已经放弃维护了&#xff0c;我们就不用了。用最…