当前开发方式

我们主要从宏观和围观两个角度分析当前物联开发的现状。

宏观角度

我们先从一个典型的例子来看当前物联网开发的主流方式以及流程。比如现在要开发一个无人智能小车,该小车可以通过移动端连接后,远程控制小车;同时小车将摄像头拍摄到的画面实时传输给移动端;小车还需要将运行状态信息、GPS定位,通过AI摄像头将被损坏的公共基础设施拍照上传到服务器,系统将通知相关维修人员,维修人员可以在网页或者APP查看小车GPS定位和轨迹,当小车电量低于20%时将停止任务自动回到充电桩自行充电。

(图片来自网络)

在这里面,为了突出重点,硬件就暂用开箱即用的树莓派和Arduino来代替。这里面,将涉及如下开发人员和开发任务:

  1. 使用Python Flask框架配合MySQL搭建Web RESTful服务;

  2. 使用手机作为控制终端,如果是安卓,则需要Java来开发Android应用,如果是iPhone/iPad,则需要Swift来开发iOS应用;

  3. 使用树莓派作为硬件协调端,用于连接网络和服务器以及Arduino交互;

  4. 使用Arduino作为控制器,传输控制信号给硬件;

  5. 使用HTML/CSS/JavaScript开发一个管理后台,可以管理多台小车;

可以看到,要完成这个产品开发,我们需要使用SQL、Python、Java、Swift、JavaScript,C六种语言。为此,我们需要一个懂电路图设计的硬件工程师负责电路图设计、元器件选型;一个懂嵌入式工程师负责编写硬件业务代码;一个懂Python和SQL的后端工程师负责服务端开发,一个懂HTML/CSS/JavaScript(当下还要懂Vue/React/各类小程序)的前端工程师;一个懂Java的安卓开发工程师;一个懂Swift的iOS开发工程师。

首先是需要招到符合要求的这6位工程师,其次是这6位工程师的项目协作也是个老大难题,就算前两个问题都解决了最后一个用人成本问题也是大部分中小企业无法承受的。如果整个项目只用一种开发语言就能完成,那么将极大提高工作效率,解决招人困难、用人成本的难题。如果一个公司只是某一款产品需要物联网化,那么完成这个产品开发后,这些岗位后续就是一些维护性工作,工作量不饱和老板就会迟疑,要不交给外包公司做?可是外包公司图的是少快简省,做的是一次性买卖,交付质量没有全职岗位高,而且后续维护是一片空白。这种两难问题会困扰不少想将自己产品转型到物联网,以此提高自己竞争力的公司。

微观角度

当前物联网的主角之一“物”的开发也存在很大问题。

硬件底层开发门槛太高了,从现状来看,硬件开发人员关注的是ADC、DAC、PWM、GPIO、I2C、高低电平、时序、晶振、驱动等;而做软件应用的人更关注需求、用户界面、人机交互、用户体验、软件架构。可以看到,这两者的关注点根本不在一个层面上,两者也无法直接对话合作。中间存在巨大的无法跨越的鸿沟。硬件底层关注MCU,软件应用关注进程线程;硬件底层关注驱动,软件应用关注RTOS;硬件底层代码可以裸机运行,软件应用则离不开操作系统。

一个人同时具备硬件底层和软件应用技能很难,要找到这样的人更难,即使找得到,因为数量有限,因此成本巨高。

硬件领域还有一个重复造轮子的现象。因为设计的电路板和元器件因为更换了核心MCU,或者是同一系列不同型号MCU平台的更换,导致之前的业务代码需要大改、驱动需要重新移植、第三方库需要修改等等一系列问题。因此,这是一个硬件工程师必须面对的既现实又无奈的问题。

(图片来自网络)

同时,在信息技术高速发展的今天,软件讲究的是小步快跑,快速迭代,每天上线一个小版本,每周发布一个大版本,代码可以随时修改和热重启,服务可以接近不间断运行。与之相反的硬件,设计之初就必须考虑自顶向下,考虑各种问题,进入一个漫长的开发过程。因为硬件的逻辑就是一旦成型,就很难修改,如果设计有缺陷,有可能就要召回处理。

