FC2ブログ

release版アプリケーションへの署名(android studio)(Android)(備忘録)


自分専用の署名鍵を管理する場合

手順概要


1. Select Build Variant で release を指定する
2. Generate Signed Bundle/APK でAPK用署名済みバンドルを生成
3. Signing Config の作成
4. Build Variant でBuild TypesとSinging Configとを関連付け
5. Build Bundle(s)/APK(s) - Build APK(s)で app-release.apk を生成
6. app\build\outputs\apk\フォルダで app-release.apk ファイルが生成された事を確認
7. 実行する

参考画像


■Select Build Variant で release を指定する
release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)



■Generate Signed Bundle/APK でAPK用署名済みバンドルを生成
release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)
OKで進む

release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)



■ Signing Config の作成
release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)



■Build Variant でBuild TypesとSinging Configとを関連付け
release版アプリケーションへの署名(android studio)(Android)(備忘録)



■Build Bundle(s)/APK(s) - Build APK(s)で app-release.apk を生成
release版アプリケーションへの署名(android studio)(Android)(備忘録)

■app\build\outputs\apk\フォルダで app-release.apk ファイルが生成された事を確認
■ 実行する


環境


release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)


スポンサーサイト



Raspberry Pi zero Visual Studio(Win) .NET core mono 準備(Raspberry Pi)(備忘録)

Raspberry Pi用のアプリケーションをWin10上のVisual Studio C#で開発する場合のRaspberry Pi zeroのインストールメモ。

何回やっても毎回忘れているのでメモります。

注意点


Raspberry Pi zero は ARMv6 ... .NET coreはV6をサポートしていない。 monoを使用する。
Raspberry Pi 3 B は ARMv8 ... .NET coreはV7 V8をサポートしている。

■update
2019/11時点では
$ sudo apt-get update
$ sudo apt-get upgrade
を行うと、raspbianのファイルマネージャが起動後すぐにクローズする現象が発生した為、実施していない。

RaspbianをSDカードにインストール


■Raspbianダウンロード
Raspbianのインストール用イメージファイルはraspberrypi.orgからダウンロード

1. 今回は 2019-09-26-raspbian-buster-full.zip をダウンロード。
2. zipを解凍し、2019-09-26-raspbian-buster-full.img を取り出す。

■SDカードに Raspbian を書き込む
Raspberry Pi zero Visual Studio(Win) .NET core mono 準備(Raspberry Pi)(備忘録)

「balenaEtcher」を使ってWindowsで書き込む。

1. balenaEtcher のダウンロード先はこちら
2. balenaEtcherをWindowsにインストールする
3. FAT32でフォーマットされたSDカードをwindowsにセット
4. balenaEtcher起動
5. 左端の「Select image」で 2019-09-26-raspbian-buster-full.img を選択
6. 中央の「Change」で目的のSDカードドライブを選択
7. 右端の「Flach!」で書き込む

Raspberry Piへのインストール時のハード構成


1. Raspberry Pi zero
2. USBハブ バッファロー BUFFALO BSH4UMB04BK [タブレット・スマホ用 USB2.0 4ポートハブ 変換コネクター付き]
3. LANアダプター バッファロー BUFFALO LUA3-U2-ATX [10/100M USB2.0用 有線LANアダプター Wii/MacBook Air対応]
4. キーボード、マウス ロジテック (USB UNIFYING RECEIVER)
5. モニター HDMI接続

Raspberry Pi 起動と設定


1. SDカードをRaspberry Piにセット後Power On

■「Welcom to Raspberry Pi」ウインドウにてセット
2. 「Set Country」
 Country Japan
 Language japanese
 Timezone Tokyo
3. 「Change Password」 任意に設定
4. 「Set Up Screen」 そのまま
5. 「Update Software」 Skip
6. 「Setup Complete」 Restart

■再起動後の設定
7. イチゴメニュー→設定→Raspberry Pi の設定にて
8. 「システム」タブにて
 「解像度」 任意に設定
9. 「インターフェイス」タブにて
 「カメラ」以外すべて有効
10.「ローカライゼーション」タブにて
 「タイムゾーンの設定」 地域 Asia 位置 Tokyo
 「キーボードの設定」 Model Generic 105-key PC(intl.) Layout Japanese Variant Japanese
11.「OK」クリックですぐに再起動を選択

VNC接続


再起動後はHDMI接続せずに、VNCでリモート接続する。

Visual Studio用 projectsフォルダ作成


/home/pi/projects を新規作成

日本語入力


$ sudo apt-get install ibus-mozc

samba


■sambaのインストール
$ sudo apt-get install samba

■バージョン確認
$ samba -V

■Sambaユーザーアカウントの作成(例は pi)
すでにシステムにユーザーが登録されいる事
$ sudo pdbedit -a pi
new password:
retype new password:

