Skip to content

easion/tvbox

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 

Repository files navigation

RaftLink信息发布终端 WebApp编程指南

xiaofu.png

Guangzhou Fuhai Software Technology Co., Ltd.
广州市孚海软件技术有限公司 出品

Company website http://www.wifi-town.com

Histroy

Version Revision Author Date
v1.0 First initial version Easion 2019-08-26
v1.1 增加多屏环境等API见2.18章及以后 Easion 2020-03-14

网站: kuaipin.wifi-town.com

默认测试环境最新版本请访问网址: https://kuaipin.wifi-town.com/kp/connect.html

1. 概论

RaftLink是广州市孚海软件技术有限公司的注册商标.

RaftLink信息发布终端是基于安卓的信息发布应用。用户可以自定义网页、幻灯片、视频三种类型的多媒体文件播出方式,默认的按照每6小时一个时间段,将全天划分成4个时间段,每个时间段可以播出不同的内容。

RaftLink信息发布终端可支持2个虚拟屏幕,我们建议用户采用WebApp的方式开发您的信息发布应用,可以通过WEB JavaScript代码实现不同屏幕的切换、播放单的读取和修改、文本转语音等功能。非常适合采用类似Angular/Vue/ReactJS+WebSocket技术方案构建的单页信息发布系统。

我们设备提供JavaScript转native功能,它类似微信公众号的JSAPI功能,通过JS代码调用原生底层实现,设备更偏重于WEB对底层基本功能的操控,从而快速完成产品的上线并快速迭代开发。

由于我们设备并非提供给普通用户,对JS调用权限并不检查调用者的来源,无需接口的签名校验操作。

RaftLink设备购买地址

1.导入基础库

导入基础库,可从 https://kuaipin.wifi-town.com 下载下面文件。

<head>
<--- 省略其他信息   --->
<script src="https://kuaipin.wifi-town.com/kp/dsbridge.js"> </script>
<script src="https://kuaipin.wifi-town.com/kp/fly.js"></script>
<script src="https://kuaipin.wifi-town.com/kp/engine-wrapper.js"></script>
<script src="https://kuaipin.wifi-town.com/kp/adapter.js"></script>
</head>

检查是否支持JSBridge

var engine = EngineWrapper(dsbAdapter)
fly.engine = engine;

if (JSBridge.hasNativeMethod("getSystemInfoSync"))
{
	console.log("Your browser was running JSBridge!");
}
else{
	alert("Your browser not supported JSBridge!");
}

2.编程API

JSBridge可支持事件回调

注册回调

function bridgeEventHandle(e)
{
	console.log("Event handle " + JSON.stringify(e) );
}
function onLocalServiceLost(e)
{
	console.log("onLocalServiceLost handle " + JSON.stringify(e) );
}
function onLocalServiceFound(e)
{
	//JSBridge.Speak('找到HomeKit设备!');
	console.log("onLocalServiceFound handle " + JSON.stringify(e) );
}
function onLocalServiceDiscoveryStop(e)
{
	console.log("onLocalServiceDiscoveryStop handle " + JSON.stringify(e) );
}
function onLocalServiceResolveFail(e)
{
	console.log("onLocalServiceResolveFail handle " + JSON.stringify(e) );
}
function onLocalServiceResolved(e)
{
	console.log("onLocalServiceResolved handle " + JSON.stringify(e) );
}

JSBridge.register('bridgeEventHandle', bridgeEventHandle);
JSBridge.register('onLocalServiceFound', onLocalServiceFound);
JSBridge.register('onLocalServiceResolved', onLocalServiceResolved);
JSBridge.register('onLocalServiceLost', onLocalServiceLost);
JSBridge.register('onLocalServiceDiscoveryStop', onLocalServiceDiscoveryStop);

2.2 查询系统信息

2.2.1 编程调用

var sysInfo = JSBridge.getSystemInfoSync();
console.log("getSystemInfoSync "+ JSON.stringify(sysInfo) );

