小米路由插件三提示插件设备哪里找

远程遥控下载 教你如何玩转小米路由器|小米|路由器|WiFi_手机_新浪科技_新浪网
远程遥控下载 教你如何玩转小米路由器
  小米手机相信大家并不陌生,随着其小米2、小米3的发布并销售,用户对于小米的认识也逐渐加强,小米公司也基于手机产品推出了能与手机进行 互联的产品,如小米盒子、小米电源、小米电视以至于近期刚刚发布的小米路由器。小米路由器采用了顶配双频AC,并拥有1TB的硬盘存储空间,在硬件方面非 常不错。另外,小米路由器还拥有Android版和iOS版的应用程序,用户可以通过其对小米路由器进行管理、设置。
远程遥控下载&教你如何玩转小米路由器
  值 得一提的是,小米路由器应用程序可以从路由器安装的初期到最终日常使用,全部可以通过手机进行设置,无需向传统路由器先要在电脑网页中输入一段数字网址, 然后进入后台再去进行繁琐的设置。笔者通过小米路由器应用程序仅需5分钟即完成了所有设置,让家中的电脑、手机、iPad和电视盒子全部连上网络。下面我 们就从小米路由器安装设置开始,向大家介绍如何通过你的手机实现所用功能。
  小米路由器初体验
  首 先,我们先了解下小米路由器如何进行安装设置。小米路由器安装非常简便,插上网线和电源即可完成硬件方面的安装。接下来,你打开手机WiFi功能,搜寻小 米路由器WiFi信号并且进行连接,随后打开小米路由器应用程序。此次测试我们选择的三星GALAXY&Note3&9008V型号手机,在苹果 iPhone手机中同样拥有该应用。随后需要先登录小米账户,然后输入宽带运营商账户及密码,即可开始使用。
&&小米路由器应用设置
  一切设置完成之后,就会进入到小米路由器主页面。在主页面会显示小米路由器WiFi名称、网内、外网的当前速度、小米路由器接入信息以及下方显示的连接设备 数量、智能场景、扩展插件和小米路由器硬盘剩余空间。用户可以通过在主页面左右滑动进行设置或者查看下载情况。
&&向左滑动进入设置界面
  在向后滑动之后,页面左侧会显示出高级设置、升级、注销等选项,选择高级设置即可对小米路由器进行设置。其中包括WiFi设置、外网设置、管理密码设置、存储设置、NFC设置、重启路由器等。在此,我们将对其中的WiFi设置选项进行介绍。
&&可对WiFi密码进行分别设置
  在 WiFi设置中可以对2.4GHz频段的WiFi信号和5GHz频段的WiFi信号名称、密码进行更改或者设置,另外你也可以选择关闭其中一个频段信号, 降低日常路由器的待机功耗。对于外网设置及管理密码设置也非常通俗易懂,普通用户可以轻松搞定。当然,作为小米产品时不时的升级更新,往往会给用户带来惊 喜,可以选择版本升级进行定期更新检测并及时升级。
  小米路由器如何管理
  从 小米路由器应用程序主页面可以进入到管理联网设备界面,可以从里面看到所有联网的智能设备,包括所联网手机的品牌或者电脑。用户可以通过点击其图标进入该 设备的管理界面,其中包括限制器互联网访问权限、共享盘访问权限以及隐私盘访问权限。在系统设置中,联网设备可以默认允许访问共享盘,而隐私盘权限需要单 独开启。&&
&&管理联网智能设备
  我们还可以看到在管理界面中可以看到该设备连接为2.4GHz频段WiFi信号,如果该设备连接的为5GHz频段WiFi信号也会显示其为5GHz状态,另外还有连接时间,下载总流量等信息。对于用户管理在网设备非常方便。
&&有线连接设备同样进行管理
  另外,我们可以看到通过有线连接的设备,同样可以在小米路由器应用中找到,并且也可以进行权限管理。在使用小米路由器应用时,可以通过该应用轻松访问共享盘 和隐私盘,并且打开里面的视频或者图片,你也可以通过该应用将手机中的视频以及图片上传至小米路由器中。值得一提的是,小米路由器中保存的视频、图片还可 以进行路由器云备份,防止意外丢失。
&&可进行云备份
&&智能场景设置
  除 了管理其他连接智能设备外,用户还可以进行智能场景设置,通过该功能设置启动时间、断开或连接设置等功能。以上这些管理功能虽然在日常生活中并不常用,但 是却是较为重要的管理设置项目,特别是智能场景的设置,相信在以后更多的智能设备与小米路由器互联之后会发挥更大的作用。接下来我们就来说说最为有意思的 远程下载功能。
  远程下载如何实现?
  路 由器在大家印象里大多是只能完成帮助更多设备接入网络,而给路由器安装了一个1TB硬盘,很多朋友认为用处并不很大,但是当你了解远程下载功能,这样的观 念将发生改变。在小米路由器应用中有个扩展插件选项,进入之后你可以选择奖迅雷云加速、小米精彩时刻以及迅雷影音全部安装,这三项插件笔者看来还是非常有 用的。&
&&扩展插件安装
  小 米精彩时刻中的内容是,小米在过往中拍摄的一些影片及短片,其中就包括“我们的时代”、“100个梦想的赞助商”这类颇为经典的视频,用户可以通过该插件 进行下载收看,从此下载下来的影片的清晰度也毋庸置疑,值得一提的是下载下来的影片可以存放在小米路由器中,并不会占用手机中的存储空间。
&&如何进行远程下载
  随 后用户可以安装迅雷云加速和迅雷影音两个插件,你需要将你的迅雷账号与小米路由器账号进行绑定以方便进行远程下载。在安装和绑定之后,用户就可以进入到迅 雷影音中下载自己所需的影片。值得一提的是,笔者从应用商店下载迅雷影音应用程序并登陆绑定的迅雷整合同样可以使用远程下载功能。当用户点击影片下载,在 下方会弹出下载至手机或远程下载选项,点击远程下载即可。