■/etc/samba/smb.conf ←編集
$ sudo mousepadにて/etc/samba/smb.confを開き
下記を追加
[usr_include]
public = yes
path = /usr/include

[pi_projects]
writeable = yes
path = /home/pi/projects

[usr_lib]
path = /usr/lib

■smb リスタート
$ samba restart


.NET Core Runtime のインストール(ARMv6以外のRaspberry Pi)


■ダウンロード
ここから.NET Core 3.0 を windowsでダウンロード
Build apps - SDK → Linux Binaries の ARM32 をダウンロードする

■転送
ダウンロードした dotnet-sdk-3.0.101-linux-arm.tar.gz
winSCPで/home/pi に転送

■インストール
$ sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet-sdk-3.0.101-linux-arm.tar.gz -C /opt/dotnet
$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin
確認
$ dotnet --info (※ Raspberry Pi zero ARMv6ではサポートしていない為 Segmentation fault となる)

mono(ARMv6の場合 zeroなど)


■インストール
$ sudo apt-get install mono-complete
確認
$ mono --versio

■実行時の注意
monoで実行する時、Visual Studioの「発行」のプロファイル設定でのポイントは、
1. 配置モードは「フレームワーク依存」
2. ターゲットランタイムは「ポータブル」
3. ターゲットの場所には、配置モードの「自己完結」のアプリと同居出来ない。
Raspberry Pi zero Visual Studio(Win) .NET core mono 準備(Raspberry Pi)(備忘録)
実行は $ mono ./sample1.dll


Raspberry Pi 3(Raspbian) VS C Sharp 外部ブログラムVLCの起動(Raspberry Pi)(備忘録)

Raspberry Pi 3 B用にwindows10上のVisual Studio C# で作成するプログラムで、
音楽ファイルを非同期に2曲同時に演奏する方法のテストです。

C#で作成したソフトから、外部のVLCを起動して音楽ファイルを再生したい。

■ソース
using System;
using System.Diagnostics;
using System.Threading;

namespace vscsrpiProcessStartTest
{
        class ProcessStartTest
    {
            public static void Main()
            {
            //プロセスとスレッド状態の表示
            Process mp = Process.GetCurrentProcess();
            Console.WriteLine("MAIN プロセス ID = " + mp.Id.ToString());

            Console.WriteLine("MAIN Thread = " + Thread.CurrentThread.ManagedThreadId.ToString());

            foreach (ProcessThread t in mp.Threads)
            {
                Console.WriteLine("Thread ID = " + t.Id.ToString());
            }

            //1つ目のvlc起動
            Process p = new Process();
            p.StartInfo.FileName = "vlc";
            p.StartInfo.Arguments = "--play-and-exit amefuri2.mp3"//--play-and-stopではない
            p.Start();

            Console.WriteLine(p.StartInfo.FileName + "#1 プロセスID = " + p.Id.ToString());


            //2つ目のvlc起動
            Process p2 = new Process();
            p2.StartInfo.FileName = "vlc";
            p2.StartInfo.Arguments = "--play-and-exit amefuri.wav"//--play-and-stopではない
            p2.Start();

            Console.WriteLine(p2.StartInfo.FileName + "#2 プロセスID = " + p.Id.ToString());

            Console.WriteLine("起動 終了");

            //vlc終了待ち
            p.WaitForExit();
            p2.WaitForExit();

            Console.WriteLine("end.");
            string ans = Console.ReadLine();
            }
        }
    }


■結果
MAIN プロセス ID = 24715
MAIN Thread = 1
Thread ID = 24715
Thread ID = 24717
Thread ID = 24718
Thread ID = 24719
Thread ID = 24720
Thread ID = 24721
Thread ID = 24722
Thread ID = 24724
Thread ID = 24725
vlc#1 プロセスID = 24728
VLC media player 3.0.7 Vetinari (revision 3.0.7-0-g86cee31099)
vlc#2 プロセスID = 24728
起動 終了
VLC media player 3.0.7 Vetinari (revision 3.0.7-0-g86cee31099)
[017c6950] main libvlc: vlcはデフォルトのインターフェースで実行しています。インターフェースのない vlc を使用するには'cvlc'を使用してください。
[00c2d950] main libvlc: vlcはデフォルトのインターフェースで実行しています。インターフェースのない vlc を使用するには'cvlc'を使用してください。
libEGL warning: DRI2: failed to authenticate
libEGL warning: DRI2: failed to authenticate
qt5ct: using qt5ct plugin
qt5ct: using qt5ct plugin
qt5ct: D-Bus global menu: no
qt5ct: D-Bus global menu: no
qt5ct: D-Bus system tray: no
qt5ct: D-Bus system tray: no
[0183b078] main playlist: end of playlist, exiting
QObject::~QObject: Timers cannot be stopped from another thread
[00ca2078] main playlist: end of playlist, exiting
QObject::~QObject: Timers cannot be stopped from another thread
end.




