总体思路
- 将wulian SDK 加入iotivity 代码中编译
- 建立Iotivity Resource Container Wulian Bundle 连接wulian 网关和设备
- 调用wulian sdk 获取/控制wulian device
- 修改Iotivity 的 Resource Container的example作为app 入口用于发现wulian 设备
环境准备
获取iotivity源代码
wget http://mirrors.kernel.org/iotivity/1.1.0/iotivity-1.1.0.tar.gz
解压
tar -xzvf iotivity-1.1.0.tar.gz
集成第三库(以wulian sdk 集成为例)
解压 wulianC++SDK.rar
拷贝头文件到 resouce-container/include 目录
cp wulianC++SDK/clientSDK/include/*.h iotivity-1.1.0/service/resource-container/include
拷贝lib库到 resouce-container/include 目录
cp wulianC++SDK/clientSDK/include/*.so iotivity-1.1.0/service/resource-container/include
新建wulian resource-container bundle (以HueSampleBunlde 为模板创建WulianSampleBundle)
cd iotivity-1.1.0\service\resource-container\examples\
cp -r HueSampleBundle WulianSampleBundle
cd WulianSampleBundle 将Hue*.h Hue*.cpp 重命名为 Wulian*.h Wulian*.cpp
将 Wulian*.h Wulian*.cpp 文件的Hue 全部替换为Wulian
### 实现WulianSampleBundleActivator.cpp中的
+ activateBundle
+ deactivateBundle
+ createResource
+ destoryResource
### 实现WulianDevice.cpp 中的
+ initAttributes
+ handleGetAttributesRequest
+ handleSetAttributesRequest
### 修改ResourceContainer 启动配置文件
vim iotivity-1.1.0\service\resource-container\examples\ResourceContainerConfig.xml
添加bundle信息如下(注意activator中的名字需要和Bundle的前缀完全一致 (此处为WulianSample) )
oic.bundle.WulianSample
libWulianBundle.so
WulianSample
1.0.0
### 修改iotivity-1.1.0\service\resource-container\examples\ContainerSample.cpp
调用WulianSDK 初始化函数,注册事件回调 (详见下面设备连接部分)
## 修改编译脚本
vim iotivity-1.1.0\service\resource-container\SConscript
### 添加WulianSampleBundle 编译
######################################################################
# build Wulian sample bundle
######################################################################
conf2 = Configure(lib_env)
wulian_resource_bundle_env = resource_container_env.Clone()
wulian_resource_bundle_env.AppendUnique(CCFLAGS=[‘-fPIC’])
wulian_resource_bundle_dir = ‘examples/WulianSampleBundle/’
wulian_resource_bundle_env.AppendUnique(CPPPATH=[
wulian_resource_bundle_dir+’include’,
‘include/’
])
wulian_resource_bundle_env.PrependUnique(LIBS=[‘rcs_container’])
wulian_resource_bundle_src=[Glob(wulian_resource_bundle_dir+’src/*.cpp’)]
WulianBundle = wulian_resource_bundle_env.SharedLibrary(‘WulianBundle’,wulian_resource_bundle_src)
wulian_resource_bundle_env.InstallTarget(WulianBundle,’libWulianBundle’)
lib_env = conf2.Finish()
######################################################################
添加WulianSDk lib 库依赖
resource_container_env.AppendUnique(LIBS = ['dl', 'boost_system', 'boost_date_time', 'boost_thread','wulianSDK'])
修改打包脚本
vim iotivity-1.1.0\tools\tizen\iotivity.spec
在%install 标签下添加
cp out/tizen/*/%{build_mode}/service/resource-container/ContainerSample %{ex_install_dir}
cp out/tizen/*/%{build_mode}/service/resource-container/ContainerSampleClient %{ex_install_dir}
cp out/tizen/*/%{build_mode}/service/resource-container/examples/ResourceContainerConfig.xml %{ex_install_dir}/examples
cp out/tizen//%{build_mode}/lib.so %{buildroot}%{_libdir}
在%files标签下添加
%{_libdir}/libWulianBundle.so
编译
cd iotivity-1.1.0
sudo ./gbsbuild.sh
编译过程中可能需要根据提示下载第三方库到指定目录
获取iotivity rpm
~/GBS-ROOT-OIC/local/repos/tizen/armv7l/RPMS/iotivity/iotivity-1.1.0-0.armv7l.rpm
安装iotivity rpm
rpm -ivh iotivity-1.1.0-0.armv7l.rpm
rpm -ivh iotivity-service-1.1.0-0.armv7l.rpm
rpm -ivh iotivity-test-1.1.0-0.armv7l.rpm
运行container sample app 发现 wulian 设备
/usr/bin/ContainerSample
完整的iotivity 兼容wulian 代码路径
//TZTV_2.2.1/[Precedence2015]/[15_LEIA_Prj]/[DEV]/[SRCN]/SRCN/15_IoT_Hub_SRCN/OIC_DEMO-1.1.0/
设备连接
- Iotivity 通过Resource Container 来实现兼容第三方设备
- Resource container 通过读取配置文件ResourceContainerConfig.xml来获取bundle lib库的名字已经路径
- Resouce container 会调用 bundle lib库中的接口来激活bundle 创建resource,获取resouce属性,控制resouoce
- 对于第三方设备需要新建一个bundle 并实现其 active/destory/createresouce/destoryresource/initatrribute/handleGetAttributesRequest/handleSetAttributesRequest
以wulian为例
在server端container sample 中调用wulian 接口
Init(&m_WulianMessageCB, pc) //初始化sdk 注册事件回调
Search(ip) //查找网关
在m_WulianMessageCB 中响应wulian 设备事件
+ SEARTCH_GATEWAY //找到了网关
+ DEVICE_UP //设备上线
在响应DEVICE_UP时调用resouce container 接口创建OIC 资源
pContainer->addResourceConfig(“oic.bundle.WulianSample”, “”, resourceParams);
此接口会调用到对应bundle中的WulianSampleBundleActivator的WulianSample_externalCreateResource 函数并填充
BundleResource 结构体 调用m_pResourceContainer->registerResource 接口注册resouce
此步完成后,就已经完成了wulian 设备的发现并创建了一个对应的OIC resoure
# 设备控制
## client端使用iotivity 接口注册回调查找资源
OCPlatform::findResource(…,&foundResource);
## foundResource 中获取设备资源OCResource
## 改变资源属性,并向server端发送消息
curResource->post()
## server端收到消息后调用 resource container 中的handleSetAttributesRequest来处理
以wulian 为例 在中的handleSetAttributesRequest 中我们调用了wulian sdk 的接口来 发送消息给wulian 设备进行控制