应答

{
	"last_version": 42,
	"last_demos": "支持多屏显示",
	"DeviceID": "r13bFs123",
	"DeviceQR": "http://kuaipin.wifi-town.com/api/serial_query/N326GCL#BIND_r13bFs123",
	"serial": "N326GCL",
	"downloadTimeout": 40,
	"email": "[email protected]",
	"DeviceRole": "lan",
	"mobileDataEnabled": false,
	"mainScreen": 2,
	"slaveScreen": 14,
	"presentationScreen": 16,
	"ip": "192.168.8.118",
	"port": 8080,
	"expired": false,
	"presentationEnabled": false,
	"wifiEnabled": true,
	"wifiState": 3,
	"displayCount": 2,
	"displayList": [{
		"id": 0,
		"name": "内置屏幕"
	}, {
		"id": 1,
		"name": "HDMI 屏幕"
	}],
	"ssid": "",
	"WiFiIP": 0,
	"mac": "A2:25:90:BE:CB:96",
	"network": -1,
	"model": "rk3288",
	"product": "rk3288",
	"sdk_int": 27,
	"brand": "rockchip",
	"display": "rk3288-userdebug 8.1.0 OPM8.181005.003 120911 test-keys",
	"version": "1.42",
	"versioncode": 42,
	"dpi": 220,
	"widthPixels": 1920,
	"heightPix": 1014,
	"scaledDensity": 1.375,
	"density": 1.375,
	"bluetoothEnabled": true
}

2.2.2 返回字段说明

字段 说明
versioncode 当前软件的版本号
last_version 当前最新的固件版本
last_demos 固件更新内容
DeviceID 云端分配的设备唯一编码
DeviceQR 设备信息查询、软件注册二维码
serial 硬件唯一序列号
DeviceRole 设备类型,用于不同的用途,默认为lan,固定
slaveScreen 从屏的播放单ID
ip 设备的IP地址
port 设备WEB访问端口
expired 软件授权是否已经过期
wifiEnabled 是否使用WIFI
model 安卓产品model
product 安卓产品ID
display 显示信息
sdk_int 安卓SDK版本号
dpi 屏幕显示密度,可设置
widthPixels ,屏幕像素,可设置
bluetoothEnabled 是否启用了蓝牙
downloadTimeout 默认下载最大超时(所有任务)
mobileDataEnabled 是否已经启用4G流量上网功能
mainScreen 主屏当前播放单ID
slaveScreen 后台当前播放单ID(默认隐藏,可激活)
presentationScreen 多屏异显环境下,其他屏幕当前播放单ID
displayCount 多屏显示环境下,屏幕个数
displayList 多屏显示环境下,所有屏幕信息

主频的播放单ID分别是0,1,2,3.对应00:00-23:59:59每6小时为一段的4个时间段。 多屏异显当前主要测试平台为RK3288,支持自动发现、投送。

2.3 查询网络状态

2.3.1 编程架构

function queryNetState()
{
    var netinfo = JSBridge.getNetworkInfo();
	console.log("netinfo "+ JSON.stringify(netinfo) );
	if (netinfo.connected === true)
	{
	  console.log("已经连接到网络");
	}
	else{
	  console.log("网络已断开");
	}
}
{
	"connected": true,
	"type": "LTE",
	"simOperator": "46001",
	"networkType": "4g",
	"traffic": {
		"mobileRxBytes": 0,
		"mobileRxPackets": 0,
		"mobileTxBytes": 0,
		"mobileTxPackets": 0,
		"totalRxBytes": 953567,
		"totalRxPackets": 970,
		"totalTxBytes": 90479,
		"totalTxPackets": 729
	}
}

2.3.2 返回字段说明

字段 说明
connected 网络是否已经连接
type 当前网络类型,如wifi,lte
networkType 移动网络类型,如2g,3g,4g
simOperator 移动网络运营商ID
traffic 流量统计,单位为字节数或者报文个数

