20210425のLinuxに関する記事は4件です。

PF用のAWSサーバに大量のログイン試行のログがあった話

全容はこの記事を見てください。 めちゃくちゃ参考になります。 https://blog.katsubemakito.net/linux/sshd-ipaddress-check Twitterでふと上の記事が流れてきて、「へぇ~ログイン攻撃ってあるんだなぁ~」と思って私も試しにコマンドを叩いてみました linux $ sudo cat /var/log/secure | grep 'Invalid user' そうしたら、めちゃくちゃ出るログイン試行の跡。ナニコレ怖い!!!! また記事に乗っているコマンドを試してみる。 linux $ sudo cat /var/log/secure* | grep 'Invalid user' | cut -f2 -d' ' | sort | uniq -c するとすると、一日1500件くらいログイン試行があるじゃないか・・・!怖いんだけど!!! スクールのメンターさんにドキドキしながら聞きました。 私はcloud9の1つからしかログインしないので、cloud9で console $ curl ipconfig.io を入れて出てきたIPアドレスをどっかにメモ(後で入力する) EC2→インスタンス→該当のEC2インスタンス→セキュリティー→セキュリティーグループをクリック インバウンドルールを編集をクリック→SSHのところのソースに自分のIPアドレス/32を入力 で出来ました! 皆様もお気をつけて・・・ SSH接続についてはこちらの記事が参考になりました。 https://qiita.com/tag1216/items/5d06bad7468f731f590e
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

bluetoothctl のコマンド一覧と使い方をまとめてみた

