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地址,重启后就可以用手机控制智慧屏开关了。非常的简单,大家可以试一下。图片的话大家可以改为自己的图片,显得更有个性。下面是项目截图,供大家参考。