在上一篇文章 向大家介绍了一个简单的 coap 服务和客户端的实现。本文将继续深入,介绍 coap 协议中的通知功能。
添加可通知的资源
在 coap-server 项目中的 cn.com.hohistar.iot.coap.resources 包中添加一个名为: ObserveResource 的类。与上一篇文章中的 HelloWorldResource 一样,该类继承于: CoapResource。建立好以后,修改代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class ObserveResource extends CoapResource {
public ObserveResource(String name) { super(name);
setObservable(true); setObserveType(CoAP.Type.CON); getAttributes().setObservable();
Timer timer = new Timer(); timer.schedule(new UpdateTask(), 0, 1000); }
private class UpdateTask extends TimerTask {
@Override public void run() { changed(); } }
@Override public void handleGET(CoapExchange exchange) { exchange.setMaxAge(1); exchange.respond("Current value: 10.8"); } }
|
修改 Coap Server
修改 CoapService.java 文件,在 simpleListen 方法中加入新的资源:
1 2
| ObserveResource observeResource = new ObserveResource("observe-res"); server.add(observeResource);
|
修改后的完整方法代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public static void simpleListen() {
CoapService server = new CoapService();
HelloWorldResource helloworldRes = new HelloWorldResource("hello-world"); server.add(helloworldRes);
ObserveResource observeResource = new ObserveResource("observe-res"); server.add(observeResource);
server.start();
System.out.println("Server startup...");
}
|
修改客户的代码
在 BasicClient.java 文件中添加一个新的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public static void startObserver() {
CoapClient client = new CoapClient("coap://127.0.0.1:5683/observe-res");
AsyncListener asyncListener = new AsyncListener(); CoapObserveRelation observeRelation = client.observe(asyncListener);
try { System.in.read(); } catch(IOException e) { e.printStackTrace(); }
System.out.println("Existing...");
observeRelation.proactiveCancel(); }
|
然后将 main 函数的中代码修改为:
1 2 3 4 5
| public static void main(String args[]) {
startObserver(); }
|
验证结果
先运行服务端,然后运行客户端,在客户的的输出中可以看到类似如下的结果:
1 2 3 4 5
| response: Current value: 10.8 response: Current value: 10.8 response: Current value: 10.8 response: Current value: 10.8 ...
|
客户端的信息被服务端每秒通知一次。