SORACOM APIでSIMの状態(オンライン・オフライン)を取得する

SORACOM APIでSIMの状態(オンライン・オフライン)を取得する

SIMの状態は、SIM IDとIMSIのどちらかで取得できます。
Clock Icon2024.10.23

SORACOMのSIMの状態(オンライン・オフライン)をAPIで取得したくなりました。というわけで、試してみました。

01_soracom_sim

おすすめの方

  • SORACOM APIを利用したい方
  • SORACOM APIでSAMユーザーにロール指定したい方
  • SORACOM APIでSIMの状態(オンライン・オフライン)を取得したい方(SIM IDを利用)
  • SORACOM APIでSIMの状態(オンライン・オフライン)を取得したい方(IMSIを利用)

SORACOM APIの利用準備をする

SAMユーザー用のロールを作成する

下記を参考にして、ロールを作成します。

2つのAPIを利用するので、2つの権限を指定します。

{
  "statements": [
    {
      "api": [
        "Sim:getSim",
        "Subscriber:getSubscriber"
      ],
      "effect": "allow"
    }
  ]
}

SORACOM SAMユーザを作成する

下記を参考にして、SAMユーザを作成します。

SAMユーザにロールを付与する

作成したSAMユーザに対して、作成したロールを付与します。

11_soracom_role

SAMユーザーの認証キーを取得する

12_soracom_key

SORACOM APIでSIM情報を取得する

スクリプトを作成する

SIMを特定するための情報として、次のどちらかが必要です。

  • SIM ID
  • IMSI

今回は、それぞれを利用した取得を試してみました。

app.py
import os
import json
import requests

SORACOM_ENDPOINT = "https://api.soracom.io/v1"

IMSI = "aaa"
SIM_ID = "bbb"

SORACOM_KEY_ID = "xxx"

SORACOM_SECRET = "yyy"

def main() -> None:
    api_key, token = get_token(SORACOM_KEY_ID, SORACOM_SECRET)

    sim_info_with_sim_id = get_sim_info_with_sim_id(api_key, token, SIM_ID)

    print("### SIM Info with SIM ID")
    print(f"status: {sim_info_with_sim_id['status']}")
    print(f"online: {sim_info_with_sim_id['sessionStatus']['online']}")
    print("\n")

    sim_info_with_imsi = get_sim_info_with_imsi(api_key, token, IMSI)

    print("### SIM Info with IMSI")
    print(f"status: {sim_info_with_imsi['status']}")
    print(f"online: {sim_info_with_imsi['sessionStatus']['online']}")

def get_token(soracom_key_id: str, soracom_secret: str) -> tuple[str, str]:
    headers = {"Content-Type": "application/json"}
    data = {
        "authKeyId": soracom_key_id,
        "authKey": soracom_secret,
    }
    resp = requests.post(
        f"{SORACOM_ENDPOINT}/auth", headers=headers, data=json.dumps(data)
    )

    d = resp.json()

    return d["apiKey"], d["token"]

def get_sim_info_with_sim_id(api_key: str, token: str, sim_id: str) -> dict:
    resp = requests.get(
        f"{SORACOM_ENDPOINT}/sims/{sim_id}", headers=make_headers(api_key, token)
    )

    return resp.json()

def get_sim_info_with_imsi(api_key: str, token: str, imsi: str) -> dict:
    resp = requests.get(
        f"{SORACOM_ENDPOINT}/subscribers/{imsi}", headers=make_headers(api_key, token)
    )

    return resp.json()

def make_headers(api_key: str, token: str) -> dict:
    return {
        "Content-Type": "application/json",
        "X-Soracom-API-Key": api_key,
        "X-Soracom-Token": token,
    }

if __name__ == "__main__":
    main()

スクリプトを実行する

オンラインのとき

SIMがオンラインのとき、「online: True」になっていました。

01_soracom_sim

### SIM Info with SIM ID
status: active
online: True

### SIM Info with IMSI
status: active
online: True

オフラインのとき

デバイスの電源をOFFにすると、オフラインになりました。この状態で情報を取得してみます。

21_soracom_sim

「online: False」になっていました。

### SIM Info with SIM ID
status: active
online: False

### SIM Info with IMSI
status: active
online: False

さいごに

SORACOMのSIMの状態(オンライン・オフライン)をAPIで取得してみました。SIM IDまたはIMSIによって、利用するAPIのPathが異なります。ご注意ください。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.