前言:转向Android智能硬件开发近一年了,一路过来也经历过几个大大小小的项目,从对Android智能硬件一无所知到现在算是略有小成,期间踩了很多坑,也接触到了许多非Android方面的知识,现用文章的方式将之记录下来,与大家分享。
1.Android智能硬件的定义与应用领域
关于智能硬件的定义,以我理解的角度来看,首先这是一个不同于移动手机的硬件,它本质还是一个可触碰的实质物体;其次关于智能,只要是基于Android系统开发的硬件就可称之为智能,因为智能硬件最关键的特性就是与外部连接通信,也称之为物联网,而Android系统自带优秀的外部连接通信体系。
我们最常听到与见到的智能硬件有手环、智能音箱、智能家居这些比较成熟的消费级商品,这些智能硬件大部分都是没有界面的,与我从事的领域有所不同。没有界面的智能硬件大部分都不是Andriod系统,而有触屏界面的智能硬件我敢说80%以上都是Android系统,因为Android的交互体系绝对是最好的。
市面上成熟的Android智能硬件有:手持POS机、自动售货机、政务自助机、人脸识别门禁、收银机、汽车多媒体、电子班牌、快递柜、影院取票机、广告视频机等等。
2.一款智能硬件产品开发的全流程
- 导入需求,分析确定需求细节,讨论方案的技术可行性。
- 确定项目负责人、产品经理、硬件工程师、软件工程师、结构工程师、UI设计师。
- 由需求确定使用哪些外设,对外设进行选型,需充分考虑性能、质量、结构设计、价格、供应商支持度等各方面的因素。
- 优先确认使用什么Android主板,确认主板与外设选型后告知结构工程师进行结构外形设计。
- 硬件工程师负责外接设备的控制板开发并提供接入协议,硬件工程师还须将外设接入Android主板的线材适配好。
- UI设计师提供界面给软件工程师(Android),开始进入进行软件开发阶段。
- 产品样品建模制作出外壳,打磨、喷漆后进行所有元件的组装。
- 样品烧入程序,开始交予测试。
- 程序bug修改,稳定性测试。
- 所有测试通过后,撰写用户文档与操作手册。
- 一款智能硬件样品全部制作完毕。
3.智能硬件开发所涉及的技术体系概述
- Android UI
- 列表(RecycleView)
- 弹窗(Dialog)
- 动画(Animation)
- 文字与按钮(TextView)
- 手势(Gesture)
- 外部通信
- 串口通信(UART)
- 以太网
- Wifi、热点
- 4G
- 蓝牙
- USB
- NFC
- I2C
- GPIO
- 存储
- TF卡
- U盘
- FTP
- Linux系统
- 脚本
- 点亮屏幕
- 固件升级
- NDK
- 音视频播放
- 设备通讯协议加密
- 接入已有的C库
- 语音识别
- 人脸识别
- 外接设备
- 二维码
- 摄像头
- 红外感应器
- 喇叭、麦克风
- 触摸屏
- LCD液晶屏
- 打印机
- NFC模块
- IC类读卡器
4.关于主板选型
Android主板的选型一定要放在首位,因为这是整个产品的控制中心,核心元件,如果不能自己定制主板,那就只能依赖于供应商提供方案。现行市面上非常多做安卓工业主板的,不愁找不到主板,但想要很特殊的定制可能会比较麻烦,除非你的量很大,否则只能用人家的标准板。依赖供应商还有一个特别麻烦的事情,就是系统功能定制的沟通,这是一个特别漫长而痛苦的过程。
4.1 Anroid系统在智能硬件中所必要的功能
结合多个项目的经验,总结出智能硬件在安卓系统中所基本必要的功能。
序号 | 功能 | 说明 |
---|---|---|
1 | 开机自启 | 智能硬件一般只运行一个应用,且开机就要自动打开 |
2 | 保证应用永远在前台运行 | 让用户永远不会看到除了应用之外的其它安卓界面 |
3 | 有接口设置系统时间 | 有些局域网场景无法连接外网,需要同步局域网服务器时间 |
4 | 定时开关机(带RTC电池) | 为了让系统更好运行,可能需要每隔几天重启一次 |
5 | 静默安装应用,完成后直接拉起应用 | 更新安装应用过程必须是无感的 |
6 | 系统固件更新接口 | 将新的系统固件放入系统后能用有方法更新 |
7 | 支持U盘、TF卡且有路径检测 | 对于非联网管理的产品必须要能检测到外部存储插入 |
8 | 设置静态以太网IP接口 | 对于某些依赖于IP地址进行管理的产品必须要能设置IP |
9 | 开启/关闭背光电源接口 | 有些场景可能要求节能环保,关背光很必要 |
10 | 读写IO口接口 | IO口是控制外设开关的关键功能 |
11 | 设置屏幕显示方向 | 横竖屏根据项目会有不同要求 |
4.2 主板CPU芯片的选择
CPU芯片是一块主板最核心的元件,对于智能硬件而言CPU价格是不能太高的,不然会导致产品成本过高竞争力下降,但CPU性能又不能太差以让产品毫无竞争力可言。从我观察的情况来看,现在市面上的智能硬件基本是三家芯片厂商占据了绝大部分市场,它们分别是:
- 瑞芯微 Rockchip,简称RK
- 全志 AllWinner
- 飞思卡尔 FreeScale
瑞芯微是我接触比较多的,在百度搜安卓主板出来的广告厂商基本都是采用瑞芯微方案的,总体来说瑞芯微方案是最成熟的。
全志的安卓主板给我的感觉就是很便宜但系统都是4.2或4.4,说实话有点落后时代,不是5.0系统以上的主板我都不想碰,界面太丑系统还有点卡。
最后关于飞思卡尔,这是一个国外厂商,我手上还没接触过这个芯片的板子,很少见搭载这个芯片的安卓主板,也许在某些特定应用场景才会考虑这个芯片吧。
下面重点介绍下瑞芯微(下面简称RK芯片)系列4款常见的芯片。
芯片 | 定位 | 特性 |
---|---|---|
RK3188 | 低端 | 四核Cortex-A9(32位),频率最高1.6GHz,四核Mali-400MP4 GPU,支持OpenGL ES1.1/2.0,1080P视频编解码 (H.264) |
RK3288 | 中端 | 四核Cortex-A17(32位),主频最高达1.8GHz,Mali-T764 GPU,支持OpenGL ES 1.1/2.0/3.1, OpenCL, DirectX9.3,1080P视频编解码 (H.264/265) |
RK3368 | 中低端 | 八核64位Cortex-A53,主频最高达1.5GHz,PowerVR G6110 GPU,支持 OpenGL ES 1.1/2.0/3.1,OpenCL,DirectX9.3,1080P视频编解码 (H.264/265) |
RK3399 | 高端 | 双Cortex-A72+四Cortex-A53大小核CPU结构,主频最高达1.8GHz,Mali-T864 GPU,支持OpenGL ES1.1/2.0/3.0/3.1,OpenVG1.1,OpenCL,DX11,1080P视频编解码 |
目前RK3288工业主板的价格大概在350~500 之间,RK3399价格在500~700之间,RK3188比3288便宜,RK3368介于3288与3399之间。
对于绝大多数应用场景而言,RK3288绝对能满足需求,价格也比较适中,系统一般是Android5.1不用进行运行时权限适配。RK3399主要用于对于运算能力要求比较高的场景,比如人脸识别,3399还有一大优势就是板子面积相对而言比较小。我目前基本都是采用3288进行开发的,对于智能硬件而言成本还是首要考虑因素,毕竟制造业利润低,苦笑~
下图是一块3288的主板示意图及规格说明
5.关于串口通信
串口通信是Android智能硬件开发所必须具备的能力,市面上类型众多的外设基本都是通过串口进行数据传输的,所以说不会串口通信根本就做不了智能硬件开发。
首先来看一张RK3288的架构图,在ConnectActivity那一个模块可以发现UART*5的字样,这就表示3288有5个串口可用,其中串口2一般是调试口不开放使用。
5.1 UART定义
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行异步收发协议。
UART串口有三种工作方式:单工、半双工、全双工。硬件连接比较简单,仅需要3条线,注意连接时两个设备UART电平,如电平范围不一致请做电平转换后再连接,可参考此文章。
我们常见的串口通讯设置的界面如下所示,
主要有下列几个参数;
- Speed(baud) 波特率
- Data bits 数据位
- Stop bits 停止位
- Parity 奇偶校验位
- Flow Control 流控
我们的设置基本都是8位数据位,1位停止位,无校验无流控,就如上图所示。对于程序开发而言,主要关注的参数就是波特率。
上述的那篇参考文章博主关于波特率是有点误解的,他将比特率理解成波特率,其实两者是有区别的。
波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。
1波特即指每秒传输1个码元符号(通过不同的调制方式,可以在一个码元符号上负载多个bit位信息),1比特每秒是指每秒传输1比特(bit)。单位“波特”本身就已经是代表每秒的调制数,以“波特每秒”(Baud per second)为单位是一种常见的错误。
按照上述的基本设置,其实一个码元总共传输了10个比特,1个起始位+1个停止位+8个数据位,如波特率为9600,那每秒一共传输了9600*10 = 96000个比特,换算成字节为12000 byte,约合11.72kb。
需要注意的是这12000byte指的是串口实际一共传输的数据位,但对于我们程序而言,真正能处理的数据就是除去起始位与停止位的数据位,对于传输8位数据位的设置而言,波特率是多少则传输的字节就是多少。如9600的波特率表示每秒传输9600个字节,每毫秒9.6字节。
安卓主板中一个串口端子的定义如下图所示
几乎所有安卓主板上的串口都是这种4pin的形式,这里有一个特别重要的点,就是对外设接线时,RX要对上外设的TX口,TX则对应RX口,否则是接收不到数据传输的。
在我所接触的众多外设中,安卓的常用串口有三种标准接口。
- RS232
- RS485
- TTL
UART所指的是硬件接口,是硬件层次的描述。而TTL与RS232、485则指的是数据传输的电平标准,计算机的存储单位是二进制位(bit),也就是0和1,而0和1怎么用电压来表示呢?不同的表示方法于是对应了不同的标准,这就是TTL、RS232这些电平标准之间的区别。
所有CPU芯片的UART数据传输的电平都是采用TTL标准的,我们所看到的安卓主板上RS232或485的接口都是要再需要经过一次电平转换才能与CPU进行通信的。可以这样说,安卓主板CPU直接引出来的串口管脚都是TTL标准的,如需要其它的接口则要中间再增加一个电平转换芯片以满足要求。
参考文章:
https://www.jianshu.com/p/f1bfc7f6059b
https://blog.csdn.net/zhuyongxin_6688/article/details/78001767
5.2 三种UART接口介绍
TTL
TTL(Transistor-Transistor Logic,晶体管-晶体管逻辑),TTL电路的工作电压是5V,它的输出可以是高电平(3.6V)或者低电平(0.3V)。为了用这种模拟量的电压来表示数字量的逻辑1和逻辑0,TTL电平规定:
- 对于输出电路:电压大于等于(≥)2.4V为逻辑1;电压小于等于(≤)0.4V为逻辑0;
- 对于输入电路:电压大于等于(≥)2.0V为逻辑1;电压小于等于(≤)0.8V为逻辑0;
参考:https://blog.csdn.net/wofreeo/article/details/82389002
RS232
它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”,该标准规定采用一个25个脚的DB-25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。
后来IBM的PC机将RS232简化成了DB-9连接器,从而成为事实标准。而工业控制的RS-232口一般只使用RXD、TXD、GND三条线。如下图所示。
采用负逻辑,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V。选用该电气标准的目的在于提高抗干扰能力,增大通信距离。RS -232的噪声容限为2V,接收器将能识别低至+3V的信号作为逻辑“0”,将高到-3 V的信号作为逻辑“1”。
全双工通信,传输距离较短,其通讯距离小于15 m,传输速率小于20 kb/s。
RS485
RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义:正电平在+2V~+6V之间,表示一个逻辑状态;负电平在-2V~-6V之间,则表示另一个逻辑状态;
数字信号采用差分传输方式,即是A-B两者的电压差用以表示逻辑状态,能够有效减少噪声信号的干扰。
RS-485工业总线标准能够有效支持多个分节点和通信距离远,总共可接收32个设备,且对于信息的接收灵敏度较高,均采用屏蔽双绞线传输。采用半双工(两线制)最大传输距离约1219米,传输速度最高达10Mbps。