论坛5 | We. Developers. 郑晔 「Ruff:用JavaScript搞定硬件开发」



  • 时间: 2016年7月28日
    发言人: 郑晔|Ruff CTO
    主题: Ruff:用JavaScript搞定硬件开发


    很高兴跟大家分享这个主题关于硬件上JavaScript,在座的各位要么是做软件的,要么是做硬件的,做软硬件的可能不太多,在我们公司内部如果是全栈工程师,我们基本的判定方式是上面要能做运维,下面能画板子。

    我是做软件程序员出身的,做程序员大概十几年了,自己做过开源的项目曾经拿过Oracle 一个奖。由于各种各样的原因,写博客也写了十几年,愿意把自己的经验知识做一些分享,做软件开发相关的东西,之前做咨询顾问,也大概做了七八年的样子。从去年开始,自己身上多了个硬件的标签。

    你有没有想过做一款自己的智能硬件,大家有没有。接下来的问题是,大家有没有自己做过的。刚才问了一个很好的问题,大家都有这方面的追求。但是理想总是很丰满,现实就是这么骨感。为什么很多人想做智能硬件呢?我们看到了大的趋势,大家都喜欢说风口这个词,当年的风口是互联网,接下来风口到了移动互联网,现在很多人都在说未来的趋势会不会是物联网,这是一个图,这个是去年发布的行业趋势报告。

    0_1470723633813_upload-7f9d5c37-933f-425a-9b8f-c562897ec72c

    这个图什么意思呢?从这个图上大家可以看到,大家对于物联网的预期,这个部分是说整个行业对于物联网的预期已经达到了峰值,整个预期已经达到了非常高的程度。但是预期已经很高了,并没有真正的今天已经变成物联网的时代了。

    另外,这里面打了一个小框,这里面写IoT平台,大家其实也期望IoT平台的诞生,就是技术的萌芽期。有了这个IoT的平台,可以更好的推动IOT技术的发展。

    我们接下来来看一个实际的例子,大家有更多的是做物联网或者是智能硬件的想法,我们来看一个实际的例子它是怎么做的。首先我们要进入一个小区,大家每天来到这里也挺不容易的,参加这样的活动或者每天上下班挺不容易的,因为温度很高。所以我期望我回到家的时候,我们家的空调已经打开了,屋里已经很凉快了,我们希望做一款智能空调。但是我为什么不是回到家才把空调打开,因为你们家一天没开门了屋里面很闷热。我为什么不下班的时候远程遥控一下把空调打开呢?以后距离太远了,北京现在的情况上下班一两个小时,你在办公室就把空调打开,回去的电费有点高,所以我们选择进入小区打开空调。
    就这么样一件事,我们应该怎么来做呢?我相信在座的各位多多少少都做过一些技术工作,作为软件程序员这个行业的人,你最需要学会的是什么?以我个人很多年写程序的经验来说,最重要的一件事是要学会任务分解,不管多么复杂的事情,你先要学会把它分解成一步一步要做的事情。现在我们来看这样一个问题,进入小区打开家里面的空调,我们怎么把它分解呢?

    首先,我们把它分解成几个端,一个是我有一个手机,基本上手机大家都是随身携带的,我只要有个手机,在我进我们家小区的时候,我把我的位置上报到云端,然后就OK了。云端应该有一个东西接收一下我的位置,判断一下我的位置是不是已经到我们家小区。然后再下发一条指令,给家里面的设备,家里面的设备只要接收到这个指令,接下来就是我把空调打开就好了。

    我讲到现在为止,大家有没有对任务分解不明白的?OK,看来各位都是相对比较合格的程序员。我相信接下来这个状况你们都会做,手机定位、位置上报,手机现成的API是没有问题的,HTTP POST,基本上每个程序员都会做。

    做一个服务应该很容易,接收一下位置,判断位置现在有各种各样的地图API,刚才高老师讲的时候展示了地图跟数据怎么结合,这个对每个软件程序员来讲也不难。下发一条指令,如果有通道的话无论是Socket或者是推送各方面怎么来做,你都很容易做。我们发现一路坦途已经到了这边。

    接下来的问题,我在这边空调接收指令开启空调,看起来道理很简单,但是是怎么做的呢?作为程序员我们是特别有追求的程序员,我们说我们要开始学习硬件开发的,把我们家空调点开,为我们家节能环保为我将来的事业做出贡献,然后你就开始查书,遇到了这么一大堆词。

    0_1470723682156_upload-45a47243-406f-4834-96d4-2c8e9fc531b4

    我不知道有多少人知道上面的名词代表什么意思,我估计至少以我的经验来看,除了C是什么东西以外,我其他的都不知道。

    稍微解释一下,我经过去年一年的学习,我大概能知道这些词是干吗的了。GPIO是硬件接口的一种方式,你不用管硬件是什么样的,它有各种各样的接口形式,跟硬件交换数据。寄存器是写各种各样的数据,数据手册告诉你应该往各个地方写什么样的值,这个是很神奇的东西。迄今为止我自己也没有耐住性子读完一个完整的数据手册。

    还有一个工作是板卡烧写,假设说你很幸运的把这些程序写好,你烧到一个硬件上能跑起来,这是一个很有趣的事情。

    还有线路连接,作为软件程序员你都没有想过,硬件怎么能把这些线连到一起而且起作用呢?对于很多软件程序员来说,硬件程序员干的都是匪夷所思的事情,以我的经验来看,这些东西都是神一样的存在,如果是面对这样的词汇,我基本会默默的选择我们家还是费点电吧。我会放弃硬件探索之路,我估计绝大多数软件程序员硬件探索基本到此为止,稍微好一点的你玩两次,你会发现果然跟我不是一个世界的,所以就放弃了。

    这也是我们开始做Ruff这件事的初衷,这是很多软件程序员,实际上对于做一个硬件的应用有着非常大的向往。但是他不能做,原因就是软硬件之间存在着巨大的鸿沟,软件程序员想跨过那个鸿沟,要面对刚才那么一堆东西,对每个软件程序员来说几乎是一件不可逾越的事情。

    这也是我们回过头来想,为什么我们说了这么多物联网、智能硬件说了这么多,但是物联网智能硬件时代也没有到来,因为没有很多人去给物联网做应用。大家会想也许这个世界上已经有了很多硬件厂商,但是实际上真实情况是他们大多数的硬件厂商的人,你去跟他谈如何做一个硬件应用,他会跟你谈如何写一个接口,他不会跟你谈如何做应用,真正懂做应用的大部分是软件程序员。所以每个人需要的不是一个硬件,你需要的是一个应用,只不过这个应用是以硬件的形式存在而已。

    所以我们最开始几个人商量Ruff这个事情的时候,我们想如果有一种可能,让更多的软件程序员能够进入到硬件的开发领域里面来,能够开发出各种各样硬件应用,是不是我们所期望的物联网时代才会真正的到来,这个是我们做Ruff的初衷。

    Ruff是什么呢?刚开始做Ruff的时候,跟很多朋友交流,我发现比较好的解释是,你可以把Ruff理解成IoT时代的安卓。为什么这么来解释呢?大家有没有想过这样一个问题,我不知道这里面有多少人年纪可能跟我相仿或者比我稍微小一点,大家有多少人拿着诺基亚手机打电话。有多少人想着在诺基亚手机上写应用,我曾经想过,也是经历过刚才的逻辑以后我放弃了。为什么?诺基亚手机你要想为它写程序,你可能要做的事情是,拿着这个诺基亚的手机你去学芯片的编程,然后你发现这个复杂程度还是放弃的好。

    后来为什么在安卓时代,在iOS时代,在苹果时代到来之后那么多人为安卓写应用,为iOS写应用,因为它提供Java和Object-C的接口,可以用面向软件程序员的方式写程序了。所以在这样一个情况下,更多的人,更多的软件程序员流到了手机开发领域,所以才有了移动互联网时代的到来。

    所以我们在这里面可能很清楚的判断,现在的物联网之所以没有到来,很大程度上是因为在里面做应用的人太少了。再一个现在做一款智能硬件应用,做一个IoT应用太复杂了,所以对我们来说,我们做Ruff这件事降低一下物联网的开发门槛,能让更多的软件程序员进入到这个领域里面来。

    所以说了这么多,我刚才也说了,这是一个关于硬件商的介绍。

    0_1470723748636_upload-72708f5c-90d1-4044-90a1-5ef56c5f3c9f

    我们来看一下说了这么多以后,对于程序员来说最高兴看到代码,在座的各位如果是开发出身的话,这个代码理解起来对你们来说有复杂度吗?

    没有复杂度也尝试解释一下,软柿子比较容易捏。这个是什么意思呢?当你看到这个程序Ready的时候,其实就这么一句话,我们点亮了一个LED灯,在程序结束的时候把它关掉。它是这样的,看到了这样一个代码以后,你刚才想的那些关于硬件的那些知识,是不是并没有看到其他复杂的过程。这样的一个程序是每一个软件程序员可以理解的。

    我们就是要把开发门槛降到每一个软件程序员可以理解的程度。所以为了让更多的软件程序上能够上手,我们自己做了一个开发套件。你不用看具体每一个模块的含义,你要知道我们这款套件,主要的目的就是让大家能够很快的上手,你买了以后你插上灯,你按一个按钮可以点亮或者一个温度传感器可以把你们家的温度写出来,就这么一个简单的套件,然后你就可以开始你的硬件开发之旅。
    具体怎么做呢?我们结合一下刚才的例子,我们想如果是跟云之间有这么一个交互,我们其实只要把数据接到这边的开发板上,然后向我们家空调发一个指令过去,这是一个红外发射器,一般空调都是红外的遥控。所以要向空调发一串红外码,你就可以该干吗干吗了,这是我想到的比较简单的改造方案,当然你愿意把你们家的空调拆了,那是另外一种改造方案。

    我们来看看基于这种改造方案可以做什么事,首先我们可以到软件仓库里面搜索,我们刚才说我们要用红外的发生器,我们在rap.ruff.io的网站上搜索一下找到红外发生器,ir-transmitter,添加里面到我们创建的项目,接下来我们添加一些参数,controller就是你在程序代码里面要用的名字。

    接下来我们会做一个rap layout的过程,对于线路连接的过程,对于每个程序员来说你知道插哪个口也是挺费劲的事情,所以我们提供了这样一个命令帮助你生成线路连接图。

    有了这样一个线路连接图,我们接下来的工作就是照着它一根一根把线插上。如果只是生成一个layout连接图我们也不会,加上参数—vistual后,就会生成一个可视化的连接图,它会把每个点怎么连告诉你,我相信能做程序员的人至少具备看图识字的能力,你照着这个图连接起来是没有问题的。有了这个命令以后,我们基本的连接就算完成了,我们开始写代码。

    如果你做过Node.js相关的工作,你会发现这个代码比较好理解。首先你创建了一个socket,这里面加密之类乱七八糟的东西我们就不考虑了。有了这样一个代码以后,当我收到打开事件以后,我只要调这个controller,你添加外设的时候写的ID,你在程序里面用的ID,然后你去发送红外代码,我估计这段代码理解起来应该没有什么太大的难度。我只要向我们空调发一堆代码,它就应该能够工作。

    你在这里最大的疑问是什么,代码从哪里来?实际上大家只要稍微了解一下红外工作原理,我刚才说了其实发一段代码,接受一段代码这么一个简单的活,这段代码从哪儿来呢?我们开发套件除了配了红外发生以后,我们还配了红外接收,你可以怎么做呢?拿着你们家的摇控器,写一个程序,按一下摇控器把代码接过来,然后写出来就可以了。

    对于程序员来说这相当于一个逆向编程的活,应该不是什么难的事。程序也写好了,我们基本的组织也写好了,对于我们来说接下来要做的是什么事呢?

    0_1470723803140_upload-69fbd149-4378-4393-a46c-101d260d02af

    开始把我们的程序部署到开发板上开始写程序了,我们把你在PC机上写好的程序传到开发板上,rap start程序开始跑了。

    讲到这里,你做过其他的开发,跟你纯做软件开发基本上没有任何的差别,这也就是我们要做Ruff的目的,让软件开发者用他们最熟悉的软件开发的方式来解决硬件开发的问题。

    刚才我说了板卡烧写,其实这个rap deploy就是板卡烧写的过程,为什么把板卡烧写写在前面?十几年前我的一个朋友跟我说他做了一个硬件开发,他们的工作特别好,每天烧一次板子,基本上要用上半个小时的时间。因为你作为一个软件开发者,你可能会很费解,为什么烧一块板子需要半个小时的时间,因为他们用串口的连接方式,每秒大概可以传输5.7kb,然后一个应用经过精简以后可能有几十兆、上百兆的大小,传输一次就需要那么长的时间。

    为什么一个应用会有几十兆上百兆的大小呢?原因就是因为他们所谓的应用,实际上里面包含各种各样的驱动,各种各样的系统。相当于你每次重新烧板的过程就等于重装一次Windows了,如果这么一对比就知道这个过程多漫长了。对于我的朋友来说,每天只要很努力的调试几次,改打印命令传上去一次,你一天部署几次就可以下班了,这样的研发效率对于我们软件程序员来说可能是不可理解的,但是这是真正存在的嵌入式开发领域现实的问题。

    而现在我们做的命令,基本上rap deploy如果在网络一切都畅通的情况下是秒级的,我们很不幸的让开发者大幅度的提高了工作频繁的程度,原来你把时间让给部署了,你每天可以跟经理说我在部署,现在经理会问你,本来就是秒级部署,你用什么部署,你该干活就干活去。所以如果你没有这样一个经历的话,你很难想象这样的开发对于生产效率的提升。可能如果你有类似的经验的话,比如说像我很早期用Java开发的时候,每次做应用服务器的部署也是非常头疼的问题,如果你有类似的现象你会理解类似的部署到底意味着什么。

    扯了很多无关的事情,下面总结一下我们要做Ruff的应用开发基本的流程,基本上我们会围绕着开发机,就是你的PC机上来做你的开发,当你需要一些驱动或者是模块的时候,实际上它会通过我们的软件仓库下一批驱动到你的电脑上。因为你想一下,send方法从哪儿来的,实际上都是我们写好的驱动。任何一个驱动都是由JavaScript写成的,你现在终于理直气壮的说,我可以是全栈开发工程师了,因为你可以写驱动了。

    前不久刚看了一个网上的贴子,各种各样的软件程序员调侃的书。其中一个就是用 JavaScript 写驱动,我们真的让它变成了现实,我很高兴的转了这个帖子告诉大家,这个事是真的。

    写完了驱动以后,你把应用写好了以后,你可以把应用部署到Ruff的开发版上,然后就可以调试了。

    这里面我们自己开发了一个工具,它做了什么样的事情呢?比如说它把你的项目初始化过程做了,包管理、设备管理、应用管理和部件的管理工作都做了,这样让你所有的命令都可以在命令行里面完成。对于程序员来说,我不知道各位理不理解能够在命令行里面做完所有的事到底意味着什么,对于一个高效程序员来说懂得命令行操作是非常关键的步骤,这样意味着你所有的操作是可以集成在开发工具里面的。

    刚才给大家介绍了整个Ruff基本的开发过程,我还想说一件事是关于测试。对于很多开发者来说,尤其对于硬件的开发者来说,我不知道各位有没有这样的理解,测试意味着什么。我刚才说了可能烧写一次板卡,看一下日志,那个东西不叫测试,而且整个过程叫调试。而且在那样悲惨的过程中,你浪费了大量的时间,因为你真的要做的其实你要测的是你的应用逻辑,而不是你整个系统是不是工作的。

    如果能在硬件开发领域里面做单元测试的话,会大幅度的提高应用本身的开发效率,这是我们除了提供基本的开发框架以外,提供了测试框架的重要原因。因为我个人自己之前,我刚才提到了我是做敏捷软件开发有很长一段时间的历史,所以对我来说不能测试的软件写起来基本上是属于提心吊胆的状态。所以我们在做Ruff项目第一天起就开始思考如何做测试这个事。所以在这里面我们除了基本的应用框架以外,我们还写了测试的框架。

    这里面我给大家准备了一个小小的视频,大家来看一下用Ruff除了做我刚才说的非常简单的东西以外,还可以做了一些什么。
    这是一个车,这是什么呢?这里面用Ruff做,这里面绑了一块东西,这是Ruff的开发板,这个地方是什么呢?为什么你看手往那里一放,车可以拐弯,这个是红外传感器。当你感受到有人的时候,程序本身的作用就是把它转头,所以你看车手一放可以来回转,就这样一个程序大概写了多少代码,大家想一想它大概写了多少代码?

    其实最核心的代码就是这几个,上面可能实现了一些用网页控制的功能,最核心的代码其实就这么两行。你可以实现刚才那样一个效果。
    我们刚才说了有了Ruff以后,作为一个软件程序员,你可以具备一定的硬件开发能力。然后让你的应用上的创意可以更好的做出原型来,但是怎么样投入到生产中呢?这是我们跟大家分享一下,如果你想做生产,你还会遇到什么问题。

    0_1470723879014_upload-4c7f178f-481b-4f33-ab2b-9845d72aa3a2

    刚才跟大家说你只要想学硬件开发,你已经遇到了一大堆的名词,你要接着做名词,你会遇到另外一大堆名词,比如说Layout、工业设计、PCB、MCU,从我的角度来说我也不想让大家每天面对这些问题,这是我们做Ruff未来要解决的问题,这个时候我会谈到关于Ruff未来的状况。

    其实一方面我们现在正在做的是,我们让Ruff具备生产的能力和未来可能会提供相关的服务。比如说刚才提到有一个词叫MCU,你可以把它理解成是更低功耗的CPU,我们希望把Ruff跑在更小的板子上,而对程序来讲可能一行都不改平滑迁移过去。对现在的硬件开发来说,原型设计需要写一套程序,到了实际生产环境又需要写一套程序,发现几个来回下来程序改的满目全非,所以基本上很难做到平滑迁移。所以我们希望Ruff写一套程序以后可以用在多个地方,这样对生产效率的提高也是极大的促进。

    对于很多做软件的人来说,你基本上没有机会接触硬件。比如说供应链重新设计PCB的板卡,基本上很难说你现在为了做实验姓的项目,你花钱组织团队做这个事情,这是基本上不可能的。我们希望未来Ruff能够提供这样的服务,能够让更多的软件开发者实现把你自己的想法,由一个想法变成原型,由一个原型变成真实可见的东西,这是我们接下来要做的事情。

    还有就是连接,连接是指什么呢?其实大家已经看到了,对于软件程序员来说看到连接很简单了,但是对于硬件程序员来说连接是非常痛苦的过程,为什么这么说呢?因为你们看到的软件连接过程是一个调用,对于硬件来说他要看到的是一个移植的过程,每一个硬件即便再熟悉的协议栈也要重新做一遍,这也是非常耗时的事情。不光如此,他可能对于每一款硬件来说,他几乎要把整个系统重新移植一遍,所以这几乎是崩溃的事情。

    接下来我们来提供了可能,包括我们帮你把连接服务建立起来,更进一步现在很多团队说我要开发一个智能硬件,你会想到什么,现在基本上你能想到的智能硬件是手机查这个查那个,控制这个,控制那个。但是这意味着你要做一个所谓的智能硬件项目,你要解决的是要有一个硬件团队,你要有一个能开发服务器的团队,你要有一个做手机的团队。

    这样的事情几乎是非常高成本的事情,我们内部现在正在研发的除了基本的SDK以外,我们还在研发连接的解决方案,让你可以通过 JavaScript全栈把所有的东西开发出来,让你不雇佣程序员就可以搞定,而不是让你雇佣完全不用说话的团队工作。

    所以我们做Ruff的时候,最初给大家设定的目标,就是简化智能硬件的开发,降低物联网开发的门槛。现在来说,我们所有的努力也在朝着这个方向走。

    0_1470723926171_upload-01e60362-35a5-4ac1-a297-1418fa6d4ea1

    这是Ruff的公众号,我们也会定期的发布一些教程也好、文章也好,你也可以在这里面买到Ruff的开发板。因为之前我个人跟一些场合做Ruff的分享,很多人说是不是为了卖开发板,其实也不是。其实我们把Ruff的定位是定位成一个操作系统,就像安卓一样,既然是一个系统,它主要的作用是跑在不同的硬件上。事实上我们也发布了基于树莓派的移植系统,如果你不想买Ruff没有关系,你不用额外购买任何的东西。所以对于我们来说,能够让更多的软件程序员进入到硬件的开发领域里面来,这才是我们真正想做的一件事,希望跟大家一起从软件的虚拟世界跨入到硬件的真实世界,让那帮宅在家里的程序员能够进入到真实的生活里面来,这是我们希望Ruff能给世界带来的改变,谢谢大家。


登录后回复
 

与 青云QingCloud 社区 的连接断开,我们正在尝试重连,请耐心等待