物联网通信之Coap 协议

物联网通信之Coap 协议

文章目录

    • 物联网通信之Coap 协议
      • Coap 简介
      • 协议特点
      • 工作模式
        • 请求方式
        • 消息类型
        • 发送coap 消息
      • HTTP和CoAP 之间的对比
      • Coap 和MQTT 之间的对比

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内置内容协商和发现支持,允许设备彼此窥测以找到交换数据的方式

你可能感兴趣的:(iOS开发)