2.4 主从屏幕切换

2.5.1 编程

JSBridge.scrollPage('slave');
setTimeout(function(){
	JSBridge.scrollPage('main');
},60000)

注意:当屏幕从WEB页面切换到其他页面,由于输入焦点已经改变。 JS将不能获取用户的按键消息,请使用软件逻辑完成页面的切回。

2.4.1 输入参数说明

字段 说明
main 切换到主屏
slave 切换到从屏
toggle 触发模式

2.5 固件升级

2.5.1 编程架构

JSBridge.fwUpdate();

自动跳转到升级界面,如果有新版本将自动升级,否则会重启到初始界面。 可根据获取系统信息API来判断是否需要支持这个操作。

2.6 播放单的读取与设置

2.7.1 编程架构

var plBrowser = {};
plBrowser.media_type = "uri";
plBrowser.name = "js";
plBrowser.local = true;
plBrowser.demos = "js wrote";
plBrowser.uri = "https://www.solidot.org";
plBrowser.tiresTime = 12;
plBrowser.data = {};

var plPics = {};
plPics.media_type = "slideshow";
plPics.name = "js";
plPics.local = true;
plPics.demos = "js slideshow";
plPics.slideshowType = "default";
plPics.slideshowInterval = 10;
plPics.data = {};

var plVid = {};
plVid.media_type = "media";
plVid.name = "js";
plVid.local = true;
plVid.demos = "js video";
plVid.data = {};

/*网络下载到本地,视频/图片都是同样的结构*/
var httpVid = {};
httpVid.media_type = "media";
httpVid.name = "js http";
httpVid.demos = "http video";
httpVid.data = [
  {path: 'http://kuaipin.wifi-town.com/file123.jpg',
	name: 'My Photo', keyid: 'file123', filesize: 123009},
  {path: 'http://kuaipin.wifi-town.com/file124.jpg',
	name: 'My Photo2', keyid: 'file124', filesize: 163014}
];

if (sysInfo.slaveScreen !== undefined)
{
	var plinfo = JSBridge.getPlayListSync({channel: sysInfo.slaveScreen});
	var plSample = {};
	
	plSample.channel = sysInfo.slaveScreen;
	plSample.data = plPics;
	JSBridge.setPlayList(plSample,function(result){
		console.log("result "+ JSON.stringify(result) );
	});
	console.log("getPlayListSync "+ JSON.stringify(plinfo) );
}

播放单支持在线的文件,如http https开头的协议,如类型为图片或者视频。 在软件启动的时候会启动下载界面自动完成下载和重启。

{
	"channel": 14,
	"data": {
		"media_type": "media",
		"name": "js",
		"local": true,
		"demos": "js video",
		"data": {}
	}
}

2.6.2 返回字段说明

字段 说明
channel 播放单ID,范围为0-3,14
data 播放单内容,填写null表示删除播放单
data.name 名称
data.media_type 类型,分别是 uri,media,slideshow
data.local 是否采用本地的文件内容
data.data 网络内容

2.7 WebP2P

ngrok服务器部署教程:

https://luozm.github.io/ngrok

2.7.1 编程

启动/保存web反向代理

var opt = {};
opt.host = "webp2p.example.com";
opt.domain = sysInfo.DeviceID;
opt.port = 1234;

var p2pInfo = JSBridge.getWebP2pInfoSync();
if (p2pInfo.autoboot !== true)
{		
	//opt.autoboot = false; //开机自动启动
	opt.focus = false; //强制保存		
}
else{
	console.log("getWebP2pInfoSync "+ JSON.stringify(p2pInfo) );
}

if (p2pInfo.running !== true)
{
	JSBridge.startWebP2P(opt, function(result){
		console.log("startWebP2P "+ JSON.stringify(result) );
	});
}
{
	"status": 0,
	"host": "webp2p.example.com",
	"domain": "Buo7QUnd415539",
	"port": 1234,
	"autoboot": false
}

