我的物联网大学【第二章】:Luat的出世
壹 启动火种
有一位软件行业的大神,名字叫做许小刚。
小刚是一位憨厚的年轻的码农,嵌入式、后端、前端,无所不能,是一个很牛的物联网全栈工程师,也是一家物联网软件公司的创始人兼CEO。
有次跟我、老陆、小强闲聊的时候,小刚憨憨的笑着说:“你们应该开源你们的那一套Lua开发应用的宝贝,并且给他取个名字。”
一直以来,合宙的应用开发工程师,喜欢用Lua语言来做定制产品的应用逻辑开发。
无论是儿童手表,还是GPS Tracker,还是给客户做其他的物联网产品定制,一直使用的都是Lua语言,以追求开发和维护的最低人员成本,以及需求迭代的高效率。
“开放出来有什么好处?” 老陆很警觉的问。
“至于有什么收益,我也不清楚。反正开放出来总是没错的,只有好处,没什么坏处的。”小刚依旧憨笑着说,并且笑的越来越灿烂了。
“不过,至少你们得给他先起个名字,才能开源。”这次小刚说话的口吻,好像是教导三个6岁的孩子。
我们三个带着满肚子的疑惑,回到了公司。
反正也没什么产品方向,先听小刚的吧,起码这人够憨厚,不会害人的。
但是起名这事情,对一群技术男而言,着实有点为难,几番讨论也没有合意的。
终于一次头脑风暴,小强灵光一闪:“我们用的是Lua语言,AT指令是模块的象征,就叫做Luat吧”。
所有人一致同意。
工程师的认同,只需要一个简单的逻辑。
就这样,合宙启动了 Luat 开放平台,以及依托于Luat平台的 GPRS 通信模块业务。
说起来,合宙团队从2006在龙尚开始就涉足通信模块业务,只不过以前做的都是无线固话垂直行业的模块,类似于目前广和通从事的笔电的上网模块,深耕一个行业,不做通用行业的覆盖,所以在物联网通信行业一直默默无闻。
因此,启动 GPRS 通信模块,相当于是合宙团队承认了自己的不足,回归到模块的老本行。
虽然是模块老本行, 但是却进入了通用模块这么一个全新的市场。
这个市场,是合宙团队完全陌生的。
标准模块市场在2016年的两个主流玩家是SIMCom和移远,这两个厂商的目标是物联网市场全覆盖。其他的厂家是局部覆盖,同时也往全行业覆盖去努力。
合宙作为新进入的玩家,几乎是没有任何的客户积累的,比起刘姥姥进入大观园,还差了两截。
最起码,刘姥姥还能看到大观园的具体形象。
而合宙,连客户群是谁都不知道,更别提注重客户体验了。
直到现在,合宙的很多同学依然记得两件事:
第一个事情,第一款Luat模块的外观:
这个模块的外观,跟合宙当时的认知特别匹配:不懂产品设计,不懂市场需求,不知道客户需要什么。
好在,迈出了第一步。在线上开始销售这款模块,勇敢地展示了自己。
虽然浅薄,虽然丑陋,
但是,又有谁的青春不傻逼呢?
第二个事情,Luat模块的第一个客户:
第一个Luat模块订单,江西省一个县城的客户给的。而这个客户的公司,员工很可能当时只有他一个。
客户收到货的时候,已经是春节前夕的腊月二十六。客户很兴奋地在技术群说,
终于发现了一个能用脚本开发应用的模块,太棒了!
接下来的几天,客户一直非常活跃的跟合宙的工程师聊怎么写代码。
合宙的团队也很兴奋。
从腊月二十六,中间除夕夜也不间断,一直到春节期间,都在QQ群里面跟客户聊天,真是相见恨晚。
在海聊的的这一个星期里面, 客户完成了产品的软件开发。
是的,使用的就是 Luat 的脚本开发。
这个客户的公司目前有多少员工,我们依然不清楚;
我们只知道跟合宙合作一年后,他的座驾,由奇瑞换成了宝马。
而且,在随后的两年内,涌现了很多厂商抄袭他的产品,从而使合宙的模块莫名其妙的垄断了这个细分行业。
这客户是94年的年轻小伙,典型的小镇青年。
直到今天, 这位小镇青年企业家,仍然是Luat的忠实用户,以及合宙最好的朋友。
贰 通过Luat认识市场
春节过后,不断的有人购买合宙的模块,几乎每天都能发出几单样品。
因为那个时候,GPRS模块这个品类,合宙是唯一的行业卖家。合宙Luat的GPRS模块,几乎独占了淘宝的全部流量。
这个情况, 大概持续了半年。
半年之后,淘宝逐渐有其他的卖家开始介入,但是也大多是模块厂家的代理商,对合宙几乎没有构成太大威胁。
对合宙的发展造成威胁的,都是合宙自己。
购买了样品的用户,经过两三个月的测试,有一部分开始能够成百上千的采购模块;
也有客户,开始上门谈价,咨询几十万片模块,能够给到什么样的价格支持;
更多的客户,以为合宙就是一家淘宝店。因为不放心,登门拜访,想查看是否真的是一家正规公司。
无论如何,合宙模块的销量,慢慢的、稳定的,开始在爬坡了。
由最初的样品销售,收款几十块上百块,逐渐发展到月销售额过百万,甚至几百万了。
每天查看QQ群增加的企业客户名称,回复群里客户提出的技术问题。看到客户批量提货之后心中暗生喜悦,也不由思考:
Luat的用户体验其实并不见得很好,问题也挺多,为什么会有这么多用户很支持呢?
合宙团队对这个问题,还是有一点清晰的认知。
并不是Luat 撞大运,恰巧有了这么多客户,而是通信模块这个产业,实在是有接近20年没什么技术上的进步,而Luat 踩对了这个技术进步的节奏,迎合了市场的潜在需求。
为什么这么说呢?
接下来我们将详细讲解通信产业的技术发展。
叁 神奇又辉煌的AT指令集
很久以来,通信模块的开发界面是AT指令集。
客户设备的主控MCU,按照约定的格式,发送AT指令给通信模块。模块执行通信服务,并应答结果,完成通信功能。
要实现这么个过程,主控MCU需要实现一个软件状态机,来维护多个AT指令的异步通信状态,这对于MCU的编程能力是有一定要求的,并且CPU的价格也往往不菲。
但是直到今天,AT仍然是各个模组厂家的主流使用方式之一。
为什么会是这个局面呢?
先从 AT 指令的来源说起。
在1960年代,互联网刚刚兴起的时候,网虫们通过计算机接入Modem(一般是电话线)上网,计算机跟Modem 的接口是RS-232串口。
这个时候,计算机很贵,Modem也很贵,上网费也很贵。贵到什么程度呢?一般美国人家里用不起,只能公款消费才能上得起网。
中国呢?
中国要等到90年代才能上网,现在还是60年代。
因为什么都贵, 所以RS-232 的支持都很完善,大多数是9针方式的通信。支持9针的串口,数据线跟信号线定义的很完善。通信之前,会先用信号线做好握手,然后再传输数据,要断线的时候,也是信号线做好断开的协商,然后再断开数据。
一切都是那么的和谐。
到了美国的70年代中期,个人电脑开始流行,这种电脑对于成本的要求很极致,像极了当前中国的硬件设备价格战。
为了降低成本,个人电脑就把串口做精简。接头虽然是9针,但是电脑主板系统实际上只支持5针,甚至3针,信号线被认为没啥用,做了大范围的删减。
这时候,有两个美国小伙进入了历史舞台。
这两个都是20多岁的年轻人:
一个叫做丹尼斯•贺氏(Dennis Hayes),另一个叫做代尔•赫斯林顿(Dale Heatherington)。
两个人是好基友,也都是互联网发烧友,经常在一起吃饭,一块谈人生,也一块做点新鲜玩意。
1977年,他俩先开发出来一款用于个人电脑的Modem,不是很畅销,原因就是上面说的,硬件接口不给力。
俩人花了接近一年时间思考解决方案,终于在1978年,他俩在吃饭的时候,想出了只用数据接口完成信令握手的方法,这就是AT指令的方法。
使用这种方式,两人推出了一款新型的调制解调器,叫做SmartModem。
因为很巧妙的只用数据线就完成了所有信号线的功能,所以可以完美适配所有的低端PC电脑。
这个叫做贺氏的小伙,很喜欢中国文化,给自己起了个中文名字,叫做贺丹毅,老婆也娶的是中国宁波的姑娘。
在1978年提出的这套AT指令,就已经通过著名的三个加号(+++)方式,从数据通信模式切换到命令控制模式。这种 AT 指令的通信方式,还能允许多台个人电脑共用一个 Modem上网,大大促进了低成本硬件的通信功能。
这个SmartModem很成功,于是这俩人注册了个公司,叫做贺氏(Hayes)公司,在Modem行业大火特火,应该是赚了不少钱。
几乎所有90年代上网的老网民,都用过Hayes的Modem。
Hayes猫拨号时发出的滋滋啦啦又叮铃叮铃的声音,承载着人们对于互联网另外一头未知世界的渴望。
虽然Hayes的Modem在业内取得了巨大的成功,但此后因为商业策略和运作模式问题,经营每况愈下。在1999年,Hayes公司破产关闭了,后来也失去这两个人的消息。
事了拂衣去,深藏功与名。也许美国贺小伙是归隐到宁波过小日子去了。毕竟,1999年,他才50岁。
但是,他对通信行业的影响,实在是太大了。
由于Hayes品牌的SmartModem太成功,其他的Modem厂家纷纷模仿AT指令集,甚至试图兼容Hayes的指令集,来分一杯羹。
后来的GSM通信时代,通信模组也是把自己作为一个Modem来对待,只是由电话线的通信承载,升级为无线的通信承载。
为了不改变用户习惯, 各个无线通信Modem厂家,也就是模块厂家,诸如wavecom、西门子、Motorola,都采用了兼容 Hayes 的 AT 指令集,并针对无线通信做了一些指令迭代。
这种通信的方式,有个前提,就是通信Modem 的价格很贵, AT 指令很方便提供给低成本的服务需求设备来使用Modem的服务。
从90年代到2015年之前,GSM模组的价格从3000多元,一路下降到百元左右。****但主控MCU的价格,下降更快。到2015年的时候,十几块的MCU随处都能买到。
低价的MCU,搭配高贵的通信模块,MCU通过AT去请求模块的服务。
通信模块是标准品,软件几乎不做更改;
MCU软件是定制品,软件围绕通信模块的特性来定制。
MCU的成本在整个系统的成本比重太低,所以省掉MCU的意愿并不强烈。
所以,AT指令曾经是很完美的使用方式,在无线模块领域也流行了20多年。
肆 OpenCPU需求的兴起
时光来到2015到2020这几年,通信模块的价格直线下滑。
GPRS模组从百元降价到了十几元,而4G模块的价格,从2015年的300多元,到2020年4G Cat1模块也几乎跌破了40元。
而2015到2020的这几年,MCU相对平稳。十元的MCU,可能至多下降20%到七八块钱,不太可能直接降低到一块钱。
这就给设备商带来了强烈的成本预期,模块价格的降低以及MCU的平价,使得设备的价格大幅度降低。突破一个门槛之后,物联网设备的需求迎来爆发。
一个小几十元甚至十几元的通信模块,还要搭配一个七八元的MCU。
而通信模块的运算和存储资源,是远远大于MCU的。
既然这样,为什么不去掉MCU,所有的任务交给通信模块,进一步降低设备成本呢?
事实上,这些年模块公司都在尝试省掉MCU这个命题。省掉MCU,设备的主板的成本就显著降低了,在出货量可观的情况下,就有可能大幅度提升利润啊。
Wavecom在2010年之前就推出了OpenAT的解决方案,SIMCom、移远都有自己的OpenCPU的软件开发包。
但是,很多年过去了,AT 指令的开发方式,仍然是这些模块公司的主要开发方式。使用OpenCPU 量产的客户寥寥无几,为什么?
因为C语言框架的OpenCPU开发,在客户进行调试debug的时候,需要模块厂家提供大量的人力进行技术支持;而使用模块的公司多如牛毛,全国少说也有三五十万家,任何一家模块公司都无法承担如此高成本的OpenCPU技术支持。
所以,AT 指令虽然低效,但其技术服务成本也很低,没有其他的架构能撼动AT指令的地位!
这个时候,Luat悄然出现了。
Luat采用脚本开发应用,开放了源码,用户的学习成本极低,甚至是Web后端和前端工程师都能参与Luat的嵌入式开发。
用户可用无痛的方式,大大方方的拿掉MCU及其外围电路,仅仅使用低价的通信模块。通过Luat开发业务逻辑,完全接管设备的功能控制,做到成本的极简。
当某些设备商采用这种极致低成本方案的时候,高成本的方案,就会逐渐被淘汰出这个市场。
尝到甜头的Luat 客户,心情肯定无比是舒畅的。
伍 成长的烦恼
Luat客户陆续带来的各种反馈,就像初春的风,凉爽又不失温暖,猛烈又不失温柔。
这样的感受,充满了整个 2017年。
原来,物联网模块的销售,也不是那么的困难。
原来,站在风口上,猪都能飞起来,这话是真的。
祸兮福所倚,福兮祸所伏。
随着销售量的一点点增加,合宙的诸多问题,迅速暴露了出来。
当一个产品品类越来越得到市场认同, 企图占有市场主流份额的时候,市场对这个产品的要求会指数级增加,要想真正占有主流份额,必须能够跨越高标准高要求这道坎。
那么, 市场对 Luat 提出了哪些要求呢?
随着客户数量的增加以及销售额的增长,合宙团队无知的弱点,越来越暴露无遗。
问题一:没有供应链管理体系,运营水平就像原始人
因为对销售计划完全没有概念,也就没有进行过任何的排产;最初的前面半年,销售出去的开发板,几乎都是当时担任运营老大的老陆一个器件一个器件,手工焊接出来的;
在客户需求指数级上升的时候,合宙的交货能力是无法跟上的。
合宙需要向客户证明,合宙有大规模高品质供货的能力。
问题二:模块的固件不稳定
有些客户用Air200可以稳定出货,没有遇到什么问题。
但是这个模块并没有经过全面的测试,也没有经过客户的大批量验证, 因此,总会有一些客户的使用场景遇到不稳定的问题。
固件版本的不稳定,一直伴随了Air200的整个生命周期,虽然品质在不断提升,但是直到停产,问题也没有完全解决。
直到合宙推出下一款 GPRS 模块——Air202, 固件稳定性的问题, 才得到了彻底的解决。
问题三:团队内部对于 Luat 开放的理解不一致
在Luat开放的最初2年,合宙团队并没有进行认真的内部沟通,也没有去认真探讨Luat开放系统的市场价值在哪里。
因此,合宙的软件研发团队在最初的2年,始终没有弄明白,Luat有什么价值。
所幸的是,即使不知道价值所在,合宙Luat 的软件研发团队, 一直在兢兢业业的开发、除 bug,使得软件的稳定性日渐提升。
但是,这种对于目标的不理解, 也必然会造成客户服务跟研发的脱节。
问题四:支撑文档不完善
合宙的工程师团队,一直以来,都是只做开发,不写文档。
这是因为,合宙的管理层和工程师,并不理解写好文档的意义在哪里。
文档的不完善,始终被 Luat 社区的网友不断诟病,但是长期没有得到很好的改善。
问题五:技术支持的无法持续
随着Luat用户的增加, QQ群里面的人,从几十人,到几百人,到几千人。
几百人的时候,合宙的技术支持工程师,从早上8点多,到凌晨一两点钟,持续不断回答问题, 建立了良好的社区口碑。
但是人数过千之后,再有耐心的工程师也会崩溃。
然而,找不到更好的解决办法。
就是在这种相当低效的运营水平之下,合宙度过了2017 年。
这一年,合宙的销售额仅有2400万元, 是2016年的三分之二,原因就是合宙砍掉了其他业务,仅仅保留了GPRS模块业务。
这2400万元销售额,几乎都是GPRS通用模块的销售额, 是合宙进入通用模块赛道的第一份成绩单。
在这一年中, 除了 2400万元的惨淡销售额之外,还收获了以下成绩:
建立了超过3000人的社区:
这个社区,几乎都是 Luat 的用户,大多数是物联网企业的工程师。
他们被Luat的简洁开发所吸引,加入到Luat开发的大家庭;同时,他们也忍受了Luat文档的不完善,固件质量的不稳定,但是绝大多数坚持留了下来。
最初的这 3000人, 是合宙Luat最亲密的朋友。
合宙团队逐渐意识到产品品质的重要性:
最初半年发出去的货,经常会出现品质故障,不是固件不稳定,就是模块的 IMEI 贴错了,或者是工厂没有校准就出货了。
产品的品质控制,成为最急需解决的问题。
不提升品质,就无法持续发展。
带着诸多的问题以及满满的收获,合宙团队怀着复杂的心情,进入 Luat 第二年。
2018年,又会有哪些挑战?
- 本文内容选自 -
合宙CEO秦鹏的最新作品《我的物联网大学》
第二章 Luat的出世
未完待续,敬请关注
点击查看
我的物联网大学【第二章】:Luat的出世的更多相关文章
- 《Node.js 高级编程》简介与第二章笔记
<Node.js 高级编程> 作者简介 Pedro Teixerra 高产,开源项目程序员 Node 社区活跃成员,Node公司的创始人之一. 10岁开始编程,Visual Basic.C ...
- C语言编程入门之--第二章编译环境搭建
第二章 编译环境搭建 导读:C语言程序如何工作,首先需要编译链接成可执行文件,然后就可以运行在不同的环境中,这个“环境”的意思就是比如说,电脑,手机,路由器,蓝牙音箱等等智能设备中,其中编译器启到了关 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- Jenkins入门系列之——02第二章 Jenkins安装与配置
2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...
- Python黑帽编程 2.0 第二章概述
Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- Asp.Net MVC4 + Oracle + EasyUI 学习 第二章
Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...
- 数据结构与算法分析C++表述第二章编程题
把昨天看的第二章巩固一下,做一做编程习题. 2.6: 第一天交2元罚金,以后每一天都是前一天的平方,第N天罚金将是多少? 这个题目和2.4.4-3介绍的幂运算基本一致.若按相同的递归思路分析,比那个问 ...
随机推荐
- 计算机网络-OSI参考模型
通信分层的好处 1.每一层的更改不会影响其他层2.有利于不同网络设备厂商生产出标准的网络设备 分层方法(比喻) OSI参考模型
- 精选Hive高频面试题11道,附答案详细解析(好文收藏)
1. hive内部表和外部表的区别 未被external修饰的是内部表,被external修饰的为外部表. 区别: 内部表数据由Hive自身管理,外部表数据由HDFS管理: 内部表数据存储的位置是hi ...
- SpringBoot邮件报警
SpringBoot邮件报警 一.介绍 邮件报警,大体思路就是收集服务器发生的异常发送到邮箱,做到服务器出问题第一时间知道,当然要是不关注邮箱当我没说 二.配置邮箱 (1).注册两个邮箱账号(一个用来 ...
- C++逆向分析----虚函数与多层继承
虚函数 C++通过关键字virtual来将函数声明为一个虚函数.当一个类包含虚函数后编译器就会给类的实例对象增加一个虚表指针,所谓的虚表指针就是指向虚表的指针.虚表就是一张地址表,它包含了这个类中所有 ...
- MFC对话框不能使用菜单更新宏ON_UPDATE_COMMAND_UI
菜单更新宏的原理 更新处理宏的工作原理是基于框架窗口类的.MFC中对话框菜单更新宏的原理是:当我们使用从CFrameWnd框架窗口类中派生的类创建窗口时,当我们单击菜单且菜单还未弹出前会产生WM_IN ...
- python爬虫——抖音数据
最近挺火的抖音短视频,不仅带火了一众主播,连不少做电商的也进驻其中,于是今天我来扒一扒这火的不要不要的抖音数据: 一.抓包工具获取用户ID 对于手机app数据,抓包是最直接也是最常见的手段,常用的抓包 ...
- copy函数与ostream_iterator、reverse_iterator
#include <iostream> #include <iterator> #include <vector> int main() { using names ...
- Envoy:开启访问日志,access_log
access_log: - name: envoy.listener.accesslog typed_config: "@type": type.googleapis.com/en ...
- [刷题] 剑指offer 面试题18:删除链表节点
要求 给定单向链表的头指针和一个节点指针,在O(1)时间内删除该节点 常规思路:从头节点a开始顺序遍历,发现p指向要删除的节点i,然后把p的m_pNext指向i的下一个节点j,时间复杂度O(n) O( ...
- linux中级之lvs配置(命令)
一.nat模式配置 环境说明: DS:nat网卡(自动获取也可以,充当vip): 192.168.254.13 255.255.255.0 vmnet3网卡(仅主机): 172.16.100.1 25 ...