以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [免费开源]狐表集成MQTT解决方案,MQTT是目前大热物联网领域最广泛使用的软硬件通讯协议。如果连MQTT都没听过,别说自己是做物联网项目的,会被人笑的....  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=159010)

--  作者:chen37280600
--  发布时间:2020/12/10 15:28:00
--  [免费开源]狐表集成MQTT解决方案,MQTT是目前大热物联网领域最广泛使用的软硬件通讯协议。如果连MQTT都没听过,别说自己是做物联网项目的,会被人笑的....
(快速浏览杰哥分享过的所有经验汇总,点击跳转

简介
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在物联网领域应用特别广泛。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。


此主题相关图片如下:微信截图_20201210153205.png
按此在新窗口浏览图片


1基础
 1引入dll
来自于github高分的开源m2mqtt库,dll下载:在帖子结尾

github源码地址:https://github.com/eclipse/paho.mqtt.m2mqtt

此主题相关图片如下:1.png
按此在新窗口浏览图片


2添加命名空间

 空间名:uPLibrary.Networking.M2Mqtt  ,别名:mq  
  空间名:uPLibrary.Networking.M2Mqtt.Messages   ,别名:mqs 

 
此主题相关图片如下:2.png
按此在新窗口浏览图片


重启项目,再检查命名空间是否还在。因为如果你写错英文,它会消失

3添加全局代码
Public MqttSub As mq.MqttClient \'MQTT的1个订阅端,方便连接后全局调用
Public MqttPub As mq.MqttClient \'MQTT的1个发布端,方便连接后全局调用
Public MqttQosDic As new Dictionary(of Integer,Byte)\'qos质量枚举,在AfterOpenProject后初始化

\'1订阅者相关---
\'MQTT订阅者断开连接后触发的事件
Public Sub SubConnectionClosed(ByVal sender As Object, ByVal e As EventArgs)
    Functions.Execute("MqttSubDisConnected")
End Sub

\'MQTT订阅者订阅后触发的事件
Public Sub MqttMsgSubscribed(ByVal sender As Object, ByVal e As mqs.MqttMsgSubscribedEventArgs)
    Functions.Execute("MqttMsgSubscribed")
End Sub

\'MQTT订阅者收到消息时触发的事件
Public Sub MqttMsgPublishReceived(ByVal sender As Object, ByVal e As mqs.MqttMsgPublishEventArgs)
    Functions.Execute("MqttReceivedMessage",e.Message,e.Topic,e.QosLevel)
End Sub

\'MQTT订阅者取消订阅后触发的事件
Public Sub MqttMsgUnsubscribed(ByVal sender As Object, ByVal e As mqs.MqttMsgUnsubscribedEventArgs)
    Functions.Execute("MqttMsgUnsubscribed")
End Sub

\'2发布者相关
\'MQTT发布者断开连接后触发的事件
Public Sub PubConnectionClosed(ByVal sender As Object, ByVal e As EventArgs)
    Functions.Execute("MqttPubDisConnected")
End Sub

4狐表AfterOpenProject事件添加代码

\'初始化MqttQos的枚举---
MqttQosDic.Add(0,mqs.MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE) \'0级,最多1次,消息可能会丢失
MqttQosDic.Add(1,mqs.MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE) \'1级,最少1次,消息可能会重复
MqttQosDic.Add(2,mqs.MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE) \'2级,仅发1次,会增加开销甚至堵塞
\'初始化MqttQos的枚举---

 5添加内部函数
5.1订阅者相关
内部函数名:MqttMsgSubscribed
\'MQTT订阅者订阅主题后触发的委托事件


内部函数名:MqttMsgUnsubscribed
\'MQTT订阅者订阅后触发的委托事件


内部函数名:MqttReceivedMessage
\'订阅的MQTT收到信息时触发的事件
\'注意编码有Default和UTF8,乱码请切换
Dim msg As String = Encoding.Default.GetString(args(0)) \'消息内容
Dim Topic As String = args(1) \'主题名
Dim QosLevel As Integer = args(2) \'qos质量,有0,1,2


内部函数名:MqttSubDisconnected
\'MQTT订阅者断开连接后触发的委托事件


5.2发布者相关
内部函数名:MqttPubDisconnected
\'MQTT发布者断开连接后的委托事件

内部函数名:MqttPublish
\'对某个主题发送某个qos质量的消息
\'通过 Functions.Execute("MqttPublish","主题","内容",0,False) 使用
\'MqttQosDic是全局Qos枚举变量,已经定义好012级别

Dim Topic As String = Args(0) \'主题
Dim msg As String = Args(1) \'消息文本内容
Dim qos As Integer = Args(2) \'质量等级,有012
Dim retain As Boolean = Args(3)
\'Retain若为True,该条消息将被保留做为最后一条收到的消息。下一个订阅消息者将能至少收到该条消息

If MqttPub.IsConnected Then   
    \'注意编码类型有Default和UTF8,乱码请切换
    MqttPub.Publish(Topic, Encoding.Default.GetBytes(msg), MqttQosDic(qos),retain)
End If


 6覆盖help.mdb

用我的help.mdb覆盖到狐表程序里的help.mdb(参考路径C:\\foxtable\\Professional)
我为代码精灵增加了很多mqtt的提示

下载:
 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:help.zip



此主题相关图片如下:3.png
按此在新窗口浏览图片

(顺便如果你想问我怎么添加的提示,你可以看之前我分享的帖子http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=152491&replyID=&skin=1)


2订阅者教程
 1初始化变量
MqttSub = new mq.MqttClient("127.0.0.1",1884,False,new System.Security.Cryptography.X509Certificates.X509Certificate,new System.Security.Cryptography.X509Certificates.X509Certificate,new mq.MqttSslProtocols )
\'或者new mq.MqttClient("http://域名:端口号/")

\'把全局代码里自定义的事件委托给当前MqttSub实例
AddHandler MqttSub.ConnectionClosed, AddressOf SubConnectionClosed
AddHandler MqttSub.MqttMsgSubscribed, AddressOf MqttMsgSubscribed
AddHandler MqttSub.MqttMsgPublishReceived , AddressOf MqttMsgPublishReceived
AddHandler MqttSub.MqttMsgUnsubscribed, AddressOf MqttMsgUnsubscribed


2连接服务器
If MqttSub.IsConnected =False Then
MqttSub.Connect(Guid.NewGuid.ToString,"admin","111") \'指定连接的随机ID,账号,密码
\'如果没有账号密码 MqttSub.Connect(Guid.NewGuid.ToString)
output.show(MqttSub.IsConnected)
End If


3订阅主题
支持多个主题,用数组传入
注意有多少个主题,就有多少个质量系数
MqttSub.Subscribe({"mytopic"},{MqttQosDic(0)})


4取消订阅
MqttSub.UnSubscribe({"mytopic"})


5关闭连接
If MqttPub.IsConnected Then
    MqttPub.Disconnect
End If


3发布者教程
1初始化变量
MqttPub = new mq.MqttClient("127.0.0.1",1884,False,new System.Security.Cryptography.X509Certificates.X509Certificate,new System.Security.Cryptography.X509Certificates.X509Certificate,new mq.MqttSslProtocols )
\'或者new mq.MqttClient("http://域名:端口号/")

\'把全局代码里自定义的事件委托给当前MqttSub实例
AddHandler MqttPub.ConnectionClosed, AddressOf PubConnectionClosed

2连接服务器
If MqttPub.IsConnected =False Then
    MqttPub.Connect(Guid.NewGuid.ToString,"admin","111") \'指定连接的随机ID,账号,密码
    \'如果没有账号密码 MqttSub.Connect(Guid.NewGuid.ToString)
    Output.show(MqttPub.IsConnected)
End If

3发送消息
Functions.Execute("MqttPublish","主题","内容",0,False)


4关闭连接
关闭后会释放内存,重连需要重新创建实例
If MqttPub.IsConnected Then
    MqttPub.Disconnect
End If

5MQTT服务器推荐
这个dll对主流的MQTT服务器版本都支持,Windows下,我推荐mosquitto,免安装,直接cmd运行即可。使用方法自行百度

6注意的坑
1. 一个程序,可以同时对同一个mqtt服务器进行订阅和发布
2. 一般是先有人订阅主题,再对主题发布信息。如果反过来,则发布的消息会被服务器当垃圾扔掉
3. 不支持TLS1.2加密,因为.net4.0框架不支持

7dll下载

这么高端的功能,不打个广告有点可惜,下载链接在我淘宝详情页的结尾,记得滚下去看完哦

以下内容只有回复后才可以浏览



===============================================================
顺便总结以前分享过的帖子,方便大家学习

联系QQ:2385350359

免费产品:

经验分享:



















[此贴子已经被作者于2022/7/21 9:59:34编辑过]

--  作者:teng0731
--  发布时间:2020/12/10 15:59:00
--  
我是来点赞的
--  作者:WELOVEFOX
--  发布时间:2020/12/10 16:01:00
--  
杰哥又出大作了图片点击可在新窗口打开查看
--  作者:wei0769
--  发布时间:2020/12/10 16:20:00
--  

--  作者:zhangjian222200
--  发布时间:2020/12/10 16:37:00
--  
mark
--  作者:有点蓝
--  发布时间:2020/12/10 16:44:00
--  
多谢分享!
--  作者:flashman
--  发布时间:2020/12/10 16:52:00
--  
谢谢分享这么好的东西。
--  作者:ljh29206
--  发布时间:2020/12/10 17:10:00
--  
厉害

--  作者:hrsoft
--  发布时间:2020/12/10 19:40:00
--  
图片点击可在新窗口打开查看
--  作者:linswcfr
--  发布时间:2020/12/10 19:48:00
--  
mark