停止web反向代理:

JSBridge.stopWebP2P();

2.7.2 输入/输出字段说明

字段 说明
host NGROK服务主机地址
port NGROK服务主机连接端口
domain 当前主机的子域名
autoboot 是否开机自动启动此服务
focus 是否强制(force)保存

2.8 磁盘空间

2.8.1 编程

var disk = JSBridge.getDiskSpace();
$("#total" ).html("存储 空闲" + disk.free + "M,总共" + disk.total+"M");

获取当前设备存储空间用量信息,单位为M(兆字节)

 {"total":12345,"free":11685}

2.9 获取Wifi AP列表

2.9.1 编程

JSBridge.onGetWifiList(function(list){
	var select = $('#wifilist');
	$('option', select).remove();
	for (var i=0; i<list.length; i++)
	{
		console.log("onGetWifiList "+ JSON.stringify(list[i]) );
		$('#wifilist').append('<option value="'+list[i].ssid+'" selected="selected">'
		+list[i].ssid+' '+list[i].level+'</option>');
	}
});

获取可用的AP列表

2.10 退出程序(自动重启)

2.10.1 编程

JSBridge.exitProgram();

退出当前程序,如修改了播放单,可调用此API,可在重启后完成新的播放单的加载。

2.11 关机

2.11.1 编程

JSBridge.powerOff();

2.12 重启

2.12.1 编程

JSBridge.reboot();

2.13 文字转语音

2.13.1 编程

JSBridge.Speak("你好 世界");

2.14 设置音量

2.14.1 编程

JSBridge.setVolume({type:'notify', val: '7'});

2.14.2 输入/输出字段说明

字段 说明
type notify为通知音量,music为媒体音量
type system为系统音量,alarm为闹钟音量
type ring为铃声音量,voice_call为电话音量
vol 音量参数,请参照获取系统信息的音量范围填写,inc为增加,dec为减少

2.15 MDNS查询

2.15.1 编程

JSBridge.startLocalServiceDiscovery({type: "_hap._tcp."}, function(list){
	console.log("startLocalServiceDiscovery "+ JSON.stringify(list) );
});

查询的结果见2.1章节注册的MDNS回调函数。

2.16 执行命令

2.16.1 编程

JSBridge.doExecCommand("/system/xbin/cpustats");

上面指令会推送到一个线程异步执行,所以不支持返回输出数据。

2.16 TTS设置

2.16.1 编程

var voiceSample = {};

voiceSample = JSBridge.getVioceSetting();
voiceSample.speaker = '0';
voiceSample.volume = '9';
voiceSample.speed = '5';
voiceSample.pitch = '5';

voiceSample = JSBridge.getVioceSetting();
console.log("getVioceSetting "+ JSON.stringify(voiceSample) );
voiceSample.speaker = '110'; //度小童(情感儿童声)
var newSetting = {data: voiceSample};
JSBridge.vioceSetting(newSetting, function(res){
	console.log("vioceSetting "+ JSON.stringify(res) );
	if (res.result == 0)
	{
		JSBridge.Speak('TTS配置已经更新,重启程序生效');
	}
	else{
		JSBridge.Speak('TTS配置已经删除');
	}
});

//删除
newSetting = {data: null};
JSBridge.vioceSetting(newSetting, function(res){
	console.log("vioceSetting "+ JSON.stringify(res) );
	if (res.result == 0)
	{
		JSBridge.Speak('TTS配置已经更新,重启程序生效');
	}
	else{
		JSBridge.Speak('TTS配置已经删除');
	}
});

设置百度语音tts声音效果方案

2.17.2 输入/输出字段说明

取值请参考百度TTS文档

字段 说明
volume 音量,取值0-15,
speed 语速,取值0-15
pitch 音调,取值0-15,默认为5中语调
speaker 语音播放者