クイックリファレンス コマンド名 説明 使用例 list 利用可能なコントローラをすべて表示する list select デフォルトのコントローラを変更する select <CONTROLLER_DB_ADDRESS> show 選択されているコントローラの情報を表示する show power Bluetooth レシーバーの電源のオン・オフを切り替える `power on pairable Bluetooth レシーバーのペアリング可否の状態を変更する `pairable on discoverable Bluetooth レシーバーを、他のデバイスから検索可能な状態にするかどうかを変更する `discoverable on discoverable-timeout discoverable on を実行したあとに、自動的に discoverable off にするまでの時間を設定する discoverable-timeout <TIME> scan ペアリング・接続可能なデバイス一覧を検索する `scan on devices ペアリング・接続可能なデバイス一覧を表示する devices pair デバイスとペアリングする pair <DEVICE_BD_ADDRESS> agent ペアリングする際にどのように認証するかを指定する agent <TYPE> paired-devices ペアリングされているデバイス一覧を表示する paired-devices info ペアリング・接続したデバイスの情報を表示する info <DEVICE_BD_ADDRESS> connect デバイスと接続する connect <DEVICE_BD_ADDRESS> disconnect デバイスを切断する disconnect <DEVICE_BD_ADDRESS> trust デバイスを信頼する trust <DEVICE_BD_ADDRESS> untrust 信頼したデバイスを信頼しない状態に戻す untrust <DEVICE_BD_ADDRESS> block デバイスをブロックする block <DEVICE_BD_ADDRESS> unblock ブロックされているデバイスのブロックを解除する unblock <DEVICE_BD_ADDRESS> remove デバイスと切断し、ペアリング情報を削除する remove <DEVICE_BD_ADDRESS> set-alias デバイスにエイリアスを設定する set-alias <DEVICE_ALIAS> system-alias コントローラにエイリアスを設定する system-alias <CONTROLLER_ALIAS reset-alias system-alias で設定したエイリアスを削除する reset-alias default-agent ペアリングなどをしたいデバイス側からリクエストがあったときに、どのコントローラでそのリクエストを受けるのかを指定する default-agent advertise 用途不明 はじめに 最近 bluetoothctl を利用する機会が多いので、bluetoothctl のコマンドについて調べてまとめてみた。 bluetoothctl とは GNU/Linux で利用可能なコマンドの一つ。Bluetooth のライブラリをインストールすると一緒についてくるコマンドの一つ。 Ubuntu Desktop の場合は Bluetooth のライブラリがプリインストールされているので bluetoothctl コマンドが最初から使えるはず。 Ubuntu Server の場合は以下のコマンドを実行すると利用可能になる。 Shell sudo apt -y install bluetooth bluez 主な利用用途 Bluetooth に関する操作をコマンドラインで行うことができる。 たとえば、PC やスマートフォンで Bluetooth の設定に行くと、接続可能なデバイス一覧が表示され、そのデバイスを選択すると Bluetooth のペアリングができる。その後、対象の Bluetooth デバイスと接続したり切断したりすることができる。 その一連の Bluetooth 操作を、GNU/Linux ではコマンドラインで行うことができる。コマンドラインで Bluetooth の操作ができてしまうのも GNU/Linux の特徴の一つだろう。 使い方 使い方は至ってシンプルだ。 bluetoothctl コマンドはインタラクティブなインターフェースで実装されている。下記コマンドを実行すると、コントローラ1の一覧とともに bluetoothctl のプロンプトが表示されるはずだ。 Shell bluetoothctl Agent registered [CHG] Controller XX:XX:XX:XX:XX:XA Pairable: yes [CHG] Controller XX:XX:XX:XX:XX:XB Pairable: yes [CHG] Controller XX:XX:XX:XX:XX:XC Pairable: yes [CHG] Controller XX:XX:XX:XX:XX:XD Pairable: yes [CHG] Controller XX:XX:XX:XX:XX:XE Pairable: yes [CHG] Controller XX:XX:XX:XX:XX:XF Pairable: yes [Bluetooth]# ここから bluetoothctl のコマンドを実行することによって、各種 Bluetooth の操作をコマンドラインで行うことができる。 終了する場合は exit または quit を実行する。 bluetoothctl exit|quit 環境 bluetoothctl 5.53 コマンド一覧 コマンド一覧とどのような操作を行うものかを順番に説明していく。 list 利用可能なコントローラ1をすべて表示する。 bluetoothctl list Controller XX:XX:XX:XX:XX:XA BlueZ 5.53 [default] Controller XX:XX:XX:XX:XX:XB BlueZ 5.53 Controller XX:XX:XX:XX:XX:XC BlueZ 5.53 Controller XX:XX:XX:XX:XX:XD BlueZ 5.53 Controller XX:XX:XX:XX:XX:XE BlueZ 5.53 Controller XX:XX:XX:XX:XX:XF BlueZ 5.53 末尾に [default] と表示されているのが、現在選択されているコントローラである。これはどういう意味か説明する。 たとえば、USB タイプの Bluetooth レシーバーを 3 つ接続していて、それぞれ A, B, C としよう。 A に Bluetooth キーボードを接続して、B に Bluetooth マウスを接続して、C に Bluetooth ヘッドフォンを接続したいとする。この用途だと、一つのレシーバーにキーボードとマウスとヘッドフォンを全部接続すれば良いのだが、あくまで説明用だ。 実際に各種デバイス (キーボード、マウス、ヘッドフォン) と接続する際は、list で [default] と表示された Bluetooth レシーバーに対してペアリングや接続が行われる。 なので、A が [default] となっていて、キーボードを接続したら、次は B を [default] にしてマウスを接続して、C を [default] にしてヘッドフォンを接続する、といった具合だ。 [default] の切り替え方は、後述する select コマンドを使用する。 select デフォルトのコントローラを変更する。 bluetoothctl select XX:XX:XX:XX:XX:XX Controller XX:XX:XX:XX:XX:XX BlueZ 5.53 [default] XX:XX:XX:XX:XX:XX にはコントローラの BD アドレスを指定する。コントローラの BD アドレスは、先ほど list コマンドで表示されたものだ。 先の list の例では、XX:XX:XX:XX:XX:XA がデフォルトになっていた。XX:XX:XX:XX:XX:XB を選択して再度 list を実行すれば [default] が変更されていることがわかる。 bluetoothctl select XX:XX:XX:XX:XX:XB list Controller XX:XX:XX:XX:XX:XA BlueZ 5.53 Controller XX:XX:XX:XX:XX:XB BlueZ 5.53 [default] Controller XX:XX:XX:XX:XX:XC BlueZ 5.53 Controller XX:XX:XX:XX:XX:XD BlueZ 5.53 Controller XX:XX:XX:XX:XX:XE BlueZ 5.53 Controller XX:XX:XX:XX:XX:XF BlueZ 5.53 先ほども説明したが、ここで [default] がついている Bluetooth 送受信装置 (Bluetooth レシーバーなど) に対して各種 Bluetooth の設定を行うことになる。 show 選択されているコントローラの情報を表示する。 bluetoothctl show Controller XX:XX:XX:XX:XX:XX (public) Name: BlueZ 5.53 Alias: BlueZ 5.53 Class: 0x00000000 Powered: yes Discoverable: no DiscoverableTimeout: 0x00000000 Pairable: yes UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Attribute Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Access Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Sink (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: usb:xxxxxxxxxxxxxxx Discovering: no Advertising Features: ActiveInstances: 0x00 SupportedInstances: 0x00 SupportedIncludes: tx-power SupportedIncludes: appearance SupportedIncludes: local-name その Bluetooth 送受信装置が起動しているかどうか、別のデバイスから検索可能かどうかなどの情報が表示される。 ここで表示されるのは選択されている (デフォルトの) コントローラの情報なので、別のコントローラの情報を見たかったら select でコントローラを変更する必要がある。 power Bluetooth レシーバーの電源のオン・オフを切り替える。 bluetoothctl power on|off 引数には on または off を指定する。 Changing power on/off succeeded show を実行すると電源のオン・オフが変更されたことがわかる。 bluetoothctl show Controller XX:XX:XX:XX:XX:XX (public) Name: BlueZ 5.53 Alias: BlueZ 5.53 Class: 0x00000000 - Powered: yes + Powered: no Discoverable: no DiscoverableTimeout: 0x00000000 Pairable: yes UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Attribute Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Access Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Sink (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: usb:xxxxxxxxxxxxxxx Discovering: no Advertising Features: ActiveInstances: 0x00 SupportedInstances: 0x00 SupportedIncludes: tx-power SupportedIncludes: appearance SupportedIncludes: local-name 電源がオン (Powered が yes) になっていないと、近くにある Bluetooth デバイスを検索したりペアリングしたり接続したりすることができない。 これ以降のコマンドの説明では、電源がオンになっていることを前提とする。 pairable Bluetooth レシーバーのペアリング可否の状態を変更する。 bluetoothctl pairable on|off Changing pairable on/off succeeded show を実行するとペアリング可能かどうかが変更されたことがわかる。 bluetoothctl show Controller XX:XX:XX:XX:XX:XX (public) Name: BlueZ 5.53 Alias: BlueZ 5.53 Class: 0x00000000 Powered: yes Discoverable: no DiscoverableTimeout: 0x00000000 - Pairable: yes + Pairable: no UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Attribute Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Access Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Sink (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: usb:xxxxxxxxxxxxxxx Discovering: no Advertising Features: ActiveInstances: 0x00 SupportedInstances: 0x00 SupportedIncludes: tx-power SupportedIncludes: appearance SupportedIncludes: local-name discoverable Bluetooth レシーバーを、他のデバイスから検索可能な状態にするかどうかを変更する。 bluetoothctl discoverable on|off Changing discoverable on/off succeeded オンにすると、他のデバイスの Bluetooth 設定画面で表示されるようになる。 discoverable off discoverable on また、show を実行すると他のデバイスから検索可能な状態かどうかが変更されたことがわかる。 bluetoothctl show Controller XX:XX:XX:XX:XX:XX (public) Name: BlueZ 5.53 Alias: BlueZ 5.53 Class: 0x00000000 Powered: yes - Discoverable: no + Discoverable: yes DiscoverableTimeout: 0x00000000 Pairable: yes UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Attribute Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Access Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Sink (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: usb:xxxxxxxxxxxxxxx Discovering: no Advertising Features: ActiveInstances: 0x00 SupportedInstances: 0x00 SupportedIncludes: tx-power SupportedIncludes: appearance SupportedIncludes: local-name discoverable-timeout discoverable on を実行したあとに、自動的に discoverable off にするまでの時間を設定する。 無引数で実行すると、現在のタイムアウトが何秒なのかを見ることができる。 bluetoothctl discoverable-timeout DiscoverableTimeout: 180 seconds デフォルトは 180 秒 (3 分) になっている。この場合、discoverable on を実行してから 3 分間は他のデバイスから検索可能な状態となる、その後、自動的に discoverable off となり、他のデバイスから検索不可能な状態に戻る。 引数に時間 (単位: 秒) を指定するとタイムアウトの秒数を変更することができる。 bluetoothctl discoverable-timeout 240 Changing discoverable-timeout 240 succeeded [CHG] Controller XX:XX:XX:XX:XX:XX DiscoverableTimeout: 0x000000f0 なお、現在のタイムアウト時間は show でも確認できるが、16 進数表記になっていることに注意。 DiscoverableTimeout: 0x000000f0 0x000000f0 は 10 進数では 240 なので 240 秒 (4 分) になっていることがわかる。 ちなみに、他のデバイスからずっと検索可能な状態になっているのは好ましくないので、不便にならない範囲で可能な限りタイムアウトの時間は短くしたほうが良い。筆者はデフォルト (3 分) なら問題ないと思っているが、これ以上に長くしたい場合は注意すること。 scan ペアリング・接続可能なデバイス一覧を検索する。 bluetoothctl scan on|off [NEW] Device XX:XX:XX:XX:XX:XX MacBook Pro 15 [NEW] Device XX:XX:XX:XX:XX:XX iPhone 7 ... ... ... いわゆる PC やスマートフォンの Bluetooth 設定画面の、ペアリング・接続可能なデバイス一覧を表示するのと同じ機能だが、余計なものも大量に表示されるので、接続したいデバイスをここで見つけるのは大変だ。 その場合は、いったん scan off して検索を終了したあと、後述する devices を実行すると、ペアリング・接続が可能なデバイス一覧がノイズなしで表示される。 逆に言うと、まず最初に scan on をしてデバイスを検索しないと devives には何も表示されないので、scan on → scan off → devices とするのが良いだろう。 devices ペアリング・接続可能なデバイス一覧を表示する。 ただし事前に scan on で検索しておく必要がある。 bluetoothctl devices Device XX:XX:XX:XX:XX:XX iPhone 7 Device XX:XX:XX:XX:XX:XX MacBook Pro 15 利用可能な状態、つまり電源がオンになっていて、Bluetooth 機能もオンになっていて、かつ Bluetooth の電波の圏内にあるデバイス一覧が表示される。 pair デバイスとペアリングする。 ただし事前に scan on して検索し、devices に表示されるようになったデバイス (利用可能な状態であるデバイス) しかペアリングできない。 bluetoothctl pair <DEVICE_BD_ADDRESS> Attempting to pair with XX:XX:XX:XX:XX:XX [CHG] Device XX:XX:XX:XX:XX:XX Connected: yes [CHG] Device XX:XX:XX:XX:XX:XX Modalias: bluetooth:xxxxxxxxxxxxxxx [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX UUIDs: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: yes [CHG] Device XX:XX:XX:XX:XX:XX Paired: yes Pairing successful <DEVICE_BD_ADDRESS> はペアリングしたいデバイスの Bluetooth アドレスを指定する。これはデバイス側の Bluetooth 設定画面に記載されていることもあるが、調べ方がわからない場合は scan on で検索したときや devices で確認することができる。 その後、ペアリング可能な場合は、ペアリングしようとしているデバイス側で接続するかどうかのダイアログが表示されるはずなので、「接続」を選択する。 Numeric output No output 一方、bluetoothctl 側では yes とタイプするか、ペアリングしようとしているデバイス側で表示されている 6 桁の認証コードをタイプすることでペアリングを行う。後述する agent の設定を変更している場合は何も入力しなくても良いようにすることもできる。 agent ペアリングする際にどのように認証するかを指定する。 bluetoothctl agent on|off|DisplayOnly|DisplayYesNo|KeyboardDisplay|KeyboardOnly|NoInputNoOutput Agent registered/unregistered ペアリングする際に、このデバイスと接続するかどうかを、デバイス同士でそれぞれ確認 (認証) するのだが、その際にどのように認証を行うのかを指定することができる。 まず、bluetoothctl 側でどのように確認を行うかは、以下の 3 種類ある。 種類 説明 デフォルト No input ペアリング時に yes または no を要求しない Yes / No ペアリング時に yes または no を要求する ✔ Keyboard ペアリング時に、相手側のデバイスで表示された 6 桁の認証コードの入力を要求する そして、ペアリングしたいデバイス側 (相手側) でどのように確認を行うかは、以下の 2 種類ある。 種類 説明 デフォルト No output 6 桁の認証コードを表示しない Numeric output 6 桁の認証コードを表示する ✔ そして、上記の 3 + 2 種類の組み合わせによって、どれを指定するかが決定する。 相手側 相手側 No output Numeric output bluetoothctl 側 No input NoInputNoOutput DisplayOnly bluetoothctl 側 Yes / No NoInputNoOutput DisplayYesNo bluetoothctl 側 Keyboard KeyboardOnly KeyboardDisplay ちなみに初期設定 (agent を一度もいじっていない状態) だと yes が指定されているようで、yes はデフォルトの組み合わせ (bluetoothctl 側が Yes / No で、相手側が Numeric output) なので、DisplayYesNo と同じ設定になっている。 逆に no を指定すると No input と No output の組み合わせなので、NoInputNoOutput と同じ設定になる。 ...... と、ここまで説明したが、実際に試してみると挙動が異なっているものもあって、ちょっとよくわからない。まあ必要がなければいじらなくて良いと思う。確認がめんどくさい場合はとりあえず no を指定しておけば yes や no や 6 桁の認証コードを入力しなくて済む。 paired-devices ペアリングされているデバイス一覧を表示する。 bluetoothctl paired-devices Device XX:XX:XX:XX:XX:XX MacBook Pro 15 pair でペアリングして、ペアリングが成功したものをここで確認することができる。 ここで表示されるのは選択されている (デフォルトの) コントローラにペアリングされているデバイス一覧なので、別のコントローラにペアリングされているデバイス一覧を見たかったら select でコントローラを変更する必要がある。 info ペアリング・接続したデバイスの情報を表示する。 bluetoothctl info <DEVICE_BD_ADDRESS> Device XX:XX:XX:XX:XX:XX (public) Name: MacBook Pro 15 Alias: MacBook Pro 15 Class: 0x00000000 Icon: computer Paired: yes Trusted: no Blocked: no Connected: no LegacyPairing: no UUID: Serial Port (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control Target (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Headset AG (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: GN (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree Audio Gateway (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Vendor specific (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: bluetooth:xxxxxxxxxxxxxxx ManufacturerData Key: 0x0000 ManufacturerData Value: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX .MacBookPro15,1 現在選択されている (デフォルトの) コントローラにペアリング・接続されているデバイスの情報しか表示されないので、別のコントローラでデバイスをペアリング・接続させている場合は select で切り替える必要がある。 connect デバイスと接続する。 bluetoothctl connect <DEVICE_BD_ADDRESS> Attempting to connect to XX:XX:XX:XX:XX:XX [CHG] Device XX:XX:XX:XX:XX:XX Connected: yes Connection successful [CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: yes 事前に pair でペアリングを行っておかないと接続できないのだが、もしペアリングをしていなかった場合は自動的にペアリングも行ってくれる。 なお、ペアリングが完了しているなら、ペアリングしているデバイス側で接続しようとすれば接続することができる。connect は bluetoothctl 側から接続を行いたいときに使う。 info を実行すると接続状況が変更されたことがわかる。 bluetoothctl info <DEVICE_BD_ADDRESS> Device XX:XX:XX:XX:XX:XX (public) Name: MacBook Pro 15 Alias: MacBook Pro 15 Class: 0x00000000 Icon: computer Paired: yes Trusted: no Blocked: no - Connected: no + Connected: yes LegacyPairing: no UUID: Serial Port (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control Target (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Headset AG (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: GN (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree Audio Gateway (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Vendor specific (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: bluetooth:xxxxxxxxxxxxxxx ManufacturerData Key: 0x0000 ManufacturerData Value: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX .MacBookPro15,1 disconnect デバイスを切断する。 bluetoothctl disconnect <DEVICE_BD_ADDRESS> Attempting to disconnect from XX:XX:XX:XX:XX:XX [CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: no Successful disconnected [CHG] Device XX:XX:XX:XX:XX:XX Connected: no ペアリング情報が削除されるわけではないので、ペアリングしているデバイス側から接続することもできる。bluetoothctl 側から接続したい場合は connect を実行すれば良い。 info を実行すると接続状況が変更されたことがわかる。 bluetoothctl info <DEVICE_BD_ADDRESS> Device XX:XX:XX:XX:XX:XX (public) Name: MacBook Pro 15 Alias: MacBook Pro 15 Class: 0x00000000 Icon: computer Paired: yes Trusted: no Blocked: no - Connected: yes + Connected: no LegacyPairing: no UUID: Serial Port (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control Target (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Headset AG (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: GN (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree Audio Gateway (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Vendor specific (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: bluetooth:xxxxxxxxxxxxxxx ManufacturerData Key: 0x0000 ManufacturerData Value: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX .MacBookPro15,1 trust デバイスを信頼する。 bluetoothctl trust <DEVICE_BD_ADDRESS> [CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes Changing XX:XX:XX:XX:XX:XX trust succeeded 信頼することによって、再起動した場合でもペアリング情報を保持することができる。 info を実行すると信頼状況が変更されたことがわかる。 bluetoothctl info <DEVICE_BD_ADDRESS> Device XX:XX:XX:XX:XX:XX (public) Name: MacBook Pro 15 Alias: MacBook Pro 15 Class: 0x00000000 Icon: computer Paired: yes - Trusted: no + Trusted: yes Blocked: no Connected: yes LegacyPairing: no UUID: Serial Port (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control Target (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Headset AG (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: GN (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree Audio Gateway (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Vendor specific (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: bluetooth:xxxxxxxxxxxxxxx ManufacturerData Key: 0x0000 ManufacturerData Value: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX .MacBookPro15,1 untrust 信頼したデバイスを信頼しない状態に戻す。 bluetoothctl untrust <DEVICE_BD_ADDRESS> [CHG] Device XX:XX:XX:XX:XX:XX Trusted: no Changing XX:XX:XX:XX:XX:XX untrust succeeded info を実行すると信頼状況が変更されたことがわかる。 bluetoothctl info <DEVICE_BD_ADDRESS> Device XX:XX:XX:XX:XX:XX (public) Name: MacBook Pro 15 Alias: MacBook Pro 15 Class: 0x00000000 Icon: computer Paired: yes - Trusted: yes + Trusted: no Blocked: no Connected: yes LegacyPairing: no UUID: Serial Port (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control Target (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Headset AG (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: GN (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree Audio Gateway (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Vendor specific (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: bluetooth:xxxxxxxxxxxxxxx ManufacturerData Key: 0x0000 ManufacturerData Value: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX .MacBookPro15,1 block デバイスをブロックする。 bluetoothctl block <DEVICE_BD_ADDRESS> [CHG] Device XX:XX:XX:XX:XX:XX Blocked: yes Changing XX:XX:XX:XX:XX:XX block succeeded [CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: no [CHG] Device XX:XX:XX:XX:XX:XX Connected: no info を実行するとブロック状況が変更されたことがわかる。 bluetoothctl info <DEVICE_BD_ADDRESS> Device XX:XX:XX:XX:XX:XX (public) Name: MacBook Pro 15 Alias: MacBook Pro 15 Class: 0x00000000 Icon: computer Paired: yes Trusted: yes - Blocked: no + Blocked: yes Connected: yes LegacyPairing: no UUID: Serial Port (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control Target (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Headset AG (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: GN (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree Audio Gateway (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Vendor specific (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: bluetooth:xxxxxxxxxxxxxxx ManufacturerData Key: 0x0000 ManufacturerData Value: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX .MacBookPro15,1 unblock ブロックされているデバイスのブロックを解除する。 bluetoothctl unblock <DEVICE_BD_ADDRESS> [CHG] Device XX:XX:XX:XX:XX:XX Blocked: no Changing XX:XX:XX:XX:XX:XX unblock succeeded info を実行するとブロック状況が変更されたことがわかる。 bluetoothctl info <DEVICE_BD_ADDRESS> Device XX:XX:XX:XX:XX:XX (public) Name: MacBook Pro 15 Alias: MacBook Pro 15 Class: 0x00000000 Icon: computer Paired: yes Trusted: yes - Blocked: yes + Blocked: no Connected: yes LegacyPairing: no UUID: Serial Port (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control Target (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: A/V Remote Control (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Headset AG (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: GN (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree Audio Gateway (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Vendor specific (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: bluetooth:xxxxxxxxxxxxxxx ManufacturerData Key: 0x0000 ManufacturerData Value: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX .MacBookPro15,1 remove デバイスと切断し、ペアリング情報を削除する。 bluetoothctl remove <DEVICE_BD_ADDRESS> [CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: no Device has been removed [CHG] Device XX:XX:XX:XX:XX:XX Connected: no [DEL] Device XX:XX:XX:XX:XX:XX MacBook Pro 15 info を実行するとデバイス情報が削除されたことがわかる。 bluetoothctl info <DEVICE_BD_ADDRESS> Device XX:XX:XX:XX:XX:XX not available 再度、ペアリング・接続を行いたい場合は pair をし直す必要がある。 set-alias デバイスにエイリアスを設定する。 bluetoothctl set-alias Mac [CHG] Device XX:XX:XX:XX:XX:XX Alias: Mac Changing Mac succeeded paired-devices を実行するとエイリアスが変更されたことがわかる。 bluetoothctl paired-devices - Device XX:XX:XX:XX:XX:XX MacBook Pro 15 + Device XX:XX:XX:XX:XX:XX Mac もともとデバイスにはわかりやすい識別名が最初からついている (MacBook Pro 15 や iPhone 7 など) ことが多いので、あまり使う機会がなさそう。 それと、これはバグなのかわからないが、select でコントローラを変更しても、このエイリアスが適用されるのは、bluetoothctl コマンドを起動したときに指定されているデフォルトのコントローラに対してのみだ。なのであまり役には立たなさそうだ。 system-alias コントローラにエイリアスを設定する。 bluetoothctl system-alias Ubuntu Changing Ubuntu succeeded [CHG] Controller XX:XX:XX:XX:XX:XX Alias: Ubuntu show を実行するとエイリアスが変更されたことがわかる。 bluetoothctl show Controller XX:XX:XX:XX:XX:XX (public) Name: BlueZ 5.53 - Alias: BlueZ 5.53 + Alias: Ubuntu Class: 0x00000000 Powered: yes Discoverable: no DiscoverableTimeout: 0x00000000 Pairable: yes UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Attribute Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Access Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Sink (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: usb:xxxxxxxxxxxxxxx Discovering: no Advertising Features: ActiveInstances: 0x00 SupportedInstances: 0x00 SupportedIncludes: tx-power SupportedIncludes: appearance SupportedIncludes: local-name エイリアスが変更されたことで、list を実行したときにコントローラが識別しやすくなる。 bluetoothctl list Controller XX:XX:XX:XX:XX:XA Ubuntu [default] Controller XX:XX:XX:XX:XX:XB BlueZ 5.53 Controller XX:XX:XX:XX:XX:XC BlueZ 5.53 Controller XX:XX:XX:XX:XX:XD BlueZ 5.53 Controller XX:XX:XX:XX:XX:XE BlueZ 5.53 Controller XX:XX:XX:XX:XX:XF BlueZ 5.53 reset-alias system-alias で設定したエイリアスを削除する。 bluetoothctl reset-alias Changing succeeded [CHG] Controller XX:XX:XX:XX:XX:XX Alias: BlueZ 5.53 show を実行するとエイリアスがもとに戻ったことがわかる。 Controller XX:XX:XX:XX:XX:XX (public) Name: BlueZ 5.53 - Alias: Ubuntu + Alias: BlueZ 5.53 Class: 0x00000000 Powered: yes Discoverable: no DiscoverableTimeout: 0x00000000 Pairable: yes UUID: Audio Source (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Attribute Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Generic Access Profile (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: PnP Information (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Handsfree (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) UUID: Audio Sink (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) Modalias: usb:xxxxxxxxxxxxxxx Discovering: no Advertising Features: ActiveInstances: 0x00 SupportedInstances: 0x00 SupportedIncludes: tx-power SupportedIncludes: appearance SupportedIncludes: local-name エイリアスが 2 つあってややこしい (set-alias と system-alias) が、reset-alias は system-alias で設定したコントローラのエイリアスを削除するものであり、set-alias で設定したデバイスのエイリアスは削除しない。 デバイスのエイリアス (set-alias) はコマンドで削除することができないようなので、いったん remove でペアリング情報を削除してから、pair で再ペアリングしないともとに戻らない。 default-agent ペアリングなどをしたいデバイス側からリクエストがあったときに、どのコントローラでそのリクエストを受けるのかを指定する。 bluetoothctl default-agent Default agent request successful このコマンドは、デバイスとのペアリングなどをすべて bluetoothctl 側で操作する際には不要だ。 しかし、逆にペアリングなどをしたいデバイス側から bluetoothctl に対してペアリング等の操作を行う場合には、select などは使えない (bluetoothctl を操作するわけではないため) ので、その場合にどのコントローラでそのリクエスト (ペアリング等) を受けるのかを予め指定しておくことができる、というものらしい。 advertise *2 これに関しては調べてもよくわからなかった。 その他、便利な使い方 bluetoothctl コマンドでいったん bluetoothctl のインタラクティブインターフェースに入ってから操作を行うのが基本だが、以下のようにするとシェルから直接 bluetoothctl のコマンドを実行することもできる。 Shell bluetoothctl -- list 上記は、シェルで bluetoothctl を実行したあとに、bluetoothctl のインターフェースで list を実行して exit したのと同じである。 上記の記法だと 1 つのコマンドしか実行できないが、以下のようにすると複数の bluetoothctl のコマンドを実行することもできる。 Shell { printf "show\n\n" printf "paired-devices\n\n" } | bluetoothctl シェルスクリプト内で bluetoothctl のコマンドを実行したいときなどに便利だろう。 そのデバイスで利用可能な、Bluetooth の電波を送受信する装置のこと。通常はそのデバイスに標準で搭載されている送受信装置が表示されるが、Bluetooth レシーバー (USB) などを複数接続していれば複数表示されるだろう。 ↩ 見出しの名前を advertise にすると消える現象が発生したので、適当に * をつけた。マークダウンパーサのバグ? ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