&&速度表现不错
  在下载过程中,我们可以在迅雷看看应用程序的下载管理中进行查看,在下载管理中有远程下载单独一栏,并会列出远程设备名称,点击远程设备名称之后就会看到正在下载影片,并包括下载速度。由于笔者使用的是联通固网宽带,其下载速度还是非常不错。
  远程下载功能对于手机所处网络并没有要求,你可以在于小米路由器同一个网络条件下或者在移动运营商数据网络下,也可在其他的WiFi环境中都可以实现远程下载功能。你完全可以在公司时找到喜欢的影片进行远程下载,这样到家之后即可马上观看到喜欢的电影。
  总结:
  小 米路由器将原有的设置复杂的路由器过程简单化,只需一部手机即可完成所有操作,完全可以摆脱电脑的束缚。另外,在管理网内设置时也无需借助第三方应用实 现,这样可以更加快捷高效。在体验方面,远程下载、共享盘播放及上传都可以通过手机一步搞定。从安装、设置、管理、使用用户仅需一部智能手机就能对小米路 由器进行全面操作,整体使用感受非常简单实用,不过现在插件功能略显单一,希望能够小米公司为用户提供更多好玩使用的小米路由器插件。
&&|&&&&|&&&&|&&
您可通过新浪首页顶部 “”, 查看所有收藏过的文章。
,推荐效果更好!
看过本文的人还看过小米路由器插件开发文档
sdk level 5 新增功能
c++ sdk 中增加了批量下载功能
c++ sdk 中添加获取下载列表功能
c++ sdk 添加下载到用户数据盘的功能
c++ sdk 中添加文件变化通知功能
http api 中添加批量下载 api
http api 下载任务时可以指定相对用户数据盘的相对路径作为下载目录
http api 中添加运行命令 api
脚本 sdk 中添加 plugin_action 命令
脚本 sdk 中添加 plugin_download 命令
sdk level 4 新增功能
sdk 中 Plugin 类添加向小强 app 发送 feed 的功能
sdk 中 DeviceManager 类添加设置上网权限的功能
sdk 中 DeviceManager 类添加获取路由器信息的功能
start_script 脚本中添加了 PROCLINE 命令,用来实现插件意外结束之后的自动重新启动
http core api 中添加设置上网权限的功能
http core api 中添加获取路由器信息的功能
小米路由器插件(以下简称“插件”)是对小米路由器本身进行扩展,能够完成很多有用和有趣的功能。
插件包含两部分:
供远程调用的web控制页(必须)
在路由器中运行的程序(可选)
当一个插件安装好之后,用户可以从手机上打开插件,看到一个展示的web页面。用户通过对web页面进行操作和管理,web处理逻辑会将信息发给路由器,路由器调用开发者的程序或者内置的API进行响应。这样实现了用户与路由器的交互,完成插件功能。
开发者只需要熟悉html,javascript,css 等知识,即可进行资源类插件的开发。
2.1申请路由器应用
开发者需要登录小米开发者中心(/)注册开发者账号,等待审核通过后,得到开发者身份。
然后在“路由器插件”模块中申请“创建路由器插件” 。
创建路由器插件成功后,会获得服务器分配的(AppID,AppKey,AppSecret),用来标识和验证开发者的身份。还会有插件的基本信息,这些基本信息在下文的xiaomi.project 文件里会用到。
2.2开通小米账号接入服务
申请路由器插件之后,在对应的插件应用页面下方有“账号接入服务” 需要启用该服务。
启用该服务的时需要填写回调地址。
注意, 回调地址要填写开发者实际的前端地址,用户授权后跳转的地址要与这个地址进行验证。否则验证不通过的话会无法访问插件。验证方式是判断这个回调地址是不是授权跳转地址的前缀。
这个回调地址是可以随时更改的。
2.3准备 Web 服务器
插件web资源并不保存在小米的服务器上,所以开发者需要将web资源(html,js,css,image 等)存放到一个外网可访问的Web服务器上。当然,开发者在开发插件的时候,只需要在本地运行一个Web服务器也是可以的。开发者可以使用 httpd,tomcat,IIS 等自己熟悉的Web服务器 。这里简单起见,以node.js为例,在linux环境下搭建一个简单的Web服务器。
首先要在 Linux 上安装 nodejs。
git clone git:///joyent/node.git
./configure
sudo make install
接着写个简单的server.js脚本通过node执行可以作为一个简单的web服务器使用。
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
).listen(80, "127.0.0.1");
console.log('Server running at http://127.0.0.1:80/');
最后保存server.js,在命令行中敲入如下命令。
node server.js
不出问题的话web服务就会正常启动,输出如下。
Server running at http://127.0.0.1:80/
在浏览器里面访问 http://127.0.0.1:80/ ,就会输出 Hello World。
如果出现错误,可能要检查端口是否被占用,以及使用管理员权限运行。
lsof -i :80|grep -v "PID"
kill -9 PID
2.4开发者自己生成公私钥对、证书申请文件
2.4.1使用在线工具
我们在网站(/plugin/key)上提供了用于生成密钥,证书和插件打包等在线工具。
该工具有个局限是,全部的资源文件不能超过10MB。所以如果插件很大,还是要使用下面的工具。
2.4.2使用linux本地工具
linux环境生成方法如下:
a.开发者生成自己的密钥:
openssl genrsa -out client.key 1024
chmod 400 client.key (修改权限为仅 root 能访问)
openssl rsa -noout -text -in client.key (查看创建的证书)
b.开发者生成自己的证书申请文件:
openssl req -new -key client.key -out client.csr (注意:Common Name 填写小米账号id,比如,注意不能填邮箱或者手机号,否则会验证不通过)
openssl req -noout -text -in client.csr (查看创建的请求)
c.开发者将证书申请文件交给小米服务器,在路由器插件模块里面点击“申请开发者证书”按钮。然后服务器会返回一个.pem 格式的证书文件,保存该文件和 a 步骤生成的client.key文件,在 2.5 步骤里面会用到这两个文件。
2.4.3使用windows本地工具
方法参见2.5,生成的证书申请文件,仍需要在中换回开发者证书。
2.5下载打包工具
Linux 打包工具使用方法:
下载前需要安装的库:
sudo apt-get install openssl
sudo apt-get install libzip-dev
下载打包工具:
/xiaoqiang/sdk/tools/sdk_package_1.0.0.zip
解压后会得到64位打包工具,plugin_packager_x64和32位打包工具 plugin_packager_x86,还有xiaomi.project文件。根据提示开发者自己编辑xiaomi.project文件,然后运行plugin_package,plugin_packager
会读入xiaomi.project文件(xiaomi.project文件下文会详细介绍,详见 2.6),并且根据 xiaomi.project 文件的配置信息生成 app.mpk(windows下是appSigned.mpk)文件,这个文件就是需要上传服务器的签名后的压缩包。
Windows 打包工具的使用方法:
key和证书申请文件的生成脚本,运行gencsr.bat可以生成key和csr文件,key是私钥,csr文件是开发者证书申请文件,利用csr文件在 上换回pem文件。
/xiaoqiang/sdk/tools/csrgen.zip
打包工具,用户填入所有的信息并选择key和pem文件,就会自动生成 mpk。
/xiaoqiang/sdk/tools/windows/packagetool.1.2.zip
工具依赖于.Net4.5安装包:/xiaoqiang/sdk/tools/NDP451-KB-x64-AllOS-ENU.zip
windows打包工具截图如下:
2.6xiaomi.project文件的内容
xiaomi.project文件在小米路由器插件的配置文件,插件的基本信息都在xiaomi.project文件里记录。
#请输入插件ID。(即在2.1里面获取到的AppID)
plugin_id= "7167149";
#请输入插件名称。(即在2.1里面获取到的插件名称)
name= "miroutertest";
#请输入插件介绍。(自定义插件的详细介绍)
introduction= "this is a test plugin introduction";
#请输入插件简介。
summary= "小米路由器插件 test";
#已安装插件图标 URL。(即在2.1里面获取到的已安装插件图标 URL)
installed_icon="http://file./download/AppStore/594aa36f-c-8e44-ef751ef66c49";
#插件详情图标 URL。(即在2.1里面获取到的插件详情图标 URL)
detail_image="http://file./download/AppStore/00830c6f-db49-0f88010e2f";
#可安装插件图标 URL。(即在2.1里面获取到的插件可安装插件图标 URL)
market_icon="http://file./download/AppStore/ffe07b2b-34c4-4dc3-bce4-2a";
#开发者名称。(即在2.1里面获取到的开发者名称)
developer= "xiaomi";
#请输入插件版本号。(格式:xx.xx.xx,即在2.1里面填写的插件版本号))
version= "1.0.0";
#请输入插件控制页面url。(即在2.2帐号接入服务里面填写的回调地址,该地址必须host在公网上,浏览器或者手机app端就是调用这control_url来控制插件)
control_url= "";
#请输入打包目录。(如果插件没有可执行文件,可不用填写。如果有可执行文件,则将所有可执行文件和start_script放到打包目录下。详情见4.4)
zip_path= "";
#请输入开发者证书文件路径。(即在2.4里面获取到的证书件,.pem 格式)
pem_path= "/home/ltj/build/.pem";
#请输入私钥文件路径。(即在2.4里面获取到的私钥文件,.key格式)
key_path= "/home/ltj/build/.key";
#是否支持R1D
supported_rom= "miwifi_rom 或者 miwifi_rom_mini";
#是否需要访问公共存储目录
access_userdata= "true";
#是否需要支持"下载"功能,此项为true才能够使用下载相关的sdk
support_download= "true";
#是否需要支持"vpn 操作",此项为true才能够使用vpn相关的sdk
support_vpn_operation= "true";
#是否需要支持"已连接的设备信息",此项为true才能够使用链接设备信息相关的 sdk
support_connected_device_info= "true"
#是否需要支持"访问U盘",此项为true才能够使用访问U盘相关的sdk。并在插件跟目录出现extdisks文件夹。
support_usb_disk_mount= "true"
#是否需要支持"文件变化通知"
support_notify_file_changed = "true"
#Sdk level 是描述路由器rom提供的api能力的。如果插件用到了高level的api,那么该插件只能在高于此level的rom上运行。
sdk_level = 3
2.7 本地安装插件
生成好了mpk文件(也就是插件安装包文件),那怎么在路由器里安装呢?这里需要先将mpk文件放到手机里,然后用小米路由器手机客户端上传该mpk文件到路由器里面,具体的UI入口在“扩展插件”里面,右上角有个menu,点击后会提示上传插件并安装,安装完毕后在已安装插件里面就能看到自己的插件啦。(这里需要注意上文说的control_url一定要在公网上否则手机app的webview 控件会无法访问control_url)
这里举一个插件的例子,插件的功能是下载一个url到路由器里面。开发平台是Ubuntu 64bit。
先写一个 server.js,具体内容如下:
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs"),
rootDir = "/home/test/www/"; // 这里 rootDir 修改成自己的目录
http.createServer(function (req, res) {
var pathname=rootDir+url.parse(req.url).
if (path.extname(pathname)=="") {
pathname+="/";
if (pathname.charAt(pathname.length-1)=="/"){
pathname+="index.html";
console.log(fs);
path.exists(pathname,function(exists){
if(exists){
switch(path.extname(pathname)){
case ".html":
res.writeHead(200, {"Content-Type":"text/charset=utf-8"});
case ".js":
res.writeHead(200, {"Content-Type": "text/javascript"});
case ".css":
res.writeHead(200, {"Content-Type": "text/css"});
case ".gif":
res.writeHead(200, {"Content-Type": "image/gif"});
case ".jpg":
res.writeHead(200, {"Content-Type": "image/jpeg"});
case ".png":
res.writeHead(200, {"Content-Type": "image/png"});
res.writeHead(200, {"Content-Type":"application/octet-stream"});
fs.readFile(pathname,function(err,data){
res.end(data);
res.writeHead(404, {"Content-Type": "text/html"});
res.end("&h1&404 Not Found&/h1&");
}).listen(80, "127.0.0.1");
console.log("Server running at http://127.0.0.1:8 /");
执行 sudo node server.js
Server running at http://127.0.0.1:80/
如果出现错误请看 2.3
去小米开发者中心执行 2.1 和 2.2, 获取到 appID, 接入小米帐号服务
Oauth 的说明:
用户在第一次使用插件时,插件会跳转到授权页面,引导用户授权插件使用自己的设备;授权成功之后,插件拿到access token,进而调用服务器的 API 去执行一些操作,完成插件的功能。其中的具体流程有些复杂的,遵循OAuth2.0标准,详情参见 的开发文档。为了简化开发,我们将上述流程简单封装成一个javascript 的 API。下面的开发说明就是基于这个 API 进行的。
绑定 host(方便本地调试用):
还记得我们在2.2步骤里面在小米开发者中心填写的回调地址吗,假设为/, 那么开发者需要将 127.0.0.1 绑定到
Linux 环境下执行:
sudo vim /etc/hosts
保存后退出
Windows 环境下以管理员权限在 C:\Windows\System32\Drivers\etc\hosts 文件 添加
完成基本 UI 代码:
在/home/test/www目录下,我们新建一个文件夹sample/download。在文件夹内 , 新建index.html文件。输入下面内容代码。
在head标签中,我们引用了router_request.js,里面包含了我们封装的API使用方法。因为是依赖jquery的 , 所以必须也要引用jquery.js,版本使用1.9.0以上即可。
&!DOCTYPE html&
&meta http-equiv="content-type" content="text/ charset=UTF-8"&
&script src="http://code./jquery/jquery-1.7.1.min.js"&&/script&
&script src="/js/router_request.js"&&/script&
&title&插件Sample-下载一个URL到路由器&/title&
&h1&插件Sample-下载一个URL到路由器&/h1&
&table id="device_table"&
&td&输入路由器ID&/td&
&input type="text" id="deviceIdText" placeholder="路由器ID"&
&td&输入要下载的URL&/td&
&input type="text" id="urlText" placeholder="资源url"&
&td&操作&/td&
&input type="button" value="授权" id="authorizeButton"&
&input type="button" value="下载" id="downloadButton"&
这里 /js/router_request.js ,我们可以在外网上访问,我们已经把它封装成一个api 。
打开 /sample/download/index.html 将会得到下面的页面。 (如果看不到内容,请按ctrl+F5,强制刷新,注意ctrl+F5和直接F5的区别 )
插件授权 :
当用户点击“授权”的时候,如果用户未进行授权过,则跳转到授权页面。当用户同意后,自动跳转回来。
如果尚未得到用户授权,那么就请求用户授权。通routerRequest.hasAccessToken()判断插件是否已经拿到用户的授权,如果没有就使用routerRequest.authorize(directUrl, appId)方法,跳转到小米用户授权页面,显式的让用户授权给appId对应插件。授权完毕之后,会自动跳转到directUrl指定的url来。
必须保证小米开发者中心“账号接入服务”中填写的回调地址是这个directUrl的前缀。
if (!routerRequest.hasAccessToken())
routerRequest.authorize(window.location.href, appId);
向服务器发起API请求:
当用户填写好正确的路由器ID和下载的URL之后,点击”下载“的时候,我们将使用routerRequest.request方法完成这个任务。下面逐一讲解各个参数的意义。
routerRequest.request({
path: "/api-third-party/service/datacenter/download_file",
type: "GET",
deviceId: deviceId, // 这个参数只是调试时添加,上线后要去掉。
appId: appId,
success: function(data) {
var response = jQuery.parseJSON(data);
if (response.code != 0) {
console("error:", data);
console.log("success");
error: function(data) {
console.log("error:", data);
path:是传入的API请求的路径, 不同API的请求路径是不同的。这里使用的是/api-third-party/service/datacenter/download_file来下载一个URL。
data:是请求的参数。其中,appId是必须要传入的,用来验证开发者的插件的身份;url表示要下载的资源;deviceId表明下载到哪个路由器上,实际开发完插件后,需要去掉,因为插件运行在小米路由器客户端时,客户端会自动加上这个参数的。
success:如果请求成功,会回调success对应的函数。 注意,这里的请求成功不代表操作成功。参数data是一个json 结构,判断data.code是不是0可以知道请求的结果。
error::如果出现授权失败,网络故障等问题会回调error对应的函数。
type: 请求的方法可以是“POST”或者是“GET”, 默认是GET。下面代码中使用的是默认的。
以下是完整的index.html的代码
&!DOCTYPE html&
&meta http-equiv="content-type" content="text/ charset=UTF-8"&
&script src="http://code./jquery/jquery-1.7.1.min.js"&&/script&
&script src="/js/router_request.js"&&/script&
&title&插件Sample-下载一个URL到路由器&/title&
&h1&插件Sample-下载一个URL到路由器&/h1&
&table id="device_table"&
&td&输入路由器ID&/td&
&input type="text" id="deviceIdText" placeholder="路由器ID"&
&td&输入要下载的URL&/td&
&input type="text" id="urlText" placeholder="资源url"&
&td&操作&/td&
&input type="button" value="授权" id="authorizeButton"&
&input type="button" value="下载" id="downloadButton"&
&script type="text/javascript"&
var appId = "7311469";
$(document).ready(function() {
$("#authorizeButton").click(function(){
if (!routerRequest.hasAccessToken()) {
routerRequest.authorize(window.location.href, appId);
$("#downloadButton").click(function() {
var deviceId = $("#deviceIdText").val();
if (!deviceId) {
alert("请填写路由器ID");
var url = $("#urlText").val();
if (!url) {
alert("请填写要下载的url");
routerRequest.request({
path: "/api-third-party/service/datacenter/download_file",
type: "GET",
deviceId: deviceId, // 这个参数只是调试时添加,上线后要去掉。
appId: appId,
success: function(data) {
var response = jQuery.parseJSON(data);
if (response.code != 0) {
console.log(data);
alert("错误:" + response.msg);
alert("下载url成功");
error: function(data) {
console.log("error:", data);
alert("下载url失败");
在路由app里安装了插件后可直接调用HTTP Core Api,在浏览器里调试时需在Api的参数中增加deviceId,开发者可登录/plugin/deviceList 查看已绑定路由的deviceId,否则调用HTTP Core Api是会提示“数据缺失”。
index.html中,请求下载的时候调用的是path: "/api-third-party/service/datacenter/download_file"
对应的HTTP Core Api是3号:
/api-third-party/service/datacenter/download_file 下载一个指定的Url到路由器
打包插件:
打包插件的流程,先填写xiaomi.project文件,执行plugin_packager就OK啦。打包完成后就会看到 app.mpk这个文件啦~~
还可以在网站/plugin/mipk上填写插件信息,打包下载生成的app.mpk文件。
在路由器上本地安装插件:
在手机app里面可以选择打包好的mpk然后安装到路由器里面。
使用插件:
在浏览器里面敲/sample/download/index.html,选好一个设备ID,输入下载的链接,下载成功就会出现下面的情景。下载成功后通过手机app就能在路由器文件管理的下载目录里看到啦。
在手机的应用中心里也会有对应的插件信息。
卸载插件:
在手机app里面,扩展插件里面找到自己安装的插件,右上角有个menu,点击弹出卸载选项。
上传插件到插件商店:
在里面对应的路由器插件里面就可以上传刚才打包后的app.mpk啦。
4.开发带有二进制文件的插件
开发者可以开发带有可执行程序的插件,插件的可执行程序在路由器上运行,控制页面可以通过插件系统提供的api进行与可执行文件进行交互。开发者打包时将自己编译好的文件与start_script放在相同目录下,并将该目录传入打包工具,生成mpk包。插件安装时,会将打包目录下的所有文件释放到插件运行的根目录中。
4.1toolchain下载
x64 toolchain下载
下载地址/xiaoqiang/sdk/toolchain/r1d/x64/xiaomi_toolchain.zip
x86 toolchain下载
下载地址/xiaoqiang/sdk/toolchain/r1d/x86/xiaomi_toolchain.zip
4.2lib下载
我们提供了一些基本的库,供开发者使用,包括:
boost,curl,json,lbiconfig,libpthread,sqlite3,thrift,openssl
这些库都是现在小米路由器rom中包含的库。开发者可以在代码中使用这些库。
如果还需要其他库可以联系。
/xiaoqiang/sdk/libs/boost.1.54.0.zip
/xiaoqiang/sdk/libs/json.0.11.zip
/xiaoqiang/sdk/libs/libpthread.0.9.33.2.zip
/xiaoqiang/sdk/libs/sqlite3.3071201.zip
/xiaoqiang/sdk/libs/curl.7.33.0.zip
/xiaoqiang/sdk/libs/libconfig.1.4.9.zip
/xiaoqiang/sdk/libs/openssl.1.0.1h.zip
/xiaoqiang/sdk/libs/thrift.0.9.1.zip
/xiaoqiang/sdk/libs/libzip.0.10.1.zip
/xiaoqiang/sdk/libs/zlib.1.2.7.zip
/xiaoqiang/sdk/libs/libevent.2.0.19.zip
/xiaoqiang/sdk/libs/glog.0.3.3.zip
/xiaoqiang/sdk/libs/gflags.2.1.1.zip
/xiaoqiang/sdk/libs/libiconv.2.4.0.zip
4.3MIWIFI SDK下载和使用
路由器能力的SDK
/xiaoqiang/sdk/tools/sdk_package_1.0.3.zip
其中带有SDK 使用sample。
4.3.1MRApp (SDK level 5)
开发者应该写一个类继承自MRApp,并在代码中声明一个派生类的全局变量。这样编译出来的插件从才能正常运行,并带有与插件控制页面交互的功能。例如:
class MyPlugin: public MRApp {
MyPlugin();
virtual ~MyPlugin();
virtual void onLaunched(const std::vector&std::string&& parameters);
1.onLaunched
onLaunched是插件启动时会被调到的处理函数。
2.onParameterRecieved
onParameterRecieved是控制页面控制插件时会被调到的处理函数。当控制页面中调用http core api 13号,控制插件api时,插件平台会将控制页面传入的信息转发到插件中。然后调用MRApp类的onParameterRecieved函数。插件开发者在onParameterRecieved函数中实现对信息的处理。开发者还可以将处理完毕的信息以函数返回值的形式返回出去,控制页面就可以在13号api中得到返回值。13号api的超时时间为1秒。
onExit是插件退出是会被调到的处理函数,这个函数执行结束后程序就会退出。开发者应该在这个函数中保存相关的数据。
4.onUDiskAdded
onUDiskAdded是当有u盘插入时被调用到的处理函数,参数为U盘的目录。需要在manifest中声明support_usb_disk_mount
5.onUDiskRemoved
onUDiskAdded是当有u盘卸载时被调用到的处理函数,参数为U盘的目录。需要在manifest中声明support_usb_disk_mount
6.onFileSystemChanged
onFileSystemChanged是当磁盘上有文件变化是被调用到的处理函数,参数为U盘的目录。需要在manifest中声明support_notify_file_changed
4.3.2 PluginTools
1.getDeviceId
static string getDeviceId()
开发者可以通过该函数得到当前设备的device id
2.saveData
static Code savedata(const string& key,const string& value)
key 存储数据用的key,依照这个key来读数据;value 存储数据的内容
开发者可以通过该函数存储一些数据,这些数据可以通过sdk 3号接口和http 5号接口来读取
static Code getData(const string& key,string& value)
key 存储数据用的key,依照这个key来读数据;value 存储数据的内容
开发者可以通过该函数获取一些已存储数据,这些数据是通过sdk 2号接口和http 6号接口设置的
4.sendPush
ErrorCode::Code sendPush(const std::string & title,const std::string & description)
title 通知的标题;description 通知的内容
该通知会显示在路由器android和iphone客户端
4.3.3 Downloader
该类中的所有函数需要“下载”权限,插件必须在打包时声明“下载”权限才能使用这些函数。(support_download= "true");
1.新建下载任务(直接下载到用户数据盘)
DownloadResult DownloadToUserData(const std::string& url,
const std::string& pathForUserData,bool downloadAgain, const std::string& dupId,string output)
url 要下载的url;pathForUserData 下载到用户数据盘为跟目录的相对目录;downloadAgain 如果是重复下载已有的任务,此参数传true;dupId 如果是重复下载已有的任务,次参数传重复的id;output json格式的结果
用户通过此api可以调用路由器的下载器下载一个文件
2.批量新建下载任务
Code multiDownload(const std::string& urls,
const std::string& pathForUserData,vector& reslut)
urls:以逗号分隔的url;pathForUserData 下载到用户数据盘为跟目录的相对目录;reslut:输出参数,创建任务结果
用户通过此api可以调用路由器的下载器批量下载文件
3.获取下载进度
DownloadResult GetDownloadProgress(const std::string& id,const bool isHidden = false)
id 要查询的任务id;isHidden 是否是隐藏的下载任务
获取下载任务的进度
4.暂停下载任务
DownloadResult PauseDownloadItems(const std::vector& itemIds)
itemIds 任务id的list
暂停下载任务
5.启动下载任务
DownloadResult ResumeDownloadItems(const std::vector& itemIds)
itemIds 任务id的list
启动已暂停的下载任务
6.删除下载任务
DownloadResult DeleteDownloadItems(const std::vector& itemIds,bool removeFiles)
itemIds 任务id的list
删除下载任务
7.获取下载任务列表
Code GetDownloadList( std::vector& list)
输出参数,下载列表
获取下载任务列表
4.3.4VpnControllor
该类中的所有函数需要“VPN控制”权限,插件必须在打包时声明“VPN控制”权限才能使用这些函数。(support_vpn_operation= "true")。
1.设置一个vpn设备(proto目前只支持 l2tp)
static ErrorCode::Code createVpn(const VpnInfo& info, string & result)
VpnInfo:要设置的vpn信息;result:输出参数
2.查看vpn配置信息
static ErrorCode::Code getVpnInfo(const string& name, string & result)
name:vpn名字;result:输出参数{"username":"xiaomi","proto":"l2tp","auto":"0","password":"123","server":"10.237.100.1"}
3.使用vpn设备拨号
static ErrorCode::Code openVpn(const string& name, string & result)
name: vpn名字;result:输出参数
static ErrorCode::Code closeVpn(const string& name, string & result)
name: vpn名字;result:输出参数
5.查看vpn拨号状态
static ErrorCode::Code getVpnStatus(const string& name, string & result)
name: vpn名字;result:输出参数{"stat":{"msg":"","code":601},"proto":"l2tp","auto":"0","up":false,"autostart":false,"pending":false,"data":[],"available":true}
6.注册一个供自己使用的rt _table_name
static ErrorCode::Code registRtTable(const string& tableName, string & result)
tableName: table名字;result:输出参数,大于0表示成功
7.检查rt _table是否存在
static ErrorCode::Code checkRtTable(const string& tableName, string & result)
tableName:table名字;result:输出参数,返回&0正常,-1 不存在
8.添加rt_table中的路由条目
static ErrorCode::Code addToRtTable(const string& tableName, const string& port,const string& items,
string & result)
tableName:table名字;port:在r1d中,wan口网卡名为eth0.2,vpn设备的dev_name为proto-interface;items:要添加的路由条目,多个用空格分隔;result:输出参数,{"success":2,"fail":0}
9.删除rt_table中的路由条目
static ErrorCode::Code deleteInRtTable(const string& tableName, const string& port,const string& items,
string & result)
tableName:table名字;port:在r1d中,wan口网卡名为eth0.2,vpn设备的dev_name为proto-interface;items:要添加的路由条目,多个用空格分隔;result:输出参数,{"success":2,"fail":0}
10.清空rt_table中的路由条目
static ErrorCode::Code cleanRtTable(const string& tableName, string & result)
tableName:table名字;result:输出参数
11.查看rt_table中的路由条目
static ErrorCode::Code getRtTableList(const string& tableName, string & result,int offset=0,int count = 0)
TableName:table名字;offset:起始条目;count:条目数(如果offset和count都是0,则返回前1000条);result:输出参数200.181.112.0/24 dev eth0.2
scope link 220.181.111.0/24 dev eth0.2
scope link
12.通过源地址使用相应的rt_table ,添加
static ErrorCode::Code addSrc(const string& tableName, const string& items,
string & result)
tableName:table名字;items:要添加的路由条目,多个用空格分隔;result:输出参数,{"success":1,"fail":0}
13.通过源地址使用相应的rt_table ,删除
static ErrorCode::Code deleteSrc(const string& tableName, const string& items,
string & result)
tableName:table名字;items:要添加的路由条目,多个用空格分隔;result:输出参数,{"success":1,"fail":0}
14.查看源地址
static ErrorCode::Code getSrcList(const string& tableName, string & result)
tableName:table名字;result:输出参数192.168.31.2
192.168.31.0/29
15.修改源地址
static ErrorCode::Code changeSrc(const string& tableName,const string& oldsrc,const string& newsrc, string & result)
tableName:table名字;oldsrc:旧地址;newsrc:新地址;result:输出参数
4.3.5DeviceManager
该类中的所有函数需要“已连接的设备信息”权限,插件必须在打包时声明“已连接的设备信息”权限才能使用这些函数(support_connected_device_info= "true")。
1.获取链接设备的信息
ErrorCode::Code getConnectedDeviceList(vector & outputList)
outputList:设备信息
2.设置设备上网权限
ErrorCode::Code setDeviceWanAccess(const std::string& mac, bool enable)
mac:设备的mac地址;enable:是否能链接外网
3.获取路由器信息
ErrorCode::Code getRouterInfo(RouterInfo& output)
output:输出参数,路由器信息
4.4编写start_script脚本
start_script是一个由小米路由器定义的用来控制插件行为的一些列命令的集合,开发者可以通过这些命令控制插件的开启,关闭和为安装插件做一些准备工作。提供的命令包括:MKDIR,RUN, PROCLINE。
MKDIR命令的作用是在插件安装时创建一个目录。MKDIR后面跟的参数为创建的目录。此命令会在插件安装时运行
RUN命令的作用是运行一个文件。RUN后面跟的参数为插件启动时要执行的文件。此命令会在插件安装、打开插件、路由器启动(如果启动时插件状态是开启)时运行。
PROCLINE命令的作用是运行一个文件,用PROCLINE运行的程序如果结束运行了,插件系统会自动再次启动该程序。
MKDIR /user/
RUN sample -s
开发者将脚本文件写好,命名为“start_script”,放在打包的zip_path根目录下,zip_path参见2.6里面的xiaomi.project文件。
4.5SDK level
Sdk level是描述路由器rom提供的api能力的。如果插件用到了高level的api,那么该插件只能在高于此level的rom上运行。一个插件的sdk level等于该插件用到的sdk和http api中最高的sdk level。例如如果一个插件用到了level为1和2的api,那么该插件的sdk level为2。
每一个路由器rom都有对应的sdk level,rom的level必须大于等于插件的level,插件才能正常运行。
R1D Rom版本
R1C Rom版本
0.4.58 以上
0.5.41 以上
0.6.37 以上
0.8.19以上
4.6开发者选项
我们给开发者提供了一个高级功能,见下图。在浏览器访问进入路由管理页面,找到高级功能-&开发者选项,输入自己的插件ID ,就可以开通ssh了,在客户端输入ssh
-p 2222就可以登录到路由器里面,然后scp自己的可执行文件到路由器里,就可以在路由器里调试了,比如查看log之类,注意使用scp的时候端口号必须是2222,比如scp -P 2222 a.txt :/folder1,并且P是大写哦。。需要说明的是,出于安全考虑,我们给插件提供的权限和工具都是有限的,如果有特殊需求请发信联系我们。
4.7 带有可执行文件的插件开发注意事项
插件包中必须要有start_script文件,该文件中必须有至少一个RUN命令用来启动可执行文件。start_script文件需要和可执行文件一起放到mpk包中。
4.8 插件的调试
可以下载gdb进行调试,/xiaoqiang/sdk/tools/gdb.6.8a ,编译程序时加入 -gdwarf-2 。
5.可供开发者调用的HTTP Core Api
1.获取设备信息
GET /api-third-party/device
appId: app id
{"code":"0","device":{"id":"","idForVendor":"","name":""}}
2.批量下载到路由器
POST /api-third-party/service/datacenter/multi_create
appId:app的id;urls:以逗号分隔的url;pathForUserData(optional):下载路径,以用户数据盘为跟目录的路径
{"code":0,"msg":"","list":[{"downloadId":"8","deviceId":"c69ee1b1-037f-4d89-bb38-4d12*"}]}
1.返回值中的downloadId是该下载项目的id,在一个路由器上是唯一的;2.deviceId是路由器的唯一标识,通过deviceId和downloadId可以唯一确定一个文件
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
3.下载一个指定的Url到路由器
POST /api-third-party/service/datacenter/download_file
appId:app的id;url:下载文件的url;pathForUserData(optional):下载路径,以用户数据盘为跟目录的路径。(sdk level 5);hidden(optional):true,false,表示是否是用户不可见的下载项目,默认为false;downloadName:下载文件的存储名字;tag:自定义标签
{"code":0,"msg":"","downloadId":"8","deviceId": "c69ee1b1-037f-4d89-bb38-4d12*"} 1.返回值中的downloadId是该下载项目的id,在一个路由器上是唯一的;2.deviceId是路由器的唯一标识,通过deviceId和downloadId可以唯一确定一个文件
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }{ "code":2010,"msg":"duplicate url","dupId":"16" }
4.根据id查询下载项目的信息
GET /api-third-party/service/datacenter/download_info
appId:app的id;deviceId:路由器的备份id;downloadId:下载任务id;hidden(optional):true,false,表示是否是用户不可见的下载项目,默认为false
{"code":0, "msg":"", "url": "/api-third-party/data/12345/image/1.jpg"} 通过url可以下载downloadId对应的文件
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }{"code":1056, "msg":"invalid device id" } {"code":1057,"msg":"resource is not ready" } {"code":1559,"msg":"datacenter error" }
5.获得app的自定义配置信息
GET /api-third-party/service/datacenter/config_info
appId:app的id;key:配置选项的key
{"code":0,"msg":"","value":"test_value"}
开发者可以通过该函数获取一些已存储数据,这些数据是通过DataTransfer::saveData接口和http 6号接口设置的。
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
6.设置app的自定义配置信息
GET /api-third-party/service/datacenter/set_config
appId:app的id;key:配置选项的key;value:配置选项的value
{"code":0,"msg":"","value":"test_value"}
开发者可以通过该接口存储一些数据,这些数据可以通过DataTransfer::getData()接口和http 5号接口来读取。
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
7.批量获取下载任务信息
GET /api-third-party/service/datacenter/batch_download_info
appId:app的id;ids:需要获取信息的id,以逗号分割,例如"1,3";hidden:true,false,表示是否是用户不可见的下载项目,默认为false
{"code":0,"msg":"","list":[{"id":"1","address":"http:\/\/\/bmiddle\/5823207fjw1e7bzefeaa0j20t62lhqre.jpg", "localFileName":"download1.jpg","type":1,"datacenterErrorCode":0,"downloadSpeed":0,"downloadStatus":1,"fileDownloadedSize":0,"fileTotalSize":195735}{"id":"3","address":"http:\/\/\/bmiddle\/5823207fjw1e7bzefeaa0j20t62lhqre.jpg","localFileName":"download1.jpg","type":1,"downloadStatus":4,"fileTotalSize":195735,"finishedTime": }]} 参数id:下载任务的Id;address:url;localFileName:文件本地置;type:下载类型(1为链接下载,3为种子下载);downloadSpeed:下载速度;downloadStatus:下载状态(详见下方列表);percent:下载进度;fileDownloadedSize:已下载文件大小(byte);fileTotalSize:文件总大小
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
8.获取插件下载任务信息
GET /api-third-party/service/datacenter/plugin_download_info
appId:app的id;hidden:true,false,表示是否是用户不可见的下载项目,默认为false;lite:true,false,如果true返回值中只包含id,pluginId,tag,status
{"code":0,"msg":"","list":[{"id":"1","address":"http:\/\/\/bmiddle\/5823207fjw1e7bzefeaa0j20t62lhqre.jpg", "localFileName":"download1.jpg","type":1,"datacenterErrorCode":0,"downloadSpeed":0,"downloadStatus":1,"fileDownloadedSize":0,"fileTotalSize":195735} {"id":"3","address":"http:\/\/\/bmiddle\/5823207fjw1e7bzefeaa0j20t62lhqre.jpg","localFileName":"download1.jpg","type":1,"downloadStatus":4,"fileTotalSize":195735,"finishedTime":}]} 参数id:下载任务的Id;address:url
;localFileName:文件本地位置;type:下载类型(1为链接下载,3为种子下载);downloadSpeed:下载速;downloadStatus:下载状态(详见下方列表);percent:下载进度;fileDownloadedSize:已下载文件大小(byte);fileTotalSize:文件总大小;pluginId:插件Id;tag:用户自定义标签
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
9.开启插件
GET /api-third-party/service/datacenter/plugin_enable
appId:app的id
{ "code": 0, "msg": "" }
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
10.关闭插件
GET /api-third-party/service/datacenter/plugin_disable
appId:app的id
{ "code": 0, "msg": "" }
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
11.删除下载任务
GET /api-third-party/service/datacenter/download_delete
idList:用分号分隔开的下载任务ID;deletefile:是否同时删除文件;appId:插件id
{ "code": 0, "msg": "" }
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
12.获取插件开启关闭状态
GET api-third-party/service/datacenter/get_plugin_status
appId:插件id
{ "code": 0, "msg": "", "isEnable": false }
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
13.控制插件
GET /api-third-party/service/datacenter/plugin_control
appId:插件id;info:要传入的信息
{ "code": 0, "msg": "" }
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
14.获取链接设备列表
GET api-third-party/service/datacenter/get_connected_device
appId:插件id;info:要传入的信息
{"mac":"","list":[{"mac":"D7:04","type":"line","company":{"priority":2,"type":{"p":0,"c":0,"n":""},"name":"","icon":""},"ptype":0,"ctype":0,"ip":"","port":0,"name":"B8:CA:3A:A2:D7:04","origin_name":"","online":1,"statistics":{"dev":"b-lan","activets":"10106","onlinets":"34","upload":"","upspeed":"0","ip":"","downspeed":"0","online":"10078","maxdownloadspeed":"4338694","mac":"D7:04","initail":"-567","download":"","maxuploadspeed":"316356","idle":6},"authority":{"wan":1,"pridisk":0,"admin":1,"lan":1},"signal":""}],"code":0}
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
15.取路由器mac地址
GET api-third-party/service/datacenter/get_router_mac
appId:插件id;info:要传入的信息
{"code":0, "msg":"", result:"aa:aa:aa:aa:aa"}
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
16.设置设备访问外网权限
GET api-third-party/service/datacenter/set_wan_access
appId:插件id;info:要传入的信息;mac:设备mac地址 ;enable:(bool)是否可以访问外网
{"code":0, "msg":""}
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
17.获取路由器信息
GET /api-third-party/service/datacenter/get_router_info
appId:插件id
{"code":0,"msg":"","name":"0_cl","version": "0.7.51","type":"R1D"}
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
18.插件执行命令
GET api-third-party/service/datacenter/run_command
appId:插件id;command:要执行的命令
{ "code":0, "msg":"" }
Error code
{"code":1,"msg":"parameter missing"}{"code":3,"msg":"Parameter format error" } {"code":5,"msg":"invalid app id" }
附录:downloadStatus列表
DownloadStatusNone
Downloading
DownloadPause
DownloadCompleted
DownloadStoped
DownloadStatusFailed
DownloadNotStart
6.shell脚本sdk
开发者可以通过一些shell命令来调用路由器的功能。
6.1 plugin_action命令
要求插件在启动和每一次启动新进程时调用该函数,该函数用来记录插件进程的pid,并对这些进程进行管理。如果发现插件没有按照要求记录pid,我们会对该插件进行下架处理。
向路由APP发送通知的内容
向路由APP发送通知的
6.2 plugin_download命令
添加一个新的下载地址
指定下载目录
获取下载列表
根据id暂停任务
根据id启动任务
根据id删除任务
7.错误返回
API常见错误如下
client不存在
app ID并未注册,需要检查app ID是否正确
客户端标识符无效
app ID并未启用账号接入服务,所以没有访问用户数据的权限。参见2.2节
token无效或已经过期
权限过期,需要重新授权
重定向URI与预先注册的值不匹配或者不是一个合法的URI
账号接入服务中,填写的回调地址有错误。参见2.2节
没有权限操作
当前登录用户不能操作指定指定路由器
资源不存在
该设备的ID不正确,或者用户与该路由器已经解除绑定关系
大部分情况就是请求参数中缺少deviceId参数,这个用来标示路由器
Documentation built with .

我要回帖

更多关于 小米路由插件 的文章

 

随机推荐