物联网通信之Coap 协议
Coap 简介
- 名为受限制的应用协议,是UDP上的应用层协议。适用于小内存,低处理和低存储能力的设备。传输内容小巧精简,对于较大的数据可分块传输。客户端可以发送观察者请求,仅当被观察的数值变化时服务器才传回客户端新数值。
协议特点
- 基于消息类型
- 请求响应模型
- 双向通信
- 轻量、低功耗
- 支持IP多播
- 非长连接通信,支持受限设备
- 支持观察模式
- 支持异步通信
- 支持Restful 接口
工作模式
CoAP是一个完整的二进制应用层协议,消息格式紧凑,默认运行在UDP上
###请求方式 和 消息类型
请求方式
- 1- GET:获取资源
- 2 -POST:创建资源
- 3- PUT:更新资源
- 4- DELETE:删除资源
定义了各种请求方式:
typedef enum {
IC_GET = 1,
IC_POST = 2,
IC_PUT = 3,
IC_DELETE = 4
} ICoAPRequestMethod;
应用场景:
coapMessage = [[ICoAPMessage alloc]initAsRequestConfirmable:YES requestMethod:IC_GET sendToken:YES payload:@""];
[cO addOption:IC_URI_PATH withValue:self.textField.text];
// add more Options here if required e.g. observe
// [cO addOption:IC_OBSERVE withValue:@""];
消息类型
内部定义
/*
* Type with +4 value for version
*/
typedef enum {
IC_CONFIRMABLE = 4,
IC_NON_CONFIRMABLE = 5,
IC_ACKNOWLEDGMENT = 6,
IC_RESET = 7
} ICoAPType;
- CON:需要被确认的请求,如果CON请求被发送,那么对方必须做出响应
- NON:不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应
- ACK:应答消息,接受到CON消息的响应
- 复位消息,当接收者接收到的消息包含一个错误,接收者解析消息或者不再关心发送者发送的内容,那么复位消息将会被发送
发送coap 消息
应用场景:
//发送消息到指定端口,并遵守协议
ICoAPMessage *iExchange = nil;
if (!iExchange) {
iExchange = [[ICoAPExchange alloc] initAndSendRequestWithCoAPMessage:iExchange toHost:@"4.coap.me" port:5683 delegate:self];
}
else {
[iExchange sendRequestWithCoAPMessage:iExchange toHost:@"4.coap.me" port:5683];
}
注释:在进行coap 请求的时候我们需要对 传递的 Message 进行数据的封装,然后使用既定的请求方式将消息传递出去,内部实现方法
发送消息之后需要实现的代理方法:
//接收到回复
- (void)iCoAPExchange:(ICoAPExchange *)exchange didReceiveCoAPMessage:(ICoAPMessage *)coapMessage {
if (!exchange.isMessageInTransmission) {
self.activityIndicator.hidden = YES;
}
count++;
NSString *codeString = [self getCodeDisplayStringForCoAPObject:coapMessage];
NSString *typeString = [self getTypeDisplayStringForCoAPObject:coapMessage];
NSString *dateString = [completeDateFormat stringFromDate:coapMessage.timestamp];
NSMutableString *optString = [[NSMutableString alloc] init];
for (id key in coapMessage.optionDict) {
[optString appendString:@"Option: "];
[optString appendString:[self getOptionDisplayStringForCoAPOptionDelta:[key intValue]]];
NSMutableArray *valueArray = [coapMessage.optionDict valueForKey:key];
for (uint i = 0; i < [valueArray count]; i++) {
[optString appendString:[NSString stringWithFormat:@" \nValue (%i): ", i + 1]];
[optString appendString:[valueArray objectAtIndex:i]];
[optString appendString:@"\n"];
}
[optString appendString:@"\n-----\n"];
}
if (exchange == iExchange) {
[self.textView setText:[NSString stringWithFormat:@"(%i) Message from: %@\n\nType: %@\nResponseCode: %@\n%@\nMessageID: %i\nToken: %i\nPayload: '%@'\n\n%@", count, dateString, typeString, codeString, optString , coapMessage.messageID, coapMessage.token, coapMessage.payload, self.textView.text]];
}
NSLog(@"\nMessage: %@\n\nType: %@\nResponseCode: %@\nOption: %@\nMessageID: %i\nToken: %i\nPayload: '%@'", dateString, typeString, codeString, optString, coapMessage.messageID, coapMessage.token, coapMessage.payload);
}
//接受失败
- (void)iCoAPExchange:(ICoAPExchange *)exchange didFailWithError:(NSError *)error {
//处理失败操作
}
HTTP和CoAP 之间的对比
- HTTP代表超文本传输协议,CoAP代表约束应用协议;
- HTTP协议的传输层采用了TCP,CoAP协议的传输层使用UDP
- CoAP协议是HTTP协议的简化版
- CoAP协议和HTTP协议一样使用请求/响应模型,拥有相同的方法
- CoAP开销更低,并支持多播
- CoAP专为资源构成应用而设计,如:IoT/WSN/M2M等…
Coap 和MQTT 之间的对比
- MQTT协议使用发布/订阅模型,CoAP协议使用请求/响应模型;
- MQTT是长连接,CoAP协议是无连接;
- MQTT通过中间代理传递消息的多对多协议,CoAP协议是Server和Client之间消息传递的单对单协议
- MQTT不支持带有类型或者其它帮助Clients理解的标签消息,CoAP内置内容协商和发现支持,允许设备彼此窥测以找到交换数据的方式