背景
複数工場に大量においたラズパイの soracom simがそれぞれどこにあるのかを管理することが目的
前提としてラズパイはmac addressをkeyとしてどこにあるかは管理されている。
環境
ak-20
raspberry pi 4
raspbian buster
python 3.7
実装
下記を起動時に実行されるようにsystemctlに登録した。(AUTH_KEY_ID とAUTH_KEYは、ここを参考に作成)
register_mac_add_for_soracom.py
import json
import logging
import logging.handlers
import sys
import os
from os.path import abspath, dirname, join
import requests
AUTH_KEY_ID = "$auth-key-id"
AUTH_KEY = "$auth-key"
def get_mac():
"""
pcのmacアドレスを取得
"""
GET_RASPI_WLAN0_MAC_ADDRESS_COMMAND = "cat `find /sys/devices/ -name wlan0`/address"
if platform.system() == "Darwin":
# 下記記事を参考に実装
# https://qiita.com/FmtWeisszwerg/items/c7aa26859c463dda5ebc
addr = ":".join(
[
hex(fragment)[2:].zfill(2)
for fragment in struct.unpack("BBBBBB",
struct.pack("!Q", uuid.getnode())[2:])
])
else:
r = os.popen(GET_RASPI_WLAN0_MAC_ADDRESS_COMMAND).read()
addr = r.replace("\n", "")
return addr
def main():
# ここでネットワーク接続とデバイス接続確認の関数があったほうがよい
get_imsi_response = requests.get('http://metadata.soracom.io/v1/subscriber.imsi')
logging.debug("get_imsi_response:{}".format(get_imsi_response.text))
if len(get_imsi_response.text) == 0:
logging.warning("imsiが取得できません")
return
imsi = get_imsi_response.text[-15:]
logger.info("imsi:{}".format(imsi))
if not imsi.isdigit():
logging.warning("imsiの値が数値ではないので不正です")
return
get_api_token_response = requests.post(
'https://api.soracom.io/v1/auth',
headers={'Content-Type': 'application/json'},
data=json.dumps({
"authKeyId": AUTH_KEY_ID,
"authKey": AUTH_KEY
}))
logging.info("get_api_token_response:{}".format(get_api_token_response.text))
if get_api_token_response.json().get("token") is None or get_api_token_response.json().get(
"apiKey") is None:
logging.warning("tokenの取得に失敗しました")
return
token = get_api_token_response.json()["token"]
api_key = get_api_token_response.json()["apiKey"]
register_tag_response = requests.put(
'https://api.soracom.io/v1/subscribers/' + imsi + '/tags',
headers={
'Content-Type': 'application/json',
'X-Soracom-API-Key': str(api_key),
'X-Soracom-Token': str(token),
},
data=json.dumps([{
"tagName": "name",
"tagValue": get_mac()
}]))
logging.debug("tag_register_process out:{}".format(register_tag_response.text))
register_tag_dic = register_tag_response.json()
if register_tag_dic.get("tags") is not None and register_tag_dic["tags"].get("name") is not None:
if register_tag_dic["tags"]["name"] == get_mac():
logging.info("success regist")
return
logging.warning("failed regist")
if __name__ == '__main__':
main()
soracom ダッシュボード
ラズパイが起動すると下記のように、ダッシュボード上のsimの名前がmac addressになる。