当前位置: 首页 > news >正文

GeekPad智慧屏编程控制(三)

前面讲了智慧屏开关通过ubuntu下面的homeassistant和笔记本电脑上的C#程序来进行控制。都可以控制智慧屏开关,但细心的用户已经发现了,我们的初心是在手机上控制开关,电脑现在回家都不一定开机,你在电脑上开发的程序只是实现了能的问题,还是没有实现手机控制。好吧,下面我们就来探索下手机控制智慧屏。

经过几天的尝试,写了一个简单的apk程序,可以开,关三个开关。界面如下:

首先,用的还是VS2022,先创建一个.net maui程序。

重新定义一下界面Main Page.xaml:

<Grid RowDefinitions="*, *, Auto, Auto, Auto, Auto, Auto, Auto"
  ColumnDefinitions="*, *"
  Padding="40">

    <Label
        Text="GeekPad开关控制器(通过MQTT)"
        x:Name="Label1"
        Style="{StaticResource Headline}"
        SemanticProperties.HeadingLevel="Level1"
        Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" />

    <Image
        Source="geekpad.png"
        HeightRequest="185"
        Aspect="AspectFit"
        SemanticProperties.Description="dot net bot in a race car number eight" 
        Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
     />
    <Button
        x:Name="Switch1OnBtn"
        Text="开_1" 
        SemanticProperties.Hint="打开开关1"
        Clicked="OnSwitch1OnClicked"
        HorizontalOptions="Fill" 
        Grid.Row="2" Grid.Column="0"/>
    <Button
        x:Name="Switch1OffBtn"
        Text="关_1" 
        SemanticProperties.Hint="关闭开关1"
        Clicked="OnSwitch1OffClicked"
        HorizontalOptions="Fill" 
        Grid.Row="2" Grid.Column="1"/>
    <Button
        x:Name="Switch2OnBtn"
        Text="开_2" 
        SemanticProperties.Hint="打开开关2"
        Clicked="OnSwitch2OnClicked"
        HorizontalOptions="Fill" 
        Grid.Row="3" Grid.Column="0"/>
    <Button
        x:Name="Switch2OffBtn"
        Text="关_2" 
        SemanticProperties.Hint="关闭开关2"
        Clicked="OnSwitch2OffClicked"
        HorizontalOptions="Fill" 
        Grid.Row="3" Grid.Column="1"/>
    <Button
        x:Name="Switch3OnBtn"
        Text="开_3" 
        SemanticProperties.Hint="打开开关3"
        Clicked="OnSwitch3OnClicked"
        HorizontalOptions="Fill" 
        Grid.Row="4" Grid.Column="0"/>
    <Button
        x:Name="Switch3OffBtn"
        Text="关_3" 
        SemanticProperties.Hint="关闭开关3"
        Clicked="OnSwitch3OffClicked"
        HorizontalOptions="Fill" 
        Grid.Row="4" Grid.Column="1"/>
</Grid>

修改MainPage.xaml.cs代码:

先启动服务器,再初始化一个客户端:

 MqttClient client;
 public MainPage()
 {
     InitializeComponent();
     Start_Mqttserver();
     Label1.Text = "MQTT Server is Ready.";
     client = new MqttClient
     {
         Log = XTrace.Log,
         Server = "tcp://127.0.0.1:1883",
         ClientId = Guid.NewGuid() + "",
     };
 }

 public void Start_Mqttserver()
 {
     var services = ObjectContainer.Current;
     services.AddSingleton<ILog>(XTrace.Log);
     services.AddTransient<IMqttHandler, MqttHandler>();
     services.AddSingleton<MqttExchange, MqttExchange>();

     var server = new MqttServer
     {
         Port = 1883,
         ServiceProvider = services.BuildServiceProvider(),

         Log = XTrace.Log,
         SessionLog = XTrace.Log,
     };
     
     server.Start();
    
 }

然后,定义按钮事件:

private void OnSwitch1OnClicked(object sender, EventArgs e)
{
    Switch1On();
}

private void OnSwitch1OffClicked(object sender, EventArgs e)
{
    Switch1Off();
}