C#の SoundPlayer Class で再生する方法を色々試したが挫折し、VLCに頼る事にした。

2つのファイルを順次に再生したい場合は、 p.WaitForExit(); を p.Start(); の次の行に移動させればよい。
2つ同時にと書いていますが、VLCの起動に時間がかかり、同時でありません。すこし時間差があります。

再生が終了した時点でVLCを終了させるコマンドラインのパラメータに --play-and-stop を指定していたが、
--play-and-exit であった。
VLCのコマンドのパラメータを調べた時に --play-and-stop がヒットし、--play-and-exit の記述はなかったが、
期待通りの動作をしなかった。後に --play-and-exit の記述例が見つかりメデタシとなった。

PulseAudio server connection failure: Connection refused 暫定対策(Raspberry Pi 3 B)(Raspbian)

Raspberry Pi 3B(Raspbian)の「端末」でのお話です。
VLCでwavファイルを再生($ vlc amefuri.wav)すると、
「vlcpulse audio output error: PulseAudio server connection failure: Connection refused」エラーが発生する。
$ cvlc amefuri.wav も同じ。

■暫定対策
「VLCメディアプレイヤー」で
ツール→設定→オーディオ→出力モジュールを「自動」から「OpenBSD sndioオーディオ出力」に変更する。
※他の設定方法については調査していない。

■本対策
未調査




資料


■Raspberry Pi 3 B(Raspbian) エラー発生画面
PulseAudio server connection failure: Connection refused 暫定対策(Raspberry Pi 3 B)(Raspbian)

■VLC設定画面
PulseAudio server connection failure: Connection refused 暫定対策(Raspberry Pi 3 B)(Raspbian)

Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 両エッジ割込と並行処理(Raspberry Pi)(備忘録)

■課題
雨降り警報機用Raspberry Piプログラムの方式検討。
1.雨滴検出時に、音声案内とメールを送信
2.センサー乾燥時に、音声案内とメールを送信

■着目点
(1)入力
1.入力ピンは一つである
2.入力信号の立ち上がり、立ち下がりで異なる処理をする
3.センサー回路によりチャッタは除去されている
4.センサー回路により雨滴検出時の信号は一定期間以上保持される

(2)Raspbian/libwiringPi
1.wiringPiISR()による割込対象エッジの指定はタスク毎に変える事はできない
2.wiringPiISR()による割込対象エッジの指定は最後に指定したものが有効になる
3.上記割込のキューは最大2つで、しかも2つ目は保証されていない

(3)アプリケーション
1.雨滴検出、センサー乾燥時にそれぞれ異なる音声ファイルを再生する
2.雨滴検出、センサー乾燥時にそれぞれ異なるメールを送信する
3.入力パルス幅より、各処理時間の方が長くなる場合がある
(センサーは微小雨滴を検出できる為、検出後即時に乾燥しパルス幅が短くなる場合がある)

方針


(1)プログラム
1.雨滴検出時と乾燥検出の間隔が短い場合も、検出後極力リアルタイムに処理を行う
2.簡単、単純な作り


(1)プログラム
1.雨滴検出用と乾燥検出用の2つのプログラムとする
(別タスクで動作(スレッドでなく))

検証項目


1.2つのタスクが各々wiringPiISR()を発行して問題が生じない事を確認
2.雨滴検出から乾燥検出期間より長い期間CPUに負荷を掛ける処理を各検出時に起動して、動作状態を観測する

Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 両エッジ割込と並行処理(Raspberry Pi)(備忘録)
黄:センサー出力(GPIO24入力)
青:雨滴検出用プログラム(vscsrpiWiringPiInterrutpTest2) (GPIO25)
赤:乾燥検出用プログラム(vscsrpiWiringPiInterrutpTest10) (GPIO7)


■長時間(6時間)連続動作時のゆらぎと割込取りこぼし確認
Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 両エッジ割込と並行処理(Raspberry Pi)(備忘録)
オシロスコープ RIGOL DS1054Z の無限残像機能によるゆらぎと取りこぼし有無を確認。

青、赤のラインで基底ラインが切れている為、取りこぼしはない。

■他の高負荷JOBがある時(※)
Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 両エッジ割込と並行処理(Raspberry Pi)(備忘録)

青、赤のラインで基底ラインの切れがなく、その後部に遅延を示すパルスもない。取りこぼしが発生。

※負荷は、ファイル名サーチによってを掛けている。


