leshan基于OMALightweight M2M(LwM2M)协议的Java实现(入门)
概述:基于翻译当前版本为2017-9-24, github地址:leshan, LwM2M是基于Coap上的协议1、Home篇:Eclipse Leshan 用java语言实现了OMA Lightweight M2M(轻量级物联网,简写LwM2M)协议服务器和客户端的项目。它不是单一服务器和客户端,它是java库集合,致力帮助任务开发他们自己LwM2M服务器和客户端。该项目也提供一个客户端,服务器
概述:基于翻译当前版本为2017-9-24, github地址:leshan, LwM2M是基于Coap上的协议
1、Home篇:
Eclipse Leshan 用java语言实现了OMA Lightweight M2M(轻量级物联网,简写LwM2M)协议服务器和客户端的项目。
它不是单一服务器和客户端,它是java库集合,致力帮助任务开发他们自己LwM2M服务器和客户端。该项目也提供一个客户端,服务器和(bootstrap)引导服务器示例,它作为测试LeshanAPI的一个例子。
这个wiki包含所有关于Leshan官方文档, 只是目前还是不完善,但是我们会继续完善它!
在开始使用Leshan之前,我们强烈建议readme文件和OMA Lightweight M2M 规范。
2、Getting started(开始尝试)
如果你还没有看过readme和运行我们demo,强烈建议您首先做这两件事。
现在您已经准备好了,选择你要做什么:
- 我想要开发自己LWM2M服务器
- 我想要开发自己LWM2M客户端
- 我想要开发自己引导服务器:这个现在还没有指导,但是你可以去看看我们已经写的引导服务器,它在leshan-bsserver-demo下leshanBootstrapServerDemo
2.1、开发自己LWM2M服务器
这里你将会明白如何利用Leshan创建自己LWM2M服务器
获取Leshan
为了开发你自己服务器,你需要使用leshan-server-cf模块。获取最新版本
使用maven
<dependencies>
<dependency>
<groupId>org.eclipse.leshan</groupId>
<artifactId>leshan-server-cf</artifactId>
<version><!-- 使用最新版本 --></version>
</dependency>
<!-- add any slf4j backend, here we use one of the smallest one: slf4j-simple ,添加一个日志jar -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.10</version>
<scope>runtime</scope>
</dependency>
</dependencies>
创建一个简单服务器
你需要使用Leshan构建器去创建服务器。
LeshanServerBuilder builder = new LeshanServerBuilder();
// add this line if you are using leshan 1.0.0-M4 because of
// https://github.com/eclipse/leshan/issues/392
// builder.setSecurityStore(new InMemorySecurityStore()); (这就是当你使用版1.0.0-M4版需要取消这行注释)
LeshanServer server = builder.build();
server.start();
如果你执行这段代码,你应该可以看到如下日志
[...] INFO ... - LWM2M server started at coap://0.0.0.0/0.0.0.0:5683 coaps://0.0.0.0/0.0.0.0:5684
你可以尝试使用leshan写的客户端(leshan-client-demo)去连接这个服务器:
wget https://hudson.eclipse.org/leshan/job/leshan/lastSuccessfulBuild/artifact/leshan-client-demo.jar //获取客户端demo
java -jar ./leshan-client-demo.jar //运行客户端
你可以看你客户端成功注册到你的服务器上:
... INFO ... - Trying to register to coap://localhost:5683 ...
... INFO ... - Registered with location '/rd/SfDZcGn8p7'.
现在在设备离开和连上时打印日志
server.getRegistrationService().addListener(new RegistrationListener() {
public void registered(Registration registration, Registration previousReg,
Collection<Observation> previousObsersations) {
System.out.println("new device: " + registration.getEndpoint());
}
public void updated(RegistrationUpdate update, Registration updatedReg, Registration previousReg) {
System.out.println("device is still here: " + updatedReg.getEndpoint());
}
public void unregistered(Registration registration, Collection<Observation> observations, boolean expired,
Registration newReg) {
System.out.println("device left: " + registration.getEndpoint());
}
});
现在让我们尝试用已经注册设备发送一个请求
public void registered(Registration registration, Registration previousReg,
Collection<Observation> previousObsersations) {
System.out.println("new device: " + registration.getEndpoint());
try {
ReadResponse response = server.send(registration, new ReadRequest(3,0,13));
if (response.isSuccess()) {
System.out.println("Device time:" + ((LwM2mResource)response.getContent()).getValue());
}else {
System.out.println("Failed to read:" + response.getCode() + " " + response.getErrorMessage());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
扩展学习
你可以去看一下我们写的服务器demo代码:leshan-server-demo文件下LeshanServerDemo项目
2.1、开发自己LWM2M客户端
这里你将会看到如何利用leshan创建自己LwM2M客户端
获取Leshan
为了开发你自己客户端,你需要使用leshan-client-cf模块。获取最新版本
使用maven
<dependencies>
<dependency>
<groupId>org.eclipse.leshan</groupId>
<artifactId>leshan-client-cf</artifactId>
<version><!-- 使用最新版本 --></version>
</dependency>
<!-- add any slf4j backend, here we use one of the smallest one: slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.10</version>
<scope>runtime</scope>
</dependency>
</dependencies>
创建一个简单客户端
你需要使用Leshan构建器创建客户端
String endpoint = "..." ; // 选择一个端点名称
LeshanClientBuilder builder = new LeshanClientBuilder(endpoint);
LeshanClient client = builder.build();
client.start();
如果你执行这段代码(需要网络权限),你应该可以看到如下日志:
[...] INFO ... - Leshan client[endpoint:myClient] started at coap://0.0.0.0/0.0.0.0:46535 coaps://0.0.0.0/0.0.0.0:36490
[...] INFO ... - Trying to register to coap://leshan.eclipse.org:5683 ...
[...] INFO ... - Registered with location '/rd/w50JjnP76l'.
[...] INFO ... - Next registration update in 270.0s...
这意味着你可以在leshan 沙箱中成功注册你客户端。你可以在web界面查看到你的设备,你可以测试它(读或写设备对象)
创建你自己的对象
在默认情况下Leshan客户端是通过托管对象(ObjectsInitializer)创建(Security,Server和Device)。
// create objects 创建对象
ObjectsInitializer initializer = new ObjectsInitializer();
initializer.setInstancesForObject(LwM2mId.SECURITY, Security.noSec("coap://leshan.eclipse.org:5683", 12345));
initializer.setInstancesForObject(LwM2mId.SERVER, new Server(12345, 5 * 60, BindingMode.U, false));
initializer.setInstancesForObject(LwM2mId.DEVICE, new Device("Eclipse Leshan", "model12345", "12345", "U"));
// add it to the client 添加到客户端
builder.setObjects(initializer.create(LwM2mId.SECURITY,LwM2mId.SERVER, LwM2mId.DEVICE));
我们只提供三个对象的简单实现。你将需要自己实现LwM2M对象。
为了实现你自己LwM2M对象,你需要创建一个类,你需要实现LwM2mInstanceEnabler或BaseInstanceEnabler.
public class ConnectivityStatistics extends BaseInstanceEnabler {
@Override
public ReadResponse read(int resourceid) {
switch (resourceid) {
case 0:
return ReadResponse.success(resourceid, getSmsTxCounter());
}
return ReadResponse.notFound();
}
@Override
public WriteResponse write(int resourceid, LwM2mResource value) {
switch (resourceid) {
case 15:
setCollectionPeriod((Long) value.getValue());
return WriteResponse.success();
}
return WriteResponse.notFound();
}
@Override
public ExecuteResponse execute(int resourceid, String params) {
switch (resourceid) {
case 12:
start();
return ExecuteResponse.success();
}
return ExecuteResponse.notFound();
}
现在我们将它添加到你客户端:
ObjectsInitializer initializer = new ObjectsInitializer();
initializer.setInstancesForObject(LwM2mId.SECURITY, Security.noSec("coap://leshan.eclipse.org:5683", 12345));
initializer.setInstancesForObject(LwM2mId.SERVER, new Server(12345, 5 * 60, BindingMode.U, false));
initializer.setInstancesForObject(LwM2mId.DEVICE, new Device("Eclipse Leshan", "model12345", "12345", "U"));
initializer.setInstancesForObject(7, new ConnectivityStatistics());
// add it to the client
// DO NOT FORGET TO ASK TO CREATE THE NEW OBJECT "7"
builder.setObjects(initializer.create(7, LwM2mId.SECURITY,LwM2mId.SERVER, LwM2mId.DEVICE));
扩展学习
你可以去看一下我们写的客户端demo代码:leshan-client-demo文件下LeshanClientDemo项目
参考:https://github.com/eclipse/leshan/wiki
更多推荐
所有评论(0)