Brynhildr

KeroRemote

リモートデスクトップエンジニアのブログ。

週刊ブリュンヒルデ創刊号。
遂にBrynhildrの通信プロトコル仕様を公開で御座います。これで自由にクライアントの開発が可能になります。今年最大の他力本願プロジェクトで御座います。

憧れのAndroid版を作るも良し、オサレなMac版を作るも良し、完全にアレな艦これ仕様版を作るも良し、とまー何でも御座れになる感じです。お正月休みとかにどーぞ的な。

一応プログラマー向けの内容でするので御了承下さい・・・(´・ω・`)

さて、まずコチラを御覧下さい。

サンプルソースコードライセンスについて

コチラが「Brynhildr 1.0.1.0」以降のパブリックモードを有効にした際に接続できるサンプルソースコードになります。VisualStudioでビルドが出来ると思います。ソースコードの書き方については御覧になって御分りになる通り「これアカンやつや」です。もうカナリ自覚してるんでスルーします。「0」と「1」しか代入されんのにlong型とかホントにモーですよね。

ちなみにパブリックモードを有効にする方法ですが、「brynhildr.exe」を起動させると生成される「brynhildr.ini」の「ServerMode」の項の「publicmode=0」を「publicmode=1」に変更するだけです。再びBrynhildrを起動させるとパブリックモードが有効な状態になります。

さて、このソースコードは「ホントただ接続するだけ」になってまして、一通り通信までは出来るものの、画面描画や音声再生は含まれておりません。画像や音声はバッファに入るところまでで御座います。また、シングルスレッド形式で書いていますけど、間違いなくマルチスレッド形式にすべきかと思います。ウインドウも生成していませんし、無限ループになってますので終わる時も手動です。あくまでもサンプルですので。

今回は創刊号とユー事で大まかな説明だけにしておこうかと思います。徐々に細かな説明とかしていこうかと思いますが、感の良い方はこれだけでサクッっとAndroid版とか作れると思います。実際いらっしゃいます。

さて、それではソースコードの中身の説明に入ります。

中身は極めてシンプルです。関数は「WinMain」「recv_data」「send_data」しかありません。「WinMain」から始まってグルグル回して色んな通信します。

通信は同一ポートに対して複数のセッションで張ります。セッションは「操作系」「画像系」「音声系」の3つです。順番に接続を行う必要があるのと、少し安定するまで次のセッションを張る事ができません。安定のカウントは「g_sock1_ct」と「g_sock2_ct」になります。まず、操作系を接続して5周通信で、次に画像系を接続して5周通信で、次に音声系を接続して通信となります。こんな流れです。

画像系での本体受信は「JPEG形式」です。ヘッダーも含まれているのでそのままファイルを書き出すとJPEGファイルとして読む事が可能です。

音声系での本体受信は「PCM形式」です。サンプルレートは音声系通信セッションの「com_data.samplerate」に返ってきまして、量子化ビット数は「16bit」でステレオの2チャンネルです。実際に操作系通信セッションの「com_data.sound_quality」で指定したサンプルレートやBrynhildr側のパソコンのサウンドデバイスの設定とは異なり、最適化された形でリサンプリングされPCM形式のデータが送られてきます。尚、こちらにはヘッダーありませんのでRIFF形式等にする時はヘッダーを別途生成する必要があります。

さて、接続先のIPアドレスやPort番号は「WinMain」に埋め込まれていますが、パスワードの仕様について御説明します。パブリックモードは、最大で16byteという制限があり、これはBrynhildr側の標準のパスワードの最大32byteとは異なります。ですので、brynhildr側で17byte以上のパスワードを設定するとパブリックモードでは接続する事が出来ません。この点を御注意下さい。逆にパブリックモードによるセキュリティが心配という方は、17byte以上のパスワードを設定する事をオススメ致します。

あと、接続以外の異常系の処理はほとんど書いていませんので、書く事をオススメ致します。てか書かない人はいないと思いますけど。

さて、えらく長くなるのも面白くありませんので、今回はサンプルコードを公開しただけに留めて、次回からはもうちょっと細かいところを御説明したいと思います。それにしてもこんなソースコードの説明なんてした事ないし、他の方が書かれているのもさらっとした読んでないので、どんな風に書いたら良いかわからんですね。もしかしたら次回より書き手が変わるかもしれん事を予告しておきます。とか言いながら誰もいなくて自分になるんでしょうけどきっと。

そんなこんなでパフォーマンス的にはOrthrosと同等イヤそれ以上が出るはずですので、どうぞ開発の参考になれば良いかなと思っております所存で御座います。

でも冷静になってよー考えたらホントに欲しい人おるんかなコレ・・・(´・ω・`)




