Linux 系でも mono を使用すれば C# などのプログラムは動作するよね?ということですが、Raspberry Pi (Raspbian) でも動作するんですかね?ということで試してみました。
まず導入。これはコマンド一発で行けるようです。(時間はかかりますが)
pi@raspberrypi ~ $ sudo apt-get install mono-complete
次。Raspberry Pi で C# のプログラムをコンパイルしてみます。
public class HelloWorld { public static void Main() { System.Console.WriteLine("hello!"); } }
上記のソースコードをコンパイルする場合は、gmcs コマンドを使用します。コンパイルに成功すると exe ファイルができるので、それを実行するには mono コマンドを使用します。
pi@raspberrypi ~ $ gmcs hello.cs pi@raspberrypi ~ $ mono hello.exe hello!
C# がコンパイルできることが分かったけど VB は?という話ですが調べてません(汗
そもそも Raspberry Pi 上でコンパイルすると結構時間がかかりますし、ソースファイルが複数になった場合や参照設定云々…という話になると面倒なので、Raspberry Pi 上で開発するのはナシということで・・・
gmcs が出力するファイルが exe なんだったら Windows で Visual Studio が吐いた exe でもいけるんじゃないの?ということで、以後開発には Visual Studio を使うことにします。 (Visual Studio 2013 を使用)
とりあえず、動作することを確認したいので UDP で通信するプログラムを作ってみることにします。
Module Module1 Sub Main() Dim udp = New System.Net.Sockets.UdpClient(60000) ' 受信 Dim remoteEP As System.Net.IPEndPoint = Nothing Dim recvBytes = udp.Receive(remoteEP) ' 受信メッセージ取得 Dim enc = System.Text.Encoding.UTF8 Dim recvString = enc.GetString(recvBytes) Console.WriteLine("Recv Message : '{0}'", recvString) ' 送信メッセージ作成 Console.Write("Input Return Message > ") Dim msg = Console.ReadLine Dim sendString = String.Format("{0} : Recv:'{1}' Send:'{2}'", Date.Now, recvString, msg) Dim sendBytes = enc.GetBytes(sendString) ' 送信元へ返信 udp.Send(sendBytes, sendBytes.Length, remoteEP) udp.Close() End Sub End Module
このプログラムの機能は以下です。
- UDP ポート 60000 で待ち受けて、
- メッセージを受信すると返信メッセージの入力を促し、
- Raspberry Pi 側の時刻, 受信メッセージ, 入力された返信メッセージを応答メッセージにして、
- 受信元の IP/Port に UDP で送信する。
- 一度送信したら、プログラムを終了する。
このプログラムをコンパイルして、できた exe (UDPServer.exe とした) を teraterm pro などでファイル転送します。
(teraterm pro の場合、メニューの file → SSH SCP を選択することでファイル転送ができます。)
ファイル転送した後、mono UDPServer.exe、と入力しプログラムを起動させ、受信を待ち受けます。
次に Raspberry Pi で待ち受けているプログラムにアクセスするコードを書きます。
以下は、ホスト名 "raspberrypi" の UDP 60000 ポートに対して、自PC の 60001 ポートから "往信" を送信して、その応答を受信,表示する Powershell Script です。
$udp = New-Object System.Net.Sockets.UdpClient(60001) $enc = [System.Text.Encoding]::UTF8 $sendString = $enc.GetBytes("往信") $udp.Send($sendString, $sendString.Length, "raspberrypi", 60000) $recvBytes = $udp.Receive([ref]$null) Write-Host $enc.GetString($recvBytes) $udp.Close() $udp.Dispose()
実行結果は以下。
左端の番号は実行順序で、赤マーカー部はプログラムへの入力、緑マーカー部はプログラムの出力です。
- Raspberry Pi 側
1. pi@raspberrypi ~ $ mono UDPServer.exe --- 10. Recv Message : '往信' 11. Input Return Message > 返信 12. pi@raspberrypi ~ $
- Windows (Powershell) 側
2. PS > $udp = New-Object System.Net.Sockets.UdpClient(60001) 3. PS > 4. PS > $enc = [System.Text.Encoding]::UTF8 5. PS > 6. PS > $sendString = $enc.GetBytes("往信") 7. PS > $udp.Send($sendString, $sendString.Length, "raspberrypi", 60000) 8. PS > 9. PS > $recvBytes = $udp.Receive([ref]$null) --- 13. PS > Write-Host $enc.GetString($recvBytes) 14. 2015/01/01 22:21:59 : Recv:'往信' Send:'返信' 15. PS > 16. PS > $udp.Close() 17. PS > $udp.Dispose() 18. PS >
割とあっさり動作しました。
ファイル入出力や COM(RS-232C) などへのアクセスはしていないのでわかりませんが、標準的なことをする分には普通に動くのではないかと思います。 #しらんけど