所以,最好的方式是在软硬件中间提供一个抽象层。硬件开发者专注硬件设计,在保证硬件正常工作基础上,而只提供必要的最基本的接口给这个抽象层。软件开发者则基于这个抽象层开发各类应用。这样就可以在不改变硬件结构情况下,软件开发者可灵活定制业务代码。想想下小米手机和特斯拉汽车,他们的做法不正是这样么?将软硬件分离,如果小米手机有某个Bug,可以发布软件新版本修复该Bug;特斯拉汽车交付给用户的时候,居然多了一些冗余硬件,这些硬件就是用于后续软件版本升级时,将唤醒这些硬件给汽车提供更强大的功能。

(当代软件开发的主要方式,虽然是个段子,但是不得不承认这种方式的灵活性)

所以说,物联网要遵循“软件定义硬件”的准则来开发应用,将最大灵活性交给软件,硬件只提供可靠的,必要的、基础的接口。

存在的痛点问题

上面两个层面其实已经提到了物联网开发的痛点问题。这里我们还是总结下:

  • 入门门槛较高,知识点非常零散。

  • 平台依赖很强,换平台比较痛苦。

  • 开发中出现的问题较难定位,往往涉及到多个技术层面协同工作。

  • 公司多选择闭源,对整体软硬件生态的贡献接近于零,阻碍了开源的发展。

  • 多种编程语言给招人带来挑战,给用人增加成本。

C/C++ 是硬件开发者相对熟悉的语言,但是,以基础设施的角度来看,C/C++ 有些老了,对于现代软件工程的支持存在天然的缺陷,比如,C/C++ 至今没有一个好的包管理工具。对于硬件开发人员来说,可移植性是个永远的痛,每次拿到一款新硬件,让程序跑起来都是件痛苦的事情。

总的来说,就是硬件开发和应用过于耦合,导致硬件变动或者软件变动,对任何一方开发人员都会造成不小的工作量,而且升级后的软件如何部署到这么多到处分散的硬件上也是个老大难题。

解决方案

基于C开发物联网就会带来这样的问题,C是开发硬件、驱动的好工具,但是又要去开发应用,那可能不是最合适的。所以,好一点的做法是硬件驱动使用C开发,软件应用使用高级语言来开发。

因为高级语言提供了更高的抽象,更简单的语言,用信息技术发展史来看,编程语言就是越来越抽象,应用开发越来越简单。C语言不正是它所处的那个年代的高级语言么?计算机最开始使用机器码,因为不方便记忆所以人类发明了人类可读的汇编;又因为汇编的跨平台程度不高(其实就是不够抽象),所以有了跨平台的C语言。而今天,我们面临的物联网这些问题,不也和当初一样么?

高级开发语言没有像C这样的语言中,开发人员需要使用诸malloc(),calloc(),realloc()和free()之类的方法手动分配和取消分配内存。在JavaScript之类的语言中,无需显式分配或释放内存。也称为垃圾收集(Garbage Collection),JavaScript值在创建对象(对象、字符串等)时分配,在不再使用时自动释放(即自动分配和释放)。

垃圾收集器功能使IoT开发人员可以专注于开发方面,而不是浪费时间进行内存管理。从某种意义上说,由于垃圾收集器消除了内存泄漏,因此自动释放未使用的内存可提供稳定的IoT解决方案。

刚刚上面说到软硬件需要一个抽象,这个抽象其实社区已经有多个方案出来了,比如三星公司的JerryScript引擎和IoT.js运行时(JavaScript)、duktape(JavaScript),nodemcu(Lua),micropython(Python),还有刚出来不久的quickjs。这些都是针对嵌入式领域设计的高级语言引擎或者运行时。甚至还有软硬件一体的开发板环境:Tessel、Espruino、Ruff。这些开发板买回来,跟着教程,普通前端工程师就可以快速点亮物联网的第一盏灯。而前端工程师基于掌握的JavaScript可通过Node.js进行后端开发,借助基于JavaScript的ReactNative完成安卓和iPhone的APP开发,借助Electron完成Windows/Mac OS/Linux客户端开发。一个前端工程师就基于JavaScript一门语言,完成物联网应用的全栈式开发。

