HTTP、CoAP推送消息

针对一些下位机或特殊应用场景中无法使用MQTT客户端情况可使用此功能通过HTTP或CoAP协议推送消息到Coolpy7内核进行消息发布。v7.3.2.6开始支持本功能。

架构

HTTP协议发布消息

  1. 1.
    通过POST方法调用接口
  2. 2.
    通过Header中添加Basic Auth信息进行用户名、密码提交(与MQTT连接的UserName,PassWord保持一致
  3. 3.
    通过URL中的Query参数设置MQTT消息参数
  4. 4.
    Coolpy7节点收到请求后保持与原用户身份验证功能调用扩展服务进行用户身份验证,验证成功后消息将发布到MQTT网络中
Basic Auth算法, 以半角":"号组合用户名和密码,然后进行Base64进行编码放到http的header中,header 键为Authorization,值以Basic加一个空格为前缀, 然后并上用户名密码的base64值
例如:Basic amFjb2I6cGFzcw==
从7.3.2.9版本开始支持使用JWT进行身分验证,通过配置相关启动参数后,同相关方式可使用JWT为 Basic +jwtToken,测试代码:https://github.com/Coolpy7/coolpy7_benchmark/blob/master/test_http_publish/cp7_http_pub_jwt.go
例如:Basic eyJhbGciOiJIUzI1NiJ9.e30.k1PZfshORXyxbck0bv95juNEBvbPNd2L47bqVsy4ix8
CURL使用示例
curl -v -X POST -H "Authorization: Basic c3R1ZGVudDpzdHVkZW50" "Content-Type: application/json" -d '{"id":100}' 'http://localhost:8888/pub?clientid=jacoblai&topic=testtopic/+/a/&qos=0&retain=false'
性能测试 (WRK压测)
wrk -t 16 -c 1000 -d 10s --latency --timeout 5s -s ./post.lua 'http://localhost:8081/pub?clientid=jacoblai&topic=testtopic/a&qos=0&retain=false'
Running 10s test @ http://localhost:8081/pub?clientid=jacoblai&topic=testtopic/a&qos=0&retain=false
16 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 8.14ms 3.05ms 45.08ms 65.95%
Req/Sec 4.47k 2.16k 66.48k 89.63%
Latency Distribution
50% 8.93ms
75% 10.11ms
90% 11.79ms
99% 12.90ms
712972 requests in 10.10s, 233.35MB read
Socket errors: connect 0, read 918, write 0, timeout 0
Non-2xx or 3xx responses: 712972
Requests/sec: 70569.91
Transfer/sec: 23.10MB
post.lua压测提交测试内容
wrk.method = "POST"
wrk.body = '{"jsonrpc":"2.0","method":"cita_sendTransaction","params":["abcd"],"id":2}'
wrk.headers["Content-Type"] = "application/json"

CoAP协议发布消息

从7.3.2.9版本开始支持使用JWT进行身分验证,通过配置相关启动参数后,同相关方式可使用JWT为 Basic +jwtToken,测试代码:https://github.com/Coolpy7/coolpy7_benchmark/blob/master/test_coap_publish/cp7_coap_pub_jwt.go
例如:Basic eyJhbGciOiJIUzI1NiJ9.e30.k1PZfshORXyxbck0bv95juNEBvbPNd2L47bqVsy4ix8
  1. 1.
    通过SetOption的LocationQuery参数设为Basic Auth身份验证信息
  2. 2.
    通过SetOption的URIQuery参数设置publish参数
消息示例
req := coap.Message{
Type: coap.Confirmable,
Code: coap.POST,
MessageID: uint16(rand.Intn(max-min) + min),
Payload: []byte(`{"data":"hello mqtt from coap"}`),
}
req.SetPathString("/pub")
req.SetOption(coap.LocationQuery, "Basic amFjb2I6cGFzcw==")
req.SetOption(coap.URIQuery, "clientid=jacoblai&topic=testtopic/+/a/#&qos=0&retain=false")
性能指标(单个客户端)
goos: darwin
goarch: amd64
BenchmarkPub
BenchmarkPub-8 41418 28107 ns/op 633 B/op 10 allocs/op
PASS