public async Task Switch1On()
{

    await client.ConnectAsync().ConfigureAwait(false);
    await client.PublishAsync("homeassistant/ECDA3B62A4CC/1/set", "ON").ConfigureAwait(false);
}

public async Task Switch1Off()
{

    await client.ConnectAsync().ConfigureAwait(false);
    await client.PublishAsync("homeassistant/ECDA3B62A4CC/1/set", "OFF").ConfigureAwait(false);
}

private void OnSwitch2OnClicked(object sender, EventArgs e)
{
    Switch2On();
}

private void OnSwitch2OffClicked(object sender, EventArgs e)
{
    Switch2Off();
}

public async Task Switch2On()
{

    await client.ConnectAsync().ConfigureAwait(false);
    await client.PublishAsync("homeassistant/ECDA3B62A4CC/2/set", "ON").ConfigureAwait(false);
}

public async Task Switch2Off()
{

    await client.ConnectAsync().ConfigureAwait(false);
    await client.PublishAsync("homeassistant/ECDA3B62A4CC/2/set", "OFF").ConfigureAwait(false);
}

private void OnSwitch3OnClicked(object sender, EventArgs e)
{
    Switch3On();
}

private void OnSwitch3OffClicked(object sender, EventArgs e)
{
    Switch3Off();
}

public async Task Switch3On()
{

    await client.ConnectAsync().ConfigureAwait(false);
    await client.PublishAsync("homeassistant/ECDA3B62A4CC/3/set", "ON").ConfigureAwait(false);
}

public async Task Switch3Off()
{

    await client.ConnectAsync().ConfigureAwait(false);
    await client.PublishAsync("homeassistant/ECDA3B62A4CC/3/set", "OFF").ConfigureAwait(false);
}

选择安卓模拟器,生成apk文件,然后将apk拷贝到手机上进行安卓。

安卓好以后打开apk,同时到手机设置里面查看一下IPv4地址,在GeekPad智慧屏MQTT设置界面填上手机的IP地址,重启后就可以用手机控制智慧屏开关了。非常的简单,大家可以试一下。图片的话大家可以改为自己的图片,显得更有个性。下面是项目截图,供大家参考。

相关文章:

  • 光谱相机在天文学领域的应用
  • 【Python爬虫(3)】解锁Python爬虫技能树:深入理解模块与包
  • cursor免费次数用完了怎么再续?以及如何更新机器码?
  • JavaWeb——Servlet基础
  • complete_all 简介
  • 面试真题 | 招银 C++
  • DeepSeek的API密钥怎么使用
  • 【触想智能】工业显示器和普通显示器的区别以及工业显示器的主要应用领域分析
  • Neo4j集群学习
  • C#使用文件读写操作实现仙剑五前传称号存档修改
  • 工作一个月的经历和总结
  • Unity学习part3
  • 云计算——AWS Solutions Architect – Associate(saa)7.放置群组
  • 【LeetCode Hot100 普通数组】最大子数组和、合并区间、旋转数组、除自身以外数组的乘积、缺失的第一个正整数
  • 【Black Mesa】黑山起源用服务器开服多人联机教程
  • 2025年2月15日(虚拟环境-deepseek)
  • 什么是BlockingQueue?什么是阻塞队列?它的特点是什么?阻塞队列的生产方法和消费方法有什么?
  • 最佳的出牌方法
  • PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展
  • [小M全新力作-修稿]PFC_LLC电源设计全攻略:从原理学习到SIMULINK仿真到EDA板实战,再到实物电源调试
  • 魔都眼|邮轮港国际帆船赛启动,120名中外选手展开角逐
  • 高新波任西安电子科技大学校长
  • 商务部回应美方加严限制中国芯片:敦促美方立即纠正错误做法
  • 最高人民法院、中国证监会联合发布《关于严格公正执法司法 服务保障资本市场高质量发展的指导意见》
  • 复原展出孙吴大墓,江苏首座考古博物馆将开放
  • 美国务院批准向土耳其出售导弹及相关部件,价值3.04亿美元