名词解释
AliOS Things: 阿里云智能IoT团队自研的物联网操作系统
HaaS:全称是Hardware as a Service,阿里云智能IoT团队基于AliOS Things系统推出的硬件即服务
HaaS UI:全称是Hardware as a Service User Interface,是源自AliOS Things操作系统上的一套应用&图形解决方案,支持C/C++和 JS两种开发语言
HaaS UI JSAPI扩展
HaaS UI内置的JSAPI为虽然JS提供了调用底层系统能力的接口,例如数据存储、网络管理、文件操作等,但是这些内置的JSAPI不能满足用户所有的开发需求。HaaS UI提供了扩展JSAPI的方法,用户可以根据项目需求和平台能力实现不同的扩展,以满足不同的功能需要。用户如果想要自定义一些JSAPI,可以按照本教程进行扩展。
1. 扩展JSAPI教程
本节内容用于扩展HaaS UI的JSAPI,提供js的扩展能力,下面将介绍一个demo JSAPI的编写步骤。
接口编写时主要有以下步骤:
JSAPI工程目录:
aos.mk用于在alios things编译
├── aos.mk
├── jsapi_demo
├── ExtensionProxyBase.h
├── DemoApiExtension.cpp
├── DemoApiExtension.h
└── aos.mk
1.1 重要说明
不论是接口还是事件,输入/输出的参数请确保为合法的json格式字符串
在回调中mProxy->postCallback(),方法必须执行,否则会导致内存泄露.就算没有返回值也必须调用.
接口定义参数为固定形式,只接收两个字符串类型参数,请参照testApi(const std::string& ,const std::string&)格式定义(不要修改定义)
1.2 JSAPI方法实现
所有扩展的JSAPI在使用前需通过REGISTER_JSAPI()方法注册:
extensionProxy->REGISTER_JSAPI(&testApi, moduleName, testApi);
接口实现示例:
DemoApiExtension.h,依赖于ExtensionProxyBase.h:
#pragma once
#include "ExtensionProxyBase.h" // 扩展jsapi时需要include该头文件
using namespace ariver::iot;
namespace demo
{
/**
* 异步方法
* @param callbackid naitve回调js方法时的回调id
* @param params js调用na
tive方法时的参数,json字符串
*/
void testApi1(const std::string& callbackid, const std::string& params);
/**
* 同步方法
* 同步方法和异步方法写法一模一样,区别在于上层js调用时是同步还是异步.
* @param callbackid naitve回调js方法时的回调id
* @param params js调用native方法时的参数,json字符串
*/
void testApi2(const std::string& callbackid, const std::string& params);
/**
* jsapi注册方法
*
*/
extern "C" void testapi_init_jsapis();
};
} // namespace demo
DemoApiExtension.cpp:
#include "DemoApiExtension.h"
namespace falcon
{
/**
* @param callbackid 用于回调js
* @param params (必现是json格式)
*/
void testJSApi1(const std::string& callbackid, const std::string& params) // 异步方法
{
/* user code */
printf("Native testJSApi1 called params(%s).n", params.c_str());
/* user code */
// callback
ariver::iot::ExtensionProxyBase* extensionProxy = ariver::iot::getJSApiExtensionProxy();
// 必须回调,成功返回成功,失败返回错误码
extensionProxy->postCallback(callbackid, ariver::iot::API_Success, "{"result": "testJSApi1 call success"}");
}
/**
* @param callbackid 用于回调js
* @param params (必现是json格式)
*/
void testApi2(const std::string& callbackid, const std::string& params) // 同步方法
{
printf("%s", ("testApi2 params:" + params + "n").c_str());
/*
* 同步方法和异步方法写法一模一样,区别在于上层js调用时是同步还是异步.
*/
std::string cbParams = "{"paramsToJs":"result2", "otherOutput":222}";
// 必须回调,成功返回成功,失败返回错误码
mProxy->postCallback(callbackid, API_Success, cbParams);
}
// extern给容器调用初始化
extern "C" void testapi_init_jsapis()
{
ariver::iot::ExtensionProxyBase* extensionProxy = ariver::iot::getJSApiExtensionProxy();
// call from js like:
// import testapi from "$jsapi/testapi";
// testapi.testJSApi1({}, r => {});
extensionProxy->REGISTER_JSAPI(&testJSApi1, testapi, testJSApi1);
// param1: apiFunction, param2: module, param3: apiName
}
}
ExtensionProxyBase.h:
#pragma once
#include
#include
#include