新手指南

开发流程



第1步: 成为开发者

1 申请开发者

点击顶部导航的开发者,如果你还没有申请开发者则会出现如上图的页面,让你申请开发者,开发者分为企业开发者,个人开发者,个人开 发者需要填写姓名与身份证号,企业开发者需要填写企业名称与营业执照号,全部填写正确后,点击提交申请,那么恭喜你成为极路由的开发者了。

2 修改开发者信息

当你成功申请开发者后,进入开发者页面显示的是开发者的信息,在开发者的信息左下角会有一个修改信息的按钮,点击就可以修改相关的信息,点击修改完成操作。

第2步: 创建应用

1 应用申请

成为开发者,现在就可以申请应用了,如图所示填写相关的信息,注意的一点是,上传的ICON 只能是288*288的。

一个开发者可以申请多个应用。注意:上传的ICON 只支持288*288大小的图片

2 应用列表

点击左导的应用列表可以看到所申请的应用的应用列表。

从该列表中可以看到所申请的所有应用与状态,在操作中可以查看版本历史,审核历史等

3 应用提交审核

应用基本信息提交后,会进入应用的具体页面,在这个页面,可以将应该提交审核,或者修改应用。

A.点击左上角的提交审核就可以提交审核,审核通过后就可以上传应用版本,否则将无法上传应用版本。
B.每申请一个应用会自动分配一个appkey, appsecret,一旦发现appsecret存在漏洞的风险,可以更改appsecret。

4 应用详情

在应用列表页可以点击应用详情就可以进入应用详情页

5 应用修改

在应用详情页中会有一个应用修改按钮,点即进入修改页面

第3步: 开发测试

开发应用,打包成tgz格式文件。

将指定文件压缩到指定文件:
比如将文件file1,file2 压缩到 v1.1.1.tgz
tar zcvf v1.1.1.tgz file1 file2
由于平台会对文件进行自动扫描,所以上传的版本的tgz包只支持全文件的打包,暂不支持tgz包内包含文件夹。

将tgz文件解压到指定目录
tar zxvf test.tgz -C 指定目录
比如将v1.1.1.tgz解压到 /source/version 目录
tar zxvf v1.1.1.1.tgz -C /source/version

第4步: 上传应用版本,提交审核

1 上传应用版本

应用版本统一打包成tgz格式,按表单提交,提交后只有开发者可以安装使用,待管理员审核后,可以更改发布范围,完成上线

2 修改应用版本

在版本的列表中有修改版本的按钮可以修改该版本的rom使用范围及更新说明。

3 应用版本列表

从版本列表中有可以进行修改,删除

第5步: 应用上线

应用版本修改发布范围--上线

审核通过的应用版本才可以修改发布范围,从而实现上线

发布范围包括,普通,极先锋,开发组,开发者。
开发者:就是指开发者本身,刚上传的应用版本只有开发者自己可以安装使用;
开发组:加入官方开发群的各位开发者,可以率先使用这些应用,进行一些相关的测试等;
极先锋:开发爱好者,可以尝鲜使用这些新开发的应用;
普通用户:全体极路由用户。

至此开发完成!


开发文档
配置页面设置

引入manifest概念,在插件包根目录加入manifest.json文件,文件内数据为json格式

内容示例

下载
    
    {
        "manifest_version": "2.0.0",
        "configuration": [
            {
                "name": "单行文本",
                "type": "text",
                "variable": "DTEXT",
                "defaultvalue": "这是默认值",
                "required": 1,
                "description": "这是描述",
                "regexpression": ""
            },
            {
                "name": "多行文本",
                "type": "txtfile",
                "variable": "MORE",
                "defaultvalue": "1;2;3;4;",
                "required": "",
                "description": ""
            },
            {
                "name": "单选框",
                "type": "radio",
                "variable": "RADIO",
                "choices": "是=1;否=0",
                "defaultvalue": 1,
                "required": 1,
                "description": "这是描述"
            },
            {
                "name": "下拉菜单",
                "type": "selection",
                "variable": "SELECT",
                "choices": "a=1;b=2;c=3",
                "defaultvalue": "2",
                "required": "",
                "description": ""
            },
            {
                "name": "多选框",
                "type": "checkbox",
                "variable": "CHECKBOX",
                "choices": "a=a;b=2;v=3",
                "defaultvalue": "3",
                "required": "",
                "description": "这是描述"
            }
        ]
    }
    
    

效果图



参数详解

1、固定值
    
        "manifest_version": "2.0.0",   
    
    
2、配置结构
    
        "configuration": [
            {结构},
            {结构},
        ]   
    
    