请注意上面数据类型为字符串 删除data填写null或者为空

调试

console.log的输出将保存在系统日志logcat中。 请登录到web控制台,菜单展开后点击“日志”目录。

2.18 获取音量信息

2.18.1 编程

var vols = JSBridge.getVolumeSync();

获取当前设备音量信息,vol为系统音量,其他类型照字面意思理解。

{
	"vol_max": 7,
	"vol_current": 7,
	"music_max": 15,
	"music_current": 0,
	"alarm_max": 7,
	"alarm_current": 7,
	"notification_max": 7,
	"notification_current": 7,
	"ring_max": 7,
	"ring_current": 7,
	"voice_call_max": 5,
	"voice_call_current": 5
}

2.19 获取机顶盒内置存储文件列表

2.19.1 编程

var path = 'picture';
var fileList = JSBridge.getFloderContents(path + '/');

获取当前指定目录(参数为String)的文件列表,照片上传为picture,视频为video,PDF为pdf。

[{
	"path": "picture/bg-9.jpg",
	"filename": "bg-9.jpg",
	"size": 395203,
	"id": 1,
	"time": 1565775738000
}]

2.3.2 返回字段说明

字段 说明
path 路径
filename 文件名
size 文件大小
id 编号
time 文件最后修改UNIX时间戳,单位毫秒

2.20 删除文件

2.20.1 编程

JSBridge.removeFile("picture/bg-9.jpg");

删除设定的文件,sd卡路径从/mnt/sdcard/Cabinet/开始

2.21 清理缓存

2.21.1 编程

JSBridge.destroyCache();

删除应用缓存、以及清理浏览器缓存、历史记录等信息。

2.22 打开应用

2.22.1 编程

JSBridge.openApp("android.settings.SETTINGS");

打开指定路径的应用程序或者设置界面

2.23 设定下载超时

2.23.1 编程

JSBridge.setDownloadTimeout("30");

设定下载播放单内媒体文件最大超时时间,单位为秒,目前暂支持字符串格式的数字

2.24 打开/设置跑马灯文字内容

2.24.1 编程

JSBridge.setMarquee("你好 世界");

设定跑马灯文字,如需要关闭跑马灯,参数可输入"//close"。

2.25 向播放单实时添加/插播新条目(默认不保存)

2.25.1 编程

var newItem = {
	"playlist": 16,
	"uri": "http://cdn.wifi-town.com/mypic.jpg",
	"path": "mypic.jpg",
	"name": "Demo Add"
};
JSBridge.addPlayListFile(newItem);

向播放单实时添加新条目(默认不保存),新条目会尽快安排播出,但不保存到当前播放单, 需要调用savePlayListFiles才能保存。

2.25.2 输入字段说明

字段 说明
playlist 该条目对应的播放单ID
path 文件下载后保存名称
uri 文件在互联网的地址
name 文件展示名称

2.26 实时查询当前在播的节目列表

2.26.1 编程

var allList = JSBridge.getRealTimePlayListSync();

应答

{
	"timeID": 3,
	"slave": {
		"id": 14,
		"currentElement": 0,
		"playType": "uri",
		"local": true,
		"playName": "connect web",
		"uri": "https://kuaipin.wifi-town.com/kp/connect.html",
		"files": 0,
		"elements": []
	},
	"main": {
		"id": 3,
		"currentElement": 0,
		"playType": "pdf",
		"local": false,
		"playName": "js",
		"files": 2,
		"elements": [{
			"type": 2,
			"key": 0,
			"name": "快屏-简介.pdf",
			"uri": "http://cdn.wifi-town.com/xx.pdf",
			"path": "xx.pdf"
		}, {
			"type": 2,
			"key": 1,
			"name": "快屏云柜 - 微信智能存包柜产品介绍.pdf",
			"uri": "http://cdn.wifi-town.com/xx2.pdf",
			"path": "xx2.pdf"
		}]
	},
	"presentation": {
		"id": -1,
		"currentElement": 0,
		"playType": "uri",
		"local": false,
		"playName": "默认网页",
		"uri": "https://kuaipin.wifi-town.com/kp_lan",
		"files": 0,
		"elements": []
	}
}

