下载并安装MQTT
1.首先搭建起MQTT服务
1.1安装mosquitto,mosquitto是开源的MQTT代理服务器,它的Windows安装包地址:https://mosquitto.org/download/
- 这里建议下载2.0.11版本,个别版本和Socket通信会出现问题,这个是个坑点,看下图;
1.2 安装完成后,去安装目录下找到mosquitt.conf 文件,记事本方式打开,配置参数;
*这里的8888,mqtt通信端口,9001是WebSocket协议端口,建议额外配置一下匿名访问:allow_anonymous true;
1.3 接下来启动Mqtt服务;
执行:mosquitto_passwd.exe -c pwfile.example -u vic
设置用户名:admin 设置密码:123456
配置文件检查:
mosquitto.exe -c mosquitto.conf
未报错说明配置正确(卡着不动了,重新打开cmd,定位到安装目录,执行下面的命令即可)
端口启动
默认端口:8888
启动:mosquitto.exe
指定端口启动:mosquitto.exe -p 8888
下面就可以启动订阅者和发布者了,上面的启动窗口不要关闭哦,下面分别再打开两个cmd窗口;
①订阅者启动
-u是用户名,-P是密码,-t是主题,-h是ip,-p是端口号
mosquitto_sub.exe -h 127.0.0.1 -p 8888 -t topic -u admin -P 123456
② 发布者
mosquitto_pub.exe -h 127.0.0.1 -p 8888 -u admin -P 123456 -t topic -m “hello world 123456”
这里的主题 “topic” 两方必须保持一致,否则收不到信息
若执行发布者和订阅者命令时,若出现*“由于目标计算机积极拒绝,无法连接”**,大概率是权限问题,设一下mosquitto.conf文件的权限,这个是个坑点;
用命令:mosquitto -c mosquitto.conf -v
重启一下服务即可;
上面配置完,就可以模拟MQTT正常通信了;
Winform采集信息(发布者)
1.安装Nuget包,M2Mqtt
下面直接贴部分源码
public class ProgramName
{
// sub后的操作
static void client_MqttMsgSubscribed(object sender, MqttMsgSubscribedEventArgs e)
{
Console.Write(“订阅完成!”);
}
// 接受消息后的操作
static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
Console.Write("接收到消息!");
}
// 发布消息后的操作
static void client_MqttMsgPublished(object sender, MqttMsgPublishedEventArgs e)
{
Console.Write("发送完成!");
}
// 关闭连接后的操作
static void client_ConnectionClosed(object sender, EventArgs e)
{
Console.Write("关闭后的操作!");
}
// 取消sub后的操作
static void client_MqttMsgUnsubscribed(object sender, MqttMsgUnsubscribedEventArgs e)
{
Console.WriteLine("链接关闭"!);
}
static void Main(string[] args)
{
string ip = "www.mqqq.com";//或者192.168.1.20 Ip地址
string user = "admin";
string pwd = "123456";
string clientid = Guid.NewGuid().ToString(); // 唯一ID
string[] topic = new string[] { "topic" };//消息主题,很重要,WebSocket那里要保持一致
byte[] qosLevels = new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE };
MqttClient client = new MqttClient(ip ,8888,false,null,null,MqttSslProtocols.None);//端口号很重要
client.ProtocolVersion = MqttProtocolVersion.Version_3_1;
Console.WriteLine(Guid.NewGuid().ToString());
byte code = client.Connect(clientid,
user,
pwd,
true,
60);
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
client.MqttMsgSubscribed += client_MqttMsgSubscribed;
client.MqttMsgUnsubscribed += client_MqttMsgUnsubscribed;
client.MqttMsgPublished += client_MqttMsgPublished;
client.ConnectionClosed += client_ConnectionClosed;
client.Subscribe(topic, qosLevels);
string msg1 = “message121221212122”;// message
byte[] msg = Encoding.UTF8.GetBytes(msg1);//消息必须转一下
ushort msgId = client.Publish("tt", // topic
msg,
0,
false); // 消息发送
client.Disconnect();
}
}
Web端接收信息(订阅者)
废话不多说,直接上Demo
// 将在全局初始化一个 mqtt 变量
console.log(mqtt)
const clientId = ‘mqttjs_’ + Math.random().toString(16).substr(2, 8);
<!--线上地址-->
$(function(){
$("#butConnect").click(function(){
//const host = 'ws://broker.emqx.io:8083/mqtt'
//const host = 'ws://broker.emqx.io:8083/mqtt'
//const host = 'ws://broker.mqttdashboard.com:8000/mqtt'
const host = 'ws://'+$("#mqttip").val()+':'+$("#mqttport").val()+'/mqtt'
const options = {
keepalive: 60,
clientId: clientId,
protocolId: ‘MQTT’,
protocolVersion: 4,
clean: true,
reconnectPeriod: 1000,
connectTimeout: 30 * 1000,
will: {
topic: ‘testopic’,
payload: ‘Connection Closed abnormally…!’,
qos: 0,
retain: false
},
}
console.log(‘正在连接(Connecting mqtt client)’)
const client = mqtt.connect(host, options)
client.on(‘error’, (err) => {
console.log('Connection error: ', err)
client.end()
})
client.on(‘connect’, () => {
console.log(‘连接成功(Client connected):’ + clientId)
// Subscribe
//消息名称
//client.subscribe(‘testopic’, { qos: 0 })
client.subscribe($(“#msname”).val(), { qos: 0 })
})
client.on(‘reconnect’, () => {
console.log(‘Reconnecting…’)
})
//接收消息
client.on(‘message’, (topic, message, packet) => {
console.log('收到消息:Received Message: ’ + message.toString() + '\nOn topic: ’ + topic)
$(“#received-data-list”).append(‘收到消息:Received Message: ’ + message.toString() + ‘\nOn topic: ’ + topic);
$(“#received-data-list”).append(’
’);
})
});
});
</script>
*特别注意:
这个引用很关键;
ws 协议下,必须使用上面mqtt的WebSocket端口 9001 ,千万不能错了;
若要用mqtt,请换成const host = ‘mqtt://’+KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲mqttip").val()+…(“#mqttport”).val()+‘/mqtt’;(作者未尝试,请自行探索)