op.27 《全领域》-全域开发实战 - 居家植物盆栽 Mvt II (C# Broker & Mysql)

op.27 纪录时空间的情话

让我们彼此之间的记忆与美好时光
永恒纪载

今天来将 Broker 进行改写吧,把对应的内容记载至资料库里。

先看看原本的程序码:

using System;
using System.Data;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Adapter;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Receiving;
using MQTTnet.Diagnostics;
using MQTTnet.Protocol;
using MQTTnet.Server;

namespace mqtt_3._0._5
{
    class Program
    {
        private static MqttServer MqttServer = null;
        void Main(string[] args)
        {
            MqttAsync();
            while (true) ;

        }
        private static async Task MqttAsync()
        {
            var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100).WithDefaultEndpointPort(1883).WithConnectionValidator(e =>
            {
                
            });
            var mqttServer = new MqttFactory().CreateMqttServer();
            await mqttServer.StartAsync(optionsBuilder.Build());
            mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId} Topic:{e.ApplicationMessage.Topic} Message:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}");
            });
            mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId} 已连接!");
            });
            mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId}已离线!");
            });
        }
    }
}

我们需要将 Mysql 的套件 Nuget 进来,忘记的夥伴可以参考这一篇文章
op.18 《应用层》-C# 与 MySQL的爱情
然後在 private static MqttServer MqttServer = null;下新增 Mysql 的变数

private static MySqlConnection conn = new MySqlConnection();
private static String ConnectionString = "server=127.0.0.1;port=3306;user id=root;password=password;";

为了在运行 MQTT 服务之前测试资料库是否可以使用,我们先写一个测试连线的 Function

static void test_Database_Link()
{
    conn.ConnectionString = ConnectionString;
    try
    {
        conn.Open();
        if (conn.State == ConnectionState.Open)
        {
            Console.WriteLine("资料库已连线");
            conn.Close();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

然後将其放在 main 里,顺序先确认资料库是否可以连线,再启动 MQTT 服务。

static void Main(string[] args)
{
    test_Database_Link();
    MqttAsync();
    while (true) ;
}

接下来需要在需要纪录的地方加入写资料库的部分,在那之前需要先新增资料库以及建好资料表。
这里就建立纪录湿度的资料库及资料表吧

CREATE TABLE `data`.`pot_humidity` ( `Date` DATETIME NOT NULL , `Humidity` INT NOT NULL ) ENGINE = MyISAM;

新增资料的部分一样在op.18 《应用层》-C# 与 MySQL的爱情有写到,可以回去复习个。
这时候就要考虑韧体发送的 主题 !两边主题要一样才可以进行监听,并且记录下来,昨天用的主题为 Data ,那今天我们就针对 Data 来做监听。

先找到 Broker 监听讯息的地方,加入主题判断,符合的主题进入资料库,并将时间一起纪录下来。

 mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId} Topic:{e.ApplicationMessage.Topic} Message:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}");

            });

我们要针对 Topic 做过滤,所以加入判断。

if(e.ApplicationMessage.Topic == "Data"){

}

在 if 里塞入新增资料库的程序码。

Console.WriteLine($"Client:{e.ClientId} Topic:{e.ApplicationMessage.Topic} Message:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}");
conn.ConnectionString = ConnectionString;
try
{
    conn.Open();
    if (conn.State == ConnectionState.Open)
    {
        DateTime date = DateTime.Now;
        var commandStr = "INSERT INTO `data`.`pot_humidity` (`Date`,`Humidity`) VALUES ('" +
        date.ToString("yyyy-MM-dd HH:mm:ss") + "', '" +
        Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0]) + "');";

        var sqlCommand = new MySql.Data.MySqlClient.MySqlCommand(commandStr, conn);
        var dr = sqlCommand.ExecuteNonQuery();
        conn.Close();
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}  

接下来拿出昨天的实作看看是否会写入资料库呢?
https://ithelp.ithome.com.tw/upload/images/20201012/20129084sTaNNddFzD.png
https://ithelp.ithome.com.tw/upload/images/20201012/20129084KA9jtGtN5X.png
是的,资料成功写进去了!恭喜发财!

好啦今天就到这里啦~感谢各位收看!

今日的曲子:<<小镇>>卢亮辉

这首是在国小时候练的,对其旋律非常难忘,简单却不会让人腻的旋律,中间的行板柔美却又富有韵味,推荐给大家。


<<:  Day29 - 重要观念: 死结与DB transaction

>>:  [Day28]无线耳机与蓝牙技术-组合应用

EP 24: The CRUD & Search of SQLite in TopStore App

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...

Day 22 UICollectionView的练习 (2/2)

今天把功能都做完吧~ 首先,我们把图片弄到Assets.xcassets里面,直接把照片拖曳到左边红...

从听明牌,学习投资

获取明牌,并不一定就是赌徒心态;正确的观念是,应该是要先了解,人家何会推荐这只?是从基本面?消息面?...

Transactions (1) - ACID

此系列是 资料工程师修炼之路 的後半部份,一样是 Design Data Intensive Ap...

《莫守成规》五个叛逆特质,让你又乖又坏(?)

打破规则的五个特质,到底是会把事情弄乱?还是会让你探索事情的全貌? 「很羡慕你那种没有犯错的日子,能...