学习笔记--MQTT协议接入Onenet服务器(C#)

一.使用.NET 开源库

我们使用MQTTnet创建我们的MQTT通信, 版本一直更新请下载最新版

二.Fixed header类型

名字

流向

描述

CONNECT

1

C->S

客户端请求与服务端建立连接

CONNACK

2

S->C

服务端确认连接建立

PUBLISH

3

CóS

发布消息

PUBACK

4

CóS

收到发布消息确认

SUBSCRIBE

8

C->S

订阅请求

SUBACK

9

S->C

订阅确认

UNSUBSCRIBE

10

C->S

取消订阅

UNSUBACK

11

S->C

取消订阅确认

三.CONNECT报文连接

字段设置

消息示例

client_id设置为平台创建设备时的设备id

username设置为“项目ID”

password设置为“鉴权信息(auth_info)”

client_id=”123”

username=”433223”

password=”注册的鉴权信息”

我们就要按照上表向平台提交我们的CONNECT报文:

参数已经修改非我真确的ID和PASSWORD

var options = new MqttClientTcpOptions
                {
                    //ProductID: 1199   userID: 83248   API-KEY: 5aldNFKeIjkmpS4XweG9=LI=
                    //DeviceID: 259262  autn-info: pub12345
                    Server = "183.230.40.39",
                    Port = 6002,
                    ClientId = "259262",                    //deviceID 
                    UserName = "1199",                      //ProductId
                    Password = "5aldNFKeIjkmpS4XwmeG9=LI=",//API-KEY or auth-info
                    KeepAlivePeriod = ts2,
                    CleanSession = true
                    
                };

除此之外我们还想要客户端和Onenet平台保持长连接, 否则接上就断开连接我们就无法实现我们的功能. 我们只需要设定KeepAlive参数就好了.

平台文档中给出: 每个客户端可自定义设置连接保持时间,最短120秒,最长65535秒。

KeepAlivePeriod = ts2,

ts2为一个TimeSpan对象, 大家自己设定就OK啦.

四.publish报文上传数据

参考官方文档:

PS: 官方文档一小时 > 百度+维基+csdn+github+....好多天尴尬

数据类型1格式说明:

Byte 1

数据点类型值:1    //1: json格式1字符串

0

0

0

0

0

0

0

1

Byte 2

//指示后面json字符串长度

固定两字节长度高位字节,值为0x00

Byte 3

固定两字节长度低位字节,值为0x41

Byte 4

{

 “datastreams”:[// 可以同时传递多个数据流

       {

“id”:”temperature”,

“datapoints”:[

{

”at”:”2013-04-22 22:22:22”,//可选

”value”: 36.5//用户自定义

}

]

},

{

“id”:”location”

“datapoints”:[…]

}, { … }

]

}

Byte n


数据类型7(type == 7)格式说明:(每次最多500个数据流的浮点数)

Byte 1

Bit0-5数据类型指示:type=7 //可离散浮点数数据流

Bit6:保留,置0

Bit7: 时间指示位,1,携带6字节时间

1

0

0

0

0

1

1

1

Byte 2

年(后两位),例如2016年,则该字节为16

0

0

0

1

0

0

0

0

Byte 3

月(1-12)

Byte 4

日(1-31)

Byte 5

小时(0~23)

Byte 6

分钟(0~59)

Byte7

秒(0~59)

Byte 8

//数据流名称(取值范围1-65535)

高位字节,值为0x00

Byte 9

低位字节,值为0x01

Byte10

//数据流个数(取值范围1-500)

高位字节,值为0x00

Byte11

低位字节,值为0x01

Byte 10

4字节float类型,低位在前,高位在后

Byte 11

Byte 12

Byte 13

...

Byte n

//数据流名称(取值范围1-65535)

高位字节,值为0x24

Byte n+1

低位字节,值为0x37

Byte n+2

//数据流个数(取值范围1-500)

高位字节,值为0x01

Byte n+3

低位字节,值为0x00

Byte n+2

4字节float类型,低位在前,高位在后

Byte n+4

Byte n+5

Byte n+6


将数据发布到$dp系统Topic上

数据发送格式

e.g.

{
   "datastreams":[
        {
        "id":"Tempreture",
        "datapoints":[
                            "value":36
                            ]
                    }
   ]
}

运行效果:(发送结束会自动断开与服务器的连接)

五.订阅单设备数据流

订阅方式: 可以通过订阅 /device_id/数据流名 的方式,及时获取到某设备最新的数据点信息

PS: 注意反斜杠的方向

运行截图:


六.运行结果

TIPS: 如果同时登陆两个设备是会被挤下线的哦.

登陆效果:

订阅:

发布:


猜你喜欢

转载自blog.csdn.net/qq_37832932/article/details/80282986
今日推荐