HTTP设备接入
大约 4 分钟
一、接入步骤
提示
- 参考的http-server模块下test文件夹下的TestBasicScheme.java和TestDigestScheme.java接入测试代码
设备认证
- 摘要认证(Digest)
- 基础认证(Basic)
设备交互
- 发布物模型、设备信息相关Mqtt主题
二、设备认证

1. 摘要认证
- 接收到客户端未认证请求后,服务器端回复 状态401,Header头:WWW-Authenticate,值为:Digest realm="http-auth@fastbee.com", nonce="xxxxx", opaque="", stale="FALSE", qop="auth", algorithm="MD5"
Digest: 说明是摘要认证
qop: =auth时说明需要认证,=auth-int时需要有完整性保护的认证,其他值忽略。(可选)
realm: 当前响应所在的域,根据域就知道该使用哪个用户名密码了,一般包含执行认证功能的主机名。
nonce: 服务器生成的随机字符串,用于加密使用,一般是Base64或十六进制数据,Get请求conce包含过期时间,Put或Post要求使用一次性nonce。
stale: 为true时说明nonce失效了,需要重新获取,为false是说明nonce仍然有效。
a1gorithm: 说明算法,没有该值时默认使用MD5算法
- 客户端 解析 ww-Authenticate 获取nonce和加密算法等信息,生成response
1. 以格式 user:realm:password 进行MD5加密得到值 a1,如 fastbee:http-auth@fastbee.com:fastbee
2. 以格式 method:uri 进行MD5加密得到值 a2,如 post:/
3. 以格式 a1:nonce:nc:cnonce:qop:a2 进行MD5加密得到 response,如:a1:326435383a37323966343563663a3c2f55408da812d8509c09bb0574faff:00000001:0a4f113b:auth:a2
- 客户端 给http请求添加Header头:Authorization,值为:
Digest username="fastbee", realm="http-auth@fastbee.com",
nonce="353761313a62373364373163373a94eac188bbb9a6119d58f125dfad1c7a", uri="/",algorithm="MD5",
qop=auth,nc=1,cnonce="177783ecbdc88e14",response="c3a1lcf18elebc5f3b237dd4664169262"
- 服务器端收到请求,进行认证,认证成功后,服务器会存储session信息,下次请求带认证头即可确认设备归属,并获取设备存储在会话中的信息
2. 基础认证
- 接收到客户端未认证请求后,服务器端回复 状态401,Header头:WWW-Authenticate,值为:Basic realm="http-auth@fastbee.com"
- 客户端将 user:password 进行base64编码,结果:dXNlcipwYXNzd29yZA==
- 客户端给http请求添加Header头:Authorization,值为:Basic ywRtaW46YWRtal4=
- 服务器端收到请求,进行认证,认证成功后,服务器会存储session信息,下次请求带认证头即可确认设备归属,并获取设备存储在会话中的信息
三、设备交互
productId
代表产品ID, SerialNumber
代表设备编号。通过web端获取产品ID和设备编号,如果使用自动添加设备,设备编号可以使用唯一编码或者使用设备MAC地址。 http认证成功后,客户端需发送/info/post请求,携带产品ID和设备编号信息,服务器端会存储到session中。
2. 发布主题
uri | 描述 |
---|---|
/info/post | 发布设备信息 |
/property/post | 发布数据 (实时显示,属性/功能和监测数据,可定时上报监测数据) |
/event/post | 发布事件 |
/monitor/post | 发布实时监测数据(仅用于实时监测图表显示,不会存储) |
3. 数据格式
设备和系统交互使用JSON格式
- 发布设备信息,对应主题:
/info/post
# 描述:1.设备上电后发布设备信息; 2.设备接收到设备信息指令后发布设备信息 # productId 产品ID # SerialNumber 设备编号 # rssi 设备信号(信号极好[-55— 0],信号好[-70— -55],信号一般[-85— -70],信号差[-100— -85]) # status 设备状态,固定为3,表示在线 # firmwareVersion 固件版本 # userId 用户的ID,可设置为用户ID为1(管理员),配网时会分配设备给具体的用户。 # longitude 可选,经度,使用设备定位时需要上传 # latitude 可选,纬度,使用设备定位时需要上传 # summary 可选,摘要,设备的配置信息等,json格式,对象可自定义 { "productId": 145, "SerialNumber": "D1M267SH21TM", "rssi": -43, "firmwareVersion": 1.2, "status": 3, "userId": 2, "longitude": 0, "latitude": 0, "summary": { "name": "FastBee", "chip": "ESP8266", "author": "kerwincui", "deliveryTime": "2023-06-06", "activeTime": "2022-10-01" } }
- 发布数据和事件,对应主题:
/property/post
、/event/post
# 描述:属性、功能、事件都属于物模型,Json定义是一样的。`value` 的值如果是布尔类型,值为"0"或者"1",代表打开/关闭;枚举类型对应枚举项的键值(例如 "1",代表中速档位);数组类型是以英文逗号分隔的字符串。 # id 标识符,产品详情中查看物模型,对应物模型的标识符 # value 值,对应物模型中定义,以字符串类型传递 # remark 可以直接使用订阅到的备注信息,设备日志信息中查看到该备注 [{ "id": "gear", "value": "1", "remark": "档位设置成功" }, { "id": "switch", "value": "0", "remark": "开关已关闭" }]
- 发布实时监测,对应主题:
/monitor/post
# 描述:根据订阅到的实时监测消息,发布指定数量和间隔的监测数据 # id 标识符,实时监测是物模型中的属性,产品详情中查看标识符,对应id值 # value 设备采集的值,只能是整数或者小数,以字符串类型传递 # remark 可为空或者使用设备当前时间 [{ "id": "temperature", "value": "27.43", "remark": "" }, { "id": "humidity", "value": "32.18", "remark": "" }]