物联网虚拟机

上面介绍的解决方案是社区和业界一些尝试,目前商用环境正式应用这些解决方案的还不太多。这些解决目前还没有规划解决更高层次的问题。来自武汉市字节码科技有限公司的一款产品,是朝着商用目标前进的解决方案——EVM虚拟机。

EVM 全称 Embedded Virtural Machine,本质上是一款通用、精简的嵌入式虚拟机,由语法解析前端框架和字节码运行后端构成,可运行在资源受限制的单片机上。

EVM有如下特点:

  • 体积小,最小编译体积40KB,最小内存占用2KB;

  • 多语言,支持多语言混合开发,目前支持JS、Python、Lua、QML、JSON、XML等语言;

  • 跨平台,纯C语言开发的虚拟机,没有任何外部依赖,可以在各种芯片上编译运行;

  • 高性能,高效的运行性能,媲美QuickJS;

  • 高效内存管理,先进的内存管理,无内存泄露和内存碎片问题;

  • 高可扩展性,灵活的虚拟机扩展技术,多语言可共享扩展功能;

  • 支持主流的RTOS,Zephyr/FreeRTOS/uCOS/LiteOS/RT-Thread;

  • 丰富的网络协议,支持TCP/UDP/HTTP/MQTT/CoAP/LwM2M/Lorawan;

  • 支持QML语法,使得嵌入式界面开发像Web的CSS开发一样简单方便;

目前,EVM正在兼容WebAssembly,为更多开发者快速上手物联网开发做好底层技术支持。

总结

基于嵌入式高级语言运行时,物联网应用将变得非常简单,总结起来有如下特点:

  • 由“支持网络”上升到“基于网络”;

  • 软硬件高度整合,将复杂的底层处理隐藏起来,留给用户友好的API;

  • 扩展变得极其简单,就像电脑上安装软件一样;

  • 设备互联更重要,甚至可随处推送并部署代码,随处访问;

  • 一般会有社区、github、wiki等伴随成长;

C语言依旧是硬件开发的最好语言,不过适用场景在底层硬件开发和驱动上,而应用开发应该交给更合适的高级语言。社区和业界也正在尝试各种高级脚本开发语言的解决方案,为降低物联网开发门槛带来曙光,而EVM独特的设计思路和实现则为物联网开发提供了一个发展潜力更大的解决方案。

我们有理由相信,物联网开发是高级脚本语言的天下,时代也会给更多人进入物联网开发的机会。

