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

## 背景
複数工場に大量においたラズパイの soracom simがそれぞれどこにあるのかを管理することが目的
前提としてラズパイはmac addressをkeyとしてどこにあるかは管理されている。
![スクリーンショット 2020-12-13 14.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199662/a8b53ab0-06fb-d529-f915-19b13034d41a.png)


## 環境
[ak-20](https://soracom.jp/products/module/ak-020/)
raspberry pi 4
raspbian buster
python 3.7


<img width="200" alt="IMG_1080.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199662/12dae4c7-a2ea-0e65-3995-c4b329e5074e.jpeg">
## 方法
mac addressでラズパイを管理しているので、simカードそれぞれにmac addressを紐づける。
simのnameがmac addressになるように起動時にsoracom apiをたたく

## 実装
下記を起動時に実行されるようにsystemctlに登録した。(AUTH_KEY_ID とAUTH_KEYは、[ここ](https://dev.soracom.io/jp/start/sam/)を参考に作成)

```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199662/042c7d28-f2a8-bf47-93e1-7238b5e24999.png)