实时查询当前在播的节目列表,根据节目单显示区域可分为main,slave,presentation三组。

2.26.3 显示区域说明

字段 说明
timeID 主屏前端节目单ID,根据时间段确定
main 主屏默认显示的前端节目单
slave 默认不显示的后端节目单,可通过JSBridge.scrollPage('slave')切换到前端
presentation 多屏环境下,其他屏幕显示的节目单

2.27 向播放单实时删除已存在条目(默认不保存)

2.27.1 编程

var who = {playlist: 14, key: 0};
JSBridge.removePlayListFile(who);

向播放单中删除指定编号的节目。

2.27.2 输入字段说明

字段 说明
playlist 该条目对应的播放单ID
key 节目的编号, 可通过getRealTimePlayListSync获取节目的key字段

2.28 保存播放单

2.28.1 编程

var who = {playlist: 14};
JSBridge.savePlayListFiles(who);

保存通过removePlayListFile/addPlayListFile临时添加、移除的内容同步到设定的播放单

2.29 启用4G网络流量开关

2.29.1 编程

var state = {enabled: true};
JSBridge.setMobileDataEnabled(state);

注意:由于安卓不同版本策略的不同,可能有些平台无法工作,需要通过调用openApp进入设置界面手动设置。

2.30 启用Wifi开关

2.30.1 编程

var state = {enabled: true};
JSBridge.setWifiEnabled(state);

注意:由于安卓不同版本策略的不同,可能有些平台无法工作,需要通过调用openApp进入设置界面手动设置。

2.30 启停多屏显示开关

2.30.1 编程

var state = {enabled: true};
JSBridge.setPresentationEnabled(state);

启停多屏显示开关, 此API当前只是修改运行参数,需要调用应用重启功能来加载新配置

2.31 设置RK3288平台的定时开关机功能

2.31.1 编程

var state = {lockTime: "22:00", startTime:"06:00"};
JSBridge.setRK3288Clock(state);

设置RK3288平台的定时开关机功能,需要主板开发商的板子兼容56iq标准

2.31.2 输入字段说明

字段 说明
lockTime 关机时间
startTime 开机时间

2.32 发送按键

2.32.1 编程

var state = {action: "press", key:"3"};
JSBridge.postKey(state);

发送虚拟按键到安卓系统

2.32.2 action输入字段说明

字段 说明
press 按键类型为按压
down 按键类型为按下
up 按键类型为松开

key 字符串,兼容安卓API“KeyEvent.keyCodeFromString”即可,参考: https://developer.android.com/reference/android/view/KeyEvent#keyCodeFromString(java.lang.String)

2.33 下载文件

2.33.1 编程

var fileInfo = {
	"url": "https://html5videoformatconverter.com/data/images/happyfit2.mp4",
	"file": "happyfit2.mp4",
	"timeout": 8000
};
JSBridge.downloadFile(fileInfo, function(value){
	console.log("Download progress: " + value + "%");
});

下载url所指向的文件到file设定的存储目录,回调函数为下载百分比。

2.32.2 输入字段说明

字段 说明
url 文件在互联网上地址,仅支持http/https协议
file 文件在机顶盒上的存储路径,sd卡路径从/mnt/sdcard/Cabinet/开始
timeout 最大超时,单位毫秒

3. FAQ

3.1我需要增加一些API 可以怎样提交

可通过下方的邮件,将您的需求发送给开发者。

4.0 联系开发者


email: [email protected]
QQ: 1694900623

Thank you!

About

RaftLink信息发布终端编程说明

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published