用Java编程能给物联网(IoT)带来什么优势与不同?
用Java编程能给物联网(IoT)带来什么优势与不同?
这是一个不太容易回答的问题,也是一个适合拿出来与大家讨论的一个话题~
首先需要聊聊物联网硬件与嵌入式设备有什么不同。嵌入式设备通常是一个软件一体的产品,MCU完成传感器的读写,驱动设备,完成一个或一个集合的设备功能。而物联网设备个人认为应该包含两个方面,一个是硬件传感器数据采集处理的能力,还有就是云服务的植入能力。不可否认,传感器等硬件能力是物联网设备的基础,但是仅仅具备嵌入设备的能力而缺乏与互联网服务接入的能力的话,并不是一个典型的物联网产品。
解释了这个问题之后,我们就可以来看看Java给物联网带来什么能力?
首先,从嵌入式设备的角度出发,传感器等硬件驱动的能力是完全没问题的,但是当你的设备完成了数据的采集控制之后,应该如何通过webAPI与云服务器互动,甚至开放出你的硬件能力给第三方服务使用这个部分是嵌入式产品和从业人员不具备的知识体系。举个例子,智能手机上的GPS传感器,手机厂商做的GPS传感器更多的是为第三方软件服务的(导航、打车、外卖)而不是手机厂商自己用,所以硬件能力的开放给第三方软件是趋势。
然后,从互联网云服务角度出发,在移动互联网成熟的业务和服务、大量的开发者,他们十分熟悉业务和云服务,但是传统无法触达终端,物联网设备的软件和硬件耦合,开发工具SDK五花八门,互联网程序员不具备从事传感器硬件编程的知识和背景,而通过JOSH技术,让互联网程序员可以用与硬件无关的Java编程方式在设备上进行硬件数据的采集控制,然后再对接自己熟悉的云服务,甚至进行业务的开发,这是让物联网从业人员多起来的方式,也是让物联网业务真正能与实际场景结合闭环的手段。
很多人不明白,JOSH是如何实现用JavaAPI实现传感器数据的读写的,如何实现硬件无关的传感器硬件接口的编程的,这个是一个比较大的话题,我们后面会再JEDI的板块展开讲解,主要的技术实现方式是通过Java设备接口来实现,DeviceAccessAPI(一个开源社区的项目,在Java虚拟机实现的一个标准的通用IO接口,支持MCU的外设接口:GPIO、UART、SPI、I2C、ADC、PWM等),下面一张图片,让大家有个基本的印象:
在国外,关于IoT为什么需要JOSH这样的技术的讨论,起源比较早。只要是嵌入式技术的从业者,或者对于OS(操作系统)有所研究有所兴趣的朋友,一定听说过uC/OS,这个是每个人的入门利器。其知名度不亚于Linux,是嵌入式系统的OS。C语言是其开发语言,与其类似的操作系统,已经发展了很多年,有ThreadX、国人主导的开源嵌入式操作系统RT Thread、华为的Liteos、和ARM出的mbed等等,种类十分众多。抛开主观因素,我想后来的操作系统无论是在开发者的规模,认可度,普及性,开源资料等等各个方面,绝不是uC/OS的对手。
那么,问题来了,uC/OS作为拥有众多受众和开发者的嵌入式操作系统的鼻祖,为何在面对IoT新的机遇时,强调JVM(uC/OS推荐的物联网操作系统方案是uC/OS作为底层系统上层使用MicroEJ的JVM用于物联网)更为适用与IoT,并且如此看重?个人认为:C语言开发优势之外,劣势在于依赖编译器,依赖硬件,门槛高,形成不了规模优势,应用不能独立运行,难以后装应用等等,而JVM(Java虚拟机)屏蔽掉了不同的芯片、编译器的区别,并且可以让应用独立的开发和后装应用,可以建立ecosystem和IoT APP Store,还有最重要的,全球1000万的开发者,和现成的开源社区应用资源。这些资源就连盘踞嵌入式系统多年的uC/OS都无法与Java比,更别提那些刚刚进入的没有本质差别的同质化产品。开源和生态不是巨无霸的商业就能建立的,而是要顺势而为,就像Google做Android都要复用Java社区的道理一样。
最后,来点干货,如果一个人民币100块钱以内的智能手表,可以让所有Java&Android的开发者都能开发应用,并且可以构建手表的应用商店,随时安装各种应用和未来我们还没想到的应用(比如安装一个共享单车的APP就可以用手表刷一下解锁)是不是听上去比现在只能计步的要更“智能”一些了呢?关键GUI非常漂亮,并且可以自己定制,随时OTA迭代~
用Java编程能给物联网(IoT)带来什么优势与不同?的更多相关文章
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- Google Java编程风格指南
出处:http://hawstein.com/posts/google-java-style.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Comm ...
- JAVA 编程规范(上)
2016-03-20 J120-CHARLIEPAN JAVA 编程规范(上) 1. 应用范围 本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JA ...
- 谷歌Java编程规范
Google Java编程风格指南 January 20, 2014 作者:Hawstein 出处:http://hawstein.com/posts/google-java-style.html 声 ...
- Google Java编程风格指南中文版
作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Cre ...
- (转)google Java编程风格中文版
转:http://www.hawstein.com/posts/google-java-style.html 目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 ...
- [转] java编程规范
原文链接: 资料推荐--Google Java编码规范 之前已经推荐过Google的Java编码规范英文版了: http://google-styleguide.googlecode.com/svn/ ...
- java 编程时候的性能调优
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
随机推荐
- RookeyFrame在线新增模块
今天给大家演示下在线新增模块的功能,在线新增模块跟在vs中写model实体类区别不大,线上新增少了手动初始化的过程,新增后模块同样具备新增.修改.删除.查看.导入.导出.复制.批量编辑.回收站.草稿箱 ...
- Blazor应用程序基于角色的授权
原文:https://chrissainty.com/securing-your-blazor-apps-configuring-role-based-authorization-with-clien ...
- Windows下实现应用程序看门狗软件
有时候,我们需要确保一个应用程序长期稳定地运行,但是在Windows平台上由于种种原因,几乎不可能保障一个应用的绝对可靠运行.那么,我们就需要有一个机制,在应用死机﹑异常﹑系统重启等情况下自我恢复,而 ...
- WPF 枚举使用
1.model class JX_Unit { public enum SumUnit { KW = 1, L = 2, Kt = 3, } } 2.viewModel public string w ...
- swift混编
http://blog.csdn.net/fengsh998/article/details/34440159
- 配置全文搜索引擎solr
前言 solr是apache下的一个子项目,用java编写基于Lucene开发的全文搜索服务器,不同于Lucene,solr一个完成的搜索服务器,提供了众多接口调用,而Lucene只是个工具包.如果用 ...
- 2.dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据
作者:中华石杉 面试题 dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? 面试官心理分析 上一个问题,说说 dubbo ...
- [TCP/IP] TCP第三次握手失败怎么办
三次握手 客户端 ==> SYN是1同步 ,ACK确认标志是0,seq序号是x ==> 服务器 客户端 <== SYN是1同步 ,ACK确认标志是1,seq序号是y,ack确认号是x ...
- linux下c语言实现多线程文件复制【转】
转自:https://www.cnblogs.com/zxl0715/articles/5365989.html .具体思路 把一个文件分成N份,分别用N个线程copy, 每个线程只读取指定长度字节大 ...
- 习题6-4 使用函数输出指定范围内的Fibonacci数
#include<stdio.h> int fib(int n); void PrintFN(int m, int n); int main(void) { int m, n, t; sc ...