29件のコメント ... ( 管理人承認制 )



通信プロトコルの公開ありがとうございます。
Vritra時代から使わせてもらっていて、ここまで軽量かつ高速なものをどのようにして作っているのか非常に気になっていたので今回の公開は非常に嬉しいです。
艦これ仕様のものやAndroid版の開発を行いたかったので、是非とも使わせていただいます。


ちゅうこ  2013/12/27


そう言って頂けますと非常に嬉しいです!有難う御座います!
何か御質問等御座いましたら御気軽に御問い合わせ下さい。
Orthros以上のアプリが出て来る事を非常に期待しております!


IchiGeki  2013/12/27


初めまして、IchiGekiさん。


Linux版クライアントってあるんでしたっけ?


素人なのですが、欲しいなと思いまして。


大学院生時代に最低限のsocketプログラミングとX11R5
(当時はAtena Widgetでしたが(^_^;)で修論用システムを
組みました。今ならQt5/Gtk++でしょうかね)


拙いプログラミングで簡単なshellを作って友人に見せてました
があまりに低機能だったので、プロジェクトとして失敗しました(^_^;


Qt4/Gtk++には興味があって、O’reilly本を買いましたが、
まだ読破できてませんが…(^_^;


もう売っていないバイブルを購入しましたが、明日Amazonから
届く予定。


UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
UNIXネットワークプログラミング〈Vol.2〉IPC:プロセス間通信


Winsockに関しては、完全素人です。というかWindows素人かも。


ですので、私が作りますとは言えないのですが…高速で、secureな
リモートデスクトップ環境に興味があります。


#今は某会社を早期退職したので、時間があると…


ふんふん  2014/01/08


ちょっとだけコメントです。
#IchiGekiさんにだけ伝わればいいです(^_^;


プロトコル情報って本ソースではヘッダーファイルなんですよね?
公開していただけるとそのまま使えますのでうれしいですが…
#ソース公開するわけではないので、まずいですかね…


COM_DATAがtypedefでなく#defineであるのはポリシー的な理由
ですか?#サンプルだからとりあえず、かもしれませんね。


#define COM_DATA struct COM_DATA_BASE


ふんふん  2014/01/08


> Linux版


無いですねw
ですので是非とも開発の方を宜しく御願い致します!


> ヘッダーファイルなんですよね?


プロトコルとゆーか通信仕様とゆーか通信手段とゆーか、そんな感じです。なかなか言い回しが難しいですねw
公開してるのは、ヘッダーファイル(.h)と本体ファイル(.cpp)が、ファイル1本になってます。ですのでVisualStudioでビルドするとそのまま動きます。もちろん普通は別々に分けると思いますので分けちゃって構わないのですが、公開にあたり出来るだけシンプルにコンパクトにまとめたくてこんな感じにしております。
ちなみに、Brynhildrでは普通にヘッダーファイル(.h)と本体ファイル(.cpp)がありますw


> typedefでなく#defineである


あー、しまった、これですねー。iOS版のOrthrosから引っ張ってきたんですけど、確かiOS版でWindows版ぽく書きたくてしょーがなしにこんな感じにした記憶があります。いらんかったですよね、この1行とか_BASEとか・・・すみません、修正します。
ちなみに、Brynhildrでは普通にtypedefもdefineも使っておりませんでしたw


IchiGeki  2014/01/08


素早いコメントですね。


>> Linux版


まぁ、Unix版ということになると思いますが…


> 無いですねw
> ですので是非とも開発の方を宜しく御願い致します!


うーん、ネットワーク、Qt/gtk+を勉強しながらなので、
どのくらい時間がかかるか分かりません。


GUI、ネットワークは専門でなかったので、これから勉強
です。(^_^; どのくらい需要があるのかな?


少なくとも私は、UNIXメインですが、Windowsも必要なときは
便利に使いたいと思うので、欲しいのです。


> ちなみに、Brynhildrでは普通にヘッダーファイル(.h)と本体ファイル(.cpp)がありますw


ですよね、すいません、いろいろ調べてから指摘すべきでした。


> ちなみに、Brynhildrでは普通にtypedefもdefineも使っておりませんでしたw


なんとなくtypedefするのが癖になってます(^_^;
まぁ、多少厳密に型チェックしてくれるからいいかなと。
あと、struct … とか書くのが面倒臭い、という
めんどくさがりなのです、ははは。


ふんふん  2014/01/08


ちょっとQt4の本を読んでみました。


スレッド、サウンド、ネットワークのライブラリがサポート
されているようですね。(GUIはもちろんですが)


サポートOSは、


UNIX(Linux,*BSDを含む), Mac OS X,
WindowsXP~Windows7(当時7までしか出てなかったらしい(^_^;)


なのでソースを一本化できる可能性がありますね。


iPhone, Android(java)は無理かな。


と思ってQt5を調べるとiOSもAndroidもいけるみたいです。
#艦これ仕様ってのはちょっと分からないのですが(^_^;


#しかし、Qt5も勉強しないと行けないので、識者の方が
#対応すると早いかも


ふんふん  2014/01/08


しかし、Qt自体がオーバースペックで
今の軽さが失われるデメリットがあるかも
しれませんね。ソースが一本化してあれば、
Qt5版ならありますけど、レベルで提供することは
可能かもしれません。
軽さが重要ですものね。


ふんふん  2014/01/08


MFCなどをラップするわけではないので
速度的なデメリットはそれ程でもないようです。
ただ、インストールに必要なディスクサイズは
どうしようもないですね^_^
#細切れですみません。


ふんふん  2014/01/09


また、思いつきですが。
筑波大学のsoftetherVPNのソースコードが
公開されたのでこれを取り込むとどこでも
VPNで結んだマシンが使えて便利ってこと
ないですかね。素人考えなのですが…
ま、VPNを設定して、別途リモートディスクトップソフトを
起動してもいいんですけど。


ふんふん  2014/01/09


とりあえずメモします。


オぺレーションを記録、再現する仕組み。
オぺレーションプロトコルのみを単純にファイルに
書き出すだけ。再現は、その逆を行うだけ。
画像、サウンドプロトコルは捨てる。


再現する時刻も指定できれば定期的にする操作を自動化できてうれしい。
同じマシンにサーバーとクライアントを設置すれば
自動テストに使える。


メンテナンス、テストが自動で行えると
いろんな所で使えるかも。Windows Serverに
入れられる?


ふんふん  2014/01/09


すいません、前コメントの訂正というか改善。
サーバが記録、再現すればクライアントは要りませんね^o^
不要な通信は無い方がシンプルでいいですね。
クライアントから指示できる機能もあっていいと
思いますが。画像、音声を加工できるようなマクロを
組めれば、テストツールに使える。高価なテストツールは
要らない^ – ^


ふんふん  2014/01/09


自分のコメントへのコメント


テスト目的ならpythonでも上手くやれるかな。


# 必要なコメントだけ使ってください。>査閲者様


ふんふん  2014/01/09


iPadもO.K.なのかな。


SoftEther VPNでBYOD(Bring your own device)もいけそう。


#”Ether”って修士論文のOHP(懐かしいですか?)に書いたら、
#”それはエーテルだろ”と教授に突っ込まれたことがある…


ふんふん  2014/01/09


操作系通信の内容はWindowsのメッセージそのものですか?
実際追ってみればわかるんでしょうけど。


いろいろ手を出しているので、時間がとれてないのですが、
Linux版(というかマルチプラットフォームQt版)って
欲しい人どのくらいいるのでしょうかね?


あまり要求が多くないようなら、優先度が低くなるのですが(^_^;
#すみません、サンデープログラマなもので。


ふんふん  2014/01/18


> 操作系通信の内容はWindowsのメッセージそのものですか?


いえ、独自のオリジナルプロトコロですね。ただ、キーボードの値はWindowsのキーと同じものです。


> Linux版が欲しい人


うーん、どうなんでしょうね。Android版であれば御要望は多いと思いますが。


IchiGeki  2014/01/18


Linuxデスクトップを常用している人がどれくらいいるんだって
ことでしょうね。


個人的に勉強がてら作ってみるくらいのスタンスで考えたいと
思います。もし、使ってもらえるようなものができたら、公開
したいかなと思います。


ではでは、今後もブログを楽しみにしています。


ふんふん  2014/01/19


> Linuxデスクトップ


うーん、どうでしょうね。Ubuntuユーザーとか結構いらっしゃいそうな気がしないでもないのですが。


開発頑張って下さい。今後とも宜しく御願いします。


IchiGeki  2014/01/20


不具合とかここに書いちゃまずいのかな?


・ユーザーが管理権限があっても、WinNT6.x系でProgram Files にほうりこんでる場合でなおかつlog.txtが存在すると管理権限でないと起動しても何もダイアログが出ず幽霊プロセスが起動する。←ダウンロードしていきなりはまりました・ω・


・サーバーだけこのアプリにアップデートしたので、サーバーからBrynhildr.exe でつないでサーバーからソフトとってこようとしたら、バージョンが違うって怒られた…オルトロスがつながると聞いてたので最終版で繋げないのはつらい


・既にPortがバインド済みでサーバーに登録済みだと、Not Open Portのダイアログが一定おきに永遠にで続けてダイアログが表示されず、サービスからの削除ができない…ど、どうすればいいんだ(これはBrynhildrも同じ/サービスを止めればいいんですが、気づかないとはまる)


・パスワードCAPS ONだと通知してくれるのに、カナONだと通知してくれないよ!(これはBrynhildrも同じ)


・対応OSに 8.1が入ってないのはいいのだろうか・ω・;


・WinNT6.x系でクライアントを起動するときは、管理者でも管理権限で実行しないと接続に異様に時間がかかる(これはBrynhildrも同じ)
時間を測ったら


権限なし:100秒前後
管理者:2秒くらい


・接続時接続失敗すると一切登録情報が残らないのは不便だにゃ
例えば・・・KANAロックが勝手に入る状態になってるときに原因が分からなくて、何度も試してるといやになって使うの自体諦めるとか・ω・;


・マニュアルについて、内容が上級者向けすぎるような・ω・;


1. IP/IPあどれす … というか 接続先(項目)・PC名/IP(説明) のがいいような
2. Control …「コントロール」ってカタカナにしただけじゃないですか(笑)せめて「リモートからの操作」とかにしようよ!
3. Service … 登録するとどうなるのか書かなきゃ(ろぐいん
画面の転送する機能??あれ、自動起動OFFにしても起動する???って初心者はなりそう)後、たぶん、管理者で実行しててもNT6.xだと管理者権限で実行しないとサービス登録できないんじゃないかな?
4.CoreCapture …違いを書かなきゃ!
5. log.txt についても記述したほうがいいような?


黒  2014/01/24


名前のところで黒で確定しようと改行したら内容と投稿場所確認する前にされてしまったでござる …
KeBORDの不具合をぶりゅんひるでのところに投稿しようかと思っただよ・ω・;


黒翼猫  2014/01/24


> 不具合色々


御報告どうもですー。修正出来そうな箇所は次バージョンで対応したいと思います。管理者権限でなかった場合のケースは、一応ダウンロードページにも書いてあります通り、管理者権限で起動させる事が必要なソフトではあるんですが、これも対応できそうなものは対応したいと思います、気になりますので。よろしくですー。


IchiGeki  2014/01/25


いあ、サイトには「管理権限のないアカウントの場合管理権限で~」って書いてあったんですが、管理権限のあるアカウントでもNT6.xだと管理権限で実行しないとダメっていう・ω・
まぁ、Vista以降では当たり前なんですが UACのない XP向けの説明になってるような…という話です


黒翼猫  2014/01/26


そういえば
コピーペーストがおかしくなるバグが前からあったんですが、
ひどくなってるような


具体的には以下の3通りの現象が起こりました


・サーバー&クライアント間でクリップボードが共有できなくなる。
・クライアント側でクリップボードが勝手に書き換えられる
・コピペしようとするとクリップボードのエラーが出る


クライアント・サーバーのOS色々試してみましたが、OS依存はなさそうです。


黒翼猫  2014/01/29


> コピペ不具合


むむむ・・・。UNICODEに対応した事が影響してるんですかね。ちょっと調べてみたいと思います。具体的な発生方法があれば御連絡頂けると幸いです。


IchiGeki  2014/01/29


バグ自体はUNICODE対応前からありますね。
接続しっぱなしにしてると気づいたらコピペできなかったり
クライアント側でコピペがサーバー側のに置き換わり続けて困る状態になって気づくという感じです。
対応前で一日1回はおこってましたが、KeBOになって4,5回おこるようになりました


黒翼猫  2014/01/30


KeBOにアップデートしてからちょっと調子が悪いのかなと思ってたのですが毎回起こるみたいなので、報告。


長時間接続しているとキーボード転送がどんどん遅くなります。
4時間くらいすると1秒に1文字しか打てなくなるぐらいになって
平衡状態になります。


再接続してもだめで、一度サーバー側のプロセスを初期化すると
直ります


Brynhildr が最新じゃなかったので、最終版で起こるかは確認してませんが、前はなかったんですけどねぇ・ω・;


黒翼猫  2014/01/30


> コピペ&入力遅延の不具合


結構今更なんですが、一応KeBORDについてはケボウソフトウェアさんにお伝え頂けますと助かります。KeBORDはこちらではサポートしておりませんので。専任者がいっらしゃいますw


ただ、こちらでも試してはみてるのですが、色んなOSの組み合わせでもコピペの不具合は発生しないですし、6時間連続接続でも入力遅延は発生してません・・・。これは環境依存なんでしょうか・・・。もうちょっと調べてみます。宜しくですー。


IchiGeki  2014/01/31


全く需要もなさそうですが、勉強のため勝手にクライアントを
実装中です。Qt5.2.1を使うので、以下でいけると思います。


Windows (32bit/64bit) 多分、XP~Windows8.1がO.K。
Linux (32bit/64bit) ほとんどのディストリビューションでO.K.。
Mac OS X (知りません…Lionくらいから)
Android (これも知りません…)
iOS (これも…)


*BSDもO.K.と言おうとしたら、Qtのサポートが…ま、O.K.でしょう、多分。


まだ、絵も出ていませんが…勉強しながらなので。
C++, Qt…すべて調べないと分からない…


ふんふん  2014/02/14


Qt5の変更点がよくわからないので、デバッガでデバッグしながら開発してます。なんとなくウインドウが出ましたのでメールしてみましたので、よかったら見てみてください。


機能的にはまだなんにも出来ませんけど…スプラッシュスクリーンだけ、出ます(^_^;次はとりあえず通信とJPEGストリームの表示ですかね…ここまでやればデスクトップが表示されるので楽しいかもしれませんね。音は最後かな。


ふんふん  2014/02/16




... 不具合報告の際は、アプリのバージョンやOS等の動作環境の記載を御願い致します。

表記されている会社名・製品名・システム名などは、各社の商標、または登録商標です。
当サイトはAmazon.co.jpアソシエイトプログラムに参加しています。
Copyright (C) IchiGeki All Rights Reserved.