1、概述
智能硬件软件三套,包括:
1、智能硬件固件,智能硬件操作系统一般是Android,Linux和RTOS(如freertos)。这里说的智能硬件固件是:Android系统的launcher app,linux系统的主应用程序,RTOS上的完整固件。
2、APP是指智能硬件配套的APP,可以说手机APP,小程序或者公众号。
3、admin,后台管理系统,一般实现智能硬件和APP的运营管理功能。
本文描述的一个批量量产智能硬件的软件,具体硬件形态是儿童陪伴机器人,操作系统是Android。主要阐述与一般APP相比、智能软件软件区别性内容,包括:项目软件架构,MQTT 协议参考。
2、软件架构
1、软件模块介绍
智能硬件软件一般都会有一个需求是APP与智能硬件之间全双工实时通讯,这个需求通常实现方案是:APP和后台,智能硬件与后台都实现长连接。在介绍长连接前,先总体介绍项目软件:
1、APP,是Android和iOS APP,技术方案是:采用cordova跨平台框架进行打包webapp 相关内容请访问 http://cordova.apache.org/ web渲染采用react框架 相关内容请访问 https://facebook.github.io/react/ ; UI采用ant框架 相关内容请访问 https://mobile.ant.design/index-cn 。 APP与后台的长连接是用socket.io实现的websocket,短连接是HTTP1.1。
2、admin是 node.js为webServer,react结合redux的前端框架进行封装,功能对于智能硬件后台管理来说,比较特别的功能是智能硬件mac地址的导入,导入mac的硬件才可以接入正常接入。
3、智能硬件固件,本项目是android系统,智能硬件固件包括andorid SDK以及luancher APP。Android SDK是支持智能硬件各类驱动的Android系统(如显示屏驱动,触控模块驱动,按键驱动等)。luancher APP与后台的短连接是HTTP1.1,长连接是MQTT协议。luancher APP主要实现智能硬件各类交互和业务功能,如类似智能音箱的语音交互功能,与APP的语音IM功能,点播音视频功能,系统升级功能等。另外,对于android系统带屏幕的智能硬件产品,一般也会集成不少APP来丰富产品功能。
4、Beckend 是后台的主要业务服务器,包括手机APP websocket server端,手机APP和智能硬件固件手机APP HTTP接口的业务,Rabbitmq的消息生产和消费。
5、MQTT server 是基于Rabbitmq配置而成,实现MQTT协议到后台消息队列的转换。
2、长连接
1、原理描述
APP与后台的长连接实现的方案很多,本项目的方案是websocket。智能硬件与后台采用的是mqtt协议,采用mqtt的原因是在智能硬件则更加通用,android,linux,rtos都有成熟方案支持mqtt。
APP启动连接到Backend的websocket server,APP即可与backend实时双通;
智能硬件接入到mqtt server需要user和password,每台硬件的mqtt user需要唯一,可以基于硬件mac地址生成user,password 可以用生成uuid。智能硬件设备启动后,按约定生成的mqtt user和 password登录到mqtt server,实现与mqtt server 实时双通。
通过智能硬件的mqtt user和APP的user的绑定,可以将智能硬件和APP关联起来。在产品需求中,智能硬件与APP是一对多的关系,即一台智能硬件可以绑定多个APP用户,通过APP进行绑定和解绑,所以mqtt user和 app user在数据库中是一对多关系。
2、数据库设计
以下是智能硬件(机器人)表,其中包含mqtt user和mqtt password
DROP TABLE IF EXISTS `robot`;
CREATE TABLE `robot` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(255) NOT NULL COMMENT \'机器人标识\',
`avatar` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'头像\',
`nickname` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'昵称\',
`birthday` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'生日\',
`gender` tinyint(1) unsigned NOT NULL DEFAULT \'0\' COMMENT \'性别:1男,2女\',
`version` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'当前版本\',
`alive_time` datetime DEFAULT NULL COMMENT \'最后**时间\',
`token` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'登录token\',
`refresh_token` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'刷新token\',
`expire_time` datetime DEFAULT NULL COMMENT \'最后有效时间\',
`mqtt_username` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'mqtt user\',
`mqtt_password` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'mqtt password\',
`ip` varchar(20) NOT NULL DEFAULT \'\' COMMENT \'机器人ip\',
`model` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'机器人型号\',
`public_id` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'机器人id\',
`sn_no` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'底部sn号\',
`mac` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'Mac地址\',
`update_time` datetime NOT NULL,
`create_time` datetime NOT NULL,
`delete_time` datetime DEFAULT NULL,
`anti_addiction_rest_duration` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `code` (`code`),
UNIQUE KEY `token` (`token`),
UNIQUE KEY `refresh_token` (`refresh_token`)
) ENGINE=InnoDB AUTO_INCREMENT=2410 DEFAULT CHARSET=utf8 COMMENT=\'机器人表\';
以下是机器人关系表,robot_id是机器人表的id,user_id的APP用户id。
DROP TABLE IF EXISTS `robot_relation`;
CREATE TABLE `robot_relation` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`robot_id` int(11) unsigned NOT NULL COMMENT \'机器人id\',
`user_id` int(11) unsigned NOT NULL COMMENT \'用户id\',
`relation` varchar(255) NOT NULL COMMENT \'关系类型\',
`update_time` datetime NOT NULL,
`create_time` datetime NOT NULL,
`delete_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `relation` (`robot_id`,`user_id`),
KEY `robot` (`robot_id`) USING BTREE,
KEY `user` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2596 DEFAULT CHARSET=utf8 COMMENT=\'机器人关系表\';
2、MQTT协议范例
1、向智能硬件单曲点播
服务端发送
字段 |
内容 |
说明 |
cmd |
playNetMusic |
命令 |
playIndex |
1 |
当前播放的索引值 |
listSource |
ximalayaFM |
列表资源来源 |
trackId |
4945682.mp3 |
列表单曲示记 |
fileSource |
ximalayaFM |
单曲资源来源 |
title |
1.为什么读唐诗以及如何参与该节目 |
单曲名称 |
type |
1 |
播放类型(1=网络专辑、2=网络专题、3=历史播放列表、4=自建列表、5=网络单曲、6=收藏夹、7=本地播放、8=下载单曲标记) |
lastOperationDate |
|
最后更新时间 |
url |
http://fdfs.xmcdn.com/group5/M09/2C/71/wKgDtVSs5ceiYxw4AED86dBrPGA859.mp3 |
资源URL |
duration |
426 |
时长(秒) |
listId |
323509 |
列表ID |
total |
0 |
列表单曲总数 |
pushDate |
2018-11-30 10:30:13 |
推送时间 |
实例:
{"playIndex":1,"listSource":"ximalayaFM","trackId":"4945682.mp3","fileSource":"ximalayaFM","title":"1.为什么读唐诗以及如何参与该节目","type":1,"lastOperationDate":"","url":"http://fdfs.xmcdn.com/group5/M09/2C/71/wKgDtVSs5ceiYxw4AED86dBrPGA859.mp3","duration":426,"listId":"323509","total":0,"cmd":"playNetMusic","pushDate":"2018-11-30 10:30:13"}
2、播放控制(上一首/下一首/播放/暂停)
1)、服务端发送
字段 |
内容 |
说明 |
cmd |
backward/ forward |
backward:下一首 forward: 上一首 playing:播放 pause: 暂停 |
实例:
{"cmd":"backward/forward/playing/pause"}
2)、设备端响应
字段 |
内容 |
说明 |
cmd |
changeNetMusic |
命令 |
direction |
forward |
方向(由微信发起) |
listId |
1ee070679209453c8aeed761707901c4 |
列表ID(由单曲点播提供) |
listSource |
ximalayaFM |
列表来源(由单曲点播提供) |
playIndex |
9 |
播放索引值(由单曲点播提供) |
total |
total |
列表总数(由单曲点播提供) |
type |
2 |
列表类型(由单曲点播提供) |
实例:
{"cmd":"changeNetMusic","direction":"forward","listId":"1ee070679209453c8aeed761707901c4","listSource":"ximalayaFM","playIndex":9,"total":26,"type":2}