SORACOM APIでSIMの状態(オンライン・オフライン)を取得する
SORACOMのSIMの状態(オンライン・オフライン)をAPIで取得したくなりました。というわけで、試してみました。
おすすめの方
- 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ユーザに対して、作成したロールを付与します。
SAMユーザーの認証キーを取得する
SORACOM APIでSIM情報を取得する
スクリプトを作成する
SIMを特定するための情報として、次のどちらかが必要です。
- SIM ID
- IMSI
今回は、それぞれを利用した取得を試してみました。
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」になっていました。
### SIM Info with SIM ID
status: active
online: True
### SIM Info with IMSI
status: active
online: True
オフラインのとき
デバイスの電源をOFFにすると、オフラインになりました。この状態で情報を取得してみます。
「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が異なります。ご注意ください。
参考
- Getting Started: SAM ユーザーを作成する | アクセス管理 (SORACOM Access Management: SAM) | ソラコムユーザーサイト - SORACOM Users
- SAM ユーザーの権限設定: SAM ユーザーの権限を設定する | アクセス管理 (SORACOM Access Management: SAM) | ソラコムユーザーサイト - SORACOM Users
- SAM ユーザーの権限設定: ロールを作成する | アクセス管理 (SORACOM Access Management: SAM) | ソラコムユーザーサイト - SORACOM Users
- リファレンス: SORACOM API リファレンス | GET /sims/{sim_id}
- リファレンス: SORACOM API リファレンス | GET /subscriber/{imsi}