Raspberry Pi で Line Notify ~ C言語を使ってIP Address通知
これまでLine Notifyを使った通知システムをM5StickCやATOM Liteで作ってきました。そして、同様にRaspberry Pi版も作ろうとは思っていましたが、Pythonを使う例がたくさんあるため作ってきませんでした。
しかしながら、Line Notifyの仕組みは本当に便利なので、Raspberry Piでも使わない手はありません。そこで、PythonではなくてC言語を使ったLine Notifyへの通知システムを作ってみます。
※Line Notifyのサービスが、2025年3月31日で終了します。残念です。
1.curlライブラリのインストール
M5StickCで使ったライブラリ「requests」はC言語にはないようなので、「curl」ライブラリを使用します。
Raspberry Piでターミナル画面を開き、
sudo apt-get install libcurl4-openssl-dev
を実行して、curlライブラリをインストールします。
2.プログラムを作成
プログラムは、以下のとおりです。
#include <stdio.h>
#include <curl/curl.h>
#define TOKEN "linenotifyのtokenを記述"
char* ipget() {
FILE *fp;
char path[1035];
static char ip[16];
fp = popen("/sbin/ifconfig wlan0 | grep 'inet ' | awk '{ print $2 }'", "r");
if (fp == NULL) {
printf("Failed to run command\n");
return NULL;
}
fgets(path, sizeof(path)-1, fp);
pclose(fp);
sscanf(path, "%s", ip);
return ip;
}
int main() {
char *ip_address = ipget();
char message[100];
sprintf(message, "IP Address: %s", ip_address);
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer " TOKEN);
char *url = "https://notify-api.line.me/api/notify";
char params[200];
snprintf(params, sizeof(params), "message=%s", message);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, params);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
3.コンパイルする
ターミナル画面で
gcc -o linenotify linenotify.c -lcurl
を実行します。
4.起動時のプログラム実行記述を追加
Line Notifyへ通知するタイミングは、Raspberry Piを起動した時です。
そこで、起動時でプログラムを起動するために「/etc/rc.local」ファイルに起動コマンドを追加する必要があります。「exit 0」の記述の前に、起動コマンドを追加しましょう。
5.Raspberry Piの「設定」の変更
Raspberry Piの「設定」画面を開き、「ネットワークを待つ」を指定します。これは、ネットワークが確立する前に、指定した起動コマンドが実行されないためです。
6.実行してみる
Raspberry Piを起動すると、スマートフォンのLineアプリにRaspberry PiのIPアドレスが通知されます。以前にRaspberry PiのIPアドレスを知る方法をご紹介していますが、モバイルネットワークが有効であれば、Line Notifyを利用する方法が一番手軽で良いでしょう。
今回のプログラムは、当初、httprequestを想定していました。しかし、webサーバーのIPアドレスがうまく取得できなくて、頓挫していました。そこで調べてcurlライブラリの存在を知り、Python並みの手軽なプログラムで動作させることができました。
Pythonの方が手軽にプログラムできますが、C言語には長い歴史があります。自由度の高いC言語は、まだまだ現役で使われていくでしょう。