最近做物联网,客户的设备使用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);
}
大致就是这样,大家有什么懂可以留言