今天,我的导师又放我鸽子了:),看到他确实很忙。于是,打开简书写下这第一篇文章。简要的说一下CoAP协议,全名Constrained Application Protocol,也就是说这是一个应用在受限制的设备上的,例如网络不佳,运算能力低下,存储能力低下的设备。相对于MQTT和XMPP协议,这是一个年轻的,国内外应用极少的物联网协议,有前景,但需考量适用性。
这不,我就来做实验了么:)
以下只是基本的客户端和服务器的展示,服务器中还需部署资源!以下有一半是自己所写,有误之处望指正!
客户端:
四个方法:
注意:只有服务器的资源部署了相应方法,才可以执行方法
1. GET:
URI uri = null;
//uri初始化
uri = new URI(args[0]);
//URI实例化,接收来自入口的uri
CoapClient client = new CoapClient(uri);
//CoAP客户端实例化
CoapResponse response = client.get();
//执行GET方法
System.out.println(response.getCode());
System.out.println(response.getOptions());
System.out.println(response.getResponseText());
//分别将响应码、选项、接收的字符输出
System.out.println(Utils.prettyPrint(response));
//建议使用此方式,规格化地将response全部信息打印出来
2. POST:
URI uri = null;
uri = new URI(args[0]);
CoapClient client = new CoapClient(uri);
//CoAP客户端实例化的过程
Scanner scan = new Scanner(System.in);
String inputChar = scan.nextLine();
String payload = inputChar;
//将键盘输入的payload初始化(非CoAP)
CoapResponse response = client.post(payload, TEXT_PLAIN);
//设置post的内容和内容的类型
System.out.println(response.getCode());
System.out.println(response.getOptions());
System.out.println(response.getResponseText());
System.out.println(Utils.prettyPrint(response));
//输出信息
3. PUT
URI uri = null;
uri = new URI(args[0]);
CoapClient client = new CoapClient(uri);
Scanner scan = new Scanner(System.in);
String inputChar = scan.nextLine();
String payload = inputChar;
// CoAP客户端实例化,并将键盘输入的payload初始化
CoapResponse response = client.put(payload, TEXT_PLAIN);
//设置put的内容和内容的类型
System.out.println(response.getCode());
System.out.println(response.getOptions());
System.out.println(response.getResponseText());
System.out.println(Utils.prettyPrint(response));
//输出信息
4. DELETE
URI uri = null;
uri = new URI(args[0]);
CoapClient client = new CoapClient(uri);
// CoAP客户端实例化
CoapResponse response = client.delete();
//执行delete方法
System.out.println(response.getCode());
System.out.println(response.getOptions());
System.out.println(response.getResponseText());
System.out.println(Utils.prettyPrint(response));
//输出信息
服务器:
以HelloCMRI为例:
四个方法:
1. GET:
exchange.respond(content);
//服务器向客户端返回内容content
2. POST:
String payload = exchange.getRequestText();
//从客户端接收字符,存入payload
Response response = new Response(ResponseCode.CREATED);
//实例化:
//客户端发出POST请求后,服务器向客户端返回CREATED码,
//客户端接收后呈现2.01Created和相应的延迟(ms)
response.getOptions().setLocationPath(resource.getURI());
//服务器向客户端返回路径
exchange.respond(CHANGED, exchange.getRequestText().toUpperCase(), TEXT_PLAIN);
//服务器向客户端返回内容
3. PUT:
content = exchange.getRequestText();
//服务器从客户端获取字符并更新
exchange.respond(ResponseCode.CHANGED,content);
//服务器向客户端返回2.04Changed和延迟
4. DELETE:
this.delete();
//服务器执行删除操作
exchange.respond(ResponseCode.DELETED);
//服务器向客户端返回2.02Deleted和延迟
额外方法:
Observe模式:
getAttributes().setObservable();
//添加标记,使core在get时可以看到obs:true
setObservable(true);
//设置Observe属性
setObserveType(CoAP.Type.CON);
//设置Observe类型
体现存储能力:如上面server中的POST方法
体现计算能力:
斐波那契数列很有意思,有兴趣的朋友可以结合图像理解
计算fibonacci number:
public void handleGET(CoapExchange exchange) {
int n = 20;
if (exchange.getRequestOptions().getURIQueryCount() > 0) {
try {
List<String> queries = exchange.getRequestOptions().getUriQuery();
for (String query:queries) {
if (pattern.matcher(query).matches()) {
n = Integer.parseInt(query.split("=")[1]);
}
}
} catch (Exception e) {
e.printStackTrace();
exchange.respond(ResponseCode.BAD_REQUEST, e.getMessage());
return;
}
}
int fib = fibonacci(n);
exchange.respond("fibonacci("+n+") = "+fib);
}
/**
* Recursive Fibonacci algorithm
*/
private int fibonacci(int n) {
if (n <= 1) return n;
else return fibonacci(n-1) + fibonacci(n-2);
}
体现不良网络环境工作能力:未知。