本文简要说明coap URI构成及URI到option的处理方式
概述
coap URI用于识别coap资源和提供定位资源的方法, coap的资源按照层次结构组织,并由coap服务器管理。coap提供coap://和coaps://两种URI类型,本文已coap://为例进行说明。名说明响应option
URI 构成 (URI Scheme)
coap-URI = “coap:” “//“ host [ “:” port ] path-abempty [ “?” query ]
例如1
2
3
4coap://192.0.2.1/test
coap://192.0.2.1:5687/test
coap://myhome/env/sensor/?name=temperature
coap://myhome/env/sensor/?name=temperature&room=bedroom
- host : 不能为空,如果host给的是ip地址就直接访问,如果给的是host name则要通过DNS解析
- port : 可选,如果不写,coap默认是5683端口,coaps是5684
- path-abempty :可以为空,或者是以/开始的路径
- “?” query : 查询以?开始,并接着key=value,如果有多个query用&连接
由于coap使用的资源通常受限,因此实际应用开发的时候coap劲量使用短的URI
URI to option
通常情况下coap的URI会被分解并放在coap的网络封包的option内,对应的option有4种:Uri-Host,Uri-Port,Uri-Path,Uri-Query
转换规则
Uri-Host
如果host是ip地址,无该option。如果host不是ip地址,则有Uri-Host选项,内容为host的小写ASCII码的percent-encoding
Uri-Port
如果URI内有port但不是10机制数,则使用默认端口.
如果port号和目的端口号不相等,则有Uri-Port,内容为port号
Uri-Path
当path-abempty不为空时,path-abempty每个段都进行percent-encoding,并对应一个Uri-Path。因此可能出现多个Uri-Path option
Uri-Query
query中每一个参数都转换为percent-encoding,并对应一个Uri-Query,因此可能出现多个Uri-Query option
转换时去掉?和分隔号&
Option说明
Uri-Host
option no: 3
format: string
length: 1~255
default: 请求目标地址IP
Uri-Port
option no: 7
format: uint
length: 0~2
default: 请求目标地址port
Uri-Path
option no: 11
format: string
length: 0~255
default: none
Uri-Path
option no: 15
format: string
length: 0~255
default: none
示例
示例1
1 | Input: |
示例2
1 | GET: |
wireshark分析如下图:
题外话
percent-encoding:百分号编码也称作URL编码, 是特定的编码机制,由RFC 3986规定其标准,大体分为以下,详细见参考文件
- 保留字符: 先转为UTF8字节序,然后对字节值进行百分号编码
- 未保留字符: 不进行百分号编码
参考
https://tools.ietf.org/html/rfc7252
https://tools.ietf.org/html/rfc3986#section-2.1