mac虚拟机桌面图标隐藏_物联网的主流开发方式还是C语言?你知道物联网虚拟机么?...相关推荐

  1. mac虚拟机桌面图标隐藏_桌面美化,任务栏、桌面图标和鼠标箭头自动隐藏!

    生命不息,折腾不止!自动用上电脑,人类就在电脑桌面美化的道路上行走.从苦苦寻觅各种壁纸,到各种主题DIY:从图标美化,到鼠标指针美化:从任务栏透明化,到各种桌面挂件.甚至有的小伙伴们,硬生生把Wind ...

  2. mac虚拟机桌面图标隐藏_「MAC软件推荐」MAC实用软件

    文章目录 1 Short Menu – 链接缩短器 2 Slidepad – 快速滑开软件 3 SideNotes – 简易桌面笔记 4 One Switch – 一键开关设置 5 iStat Men ...

  3. mac虚拟机桌面图标隐藏_Win10 终极美化篇 | 高仿Mac ,这不是主题

    Mac 专题 |Win10 终极美化篇 mac OS 上超好用的5个工具 7SIZE丨部分插图内容来自于网络侵权删 Win10美化 Windows是目前在全球上使用人群最多的系统了,长期使用,难免会出 ...

  4. 怎么恢复计算机隐藏的桌面图标,怎么把桌面图标隐藏 win10桌面怎么找回我的文档图标?...

    怎么把桌面图标隐藏 一篇 : win10桌面怎么找回"我的文档"图标? 新装的win10系统,可能有些人仍然不太习惯,比如桌面上"我的文档","计算机 ...

  5. mac隐藏桌面图标快捷键_如何在Mac OS X桌面上隐藏图标

    mac隐藏桌面图标快捷键 Icons on the desktop make things look really cluttered, and Mac OS X has always embrace ...

  6. Mac OS X 桌面图标隐藏和显示

    打开  应用程序-实用工具-终端,粘贴如下命令: defaults write com.apple.finder CreateDesktop -bool FALSE;killall Finder 复制 ...

  7. Insyde uefi 隐藏设置_安卓福利,手机桌面图标隐藏,找应用按字母轻松搞定!

    前几天玩客君刚分享了IOS最新BUG"微信"图标快速隐藏方法,后台就有粉丝回复,是否有安卓桌面图标的隐藏技巧,这不玩客君给安排上了. 小技巧:IOS 13最新版"微信&q ...

  8. java 桌面图标插件_盘点10个非常强大的界面设计工具

    你是否还在为找不到合适的界面设计工具而发愁?今天,慧都小编为大家送来了福利,盘点了以下10个非常好用的界面设计工具,相信能让你的UI设计工作如虎添翼,大大提升开发效率. Kendo UI是Teleri ...

  9. 如何将地址栏打开的图标隐藏_如何制作一款手机主题?这套UI主题图标教程将为你解密!...

    想要学习手机主题制作,大量临摹优秀案例作品,是提高软件熟练程度以及形成创作思维的捷径,本套课程注重案例实操的同时,也强调教会大家临摹的方法,课程将带你探秘大赛获奖作品的制作经验. - 立即学习:htt ...

最新文章

  1. Linux下使用perf进行性能分析,并导出火焰图
  2. Goolg Chrome 插件开发--Hello world
  3. Linux下php5.3编译oracle客户端
  4. 02.Python基础
  5. 用Aspose.Words for .NET动态生成word文档中的图片或水印
  6. 使用Chrome的timeline工具分析web应用性能
  7. SPOJ MYQ10 (数位DP)
  8. 收藏 | YOLOX模型部署、优化及训练全过程
  9. A - 敌兵布阵 (HDU - 1166)
  10. 安卓开发 实现文字渐变效果_AI教程!用网格工具做渐变字效
  11. 《编写可维护的JavaScript》——JavaScript编码规范(七)
  12. 【图像几何】基于matlab GUI图像空间变换(仿射变换)【含Matlab源码 841期】
  13. python 水位流量关系曲线_水位流量关系曲线的绘制方法_张红艳
  14. SystemVerilog: always, always_comb, alwasy_ff, always_latch
  15. swp安装(Scientific Work Place)
  16. 【论文阅读】Recurrent Chunking Mechanisms for Long-Text Machine Reading Comprehension
  17. 人造大理石行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  18. python 通讯录系统_Python实现通讯录功能
  19. 基于IIC和SPI协议的温湿度采集与OLED显示
  20. B树详细图解与Java完整实现

热门文章

  1. 运用php制作一个表单,PHP 表单处理,一个简单的 HTML 表单
  2. html5中英文翻译论文,毕业论文外文翻译--使用JavaScript设计网页(适用于毕业论文外文翻译+中英文对照).doc...
  3. 【项目精选】城市公交查询系统(论文+视频+源码)
  4. Android BindService 简单使用
  5. 手把手教你做一个新浪博客发布软件JAVA版本(4)--打开博客发布页面
  6. PHP项目中使用 Markdown编辑器
  7. Windows 2003上Oracle通过端口映射访问连接超时的解决办法
  8. WV.33-电阻并联
  9. Implement (interface)
  10. 计算机集成制造系统C MS论文,浅谈自动化机械制造及发展毕业论文.docx