開発ブログ

第10回 ソケット通信でWPFアプリからパペロを制御してみた[後編]

投稿日時:2018年12月13日 10:12

こんにちは。ピャペロンです!
今回は前回の続きでソケット通信でWPFアプリからパペロを制御してみよう。
第9回 ソケット通信でWPFアプリからパペロを制御してみた[前編]

あらかじめパペロシミュレーターを動かす環境を整えておこう。第2回 Windowsからパペロシミュレーターを動かしてみた

使用するソフト
・Windows 10
・テキストエディタ(Visual Studio Code
・Google Chrome
・Visual Studio 2017
・Python 3.7.1 ※実機で動かす場合はPython 3.4で開発しないと動作しない可能性があります。

参考
[Tips][TextBox] テキストを取得/設定する | HIRO’s.NET Blog
WPF4.5入門 その22 「Buttonコントロール」 – かずきのBlog@hatena
18.1. socket — 低水準ネットワークインターフェイス — Python 3.6.5 ドキュメント
TcpClient Class (System.Net.Sockets) | Microsoft Docs
17.1. threading — スレッドベースの並列処理 — Python 3.6.5 ドキュメント


後編ではクライアント側のWPFアプリをVisual Studio 2017で作ろう。

 

MainWindow.xaml

  1. <Window x:Class="papero_socket.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.         xmlns:local="clr-namespace:papero_socket"
  7.         mc:Ignorable="d"
  8.         Closing="window_closing"
  9.         Title="MainWindow" Height="450" Width="800">
  10.     <Grid>
  11.         <Grid.ColumnDefinitions>
  12.             <ColumnDefinition Width="781*"/>
  13.             <ColumnDefinition Width="12*"/>
  14.         </Grid.ColumnDefinitions>
  15.         <Button Content="左" HorizontalAlignment="Left" VerticalAlignment="Top" Width="361" Height="156" Margin="21,165,0,0" FontSize="20" Click="button_left"/>
  16.         <Button Content="右" HorizontalAlignment="Left" VerticalAlignment="Top" Width="359" Height="156" Margin="412,165,0,0" FontSize="20" Click="button_right"/>
  17.         <Label Content="シミュレータID" HorizontalAlignment="Left" VerticalAlignment="Top" Height="37" Width="114" Margin="50,61,0,0" FontSize="20" RenderTransformOrigin="0.5,0.5">
  18.             <Label.RenderTransform>
  19.                 <TransformGroup>
  20.                     <ScaleTransform/>
  21.                     <SkewTransform AngleY="-0.148"/>
  22.                     <RotateTransform/>
  23.                     <TranslateTransform Y="-0.464"/>
  24.                 </TransformGroup>
  25.             </Label.RenderTransform>
  26.         </Label>
  27.         <TextBox x:Name="textbox" HorizontalAlignment="Left" Height="32" TextWrapping="Wrap" VerticalAlignment="Top" Width="284" Margin="167,65,0,0" FontSize="20"/>
  28.         <Button Content="実行" HorizontalAlignment="Left" VerticalAlignment="Top" Width="123" Margin="470,65,0,0" Height="32" FontSize="20" Click="button_run"/>
  29.     </Grid>
  30. </Window>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace papero_socket
{
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window
    {
        string HOST = "localhost"; //接続するホストを指定
        int PORT = 50088; //接続するポート番号を指定

        public MainWindow()
        {
            InitializeComponent();
        }

        private void send_msg(string msg)
        {
            System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient(HOST, PORT); //クライアント接続を扱うクラスを生成
            System.Net.Sockets.NetworkStream stream = client.GetStream(); //メッセージを送信するデータストリームを取得
            System.Text.Encoding enc = System.Text.Encoding.UTF8; //文字列のエンコード方式を指定
            byte[] send_bytes = enc.GetBytes(msg); //文字列をUTF8でByteにエンコード
            stream.Write(send_bytes, 0, send_bytes.Length); //データストリームにメッセージを書き込む
            stream.Close(); //データストリームを閉じる
            client.Close(); //クライアント接続を閉じる
        }

        private void button_run(object sender, RoutedEventArgs e)
        {
            send_msg(textbox.Text); //入力されたシミュレータIDを取得して送信
            
        }

        private void button_right(object sender, RoutedEventArgs e)
        {
            send_msg("action_right"); //メッセージを送信
        }

        private void button_left(object sender, RoutedEventArgs e)
        {
            send_msg("action_left");
        }

        private void window_closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            send_msg("exit"); //ウィンドウを閉じた時、メッセージを送信
        }
    }
}

 

今回作ったクライアントソフトと前回作ったサーバソフトを実行してシミュレータIDを入力してボタンを押してみよう!


0

最新開発ブログ一覧  (一覧で確認
2020年8月19日 14:08
開発ブログ
第30回 パペロで赤外線アレイセンサを動かしてみよう!【中編:顔の表面温度を測ってみよう】
by 管理者
2020年7月22日 16:07
開発ブログ
第29回 パペロで赤外線アレイセンサを動かしてみよう!【前編:簡易サーモグラフィを作ろう】
by 管理者
2019年11月20日 17:11
開発ブログ
第28回 パペロでJulius4.5を実行してみた
by 管理者
2019年11月13日 09:11
開発ブログ
第27回 JuliusをPaPeRoi向けにクロスコンパイルしてみた
by 管理者
2019年9月19日 17:09
開発ブログ
第26回Linaro Toolchainでクロスコンパイルしてみた
by 管理者

コメントは受け付けていません。