LoginSignup
17
1

More than 3 years have passed since last update.

大量のラズパイにつけたsoracom simを管理するために、simの名前をmac addressにする方法

Last updated at Posted at 2020-12-12

背景

複数工場に大量においたラズパイの soracom simがそれぞれどこにあるのかを管理することが目的
前提としてラズパイはmac addressをkeyとしてどこにあるかは管理されている。
スクリーンショット 2020-12-13 14.50.04.png

環境

ak-20
raspberry pi 4
raspbian buster
python 3.7

IMG_1080.jpg

方法

mac addressでラズパイを管理しているので、simカードそれぞれにmac addressを紐づける。
simのnameがmac addressになるように起動時にsoracom apiをたたく

実装

下記を起動時に実行されるように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になる。

スクリーンショット 2020-12-12 22.53.40.png

17
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
1