.Net Mqtt程序

最近做物联网,客户的设备使用mqtt协议,所以研究了一下这个东西

说下遇到的问题,以及解决

前面在网络中总是搜索的都是.netCore的例子,然后发现一个问题,没解决,

使用MqttServer,没办法进行发布主题,然后就是这个.NetCore用的不多,是个控制台程序,不熟练,感觉控制不住,后面就又换了一个库。

后面找到一个强大的库,里面封装的物联网的东西挺多的,希望给大家一些帮助库名称:HslCommunication

大家可以去下载看看,这个里面什么websocket,mqtt等很多物联网的协议都封装了,又一种相恨见晚的感觉,以后就用这个开发,不是方便了很多,并且这个还是一个.NetFramework的库,用起来也是很方便。

后面的确是设备数据都接上来了,但是又有一个关于线程的问题,多个线程同时访问的问题,时不时就导致程序奔溃了,这个问题不是库的问题,是我自己写的问题,后面查找资料,终于也是解决了,这里记录一下,

程序中使用了多个线程进行访问一个公有的集合,导致程序出现问题,后面使用了锁(Lock)进行解决。话不多说,上代码吧

 //创建mqttSever
if (mqttServer == null)
   {

                mqttServer = new MqttServer();
                mqttServer.Port = port;

                mqttServer.OnClientApplicationMessageReceive += MqttServer_OnClientApplicationMessageReceive;
                mqttServer.OnClientConnected += MqttServer_OnClientConnected;
                mqttServer.OnClientDisConnected += MqttServer_OnClientDisConnected;
               

                mqttServer.ServerStart();



               
 }
//发布主题,针对某一个客户端进行发布,库里有很多方法,大家可以进行查看
  public void Publish(string clientid,string top,string payload)
        {
           
            mqttServer.PublishTopicPayload(clientid,top, Encoding.UTF8.GetBytes(payload));
           
        }

//收到消息的内容都是在这里
 private void MqttServer_OnClientApplicationMessageReceive(MqttSession session, MqttClientApplicationMessage message)
        {
           
                var msg = @"发送消息的客户端id:" + session.ClientId + "\r\n"
               + "发送时间:" + DateTime.Now + "\r\n"
               + "发送消息的主题:" + message.Topic + "\r\n"
              + "发送的消息内容:" + Encoding.UTF8.GetString(message.Payload ?? new byte[0]) + "\r\n"
              + "--------------------------------------------------\r\n" ;
                showtext = msg;
 
            
    }

最后说下这个锁的应用

你想要让线程访问某一个变量需要排队,就将某一个变量进行上锁,这里需要将所有用到改变量的代码出都写上锁,不然还会出现问题

//我这里需要移除离线的设备
  lock (onlineArr)
            {
                onlineArr.Remove(session.ClientId);
            }
//这个是在收到消息后的方法里面,同样加上锁,进行添加上线的设备 
lock(onlineArr)
            {
                onlineArr.Add(session.ClientId);
}

大致就是这样,大家有什么懂可以留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值