m2mqtt庫:https://github.com/eclipse/paho.mqtt.m2mqtt
m2mqtt手冊:https://m2mqtt.wordpress.com/using-mqttclient/
m2mqtt下載:https://www.nuget.org/packages/M2Mqtt/
準備
- 本客戶端使用VS2015進行開發,所以需要實現安裝VS2015。
- 開發之前需要下載M2MQTT庫。m2mqtt庫的獲取,可以使用vs的nuget來獲取。
- 如果VS2015沒有NuGet包管理器,可以按照https://jingyan.baidu.com/article/066074d636fd19c3c21cb0a2.html安裝。
- 重啓VS2015後,打開自己的C#工程,然後打開“工具”-“Nuget包管理器”-“程序包管理器控制檯”
在控制檯中輸入“Install-Package M2Mqtt -Version 4.3.0”即可自動完成配置。
代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using System.Net.Security;
namespace m2mqtt_test
{
class Program
{
static void messageReceive(object sender, MqttMsgPublishEventArgs e)
{
string msg = "Topic:" + e.Topic + " Message:" + System.Text.Encoding.Default.GetString(e.Message);
Console.WriteLine(msg);
}
static bool cafileValidCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
string msg = "X509 鏈狀態:";
foreach (X509ChainStatus status in chain.ChainStatus)
{
msg += status.StatusInformation + "\n";
}
msg += "SSL策略問題:" + (int)sslPolicyErrors;
Console.WriteLine(msg);
if (sslPolicyErrors != SslPolicyErrors.None)
return false;
return true;
}
static void Main(string[] args)
{
string brokerHostName = "192.168.1.38";
int brokerPort = 8883;
string clientId = "m2mqtt";
string username = "develop";
string password = "666666";
string[] topic = {"topic"};
byte[] qosLevels = { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE};
string caPath = "C:/MqttSSL/ca.crt";
X509Certificate caCert = new X509Certificate(caPath);
Console.WriteLine(caCert.ToString(true)+"\n"+caCert.ToString());
Console.ReadKey();
Console.WriteLine("------------------------分割線-------------------------------");
//無SSL連接
//MqttClient client = new MqttClient(brokerHostName,brokerPort,false,null,null,MqttSslProtocols.None);
try {
//單向SSL通信
MqttClient client = new MqttClient(brokerHostName, brokerPort, true, caCert, null, MqttSslProtocols.TLSv1_2, new RemoteCertificateValidationCallback(cafileValidCallback));
//消息接受
client.MqttMsgPublishReceived += new MqttClient.MqttMsgPublishEventHandler(messageReceive);
//連接Broker
client.Connect(clientId, username, password);
client.Subscribe(topic, qosLevels);
}
catch (System.Exception)
{
Console.WriteLine("連接失敗!");
Console.ReadKey();
}
}
}
}
- 本客戶端連接Broker是mosquitto,可以到本人的博客找到:http://blog.csdn.net/sxpsxp12/article/details/77870109
- 可能C#遇到的問題:一個是因爲客戶端和服務端以及簽發機構的證書信息相同,導致客戶端和服務端不能識別證書,導致連接失敗。另外一個原因是因爲自己生成的證書沒有添加到系統的根證書中,不被根證書所信任導致連接失敗。