`

Spring4+WebSocket小示例

阅读更多
一、简介
    WebSocket协议为web应用程序定义了一种全新的重要能力:在客户端和服务器端之间可以进行全双工的双向通信。简短来说,Websocket协议是先用http做初始化的握手,之后利用http向服务器发送一个协议升级(或者协议变化)的请求,如果服务器同意会返回一个101的状态码。如果这个握手成功,http请求升级后对应的底层的tcp socket会一直保持着打开状态,服务端和客户端就都可以利用它来发送消息。
二、后备选项
  做WebSocket应用的一个重要挑战就是要考虑不支持WebSocket的浏览器,如IE从IE10开始才支持(具体的浏览器支持情况可以查看http://caniuse.com/websockets)。后备选项指的就是当需要时能够通过其他方式来模拟Websocket API从而在不支持Websocket的浏览器中利用Websocket的功能。
  Spring FrameWork基于SockJs protocal对此提供的透明的支持,可以通过配置而不用修改应用程序代码。SockJs的具体内容可以参考https://github.com/sockjs/sockjs-protocol
三、Websocket中的子协议
  Websocket定义了消息的架构,但是没有规定具体的协议。而直接用TPCP把字节流转换成消息流是极其笨重的,而且不像应用层协议的HTTP,对于一个到来的信息,在WebSocket协议中是没有足够的信息来使framework或者容器知道如何去路由它,以及如何处理它。因此Websocket对于应用程序而言太低层太琐碎,就像现在大多数web应用都会采用一种web 框架,而不是直接用servlet api。
  基于这个原因,Websocket RFC定义了子协议。在握手过程中,服务端和客户端可以利用请求头中的 Sec-WebSocket-Protocol来协定一个高层次的应用级别的子协议。虽然子协议不是必须的,但是即便不用,你的应用程序也需要定义一种客户端和服务端都能识别的消息格式。
  在Spring Framework中提供了STOMP-一种简单的面向文本的消息协议。虽然STOMP是面向文本的,但是消息内容不仅仅局限于文本,也可以是二进制类型。STOMP的具体内容可以参考http://stomp.github.io/stomp-specification-1.2.html
四、什么时候要用Websocket
  web应用中最适合采用Websocket的是服务端和客户端以高频率低延时交换信息的场合。例如金融、股票、游戏等,这些都是对延时非常敏感,而且交换信息的频率很高的行业。
五、示例
本示例没有用maven,采用xml的配置形式
1.web.xml
和普通的spring mvc没有区别,作用
a.定义了一个servlet拦截器,以及Mapping规则
b.引入spring-context配置文件
c.添加log4j配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>SpringTest</display-name>
    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/resources/log4j/log4j.properties</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- Disables Servlet Container welcome file handling. Needed for compatibility 
        with Servlet 3.0 and Tomcat 7.0 -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

2.DispatcherServlet Context配置文件,作用
a.激活注解配置功能
b.配置资源文件路径
c.配置视图层技术
d.引入具体组件配置文档
e.配置websocket相关内容
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/websocket
		http://www.springframework.org/schema/websocket/spring-websocket.xsd
		">

	<!-- DispatcherServlet Context: defines this servlet's request-processing 
		infrastructure -->

	<!-- Enables the Spring MVC @Controller programming model -->
	<mvc:annotation-driven/>

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
		up static resources in the ${webappRoot}/resources/ directory -->
	<mvc:resources mapping="/resources/**" location="/resources/" />
	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
		in the /WEB-INF/views directory -->
<!-- 	<bean -->
<!-- 		class="org.springframework.web.servlet.view.InternalResourceViewResolver"> -->
<!-- 		<property name="prefix" value="/WEB-INF/views/" /> -->
<!-- 		<property name="suffix" value=".jsp" /> -->
<!-- 	</bean> -->
	<bean id="templateResolver"
		class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".html" />
		<!-- Template cache is true by default. Set to false if you want -->
		<!-- templates to be automatically updated when modified. -->
		<property name="cacheable" value="false" />
	</bean>
	<!-- SpringTemplateEngine automatically applies SpringStandardDialect and -->
	<!-- enables Spring's own MessageSource message resolution mechanisms. -->
	<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
		<property name="templateResolver" ref="templateResolver" />
	</bean>
	
	<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
        <property name="templateEngine" ref="templateEngine" />
    </bean>
	
	<!-- Imports user-defined @Controller beans that process client requests -->
	<import resource="controllers.xml" />
	<!-- Enable STOMP over WebSocket -->
	<websocket:message-broker application-destination-prefix="/app">
		<websocket:stomp-endpoint path="/websocket">
			<websocket:sockjs />
		</websocket:stomp-endpoint>
		<websocket:simple-broker prefix="/topic, /queue" />
	</websocket:message-broker>
</beans>


关键点:
a.头部引入了「xmlns:websocket=“http://www.springframework.org/schema/websocket”」,websocket对应的命名空间
b.「<websocket:message-broker application-destination-prefix=“/app”>」标明以app开头的请求将被认为是websocket请求
c.「<websocket:stomp-endpoint path=“/websocket”>」注册一个websocket的endpoint,并采用stomp作为子协议,这个endpoint会在websocket handshake时用到(js中初始化websocket)
d.「<websocket:sockjs />」表示启用sockjs备用选项,以便在不支持websocket的浏览器端正常模拟出websocket的效果
e.「<websocket:simple-broker prefix="/topic, /queue" />」标明broker采用SimpleBroker,并定义broker请求对应的地址是topic和queue
3.组件配置文档,主要作用
a.配置默认页面路径
b.配置组件扫描路径
具体文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- Maps '/' requests to the 'home' view -->
    <mvc:view-controller path="/" view-name="views/index.html"/>
    
    <context:component-scan base-package="test.spring.socket"/>
     
</beans>

4.代码
a.controller 接受用户请求,包括http请求和websocket请求
package test.spring.socket;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import test.spring.socket.service.GreetingService;

@Controller
public class GreetingController {

	private static final Log logger = LogFactory.getLog(GreetingController.class);

	@Autowired
	private GreetingService service;

	@MessageMapping("/hello")
	@SendTo("/topic/greetings")
	public Greeting greeting(HelloMessage message) throws Exception {
		service.greeting();
		return new Greeting("Hello, " + message.getName() + "!");
	}

	@RequestMapping("/index")
	public String hello() {
		logger.info("start to maping request hell");
		return "socket/index";
	}

}


b.service 模拟逻辑处理,处理完成后发送消息给broker
/**
 * 
 */
package test.spring.socket.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;

import test.spring.socket.Greeting;

/**
 * @author dwxx-chengaofeng
 *
 */
@Service
public class GreetingService {
	@Autowired
	private SimpMessagingTemplate template;

	public void greeting() throws InterruptedException {
		for (int i = 0; i < 10; i++) {
			Thread.sleep(1000); // simulated delay
			template.convertAndSend("/topic/greetings", new Greeting("the number is" + i));
		}
	}
}


c.html代码
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello WebSocket</title>
    <link th:href="@{/resources/socket/css/main.css}" rel="stylesheet">
    <script type="text/javascript" th:src="@{/resources/js/jquery-2.0.3.js}"></script>
    <script type="text/javascript" th:src="@{/resources/socket/js/sockjs.js}"></script>
    <script type="text/javascript" th:src="@{/resources/socket/js/stomp.js}"></script>
    <script type="text/javascript" th:src="@{/resources/socket/js/app.js}"></script>
</head>
<body>
<noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websocket relies on Javascript being
    enabled. Please enable
    Javascript and reload this page!</h2></noscript>
<div id="main-content" class="container">
    <div class="row">
        <div class="col-md-6">
            <form class="form-inline">
                <div class="form-group">
                    <label for="connect">WebSocket connection:</label>
                    <button id="connect" class="btn btn-default" type="submit">Connect</button>
                    <button id="disconnect" class="btn btn-default" type="submit" disabled="disabled">Disconnect
                    </button>
                </div>
            </form>
        </div>
        <div class="col-md-6">
            <form class="form-inline">
                <div class="form-group">
                    <label for="name">What is your name?</label>
                    <input type="text" id="name" class="form-control" placeholder="Your name here...">
                </div>
                <button id="send" class="btn btn-default" type="submit">Send</button>
            </form>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <table id="conversation" class="table table-striped">
                <thead>
                <tr>
                    <th>Greetings</th>
                </tr>
                </thead>
                <tbody id="greetings">
                </tbody>
            </table>
        </div>
    </div>
    </form>
</div>
</body>
</html>

d.js代码
var stompClient = null;

function setConnected(connected) {
    $("#connect").prop("disabled", connected);
    $("#disconnect").prop("disabled", !connected);
    if (connected) {
        $("#conversation").show();
    }
    else {
        $("#conversation").hide();
    }
    $("#greetings").html("");
}

function connect() {
    var socket = new SockJS('/SpringWebsocket/websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

function disconnect() {
    if (stompClient != null) {
        stompClient.disconnect();
    }
    setConnected(false);
    console.log("Disconnected");
}

function sendName() {
    stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}

function showGreeting(message) {
    $("#greetings").append("<tr><td>" + message + "</td></tr>");
}

$(function () {
    $("form").on('submit', function (e) {
        e.preventDefault();
    });
    $( "#connect" ).click(function() { connect(); });
    $( "#disconnect" ).click(function() { disconnect(); });
    $( "#send" ).click(function() { sendName(); });
});


关键点
a.「var socket = new SockJS(‘/SpringWebsocket/websocket’);」初始化一个SockJs对象,其中SpringWebsocket是自己的工程名,websocket是在Servlet-context.xml中配置的websocket的endpoint
b.「stompClient.send("/app/hello", {}, JSON.stringify({'name': $(“#name”).val()}));」发送消息到websocket,对应的方法是controller中的@MessageMapping(“/hello”)注解方法,注意多了个app前缀,是在Servlet-context.xml中配置的application-destination-prefix
c.「stompClient.subscribe(‘/topic/greetings’, function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });」表示从broker中订阅/topic/greetings,当有消息发送到/topic/greetings时,客户端就可以收到通知,并获取消息的内容。
最终的工程目录:



工程的具体代码请参考附件
  • 大小: 28.7 KB
分享到:
评论

相关推荐

    Gowin-master.国产高云FPGA 开发板及其工程

    描述:Gowin(高云)是国产FPGA里做的比较好的几家之一(安路、紫光、高云、复旦微等)。由于开发板和实际项目较少,此处按开发板对工程项目进行分类。 其他:大部分工程均有从Cyclone IV仓库移植的影子,如有其他项目需求移步Cyclone IV的仓库。 主要目录: Pocket_lab_F0: 基于高云GW1N-LV9的一款FPGA开发板,易思达和高云大学计划出品 Pocket_lab_F2: 基于高云GW2A-LV18的一款FPGA开发板,易思达和高云大学计划出品 Tang Mega 138K:基于 GW5AST-LV138 的一款FPGA开发板,Sipeed出品,曾用于 2023 年全国大学生 FPGA 大赛高云赛区 Tang Primer 20K:基于 GW2A-LV18 的一款FPGA开发板,Sipeed出品,曾用于 2022-2023 年全国大学生 FPGA 大赛高云赛区 Tang Nano 20K: 基于GW2A-LV18的一款FPGA开发板,Sipeed出品 Tang Nano 9K:基于 GW1NR-LV9 的一款 FPGA 开发板,Sipeed出

    TensorFlow Python版环境安装指南:从底层环境到anaconda配置的详细步骤,使用Mask R-CNN源码实现多张连续输出,兼容项目迁移至TensorFlow.js的技巧 ,Tenso

    TensorFlow Python版环境安装指南:从底层环境到anaconda配置的详细步骤,使用Mask R-CNN源码实现多张连续输出,兼容项目迁移至TensorFlow.js的技巧。,TensorFlow.Python版底层环境安装指南及Anaconda环境快速配置说明:涵盖Mask R-CNN源码实现及多图输出功能的训练项目搭建教程(附以往程序回溯及新版tensorflowjs的应用介绍),tensotflow.python版本底层环境安装命令。 程序都写好复制就可以安装anacoda环境。 maskrcnn源码可以连续输出多张。 以及可以跑通项目,现在用tensorflowjs了。 这个是之前跑通的主程序很多忘记了。 源程了 ,tensorflow_python_安装命令; anaconda环境安装; maskrcnn_源码; 连续输出多张; tensorflowjs; 主程序跑通。,TensorFlow环境安装指南:Python版anaconda环境配置命令及MaskRCNN源码使用教程

    如何基于大模型(DeepSeek)实现一个多智能体的对话系统的,python脚本

    如何基于大模型(DeepSeek)实现一个多智能体的对话系统的,python脚本

    新版 PFMEA 培训课件(126页,内容丰富清晰)

    AIAG(汽车工业行动小组)与VDA(德国汽车工业联合会)联合发布的FMEA(潜在失效模式及后果分析)标准,已成为全球汽车制造商和供应商的权威指南。本课程专注于过程FMEA(PFMEA),旨在帮助您深入理解其核心理念、方法与实践应用,掌握如何通过PFMEA识别设计缺陷、预防潜在问题,从而提升产品设计质量,降低开发成本,增强市场竞争力。 讲解新版FMEA七步法:1.策划与准备;2.结构分析;3.功能分析;4.失效分析;5.风险分析;6.优化;7.结果文件化。

    北京邮电大学实验报告模板带封面的非官方.zip

    实验报告

    matlab下载,欢迎下载使用

    matlab下载

    21考试真题最近的t319.txt

    21考试真题最近的t319.txt

    基于Java Swing 写的学生成绩管理系统(毕设&课设&实训&大作业&竞赛&项目)

    基于Java Swing 写的学生成绩管理系统 有数据库文件,用了仿苹果化的皮肤界面.zip项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    21考试真题最近的t284.txt

    21考试真题最近的t284.txt

    基于Layui+SSM框架的宿舍管理系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    关于操作系统的四次大作业,两次编译原理的实验和高级算法大作业.zip(课设&实训&大作业&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    多维度基因表达与关联性分析:WGCNA、共表达网络、表型关联与聚类模块解析,基于生物信息学技术的基因网络与模块综合分析,WGCNA分析 基因共表达网络分析 基因表型关联分析 基因聚类分析 基因模块分析

    多维度基因表达与关联性分析:WGCNA、共表达网络、表型关联与聚类模块解析,基于生物信息学技术的基因网络与模块综合分析,WGCNA分析 基因共表达网络分析 基因表型关联分析 基因聚类分析 基因模块分析 ,WGCNA分析; 基因共表达网络分析; 基因表型关联分析; 基因聚类分析; 基因模块分析,基因网络与模块分析综合研究

    1a89e6f5b1485b055ed7f0aeccd7b9f9.docx

    1a89e6f5b1485b055ed7f0aeccd7b9f9.docx

    GDUT 编译原理课程的课内实验和课程设计含报告.zip

    实验报告

    Matlab Simulink模型:三机九节点系统中双馈风机虚拟惯性与下垂控制在频率二次跌落中的应用与对比,Matlab Simulink模型:三机九节点系统下的风机虚拟惯性与下垂控制参与一次调频及频

    Matlab Simulink模型:三机九节点系统中双馈风机虚拟惯性与下垂控制在频率二次跌落中的应用与对比,Matlab Simulink模型:三机九节点系统下的风机虚拟惯性与下垂控制参与一次调频及频率二次跌落对比研究,Matlab simulink 频率二次跌落,双馈风机惯性控制+下垂控制参与系统一次调频的Matlab Simulink模型,调频结束后转速回复,造成频率二次跌落 系统为三机九节点模型,所有参数已调好且可调,可直接运行,风电渗透率20% 风机采用惯性+下垂控制。 有文档,可讲解。 对比不同恢复时间下二次跌落。 ,核心关键词: Matlab Simulink; 频率二次跌落; 双馈风机; 虚拟惯性控制; 下垂控制; 系统一次调频; 转速恢复; 三机九节点模型; 风电渗透率; 恢复时间; 对比。,Matlab Simulink模型中双馈风机虚拟惯性控制与下垂控制对频率二次跌落的影响研究

    2010-2022年国家农业龙头企业.xlsx

    国家农业龙头企业数量主要指的是经过国家相关部门认定,并在农业产业化方面发挥重要引领作用的企业的总数。这些企业通常以农产品加工或流通为主业,通过各种利益联结机制与农户相联系,带动农户进入市场,实现农产品生产、加工、销售的有机结合和相互促进。 数据名称:国家农业龙头企业数量 数据年份:2010-2022年 ## 02、相关数据 省份、年份、龙头企业数量。

    基于5G指纹的智能室内定位技术研究-王志坤.pdf

    基于5G指纹的智能室内定位技术研究_王志坤.pdf

    基于Structs+Hibernate+Spring+mahout+bootstrap+junit+tomacat+mysql 实现的网上书店前后台系统(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    基于扩展卡尔曼滤波的车辆状态观测器:Carsim与Simulink联合应用,高效估计车辆Vx、β、γ状态,附详细注释与说明文档,基于扩展卡尔曼滤波的Carsim与Simulink联合车辆状态观测器 利

    基于扩展卡尔曼滤波的车辆状态观测器:Carsim与Simulink联合应用,高效估计车辆Vx、β、γ状态,附详细注释与说明文档,基于扩展卡尔曼滤波的Carsim与Simulink联合车辆状态观测器 利用子函数编程,可估计Vx、β、γ状态,附低版本simulink文件及详细注释文档。,基于扩展卡尔曼滤波(Extended Kalmam Filter, EKF)的车辆状态观测器 Carsim与Simulink联合 可估计车辆Vx,β,γ(效果见图) EKF使用子函数形式编程,只要定义好状态方程和观测方程,便可方便的进行二次开发 Carsim2019 MATLAB2020a 可提供对应的低版本simulink文件 带有详细注释和说明文档 Carsim与Simulink联合估计难度与单纯的Simulink模型估计难度不同 ,基于扩展卡尔曼滤波;车辆状态观测器;Carsim与Simulink联合;Vx,β,γ估计;低版本simulink文件;详细注释和说明文档。,基于EKF的车辆状态观测器:Carsim与Simulink联合仿真及效果展示

    21考试真题最近的t394.txt

    lstm21考试真题最近的t394.txt

Global site tag (gtag.js) - Google Analytics