システムコールでラズパイを操作してみよう!

システムコールとかいうロマン溢れる響き アプリケーション側からカーネルの機能を呼び出す為のインターフェースをシステムコールと言います。 「OSの中核を担うプログラムを呼び出す」・・・くぅ!!カッコいい!!! ・・・これぞプログラミングのロマンと思い、チャレンジしてみました。 で、なにするの? 今回はシステムコール!って叫びたいので、ラズパイのGPIOをカーネルの機能のみで制御してみようと思います。 ラズパイのOSはDebianベースのLinuxなのでシステムコールのお勉強には最適です。 ボタンとLEDを組み合わせた回路を組んで、ボタンを押したらLEDが光る奴を作ります。 実験材料 RaspberryPi 4B LED(汎用品適当に) タクトスイッチ(ポチポチ押すスイッチ) 抵抗 1kΩ 使用言語はC言語です。システムコールの為のライブラリがいろいろ準備されています。 システムコールでラズパイのGPIOを操作する 概念的な部分を簡単に説明すると、Linuxでは様々なデータをファイルという単位で管理しています。 GPIOのオン、オフなんかも、ピンごとに制御する為のファイルが存在し、そこに情報を書き込んでやれば制御できる、というわけです。 例えば、LEDを点灯させたければ、GPIO18にLEDを繋いでいた場合、対応するファイルをプログラム上で開き、出力状態を記述し、ファイルを閉じるとLEDが光ります。 カーネルの機能としては、プロセス管理や排他制御、同期、プロセス間通信など、重要な機能が沢山ありますが、マルチタスクを実装するわけでは無いので、今回は扱いません。 今回使うカーネル機能は、ファイル操作+αとなります。システムコール入門編といったところですね! では行こう。 先ずはヘッダファイルをinclude! #include<fcntl.h> #include<poll.h> #include<unistd.h> #include<stdlib.h> #include<stdio.h> void led_on(void); void led_off(void); まずは必要なヘッダファイルをincludeします。 標準ライブラリ系の奴らと、ファイル操作系、ポーリング処理系のヘッダファイルです。 LEDのオンオフに関する処理は関数としてプロトタイプ宣言しておきます。 では、準備が出来たところでmain関数を見て行きましょう! とりあえず変数宣言! int main(void){ int i; int fd; //ファイルディスクリプタ int fd2; int ret; //戻り値格納用 struct pollfd pfd; //ポーリング処理構造体 char c; //スイッチ状態格納用 main関数に入ったところで、変数を宣言しておきます。 ここでいきなり馴染みのない言葉「ファイルディスクリプタ」が登場します。 これが分かれば本記事のネタは7割クリアも同然です! ファイルディスクリプタ! システムコールに続き、カッコいい用語続出ですね・・・ 一言で言えば、ファイル識別用の番号です。ファイル記述子とも呼びます。 Linuxでは例えば標準入力(キーボードからの入力)なんかもファイルとして扱われます。今回はGPIOの制御をしたいので、該当ファイルを 開く→ステータスを書き込む→制御成功! とプログラム上で操作する事が基本的な考え方となります。このファイル識別番号を目印に、ファイルを読み書きする必要があります。 では、実際にコードを書いてみます。 // ファイルを開く fd = open("/sys/class/gpio/export", O_WRONLY); // エラーが起きた場合は終了する if(fd < 0){ printf("export error"); exit(1); } // ファイルに情報を書き込む write(fd, "12", 2); // ファイルを閉じる close(fd); 先ずは/sys/class/gpio/exportというファイルに使用するGPIO番号を書き込みます。 流れとしては、ここに書き込んだGPIO番号に該当するファイルが作成され、そのファイルに「入力か出力か」「何かオプションはあるか」を書き込み、最後に「オンかオフか」を書き込めばOK、という感じです。 ラズパイおなじみのライブラリwiringPiでいうと wiringPiSetupGpio(); pinMode(12, OUTPUT); digitalWrite(12, HIGH); このへんの処理に該当します。 もう少し掘り下げて、関数について説明します。 open("ファイルのパス", 動作モード); 戻り値 = 非負の整数(エラー時-1) ファイルのパスを指定して、動作モード(読み込み専用、書き込み専用など)を指定すれば、0以上の値が帰ってきます。 この関数が走った時点で他にファイルディスクリプタが使用されていなければ、 3が帰ってきます。いきなり3!? 理由は、0~2は標準入力、標準出力、標準エラー出力に割り当てられている為です。そういうもんなんです。 あとはこの帰り値を目印として、書き込み用関数を使用します。 write(ファイルディスクリプタ番号, "書き込む値(今回はGPIO番号)", 書き込むバイト数); 戻り値 = 書き込んだバイト数(エラー時 -1) 主な関数はこんな感じで使用します。 エラー時は-1が帰ってくるので、ファイルオープンの段階で-1を受け取ったらエラー処理をするように記述しておきます。(勝手にエラー吐いてくれません) 一連の処理が終わったら、下記の関数にファイルディスクリプタを渡してファイルを閉じます。放置するといろいろややこしいです。(詳細は割愛) close(fd) ここまで分かれば今回のコードは楽勝です! 一気に進めましょう。 // スイッチのGPIO番号指定 fd = open("/sys/class/gpio/export", O_WRONLY); if(fd < 0){ printf("export error"); exit(1); } write(fd, "12", 2); close(fd); // LEDのGPIO番号指定 fd2 = open("/sys/class/gpio/export", O_WRONLY); if(fd2 < 0){ printf("export error\n"); exit(1); } write(fd2, "23", 2); close(fd2); // スイッチに割り当てたGPIOのモードを入力に設定 fd = open("/sys/class/gpio/gpio12/direction",O_WRONLY); if(fd < 0){ printf("direction error"); exit(1); } write(fd, "in", 2); close(fd); // LEDに割り当てたGPIOのモードを出力に設定 fd2 = open("/sys/class/gpio/gpio23/direction", O_WRONLY); if(fd < 0){ printf("direction error"); exit(1); } write(fd2, "out", 3); close(fd2); // スイッチに割り当てたGPIOのエッジ検出機能を使う fd = open("/sys/class/gpio/gpio12/edge", O_WRONLY); if(fd < 0){ printf("edge error"); exit(1); } write(fd, "both", 4); close(fd); これでGPIOの設定が完了しました! LEDチカを実装! ファイルシステムの概要が掴めていれば、楽勝です。以下のように記述します。GPIOの番号は適宜変更を。 void led_on(void){ fd2 = open("/sys/class/gpio/gpio23/value",O_WRONLY); if(fd2 < 0){ printf("gpio23 error\n"); exit(1); } // 1を書き込むと出力オン! write(fd2,"1",1); close(fd2); } void led_off(void){ fd2 = open("/sys/class/gpio/gpio23/value", O_WRONLY); if(fd2 < 0){ printf("gpio23 error\n"); exit(1); } // 0を書き込むと出力オフ! write(fd2, "0", 1); close(fd2); } スイッチの状態を読む! まずはコードをざっと見てみましょう! fd = open("/sys/class/gpio/gpio12/value", O_RDONLY); if(fd < 0){ printf("value error"); exit(1); } // 構造体のメンバfdにファイルディスクリプタ番号を指定 pfd.fd = fd; // 構造体のメンバeventsにデータ読み出しモードを設定 pfd.events = POLLPRI; for(i = 0; i < 20; i++){ // 読み出し位置(オフセット)をファイル先頭に指定 lseek(fd, 0, SEEK_SET); // イベントを待つ。イベントがあれば以下の処理を実行 ret = poll(&pfd, 1, 3000); read(fd, &c, 1); if(ret == 0){ printf("Timeout\n"); } else{ if(c==49){ printf("LED ON"); led_on(fd2); } else{ printf("LED OFF"); led_off(fd2); } } } close(fd); まずはスイッチのファイルをopen()して読み書き出来るようにします。 今回はもう一つ、pollシステムコールを使うので、少しだけ説明します。 pfd.fd = fd; pfd.events = POLLPRI; ここで使われている構造体の中身は・・・ struct pollfd { int fd; short events; short revents; }; こんな感じです。 あとはpoll()を使って、ボタン入力を待つ、という仕掛けです。 pollはその名の通りポーリングと言って、状態を常に監視して(今回はスイッチの状態)指定したイベントが発生した場合に次の処理に移行します。 ret = poll(&pfd, 1, 3000); read(fd, &c, 1); if(ret == 0){ printf("Timeout\n"); } else{ if(c=='1'){ printf("LED ON"); led_on(fd2); } else{ printf("LED OFF"); led_off(fd2); } } poll()にpollfd構造体を渡し、タイムアウトする時間を設定します。 今回の場合はボタンを押せばイベントを検知するので、その先の処理が実行されます。 read()では0か1が帰ってくるので、その値を元に条件分岐させて、 ボタンが押された→LED点灯 ボタンが離された→LED消灯 という処理となります。 では、最後に完成したプログラムです。 ソースコード syscall.c #include<fcntl.h> #include<poll.h> #include<unistd.h> #include<stdlib.h> #include<stdio.h> void led_on(void); void led_off(void); int main(void){ int i; int fd; int fd2; int ret; struct pollfd pfd; char c; fd = open("/sys/class/gpio/export", O_WRONLY); if(fd < 0){ printf("export error"); exit(1); } write(fd, "12", 2); close(fd); fd2 = open("/sys/class/gpio/export", O_WRONLY); if(fd2 < 0){ printf("export error\n"); exit(1); } write(fd2, "23", 2); close(fd2); fd = open("/sys/class/gpio/gpio12/direction",O_WRONLY); if(fd < 0){ printf("direction error"); exit(1); } write(fd, "in", 2); close(fd); fd2 = open("/sys/class/gpio/gpio23/direction", O_WRONLY); if(fd < 0){ printf("direction error"); exit(1); } write(fd2, "out", 3); close(fd2); fd = open("/sys/class/gpio/gpio12/edge", O_WRONLY); if(fd < 0){ printf("edge error"); exit(1); } write(fd, "both", 4); close(fd); fd = open("/sys/class/gpio/gpio12/value", O_RDONLY); if(fd < 0){ printf("value error"); exit(1); } pfd.fd = fd; pfd.events = POLLPRI; for(i = 0; i < 20; i++){ lseek(fd, 0, SEEK_SET); ret = poll(&pfd, 1, 3000); read(fd, &c, 1); if(ret == 0){ printf("Timeout\n"); } else{ if(c=='1'){ printf("LED ON\n"); led_on(); } else{ printf("LED OFF\n"); led_off(); } } } close(fd); fd = open("/sys/class/gpio/unexport", O_WRONLY); write(fd, "12", 2); close(fd); fd2 = open("/sys/class/gpio/unexport", O_WRONLY); write(fd2, "23", 2); close(fd2); return(0); } void led_on(void){ int fd2 = open("/sys/class/gpio/gpio23/value",O_WRONLY); if(fd2 < 0){ printf("gpio23 error\n"); exit(1); } write(fd2,"1",1); close(fd2); } void led_off(void){ int fd2 = open("/sys/class/gpio/gpio23/value", O_WRONLY); if(fd2 < 0){ printf("gpio23 error\n"); exit(1); } write(fd2, "0", 1); close(fd2); } 紹介した全ての処理が終了した後は fd = open("/sys/class/gpio/unexport", O_WRONLY); write(fd, "12", 2); close(fd); fd2 = open("/sys/class/gpio/unexport", O_WRONLY); write(fd2, "23", 2); close(fd2); このようにファイルを操作してGPIOをお掃除して終了です。 早速コンパイルしてみましょう。 gcc -o syscall syscall.c && sudo ./syscall コンパイルして実行する際は必ず管理者権限を伴って実行します。 システムファイルを弄るので一般ユーザは書き込み権限が無い為です。 では、実行結果を見てみましょう! 実行結果 スイッチのチャタリング対策を記述していないのでちょっとノイズありますが・・・ 無事に意図した動作を実装出来ました! 遂にシステムコールによるラズパイのGPIO操作が出来るようになりました! 少しだけLinuxカーネルに近づけましたね! おわりに 「システムコール・オープン!」「システムコール・ポール!!」とか叫びながらコーデイングしていた私は多分アホですが、OSの仕組を理解する第一歩として非常に勉強になりました。 例えば、ポーリングを含むメイン処理をfor文で回数制限するのではなく、ctl + c入力でシグナルを送信してGPIOのクリーンナップを行えばもうちょいスマートなんだろうなぁとか思いつつ、記事ボリュームがもりもりになりすぎそうだったので今回は割愛しました。 プロセス操作や排他制御を理解すれば、行く行くは高度なAPIも自作出来るようになりそうです!! 今回の記事に関しましてはまだ理解の甘い所が多いと思います。 もし内容の誤り等ございましたら随時改善して参りますので、宜しければご指摘頂ければ幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

linuxで拡張子を一括変更

linuxで拡張子を一括変更する方法(例:".txt" → ".word") #!/usr/bin/bash for fname in *.txt; do mv $fname ${fname%.txt}.word; done 備忘録のため残しておきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む