■割込対象の入力信号作成用
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace vscsrpiWiringPiSend
{
    class SendProgram
    {
        [DllImport("libwiringPi")]
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int PINNO = 23;

        static void Main(string[] args)
        {
            Console.WriteLine("vscsrpiWiringPiSend start.");
            wiringPiSetupGpio();

            pinMode(PINNO, PINMODE.OUTPUT);

            while (true)
            {
                digitalWrite(PINNO, HIGH);  //オン
                Thread.Sleep(20); //ミリ秒
                digitalWrite(PINNO, LOW);   //オフ
                Thread.Sleep(200); //ミリ秒
            }
            Console.WriteLine("vscsrpiWiringPiSend done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}


■立ち上がり検出時の処理用
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace vscsrpiWiringPiInterrutpTest2
{

    public delegate void CallBack(); //■デリゲートを宣言

    class IntProgram
    {
        [DllImport("libwiringPi")]
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        [DllImport("libwiringPi")]
        static extern int digitalRead(int pin);

        //■割り込みサービスルーチン用関数
        [DllImport("libwiringPi")]
        static extern int wiringPiISR(int pinint edgeTypeCallBack f);


        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int RECEIVEPINNO = 24;
        private static readonly int CKPINNO = 25;

        //■割り込みトリガエッジ極性指定
        private static readonly int RISINGEDGE = 2;
        private static readonly int FALLINGEDGE = 1;
        private static readonly int BOTHEDGE = 3;

        //■CallBack用メソッド定義
        public static void Intfunc()
        {
            Console.WriteLine("intfunc() begin");

            if (digitalRead(RECEIVEPINNO) == 0)
            {
            } else
            {
                digitalWrite(CKPINNO, HIGH);
                for (int i = 0i < 6000000i++) ;
                digitalWrite(CKPINNO, LOW);
            }

            //digitalWrite(CKPINNO, HIGH);
            //Thread.Sleep(20); //ミリ秒
            //for (int i = 0; i < 1000000; i++) ;
            //digitalWrite(CKPINNO, LOW);
            Console.WriteLine("intfunc() end");
            return;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("vscsrpiWiringPiInterrutpTest2 start.");
            wiringPiSetupGpio();

            pinMode(RECEIVEPINNO, PINMODE.INPUT);
            pinMode(CKPINNO, PINMODE.OUTPUT);

            digitalWrite(CKPINNO, LOW);

            CallBack intf = new CallBack(Intfunc); //■CallBackインスタンス生成
            Console.WriteLine("ISR begin");

            //wiringPiISR(RECEIVEPINNO, RISINGEDGE, intf);  //■立ち上がりエッジで割り込み設定
            //wiringPiISR(RECEIVEPINNO, FALLINGEDGE, intf);   //■立ち下がりエッジで割り込み設定
            wiringPiISR(RECEIVEPINNO, BOTHEDGE, intf);    //■立ち両エッジで割り込み設定

            Console.WriteLine("ISR end");

            while (true)
            {
                //waitForInterrupt()では、時々、割り込みの取り漏れが発生したので、Sleep()にした(原因は未追及)
                Thread.Sleep(10000); //ミリ秒
            }

            Console.WriteLine("vscsrpiWiringPiInterrutpTest2 done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}



■立ち下がり検出時の処理用
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace vscsrpiWiringPiInterrutpTest11
{

    public delegate void CallBack(); //■デリゲートを宣言

    class IntProgram
    {
        [DllImport("libwiringPi")]
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        [DllImport("libwiringPi")]
        static extern int digitalRead(int pin);

        //■割り込みサービスルーチン用関数
        [DllImport("libwiringPi")]
        static extern int wiringPiISR(int pinint edgeTypeCallBack f);


        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int RECEIVEPINNO = 24;
        private static readonly int CKPINNO = 7;

        //■割り込みトリガエッジ極性指定
        private static readonly int RISINGEDGE = 2;
        private static readonly int FALLINGEDGE = 1;
        private static readonly int BOTHEDGE = 3;

        //■CallBack用メソッド定義
        public static void Intfunc()
        {
            Console.WriteLine("intfunc() begin");

            if (digitalRead(RECEIVEPINNO) == 0)
            {
                digitalWrite(CKPINNO, HIGH);
                for (int i = 0i < 6000000i++) ;
                digitalWrite(CKPINNO, LOW);
            }

            //digitalWrite(CKPINNO, HIGH);
            //Thread.Sleep(20); //ミリ秒
            //for (int i = 0; i < 1000000; i++) ;
            //digitalWrite(CKPINNO, LOW);
            Console.WriteLine("intfunc() end");
            return;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("vscsrpiWiringPiInterrutpTest10 start.");
            wiringPiSetupGpio();

            pinMode(RECEIVEPINNO, PINMODE.INPUT);
            pinMode(CKPINNO, PINMODE.OUTPUT);

            digitalWrite(CKPINNO, LOW);

            CallBack intf = new CallBack(Intfunc); //■CallBackインスタンス生成
            Console.WriteLine("ISR begin");

            //wiringPiISR(RECEIVEPINNO, RISINGEDGE, intf);  //■立ち上がりエッジで割り込み設定
            //wiringPiISR(RECEIVEPINNO, FALLINGEDGE, intf);   //■立ち下がりエッジで割り込み設定
            wiringPiISR(RECEIVEPINNO, BOTHEDGE, intf);    //■立ち両エッジで割り込み設定

            Console.WriteLine("ISR end");

            while (true)
            {
                //waitForInterrupt()では、時々、割り込みの取り漏れが発生したので、Sleep()にした(原因は未追及)
                Thread.Sleep(10000); //ミリ秒
            }

            Console.WriteLine"vscsrpiWiringPiInterrutpTest10 done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}


環境


■Microsoft Visual Studio Community 2019
Version 16.3.3
VisualStudio.16.Release/16.3.3+29403.142
Microsoft .NET Framework
Version 4.8.03752

■C# ツール 3.3.1-beta3-19461-02+2fd12c210e22f7d6245805c60340f6a34af6875b
■TargetFramework netcoreapp3.0.0

■Raspberry Pi 3 Model B V1.2

■Raspbian
pi@rp:~ $ uname -a
Linux rp 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
pi@rp:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.9 (stretch)
Release: 9.9
Codename: stretch
pi@rp:~ $

■libwiringPi.so.2.50


感想


雨降り警報機用と郵便箱投函センサー用として、外部からの停止や起動の機能を持たない暫定版に適用しようと思っています。
やっぱり、雨降り警報機と郵便投函の通知がないと不便です。


Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 割り込み(Raspberry Pi)(備忘録)

Visual Studio 2019 + C# + libwiringPi を利用して Raspberry Pi 3B のGPIO制御の検討。
GPIOの入力ピンの信号の変化で割り込みを発生させて、処理を行う為の libwiringPi の使用方法。


■サンプルコード
1.GPIO24ピンを入力端子とし、立ち下がりエッジでの割り込みを受ける
2.割り込み処理では、コンソールにメッセージを表示し、GIOP25ピンからパルスを出力する
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace vscsrpiWiringPiInterrutpTest
{
    
    public delegate void CallBack(); //■デリゲートを宣言

    class IntProgram
    {
        [DllImport("libwiringPi")]
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        [DllImport("libwiringPi")]
        static extern int digitalRead(int pin);

        //■割り込みサービスルーチン用関数
        [DllImport("libwiringPi")]
        static extern int wiringPiISR(int pinint edgeType,CallBack f);


        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int RECEIVEPINNO = 24;
        private static readonly int CKPINNO = 25;

        //■割り込みトリガエッジ極性指定
        private static readonly int RISINGEDGE = 2;
        private static readonly int FALLINGEDGE = 1;
        private static readonly int BOTHEDGE = 3;

        //■CallBack用メソッド定義
        public static void Intfunc()
        {
            Console.WriteLine("intfunc() begin");
            digitalWrite(CKPINNO, HIGH);
            //Thread.Sleep(20); //ミリ秒
            for (int i = 0i < 1000000i++) ;
            digitalWrite(CKPINNO, LOW);
            Console.WriteLine("intfunc() end");
            return;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("vscsrpiWiringPiinterruptTest start.");
            wiringPiSetupGpio();

            pinMode(RECEIVEPINNO, PINMODE.INPUT);
            pinMode(CKPINNO, PINMODE.OUTPUT);

            digitalWrite(CKPINNO, LOW);

            CallBack intf = new CallBack(Intfunc); //■CallBackインスタンス生成
            Console.WriteLine("ISR begin");

            //wiringPiISR(RECEIVEPINNO, RISINGEDGE, intf);  //■立ち上がりエッジで割り込み設定
            //wiringPiISR(RECEIVEPINNO, FALLINGEDGE, intf);   //■立ち下がりエッジで割り込み設定
            wiringPiISR(RECEIVEPINNO, BOTHEDGE, intf);    //■立ち両エッジで割り込み設定

            Console.WriteLine("ISR end");

            while (true)
            {
                //waitForInterrupt()では、時々、割り込みの取り漏れが発生したので、Sleep()にした(原因は未追及)
                Thread.Sleep(10000); //ミリ秒
            }

            Console.WriteLine("vscsrpiWiringPiinterruptTest done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}
//■のコメント部分は主要な部分である事を示す。

雑記


■リアルタイム性について
RaspbianがリアルタイムOSではないので当たり前の話ですが、
入力端子の電圧が変化し、CallBack関数が動くまでに、3msも掛かる場合があった。

ただし、割り込みの取り漏れは発生しなかった。

■多重割り込みについて
割り込み処理中の割込は、一つは保留される模様。それ以上は無視される。
ただし、保留された一つも失われる事もあった。

Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 検討(Raspberry Pi)(備忘録)

Visual Studio 2019 + C# + libwiringPi を利用して Raspberry Pi 3B のGPIO制御の検討。

既存のEZgpから壊れた為、代替品としてRaspberry Pi 3Bを使用するにあたり、開発環境の検討の一部です。


■実現できる最小パルス幅
Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)


■波形の乱れ
Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)


■アプリに制御が渡らない期間
Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)

Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)




■テスト用ソース
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace LibWiringPiTest
{
    class Program
    {
        [DllImport("libwiringPi")] 
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int PINNO = 23;

        static void Main(string[] args)
        {
            wiringPiSetupGpio();

            pinMode(PINNO, PINMODE.OUTPUT);

            while(true)
            { 
                digitalWrite(PINNO, HIGH);  //オン
                digitalWrite(PINNO, LOW);   //オフ
            }
            Console.WriteLine("Done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}

Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)
Microsoft Visual Studio Community 2019
Version 16.3.3
VisualStudio.16.Release/16.3.3+29403.142
Microsoft .NET Framework
Version 4.8.03752



結果


雨降り警報、郵便投函センサー、不審者監視などの低速度機器には使えるレベル。
GPIO入力信号の割り込みの評価はこれから。

Visual Studio+C#の環境も、このテストに限れば使いやすい。


追加資料


制御が戻らない期間の調査資料(画像のみ)

4839-17.jpg

4839-17.jpg

4839-12.jpg

4839-14.jpg

4839-15.jpg

4839-16.jpg

4839-17.jpg

Indy10 Could not load SSL library 対応(Raspberry Pi)(備忘録)

Raspberry Pi Lazarusでindy10を使用して、SMTPでgmail送信をしようとした所、「Could not Load SSL Library」のエラーとなりました。
Indy10 Could not load SSL library 対応(Raspberry Pi)

indyのバージョンは indy-10.2.0.3 です。

原因は、OpenSSLのライブラリーバージョンが「システム > Indy10」とバージョンサポート範囲外でした。
システム側の利用出来るバージョンは 1.0.0 で Inyd10が対応しているバージョンは 0.9.9~0.9.6 でした。

■対策
Indy10側で対象バージョンを無理やり、 1.0.0 もLoadLibray()の対象としました。
バージョン違いによる弊害は「幸運を期待する」です。

※なお、この対策をしても、Lazarusのデバッグモードでは「例外クラス'Extemal:SIGILL'」が発生します。実行ファイルを直接実行させると例外は発生しませんでした。よって、この件は将来の叡智に任せる事にしました。(使えればいいじゃん!)



環境


ハード:Raspberry Pi 3 Model B V1.2
pi@rp3a:~ $ uname -a
Linux rp3a 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
pi@rp3a:~ $ 

pi@rp3a:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
pi@rp3a:~ $ 

pi@rp3a:~ $ openssl version
OpenSSL 1.0.1t  3 May 2016
pi@rp3a:~ $ 

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

Indy10 : indy-10.2.0.3.tar.gz



テストプログラム



メイン
unit u_app;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, IdSMTP, IdSSLOpenSSL, FileUtil, Forms, Controls, Graphics,
  Dialogs, StdCtrls,
  IdMessage;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    IdSMTP1: TIdSMTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  idmessage: tidmessage;
begin
  memo1.Lines.add('send start.');

  idmessage := tidmessage.Create(nil);
  idmessage.attachmentencoding := 'MIME';
  idmessage.charset := 'UTF-8';
  idmessage.ContentTransferEncoding := 'BASE64';
  idmessage.contenttype := 'text/plain; charset=UTF-8';  //←ここがポイント

  idmessage.from.address := 'ffffff@gmail.com';
  idmessage.recipients.emailaddresses := 'rrrrrr@gmail.com';

  idmessage.subject := 'test ' + formatdatetime('yyyy/mm/dd hh:mm:ss', now);
  idmessage.body.Text := 'test body.' + #$0d#$0a + '日本語' + #$0d#$0a +
    formatdatetime('yyyy/mm/dd hh:mm:ss', now);

  idsmtp1.connect();
  try
    idsmtp1.send(idmessage);
  finally
    idsmtp1.disconnect;
    idmessage.Free;
  end;

  memo1.Lines.add('send end.');
end;

end.


TIdSMTPとTIdSSLIOHandlerSocketOpenSSL
  object IdSMTP1: TIdSMTP
    IOHandler = IdSSLIOHandlerSocketOpenSSL1
    Host = 'smtp.gmail.com'
    Password = 'xxxxx'
    Port = 465
    SASLMechanisms = <>
    UseTLS = utUseImplicitTLS
    Username = 'xxxxxx@gmail.com'
    Left = 96
    Top = 40
  end

  object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
    Destination = 'smtp.gmail.com:465'
    Host = 'smtp.gmail.com'
    MaxLineAction = maException
    Port = 465
    DefaultPort = 0
    SSLOptions.Method = sslvSSLv23
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    Left = 120
    Top = 104
  end




経過


エラー発生時の経過を辿って行くと、下記の青枠の LoadLibrary() で複数のバージョンのロードを試みていますが、全て失敗しています。
Indy10 Could not load SSL library 対応(Raspberry Pi)

上記の赤枠の ALibVersions[] をみてみると、

Indy10 Could not load SSL library 対応(Raspberry Pi)

0.9.9~0.9.6 となっていました。
※先頭の「.」があるのとないのがありますが、これでよいのか不明です。

ldconfig -v で調べてみると

pi@rp3a:~ $ ldconfig -v

/usr/lib/arm-linux-gnueabihf:

   libssl.so.1.0.0 -> libssl.so.1.0.0

   libcrypto.so.1.0.0 -> libcrypto.so.1.0.0



.1.0.0 となっているので、

下記のように、 .1.0.0 を追加しました。

Indy10 Could not load SSL library 対応(Raspberry Pi)


これで、 gmai 送信できましたが、冒頭の記述のようにLazarusのデバッグモードでは「例外クラス'Extemal:SIGILL'」が発生します。
実行ファイルを直接実行させると例外は発生しませんでした。



例外クラス'Extemal:SIGILL'を追う


これを追っていくと、

こんな箇所に遭遇しました。
Indy10 Could not load SSL library 対応(Raspberry Pi)

{}のネスト不良がありました。
修正方法がわからないので、(* *)でコメント化し、万一この関数を呼ばれた時の為に、 raise を入れて置きました。
ただし、これを行っても結果はなんら変わりませんでした。

Indy10 Could not load SSL library 対応(Raspberry Pi)

※しかし、このような状態でコンパイルが通ったのかは判りません。これも「将来の叡智に任せる」ですね。



感想


色々探っているなかで、if xxx then begin xxx; exit; end; で exit; を通過しているにもかかわらず、exitしないで次の文に制御が移ります。
「コンパイラオプション」で「最適化なし」にすると、この現象は無くなりました。

色々、難問が残っていますがとりあえずこのまま使ってみます。



Lazarus ソースエディタで入力ダブリ(Raspberry Pi)(備忘録)

Raspberry Pi 3上のLazarusにおいて、ソースエディタで半角英文字を入力すると、
1文字入力で2文字表示される。
ただし、この現象は「オブジェクトインスペクター」や「Leafpad」では発生しない。

暫定対策は 「Raspberry Pi設定」のローカライゼーションを「en(Englich)」にして、この現象を逃げる。

ダブリが発生する時


Lazarus ソースエディタで入力ダブリ(Raspberry Pi)



正常に入力できる時


Lazarus ソースエディタで入力ダブリ(Raspberry Pi)
※Lazarusの「IDEオプション」→「環境」→「一般」→「言語」は「日本語[ja]」に設定しても正しく動作する。



環境


ハード:Raspberry Pi 3 Model B V1.2
pi@rp3a:~ $ uname -a
Linux rp3a 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
pi@rp3a:~ $ 

pi@rp3a:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
pi@rp3a:~ $ 

pi@rp3a:~ $ openssl version
OpenSSL 1.0.1t  3 May 2016
pi@rp3a:~ $ 

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)(備忘録)

Raspberry Pi 3(Raspbian)に indy-10.2.0.3 をインストールした時のメモです。

■不具合との遭遇
(1)indy10をLazarusに組み込む為に、コンパイルをするとエラーとなります。
(2)indyとは無関係に、ソースエディタで半角文字を一文字入力すと二文字表示されます。(電動タイプライター風にいうとダブリます)
(3)indy10が対応しているSSLのバージョが古い為にSMTP利用時にSSLが使用できない不具合があります。(ライブラリーロードエラー)

(1)の対策は本記事で対策しています。
(2)の対策は、Lazarusのソースを修正する必要があると思われますが、困難なので暫定的に環境で対応しました。(別記事)
(3)の対策は、幸運を期待した対策をしました。(別記事予定)


要点版


indy10のダウンロードはコチラから
indy-10.2.0.3.tar.gz をダウンロードする。

■解凍後フォルダ名変更
「fpc」フォルダ → 「indy_fpc」
「lazarus」フォルダ → 「indy_lazarus」

■フォルダをコピー(windows上で作業の場合)
「indy_fpc」 → 「/usr/local/fpc/source/packages」に
「indy_lazarus」 → 「/usr/local/share/lazarus/components」に

■パーミッション変更
0777に変更する。
「/usr/local/share/lazarus」
「/usr/local/fpc」

■パッケージ lpk ファイル指定
メニュー「パッケージ」 → 「パッケージファイルを開く」
/usr/local/share/lazarus/components/indy_lazarus/indylaz.lpk

■パッケージOptions指定
「コンパイラオプション→パス」 → 「Other unit files(-Fu)」欄の横の「...」をクリックする。
「/usr/local/fpc/source/packages/indy_fpc」を指定

■パッケージコンパイル
「パッケージダイアログ」の「コンパイル」クリック

■バグ修正
idMessageの831行目の if Encoding = meMIME then でErrorとなるので、
これを if self.Encoding = meMIME then と修正する。

■再度コンパイル

■パッケージのインストール
「パッケージ」ダイアログの「Use」→「インストール」をクリックしてインストール。



画像付版


環境


ハード:Raspberry Pi 3 Model B V1.2
pi@rp3a:~ $ uname -a
Linux rp3a 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
pi@rp3a:~ $ 

pi@rp3a:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
pi@rp3a:~ $ 

pi@rp3a:~ $ openssl version
OpenSSL 1.0.1t  3 May 2016
pi@rp3a:~ $ 

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)



準備


■indy10 ダウンロード

indy10のダウンロードはコチラから
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
indy-10.2.0.3.tar.gz をダウンロードする。

■indy10 解凍

windows上で解凍しました。
7-Zipでindy-10.2.0.3.tar.gzを解凍後、解凍されたindy-10.2.0.3.tarを更に解凍。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
解凍されたファイル

■フォルダ名変更(任意)

解凍されたファイルの2つのフォルダの名前を下記のように変更する。
(indyである事と用途が分かるように)(他とダブらなければ任意の名前でよい)

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

■解凍したファルダをRaspberry Piに転送
windows上で作業しているので、解凍した内2つのフォルダをlazarusに転送する。
転送はWinSCPでしました。ログインはrootで。

(1)indy_lazarusファルダ

下記のようにcomponentsフォルダに転送する。
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
転送結果

componentsのフォルダの位置は環境により変わるので注意。
components中の他のフォルダに「.lpk」が存在する事で確認しました。

(2)indy_fpcフォルダ

下記のようにpackagesフォルダに転送する。
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
転送結果



作業性向上の為に


Lazarusのインストール等はrootで行いましたが、indyインストールの作業やアプリの作成はpiでするので、
色々面倒な事を避ける為 lazarus と fcp のフォルダのパーミッションは何でも可にして置きました。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

下記のエラーは「スキップ」で対応。
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

/usr/local/fpcも同様に処置します。



パッケージのインストール



■Lazarusを起動し、 メニュー→パッケージ→パッケージファイルを開く をクリック。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

■indylaz.lpkを開く

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

パッケージダイアログが開いたところ
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

■Option指定

上記画面の「Options」をクリックする。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

「コンパイラオプション」ダイアログで「コンパイラオプション→パス」を選択し、
「Other unit files(-Fu)」欄の横の「...」をクリックする。

表示された「パスエディタ」ダイアログの「検索パス」グループの検索用フォルダマークボタンをクリックして、
先程、コピーした「indy_fpc」を指定する。
その後、「追加」ボタンをクリックして、一覧に追加する。
Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
追加後の画面

「OK」をクリックして戻る。

■パッケージをコンパイル

「コンパイル」ボタンをクリックしてコンパイルする。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

■バグ修正

idMessageの831行目の if Encoding = meMIME then でErrorとなるので、
これを if self.Encoding = meMIME then と修正する。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

赤枠が修正対象行。 水色枠は原因行でwithによる限定子省略の戻し忘れが原因と思われる。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)
修正後

■再度コンパイル

「コンパイル」ボタンをクリックしてコンパイルする。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

コンパイル成功

■パッケージのインストール

「パッケージ」ダイアログの「Use」→「インストール」をクリックしてインストール。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

Lazarus再構築の許可を与える。
「はい」ボタンをクリックする。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

パッケージのインストールが完了し、Lazarusが再起動される。

Raspberry Pi 3(Raspbian)に indy10 をインストール(Raspberry Pi)

indy登録完了。


お知らせ
■注意:Google Chrome以外のブラウザでは動作しない事もあります。
お好みに応じて
画像だけの表示でいいよ
やっぱり全部表示して
背景は黒がいいな
背景を元に戻して
サブジャンル
メモリアルマップ
My Favorite Photo
検索フォーム
プロフィール

otsu.usiwakamaru

Author:otsu.usiwakamaru
五条の橋でひらりひらりと欄干を飛び渡る牛若丸のように、興の向くまま電子回路にプログラミングに写真にと飛び回っています。

プロフィール詳細

カレンダー
06 | 2020/07 | 08
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
キーワード
クリックしたキーワードの記事のみ表示します。

ダンサー ミニー ミッキー デイジー ドナルド グーフィー キャラクター  3D 試み MFP 電池 ティンカーベル デザイン 全天球 クラリス パークテーマ プルート チップデール キャスト IXY マレフィセント スクルージ スモールプラネット ダッフィー SPOT 改造 

最新記事
月別アーカイブ
全記事表示リンク

全ての記事を表示する

おすすめプログ(新着記事)
リンク


にほんブログ村
カテゴリ
橋 (1)
PIC (3)
カウンタ
訪問者数(UU)

アクセス数

現在の閲覧者数

tael no013用