エレクトロニクス開発者向けのボトムアップの外観またはUbuntuサーバー。 パート2

マイクロコントローラーの世界とパーソナルコンピューターの世界を接続するためのデバイスとして、ubuntuサーバーを搭載したコンピューターを使用するというテーマの開発を続けています。



パート1へのリンク

画像

この記事では、説明した手法の使用方法について説明しており、最新の機器のすべての深さと機能をカバーすることを目的としていないことを思い出してください。 これは、問題を解決するためのオプションの1つです。



このパートでは、次のポイントをどのように進めるかを説明します。



静的IP + DHCPサーバー
現在、2つのデバイスのみがローカルネットワークに存在することになっています。 サーバー自体とホストマシン。 この単純さに基づいて、Ubuntuサーバーを構成します。

静的IP

参考情報

1.ネットワークインターフェイスの論理名を確認するには、次の手順を実行します。



sudo lshw -C network
      
      



そしてラインを探します
  logical name: enp3s0
      
      





ifconfig関数を使用するオプション(Windowsのipconfigの類似物として)は、ループ127.0.0.1のみを提供する場合があります。 インターフェイスの名前はハードウェアに依存します。 2台の異なるマシンに、同じフラッシュドライブからubuntuをインストールしましたが、ネットワークインターフェースの名前が異なっていました。 enp3s0は、バスとデバイス番号による分類です。理解できます。 そのようなシリーズeth0およびそのようなens35からもあります。 心配しないでください。



2.ネットワーク構成ファイルを変更します



 sudo nano /etc/network/interfaces
      
      



(nanoはこの小さなテキストエディターです)

次のようになります。



  # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # My local network. allow-hotplug enp3s0 iface enp3s0 inet static address 172.16.55.1 netmask 255.255.255.0 gateway 172.16.55.1
      
      





cntrl-xを押します-エディターを終了します

yを押して変更を保存します



3.ネットワークサービスを再起動します。

 service networking restart
      
      







DHCPサーバー

参考情報

1. DHCPサーバーのファイルの編集

 sudo nano /etc/default/isc-dhcp-server
      
      



行を見つける
 INTERFACES=""
      
      



DHCPサーバーのインターフェースの名前です。 この場合、次のようになります。



 INTERFACES="enp3s0"
      
      





ファイル内
 sudo nano /etc/dhcp/dhcpd.conf
      
      



追加する必要があります

 subnet 172.16.55.0 netmask 255.255.255.0{ range 172.16.55.2 172.16.55.100; }
      
      



このサブネット内で、DHCPサーバーは2〜100の範囲のアドレスを発行します。



2. gethostbyname()関数を使用する場合、ファイル内で
 sudo nano /etc/hosts
      
      



PCとIPの名前を記入する必要があります。 おそらく、あなた自身のIPを取得するより便利な方法があるかもしれませんが、彼は私に屈しませんでした。

 127.0.0.1 localhost 172.16.55.1 ubuntu
      
      





PCの名前(ubuntu)は、/ etc / hostnameファイルに保存されます。 透けて見える

 sudo cat /etc/hostname
      
      



そして、さらに多くの方法。



3.ネットワークサービスを再起動します。

 service networking restart
      
      





SSHアクセス

理論的には、今は固定コンピューターを接続したので、そのIPを取得し、SSH経由でアクセスできるようになります。 Windowsからのアクセスには、PuTTYユーティリティを使用しました。 PuTTYプログラムファイルには、ネットワーク経由でデータを送信するためのユーティリティがあります。