3、结构
    
        {
            name : string 显示说明 
            type : string 类型(text:单行文本框;txtfile:多行文本;selection:下拉框;radio:单选框;checkbox:多选框;)
            variable : string 插件所需的配置key,注意:不要有下划线 _
            choices : string 配合下拉框、单选框、多选框使用,各选项值以;隔开,如: a=1;b=2;c=3
            defaultvalue : string 默认值,
            required : int 是否为必须参(1:必填;0:选填)
            description : string 描述
            regexpression : string 正则匹配用户所填数据("/^正则$/"),或使用is_ip(是否是ip)、is_port(是否是端口号)
        }
    
    
4、读取
用户在填写完配置之后,配置信息会打包到插件根目录,文件名为"插件英文名.conf",如下: ename.conf
    
    DTEXT='***'
    RADIO='***'
    
    
注意:type为txtfile的比较特殊,会单独写到你命名的variable文件下,比如:
    
        {
            "name": "单行文本",
            "type": "txtfile",
            "variable": "DTEXT",
            "defaultvalue": "这是默认值",
            "required": 1,
            "description": "这是描述",
            "regexpression": ""
        }
    
    
用户填写的该域信息会保存到DTEXT文件内,该文件存在于包根目录



iOS应用案例

示例Demo请参考:OpenAPIDemo.zip(点击下载)
应用示例
    
NSInteger const appID = <#插件AppID#>; // 插件AppID(AppKey)
NSString *const appSecret = <#插件AppSecret#>; // 插件AppSecret
NSString *const devId = <#要调用的路由器MAC地址#>; // 要调用路由器的MAC地址,大写无分隔符,如:D4EE07FFFFFF

NSString *baseURL = @"https://openapi.hiwifi.com"; // bind/unbind:使用http(s)://openapi.hiwifi.com // call:建议使用http(s)://client.openapi.hiwifi.com
NSString *action = @"bind";
NSTimeInterval timeout = 30.0; // 本次请求过期时间
NSTimeInterval expirePeriod = 2592000; // 接口授权过期时间
NSString *HTTPMethod = @"POST";
NSString *contentType = @"application/json";
NSString *permissions = @"[\"network.traffic.*\", \"network.common.*\"]"; // 插件申请的接口权限列表

NSString *jsonBody = [NSString stringWithFormat:@"{\"app_id\":\"%d\", \"client_id\":\"%@\", \"dev_id\":\"%@\", \"expire_period\":%f, \"permissions\":%@ }", appID,self.clientID, devId, expirePeriod, permissions];

// 签名
// openapi.hiwifi.com 使用AppSecret(开发平台-应用列表-应用详情中可查)签名
// client.openapi.hiwifi.com 使用ClientSecret(调用bind接口成功后返回)签名
NSString *signString = [NSString stringWithFormat:@"%@%@%@", action, jsonBody, appSecret];

// 拼URL
NSString *url = [NSString stringWithFormat:@"%@/%@?sign=%@", baseURL, action, [self md5HexDigest:signString]];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:HTTPMethod];
[request setTimeoutInterval:timeout];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[jsonBody dataUsingEncoding:NSUTF8StringEncoding]];

[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    
    
Andriod应用案例

示例Demo请参考:OpenExample.zip(点击下载)
应用示例
    
1. Configure.java://所有的配置类
/**
* @description 需开发者自己配置相关信息
* configure
*/
public static final String APP_ID = "《#插件AppId#》";  //插件AppKey
public static final String APP_SECRET = "《#插件AppSecret#》";//插件AppSecret
public static String MAC="《#路由器Mac地址#》";//要操作路由器的mac地址,大写无分隔符。eg:D4EE070B1C38

2.请求参数封装形式:{RequestBody.java  RequestBodyBulider.java}

3. HttpClient.java://简单网络请求类
JsonObject response = HttpClient.sendHttpPost(String url,JsonObject jsonObjSend);//jsonObjectSend为传入的StringEntity实体
    
    

HAE开发文档
概述:

HiWiFi开放云平台是HiWiFi面向开发者的开放平台,基于HAE,使得第三方插件开发者可以为自己的插件增加个性化界面..

参考案例:迅雷远程下载插件的HAE页面

插件HAE入口:

如何上传HAE站点:

通过你的HiWiFi 开放平台的插件列表页



1 站点上传注意事项:

1):插件得通过审核后才会出现上传站点的链接。

2):上传的包必须得是tgz格式。

3):HAE默认索引index.php 文件, 所以上传的站点包必须得含有index.php文件。

2 如何创建tgz文件:

1): 创建站点包文件 index.php 文件

2): 打包文件

tar -zcf ./demo.tgz ./index.php
    

