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) などへのアクセスはしていないのでわかりませんが、標準的なことをする分には普通に動くのではないかと思います。 #しらんけど