精华内容
下载资源
问答
  • 这事一个java嵌入式系统的讲座,相信大家对java的嵌入式前景都有了解,学吧。
  • Java ME嵌入式程序设计

    2015-07-16 09:37:38
    Java ME嵌入式程序设计
  • 主要为大家详细介绍了Java嵌入式MySQL的使用方法,Java中如何使用嵌入MySQL,感兴趣的小伙伴们可以参考一下
  • 本文主要介绍了JAVA嵌入式系统中的应用
  • 1995年后全球爆发的互联网络信息革命为Java带来机会,Java成为众多编程语言编程技术中的黑马,迅速成为全球各大IT厂商应用开发平台的新贵,不仅一跃成为桌面应用(J2SE)平台,更在很短的时间内成为企业级应用...
  • Java嵌入式开发.rarJava嵌入式开发.chmJava嵌入式开发.chmJava嵌入式开发.chmJava嵌入式开发.chmJava嵌入式开发.chmJava嵌入式开发.chmJava嵌入式开发.chm
  • java移植嵌入式平台

    2011-07-01 17:47:36
    java移植介绍,嵌入式平台开发,开发过程详细的论文
  • Java嵌入式开发

    2007-10-14 16:44:34
    Java嵌入式开发 Java嵌入式开发
  • java嵌入式开发

    2007-07-14 21:38:35
    java嵌入式开发java嵌入式开发
  • Java嵌入式系统优点局限.docJava嵌入式系统优点局限.docJava嵌入式系统优点局限.docJava嵌入式系统优点局限.docJava嵌入式系统优点局限.docJava嵌入式系统优点局限.docJava嵌入式系统优点局限.doc
  • JAVA嵌入式

    千次阅读 2010-03-28 16:06:00
    看来,用Java开发上的网的嵌入式应用应是很理想的,可惜,实现起来受嵌入式设备硬件在速度、存储器容量、其它资源的限制,加上桌面Java语言操作不到硬件,执行时间的不确定性,使Java应用于嵌入式系统遇到新的...

    Java是在C++基础上改进了的面向对象的语言。它可以得到类的封装、继承、多态等的优异重用性的好处,Java的小应用程序(Java Applet)还特别适合于上网。看来,用Java开发上的网的嵌入式应用应是很理想的,可惜,实现起来受嵌入式设备硬件在速度、存储器容量、和其它资源的限制,加上桌面Java语言操作不到硬件,和执行时间的不确定性,使Java应用于嵌入式系统遇到新的问题。Sun公司按PersonalJava规范开发的J2ME(Java 2 Micro Edition),是专用研制用于开发嵌入式的上网个人消费类设备的。因此J2ME除有面向对象的优点外,还包含了Web能力。J2ME使用的是Java API的一个子集,它仅保留了API的关键特性并适当地作了简化。同时,又规定了两种可有存储模式:一个模式的内存为128~256KB,另一种模式是256KB以上的。其他,如类包也根据存储模式选用。

    下面为避免混淆,在文中凡未加特殊说明的Java,统指桌面Java而言。

    一、 问题提出

    *常用的解释性Java(Java Applet)的执行速度慢,不适于嵌入式的应用。

    *Java要求过大的内存。

    *嵌入式设备要求操作硬件。因Java废弃了C语言所使用的指针,且在Web环境下使用了Java虚拟机(JVM),使Java无力直接甚至间接地用指针操作硬件。

    *Java使用一些自动功能会引起执行时间的不确定性,成为嵌入式的大忌。如垃圾自动收集器。本是对于C的重大改进,但却因程序自动地回收垃圾,从而引入了实时的时间不确定性。

    二、解决方案

    使用AOT编译器

    为解决解释性Java(Java Applet)执行速度过慢的问题,发展了AOT(ahead-of-time)编译器。大家喜欢在Internet上使用Java的一个原因是其字节码具有跨平台性,即同一Java代码可以运行于PC、Mac、Solaris,甚至于主机之上。为此,在英文叫它WORA(写一次即可通行于任意机)。这是因为每一操作系统平台上都有符合自己机型的专用Java虚拟机(JVM),由它对字节码进行解释运行。因为解释程序需先被解释再被执行,多了解释环节,延误数秒钟时间。如果是拨打电话,这个时间足以令人生厌。现在使用AOT(ahead-of-time)超前编译器,提前将解释码转换为本平台所用的并经优化过的二进制码,速度提高很多。现有Cygnus公司声称,它开发的AOT编译器执行速度是原解释程序的8倍。NewMonics说它的QuickPERC编译器是原解释程序的20倍。当然,AOT编译器也有不足,就是他牺牲了Java的WORA。

    减少内存的占用

    所有的面向对象语言,比C及汇编语言点用内存都多。这个问题对于桌面系统早已不再是考虑的因素了,如服务器平均占用数GB的内存已司空见惯。但是,对于嵌入式系统却不能不考虑。用Java开发的信息家电产品可能需要把内存限制到512KB以下。如果嵌入式系统使用的是规模为1MB的核心类库,那就是说,一句代码尚未写,内存早就不够用了。

    为此,需要把用不到的类、类方法和代统统从程序中剔除。(AOT超前编译器可以帮助解决这个问题。)再就是自己开发本平台专用的,既短小高效、又符合Java API标准的Java核心类库。

    开发能混合编程的IDE

    一般认为,用C语言写的程序,指锗使用不当引起的缺陷占总缺陷的80%左右。Java语言,出于安全的考虑,才废弃了使用指针。但是,指针却能够最直接地访问到存储器和真实的硬件。现在,为在嵌入式Java中能够访问到硬件,不得不改用本地接口,即从嵌入式Java中利用能够访问到硬件的C语言函数来实行交叉编程。这就意味着增加了复杂性。开发人员需要具备多语言以及多层次的混合编程和混合调试的能力。发展多语言多层次混合编程的IDE,无疑十分有助于一般开发人员完成这一相当复杂的课题。Metrowerks的CodeWorrior和IBM的VisualAge就是新开发的基于J2ME的这样的IDE。

    克服时间的不确定性

    Java最主要的问题是时间不确定性,主要来源于存储器残渣的自动收集再生器。这种垃圾收集再生器工作的时候,自动地决定何时停下其他程序的执行,再根据当时残渣的实际情况或长或短地完成任务。所以,它严重地干扰实时应用所要求的时间确定性。为解决这一问题,不同公司采用不同的方法和垃圾收集的算法。NewMonics的Real Time Executives和Windriver的FastJ都是保证绝对的确定时间,Sun公司用不同的办法但也保证具有实时的确定性。采用不同的编程技巧,譬如使用类型确定的线程局部存储,也可以避免因垃圾收集引发的冲突。

    需保持跨平台的必要

    AOT编译器生成的Java代码丧失了Java在其他操作平台上的执行能力。要想把Java的源代码再向其他平台移植,需要附加很大的劳动。面向对象的一个基本设计原理就是只要保持接品不变,那么,与接口交谈的代码在移植时就不受影响。所谓高级逻辑接口的隔离手法,事实上,就是将平台敏感的内容同移值无关的代码分离开来,并且分别提供同样功能的平台敏感程序。现在,针对嵌入式Java,目前还没有人做这项工作。

    三、实际应用

    Java是良好的嵌入式编程语言吗?

    还不能这么说,至少现在是这样。因为在嵌入式系统中,Java如何应用要看具体情况而定。对于需要管理中断来完成重要任务的应用系统,就不宜于选用Java进行开 发,譬如引导登外星的飞行器系统就是这样。对于要求轻型、高效、任务重要、时间确定性要求极高的系统,也是只能局限于使用C语言和汇编。比如,点燃登陆外星的制动火箭系统,定时通过串行口获取关键信息一边做出决定的系统,定时报告航天器方位的系统等都不能使用Java。但是,需要不断与他人通信联系,以便对货运进行有效管理的手持系统,又最适合使用Java编程。因为,它既发扬了Java Applet固有的跨平台应用地Web环境的特点,又能充分利用服务器端的现成软件。

    使用Java有时也并不完全取决于技术

    立足于经济上的考虑,比单独的技术考虑更为重要。譬如,对于服务器,为了支持使用Java,宁愿多花费数千元扩大存储器是正确的。因为,从投入/产出的分析也得出同样的结论。又如手机,若为支持使用Java,哪性仅只需要多花一元钱去扩大存储器也是不可行的。因为,手机的生产是以行百万件的产量来考虑的,多花一元线,就意味着多花千百万元,诺大的数字远比技术的先进更为重要,是显而易见的。

    实施嵌入式Java时需注意

    Java用于嵌入式还是瓣生事物,需要探路前进,摸着石头过河,忌冒进和全面开花。应试探性地从使用现成的嵌入式J2ME开始,在它的通用性的开发环境下运行本平台的字节码。尽可能地顺着J2MME向前走,尽可能地顺着J2ME向前走,尽可能地走得远一点,只有在遇到特殊问题时才导求新的解决办法。新方法的采用并不一定能够解决问题,比如,AOT或半自动的垃圾收集器等可能并没有解决你的问题,也勿惊慌,要总结经验做出评价,继续前进,使嵌入式Java日罄完善。

    要重视IDE的选用,好的IDE绝对是良好的助手。否则,你是单枪匹马,披荆斩棘,艰苦良多。

    展开全文
  • Java嵌入式浏览器

    2013-11-06 14:11:30
    Java嵌入式浏览器,自己开发浏览器,类似360页面风格
  • Java 嵌入式

    2011-07-06 18:06:18
    Java 嵌入式
  • Java嵌入式系统

    千次阅读 2010-01-30 13:47:00
    Java嵌入式系统 杜荣华  应用与开发 如果有人问Java是否可以成为理想的嵌入式设备程序设计语言,正确的答案应该是:具体情况具体分析。对此,本文将提供有益的参考。 Java程序设计语言最初是针对机顶盒应用而...
    Java与嵌入式系统

    杜荣华 

    应用与开发

    如果有人问Java是否可以成为理想的嵌入式设备程序设计语言,正确的答案应该是:具体情况具体分析。对此,本文将提供有益的参考。

    Java程序设计语言最初是针对机顶盒应用而设计的,它可使家庭与WWW连为一体。而今,开发商们又希望把Java作为一种针对嵌入式系统的程序设计语言, 令其以新的方式进入家庭。

    然而, 与最初针对机顶盒的应用开发相比, 针对嵌入式系统的家庭应用开发要复杂得多。人们不得不面对许多新的设备与新的技术,同时也遇到种种限制,例如运行速度、内存配置、外形尺寸以及与时间相关 的技术问题。Java具有面向对象的特性、内在的Internet集成并因此而获得了大批拥有雄厚技术实力的开发商,可以帮助人们顺利完成嵌入式系统的开 发。

    例如, Java 2 Micro Edition(J2ME)——Java API的一个子集,只包含了Java的关键特性,是专门针对那些对内存具有苛刻要求的嵌入式设备而设计的。J2ME粗略地将应用对象划分为两大范畴:内存 在128K~512K之间的设备和内存为512K以上的设备,根据设备所处的类别提供不同的用户接口和不同的软件包。

    然而, 具有讽刺意味的是, 某些使Java成为Internet和桌面设备理想编程语言的良好特性, 在嵌入式系统中却引发了一些十分棘手的问题。缺乏指针寻址以及运行于Java虚拟机(JVM)模式中的安全特性都使Java很难对硬件进行直接控制。

    自动垃圾收集功能可使程序设计变得更加容易, 但却使应用失去了实时决策能力。另外, Java的运行速度偏慢, 而且程序量也偏大。然而, 令程序设计人员感到鼓舞的是, 目前所有这些问题大多数已能够解决, 许多可行的方案正在陆续推出。因此, 如果有人问Java是否可以成为理想的嵌入式设备程序设计语言, 那么正确的答案应该是:具体情况具体分析。

    什么情况下Java是理想的选择?

    为“火星探路者”引导方向的微处理器对中断功能具有很强的依赖性, 此时Java可能不是最佳的选择。如果你希望设计那些小型化、高功效、可执行关键任务的实时应用, 例如火箭控制、传感器通信或报告宇宙飞行器的方位等, 最好采用C语言或汇编程序。

    然而, 对于其他一些应用, 例如使用手持设备追踪货物的发运情况, Java将是一种最理想的选择。那些需要相互对话或与Internet进行沟通的设备, 可以充分利用这一语言的内在通信特性。如果已经用Java编写了服务器端软件,那么与此协同运作的客户端应用也很适合使用这种语言。

    关于运行速度的考虑

    Java之所以能够得以流行, 一个重要原因是具有WORA(Write once run anywhere, 编写一次即可到处运行)的特性。同样的Java代码可以运行在Mac、PC甚至是大型机上, 因为Java是一种解释性语言。面向具体平台的JVM可解释在每一操作系统平台上运行的字节代码。然而, 这一解释需要花费额外的时间。值得庆幸的是, 目前JVM解释代码所花费的时间已大大减少, 这要归功于即时(Just-in-time)编译程序的推出。预先(AOT,ahead-of-time)编译程序也可解决这一问题, 因为它能够预先解释Java代码, 把Java代码转换成经过优化且面向具体平台的二进制代码。

    Cygnus Solutions公司声称, AOT编译程序能够把代码的运行速度提高8倍。NewMonics也开发了一个名为QuickPERC的编译程序。该公司宣称, 与通常的解释模式相比,这一编译程序可把代码的执行速度提高20倍。

    尽管使用AOT令开发人员失去了可以在中心控制点对所编译的代码进行版本管理和维护的能力, 但对于比较稳定的代码库(例如嵌入式系统)环境这算不上是很大的损失。

    程序规模遇到了“天花板”

    在一个服务器中拥有几个Gb的内存十分平常,但一 个可运行Java的电器设备充其量只有不足512K的内存。因此, 当运行带有1Mb核心类库的Java时, 即使你只编写了一行代码, 也无法将其装进嵌入式系统。AOT编译程序可以解决这一问题,因为它可以帮助你去除所有不使用的代码、方法和类。许多供应商已经编写了体积更小、效率更 高、面向具体平台的专用核心Java类, 而且仍可继续使用已公布的Java API。与汇编或C等语言相比, 通常情况下, 面向对象的语言需要使用更多的内存。在台式机上这早已算不上是一个问题,然而在嵌入式系统中却是一个很大的问题。

    选择正确的集成开发环境(IDE)

    人们已经认识到, C程序中80%的故障是指针引起的, 因此Java中去掉了指针。Java的安全模式放弃了系统内存直接寻址和指向实际硬件的指针寻址。然而, 这些指针的存在本来是很方便的, 特别是当你希望快速和直接寻址内存时。

    用Java编写的嵌入式系统必须使用本地接口去执 行那些面向具体硬件的功能。然而, 这将意味着你正在管理以多种语言编写、具有多种类型的代码。对于开发人员来说,就必须懂得更多的技术, 否则只好组织一个更庞大的开发人员班子。如何把所有代码连接成一个模块?当出现某些故障时如何对代码进行调试? 所有这些都是必须解决的问题。

    推出功能丰富、支持多平台代码的IDE(集成开发 环境),这是朝正确方向迈出的一大步。当前可用的IDE有Metrowerks CodeWarrior(它可使程序设计人员在同一IDE中使用多种语言编写代码) 和IBM的VisualAge for J2ME。由于这些IDE是用于解决复杂问题的,所以人们也需付出较大的努力才能掌握它们。

    垃圾处理刻不容缓

    许多人不愿在嵌入式系统中使用Java的一个重要 原因是Java不能保证应用的实时决策需求,即这种语言不能以可预知、可重复的时间长度来处理一个具体的代码部分。Java使用自动垃圾收集功能回收那些 不再使用的内存,开发人员几乎不能控制垃圾收集的具体时间。实际上, 当Java进行垃圾收集时暂停了整个应用的执行。为了解决这一问题, 供应商们陆续推出一些不同的垃圾收集方法与算法。

    有些产品, 例如NewMonic的Real Time Executive和WindRiver的FastJ,可以确保绝对时间决策应用的开发。Sun拥有一个不同的方案,但它也开始转向对实时决策功能的支 持。各种编码技术(例如对象的重用), 也可减缓垃圾收集所产生的不良影响。

    可重用性不可忽视

    尽管使用AOT编译程序会牺牲掉在任何平台上运行同一编译后Java代码的能力, 但可移植的Java源代码仍将是一大优势。

    当供应商推出其硬件新版本时, 只要接口保持不变, 那么与接口对话的代码就不必改变, 这就是面向对象设计的实质所在。事实上,大多数高级应用逻辑在台式机上就可以进行调试,而不必在嵌入系统的目标设备上摸索。

    内存与处理器的成本

    有的时候, 人们之所以愿意使用Java, 是因为Java具有良好的性能价格比。众所周知, 目前内存和处理器的价格是相当便宜的, 而且越来越便宜。尽管花费几百美元, 甚至是几千美元为服务器购买内存是合乎情理的,但对于价格本来就十分低廉的蜂窝电话来说, 过多的内存开销显然是不能接受的。如果因为使用了较小的内存让每部电话节省1美元, 那么2000万部将节省2000万美元。因此内存和处理器速度的开销应与设备成本相适应。实际上,对于有些应用场合来说,内存和处理器速度并不是刻意追求 的因素,这就给降低产品成本找到了一条出路。

    如何吸纳Java?

    如果你正在考虑把Java用于你的下一个嵌入式系 统, 那么重要的不是技术问题,而是你的公司文化。如果你拥有一批习惯于牺牲机器资源换取自己方便的Web设计人员, 并让他们充当嵌入式系统的Java程序员,尽管同样是使用Java,但从Web设计到嵌入式系统程序设计将是一个不大容易的转变。对Java的使用要循序 渐进,而不是立即使用Java编写所有的应用。必须让Java程序员与那些有经验的嵌入式系统设计人员进行对话沟通,互相学习对方的技能。

    在JVM上运行的J2ME目标代码偏离通常环境越远,应用管理就越复杂。其中的经验是, 尽可能采用标准的J2ME。只有遇到特殊问题时,才采用特殊的方案。

    如果某些针对嵌入式系统的技术(例如AOT编译程序和半自动垃圾收集)反过来被应用到台式机和服务器环境,这并不令人感到惊奇。Java良好的内在特性, 无论对于家庭应用还是工业应用, 都将是嵌入式系统首先需要认真考虑的一种程序设计语言。

    文章选自《计算机世界网》

    展开全文
  • 首先,Java开发和嵌入式开发都是目前IT行业内比较常见的开发岗位,也都有大量的从业人员,所以从就业的角度来看,学习Java开发和嵌入式开发都是不错的选择。Java语言的应用领域包括Web开发、Android开发大数据开发...

    首先,Java开发和嵌入式开发都是目前IT行业内比较常见的开发岗位,也都有大量的从业人员,所以从就业的角度来看,学习Java开发和嵌入式开发都是不错的选择。Java语言的应用领域包括Web开发、Android开发和大数据开发等领域,这些领域也都有大量的岗位需求。

    在这里插入图片描述

    从行业发展趋势来看,随着5G标准的落地以及产业互联网的发展,未来物联网领域的发展前景将非常广阔,而嵌入式开发作为物联网开发的重要组成部分,必然会迎来更多的机会,从这个角度来看,嵌入式开发似乎未来的发展机会更多一些。

    在这里插入图片描述

    相比于传统Java开发来说,嵌入式开发在可穿戴设备领域、车联网领域、农业物联网领域将陆续获得大量的发展机会,尤其在产业互联网发展的大背景下,物联网将全面走进传统行业,一系列设备将具备网络连接功能和计算功能(边缘计算),在这个背景下,嵌入式开发将变得越来越重要,岗位需求量也会持续增加。

    嵌入式开发未来将逐渐与移动互联网开发、大数据开发、人工智能开发等进行全面整合,技术边界也将逐渐模糊,所以对于技术人员来说,掌握一定的嵌入式开发技术将提升自身的岗位竞争力。目前C和Python语言在嵌入式开发领域有广泛的使用,这两门语言的学习难度并不大,其中Python语言的应用场景非常广泛(Web开发、大数据开发、人工智能开发等),所以从Python语言开始学起也是一个不错的选择。

    当然,如果对硬件开发并不感兴趣,当前选择Java开发也比较容易就业。

    展开全文
  • Java嵌入式开发.chm

    2009-09-01 15:33:43
    Java嵌入式开发Java嵌入式开发Java嵌入式开发Java嵌入式开发Java嵌入式开发Java嵌入式开发
  • 主要就是关于职业选择技术发展的问题,其中有一个问的很多,就是 “我到底是学Java还是嵌入式?” 开始我都是不厌其烦得从未来发展学习难度帮忙分析,让大家对这这个有个自主的认识,但是慢慢的我发现其实很多人...

    可能是我回答了很多嵌入式问题的原因,经常有读者给我留言

    主要就是关于职业选择和技术发展的问题,其中有一个问的很多,就是 “我到底是学Java还是嵌入式?”

    开始我都是不厌其烦得从未来发展和学习难度帮忙分析,让大家对这这个有个自主的认识,但是慢慢的我发现其实很多人是没有找到问题的重点。

    我还是那个原则,兴趣是第一位的,不然后边几十年你会后悔的。

    纠结这个问题的无非有几个考虑。

    1.Java学着简单,嵌入式好像摸不着头脑,很多学了很久还是不知道怎么回事?

    这两个我都学过,我觉得这主要是因为Java的应用很集中,基本就是web和安卓(占比很小),所以就是web开发,再加上这些年培训班的大肆招生,学习路径基本很清晰,所以对于后来者学习来说自然是很简单的

    嵌入式则不然,嵌入式的应用非常广,单片机软硬件设计(无数的单片机类型,各种应用场景),纷繁的嵌入式操作系统学习,FPGA软硬件设计,Linux软硬件设计,这些软件又分应用开发和驱动开发(很多还结合紧密),更进一步甚至还有内核开发

    如果把这些混在一起和Java对比是不是有点不公平,Java甚至只是Linux软件开发中学习的一部分,当然这确实就是嵌入式的缺点,太分布了,让初学者迷茫。

    不过好处也是有的,从上到下,从底层到驱动,到操作系统,到应用都可以不断的扩展,这本身就是有意思的。

    2.Java赚的多,嵌入式赚的少?

    这还得借用上边的回答,这个问题可能存在目标不一致的问题,先总的说一下,工作赚的多少我一直认为和语言无关,而是和行业有关,Java之所以看起来赚的多,主要还是因为Java基本都是用于web开发,得益于互联网发展,自然水涨船高。当然这也是部分,效益好的还是大公司,很多小公司其实不算高。

    这时候一般做对比的就是嵌入式的单片机开发,但是不能专挑软柿子捏,把一众高薪的嵌入式算法开发,大厂硬件开发,芯片开发,协议开发,模拟电子开发排除在外是吧,可能会说我没这水平啊?那就是你的问题了,Java学不精去不了好公司也不会赚的多的,忘了还有996等你。

    总结下,Java因为行业原因,红利大岗位多,所以自然很多高薪者,这无可厚非,但是其实愿意不断提高,且兴趣使然嵌入式也是很多高薪职位的(上来就说自己不行的,建议去做Java)

    在这里插入图片描述

    2020年6月6日 晚
    你点的每个在看,是对我最大的支持

    展开全文
  • JavaME嵌入式小游戏开发案例
  • Java嵌入式系统中的应用与实现.pdf
  • 在西安嵌入式和Java有很大的区别,嵌入式是软硬结合的,底层开发用的大多是C语言和汇编语言,现在就业前景薪资待遇都很不错的。而JAVA的是纯软件的,现在市场也趋于饱和的状态,所以并没有什么发展的空间,薪资也不...
  • 又一个Java嵌入式数据库引擎.pdf
  • 基于JAVA嵌入式网络测控系统的全新设计方案、电子技术,开发板制作交流
  • java嵌入式tomcat

    2011-09-03 13:59:15
    java程序做的一个嵌入式tomcat,可供大家参考、补充。
  • Java 注释和嵌入式文档 一、 Java 里面有两种注释风格: 1. 第一种:以/**开始,*/结束 多行注释 /**  * hello */ 2. 第二种: // 单行注释 Eg.// this is a example 二、 注释文档 1. javadoc:...
  • H2 是一款基于 Java 实现的小巧而强大的关系型数据库,支持嵌入式、客户端/服务器以及混合部署模式。H2 数据库适合嵌入小型应用程序、元数据管理、快速应用开发测试、内存数据库。
  • 机械转嵌入式还是it?学嵌入式好还是java好?.pdf
  • Java属于嵌入式开发吗?

    千次阅读 2014-11-19 11:02:08
    Java属于嵌入式开发吗?其实对于嵌入式系统来说,Java...当然,但大多数嵌入式应用也面临着Java没有处理的两大约束:没有足够的空间时间。  Java嵌入式开发的优势  1. 提高开发效率和可维护性  在项

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,793
精华内容 49,517
关键字:

java和嵌入式哪个好

java 订阅