这样就生成了tgz文件,然后将打包好的文件上传到站点,上传站点后,点击后面的访问测试站点

示例代码下载

3 上传HAE包

点击右侧的上传站点,进入上传页面,上传插件站点包即可:


4 上传插件包后,列表页出现如下选项:

1): 上传站点:可以继续上传站点,一旦上传新的站点将会覆盖之前的站点

2): 提交审核:站点提交审核后, 大家安装对应的插件后将会看到访问HAE站点的页面链接,点击后即可进入hae页面

3): 查看审核历史:查看站点包的审核记录

4): 访问测试站点:自己可以从该入口访问最新的hae站点页面效果,当觉得合适了,便可以提交审核,审核通过后就可以让普通用户访问了

点击访问测试站点,然后进入路由器选择页面,选择安装了该插件的某个在线路由器<绿色灯亮表明路由器在线>
选择路由器后进入HAE页面,然后即可看到你设置的页面信息
3 HAE 接口调用:
getRouterInfo() 获取路由器信息
$router_info = getRouterInfo();
print_r($router_info);
    
返回结果
Array
(
    [status] => 0
    [msg] => success
    [data] => Array
        (
            [ip] => 218.241.135.162 
            [wanip] => 192.168.10.116 
            [lastlogin] => 2014-11-03 12:16:12 //上次登录时间
            [lastboottime] => 2014-11-03 4:05:44
            [online] => 1 //当前是否在线
            [level] => 10 //路由器leve
            [model] => HC5661 //路由器型号
            [storage] => 6581 //总大小
            [version] => 0.9008.0.7075s //当前路由器的rom版本
            [storageType] => SD //外置外置存储类型
            [storageStatus] => rw //外置存储空间是否可写
            [storageState] => mounted //外置存储状态,是否挂载上
            [storageFreeSize] => 6154375168 //外置存储剩余总存储空间大小
            [flashFreeSize] => 2658304 //flash剩余大小
            [mac] => D4EE07074C9A //mac 地址
            [name] => 极路由_074C9A //路由器名称
        )
)

storageType/storageStatus/storageState/storageFreeSize/flashFreeSize/flashTotalSize 
获取这些信息要求rom版本不小于0.9007.0.6044 才可以获取这些数据
getRid() 获取当前的路由器的rid
 $rid = getRid(); 
返回结果
 12345 
getSid() 获取插件sid
 $sid = getSid(); 
返回结果
 12345 
getMac() 获取路由器MAC
 $mac = getMac(); 
返回结果
 D4EE07074C8B 
getSign($action, $jsonbody) 获取签名
请求参数
  必选 类型 说明
app_id true int 路由器id。
dev_id true string 路由器MAC。
method true string 请求的接口名称。
data true array 传递的参数。
demo
$aa = array(
    'app_id' => $app_id,                                     
    'dev_id' => $mac,                                                                          
    'method' => 'network.wireless.set_ssid',
    'data' => (object)null,
);
$jsonbody = json_encode($aa);
$sign = getSign($action, $jsonbody);
    
返回结果
 
Array
(
    [status] => 0
    [msg] => success
    [data] => 247e79557b7bd96722b4adf030cc50e5
)
 
openApi($action, $jsonbody, $sign) 调用当前路由器里面的一些接口
访问: OpenAPI参考文档 可以获取完整的openapi接口信息

比如调用迅雷插件的绑定状态接口
    $action = 'call';
    $routerinfo = getRouterInfo(); 
    $routerinfo = $routerinfo['data'];
    $router_name = $routerinfo['name'];
    $app_id = getSid(); //获取sid
    $mac = getMac(); //获取mac
    $rid = getRid(); //获取路由器rid
    $aa = array(
        'app_id' => $app_id,                                     
        'dev_id' => $mac,                                                                          
        'r_api' => 'call',                                                                              
        'r_server' => 'https://openapi.hiwifi.com/', 
        'timeout' => 1000,
        'method' => 'apps.xunlei.bind_status',
        'data' => (object)null,
    );
    $jsonbody = json_encode($aa);
    $sign = getSign($action, $jsonbody);
    $bind_status = openApi($action, $jsonbody , $sign);
    
返回结果
 
Array
(
    [code] => 0
    [msg] => 成功
    [data] => Array
        (
        )

    [app_data] => Array
        (
            [vip_level] => 0
            [bind_status] => 1
            [bind_user] => "zimu"
            [ever_binded] => 1
        )

    [app_msg] => get bind status ok
    [app_code] => 0
)
clientOpenApi($action, $jsonbody, $sign) 直接调用绑定路由器里面的接口
调用效果同上