一.使用.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: 如果同时登陆两个设备是会被挤下线的哦.
登陆效果:
订阅:
发布: