Raspberry Pi で Line Notify ~ C言語を使ってIP Address通知

2023年4月29日

これまでLine Notifyを使った通知システムをM5StickCATOM Liteで作ってきました。そして、同様にRaspberry Pi版も作ろうとは思っていましたが、Pythonを使う例がたくさんあるため作ってきませんでした。

しかしながら、Line Notifyの仕組みは本当に便利なので、Raspberry Piでも使わない手はありません。そこで、PythonではなくてC言語を使ったLine Notifyへの通知システムを作ってみます。

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 PiIPアドレスが通知されます。以前にRaspberry PiIPアドレスを知る方法をご紹介していますが、モバイルネットワークが有効であれば、Line Notifyを利用する方法が一番手軽で良いでしょう。

今回のプログラムは、当初、httprequestを想定していました。しかし、webサーバーIPアドレスがうまく取得できなくて、頓挫していました。そこで調べてcurlライブラリの存在を知り、Python並みの手軽なプログラムで動作させることができました。

Pythonの方が手軽にプログラムできますが、C言語には長い歴史があります。自由度の高いC言語は、まだまだ現役で使われていくでしょう。