以下は、UbuntuからWindowsにファイルを転送するためのバッチファイルの構成です。

 d:\"Program Files"\PuTTY\pscp.exe ubuntu@172.16.55.1:/home/ubuntu/tool/* "F:/WORK/SERVER/tool/"
      
      





そして、サーバーにアップロードするには

 d:\"Program Files"\PuTTY\pscp.exe "F:/WORK/SERVER/tool/*" ubuntu@172.16.55.1:/home/ubuntu/tool/
      
      







FTDIからドライバーを配置します
FTDIドライバーは圧縮形式で提供されます。 パッケージには、ドライバー自体、ライブラリ、使用例、およびREADME.pdfファイルが含まれています。 D3XXプログラマーガイドファイルから、Linuxドライバーの使用方法が明確ではありません。 FTDIサポートはそれらに迅速に対応し、業務上対応するため、それらを作成する必要さえありました。 このアーカイブをすぐに開いた場合、書き込みをしないことも可能です。 しかし、彼らが送ったリンク、配線と回路の例は役に立ちました。

上記のように、PuTTYキットのpscpユーティリティを使用して、ドライバーをサーバーにコピーします。 d3xx-linux-i686-0.5.0.tar.bz2がありました。 サーバー上のこのフォルダーに移動して
 tar -xvf d3xx-linux-i686-0.5.0.tar.bz2
      
      





さらに、FTDI命令に従って、次を実行します。

 cd linux-i686 sudo rm -f /usr/lib/libftd3xx.so sudo cp -f libftd3xx.so /usr/lib sudo cp -f libftd3xx.so.0.5.0 /usr/lib sudo cp -f 51-ftd3xx.rules /etc/udev/rules.d sudo udevadm control --reload-rules
      
      







プログラムをコンパイルする
codeBlocksでプログラムを作成しましたが、FTDIを含むいくつかの点を除き、Windowsと互換性があります。 Linux D3XXのドライバーからhファイルをそこに置くと、Windows用のコンパイルが停止しました(D2XXおよびFT232RLチップには問題がありませんでした)。

メイクファイル。 プログラマーはすでにそれが必要な理由を知っているので、機能を示してください:

STATLIB = libftd3xx.a-Linuxのライブラリの名前を指定します

CFLAGS = $(依存関係)-Wall -Wextra -std = c ++ 11-allow c ++ 11

1つのmain.cppプロジェクトファイルのmakefileの例
 CC=g++ UNAME := $(shell uname) ifeq ($(UNAME), Darwin) DEPENDENCIES := -lpthread -ldl -lobjc -framework IOKit -framework CoreFoundation else DEPENDENCIES := -lpthread -ldl -lrt endif CFLAGS=$(DEPENDENCIES) -Wall -Wextra -std=c++11 STATLIB=libftd3xx.a APP = prgr all: $(APP) $(APP): main.o $(CC) -o $(APP) main.o $(STATLIB) $(CFLAGS) main.o: main.cpp $(CC) -c -o main.o main.cpp $(CFLAGS) clean: rm -f *.o ; rm $(APP)
      
      





したがって、main.c ftd3xx.h makefile libftd3xx.aおよびその他のプロジェクトファイルはプロジェクトフォルダーにあります。 プロジェクトをコンパイルするには、このフォルダーに移動して、

 make
      
      







デーモン
Linuxでのデーモンの役割は、Windowsでのサービスの役割に似ています。 これらは、バックグラウンドで動作し、あらゆる種類の周辺作業を行うプログラムです。 それはすべてsystemdで始まり、最初に起動するプログラムはそれぞれPID = 1を持ち、スクリプトを介して他のすべてのバックグラウンドタスクを開始します。 Ubuntuを掘り下げてみると、内部のすべてがスクリプトで構築されていることに驚きました。 テキストエディターでファイルを簡単に修正することで、静的IPがどのように変化し、プログラムがどのように構成されているかを既に見ました。



完了することにより
 ps -el
      
      



実行中のプログラムとそのPIDのリストが表示されます。 PIDは実行中のプログラムの必須識別子であり、OSはこのプログラムを監視します。 極端な状況では、端末からこのPIDのプログラムをバングすることができます-killとPIDを書きます(デバッグに役立つかもしれません)。



そのため、デーモンの起動時に、プログラムをいつ、どのように起動する必要があるか、停止または再起動する方法を示すスクリプトが実行されます。 デーモンが正常に機能するためには、起動時のプログラムは、ファイル、スクリプトで指定されたパス、そのPIDに保存し、別のストリーム(バックグラウンド)に切り替える必要があります。



悪魔のガイドは私を悲しみと切望に導いた。 デーモンを大幅に簡素化したため、私はそれをあらゆるプログラムを起動するためのユーティリティに変えました。 ただし、必須部分は変更されていません。 さらに、彼は何かが起こったかどうかをチェックするためにログに記録します。



デーモンコード
 void SetPidFile(char* Filename) { FILE* f; f = fopen(Filename, "w+"); if (f) { fprintf(f, "%u", getpid()); fclose(f); } } int main( int argc, char** argv ) { char toolfile[32]; char folder[32]; intptr_t ret; FILE* logfile; if( argc!=3 ) { printf( "Write address of the program and name: /home/ubuntu/tool/ tool\n"); return -1; } pid_t pid, sid; pid = fork(); if (pid < 0) { sleep(1); return -1; } //We got a good pid, Close the Parent Process if (pid > 0) { return 0; } //Create a new Signature Id for our child sid = setsid(); if (sid < 0) { return -1; } //Change File Mask umask(0); //Save PID memcpy( toolfile, argv[0], strlen(argv[0]) ); memcpy( toolfile + strlen(argv[0]), ".log", 4 ); memset( toolfile + strlen(argv[0]) + 4, 0, 1 ); printf( "Daemon:: log to:%s\n", toolfile ); logfile = fopen( toolfile, "w" ); fprintf( logfile, "Daemon:: started with 0=%s 1=%s 2=%s\n", argv[0], argv[1], argv[2] ); memset( toolfile, 0, 32 ); memcpy( toolfile, argv[0], strlen(argv[0]) ); memcpy( toolfile + strlen(argv[0]), ".pid", 4 ); memset( toolfile + strlen(argv[0]) + 4, 0, 1 ); SetPidFile( toolfile ); fprintf( logfile, "Daemon:: PID=%u saved in the %s\n", getpid(), toolfile ); memset( folder, 0, 32 ); memcpy( folder, argv[1], strlen(argv[1]) ); fflush ( logfile ); memset( toolfile, 0, 32 ); memcpy( toolfile, folder, strlen(argv[1]) ); memset( toolfile + strlen(argv[1]), '/', 1 ); memcpy( toolfile + strlen(argv[1]) + 1, argv[2], strlen(argv[2]) ); //Change Directory //If we cant find the directory we exit with failure. if ((chdir(folder)) < 0) { fprintf( logfile, "Daemon:: Program folder was not found:%s\n", folder ); fclose( logfile ); return -1; } //Close Standard File Descriptors close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); fprintf( logfile, "Daemon:: Program started\n" ); fflush ( logfile ); ret = execl( toolfile, folder, NULL ); if( ret==-1 ) { fprintf( logfile, "Daemon:: execl error: %s. File=%s Folder=%s\n", strerror(errno), toolfile, folder ); fclose( logfile ); return -1; } fprintf( logfile, "Daemon:: closed\n" ); fclose( logfile ); return 0; }
      
      





悪魔をコンパイルします。



現時点では、作業ディレクトリに/ home / ubuntu / daemon /と言ってみましょう。



デーモン-デーモンプログラム

prgr-プログラム

prgr.strt-プログラムの開始前に実行する必要があるスクリプト(必要な場合)

prgr.stop-プログラムを停止するために実行する必要があるスクリプト(必要な場合)



プログラムが機能するようにする必要があります。



 sudo chmod 755 ./tool sudo chmod 755 ./daemon
      
      





systemdのスクリプトが必要になりました

やる
 sudo nano /etc/systemd/system/mydaemon.service
      
      



そしてそこにスクリプトを書きます。



mydaemon.service
 [Unit] Description=my service After=network.target After=isc-dhcp-server.service [Service] Type=forking PIDFile=/home/ubuntu/daemon/daemon.pid ExecStartPre=/bin/sh /home/ubuntu/daemon/prgr.strt ExecStart=/home/ubuntu/daemon/daemon /home/ubuntu/daemon/prgr prgr ExecStop=/bin/sh /home/ubuntu/daemon/prgr.stop Restart=always TimeoutSec=5 [Install] WantedBy=multi-user.target
      
      





スクリプトで簡単に:

説明-簡単な説明

後-実行に必要なもの

Type = forking-systemdは、サービスが一度開始され、プロセスが親プロセスの完了で分岐すると想定します。

PIDFile-デーモンからのPIDプログラムを含むファイル

ExecStartPre-プログラムを開始する前

ExecStart-パラメーターを持つプログラム

ExecStop-停止する方法

WantedBy-実行するレベル



これで、すべてを実行することができます。

書く

 systemctl daemon-reload systemctl status mydaemon
      
      





すべてにエラーがない場合は、次を実行します。

 systemctl start mydaemon
      
      





その後、悪魔のログを参照してください、すべてが行く必要があります。

自動ロードを機能させるには
 systemctl enable mydaemon
      
      







友人、私はあなたの興味深いコメントと貴重なアドバイスを楽しみにしています。 あなたがどこに嘘をついた場合-非常に怒ってはいけない、単により良いことができるものを示してください。 大きなスクリプト、自動インストールなどについて、パート3が登場することを願っています。



All Articles