ラベル Soracom の投稿を表示しています。 すべての投稿を表示
ラベル Soracom の投稿を表示しています。 すべての投稿を表示

2019/08/19

SORACOM LTE-M Button for Enterpriseで位置情報を取得してみた

SORACOM LTE-M Button for Enterpriseで位置情報が取得してみた

ボタンを押すとFunk経由でAWS Lambdaを呼び出してみる

以下、Lambdaのコード
From __future__ import print_function 
import boto3
import os
import json
import logging
import dateutil.parser
from datetime import datetime, timedelta
import xml.etree.ElementTree as ET
import urllib.request

logger = logging.getLogger()
logger.setLevel(logging.INFO)
ses = boto3.client('ses')
from_address = "送信元のメールアドレス"
to_address = []
to_address.append("送信先メールアドレス")

def lambda_handler(event, context):
    clickType = event["clickTypeName"]
    batteryLevel = event["batteryLevel"]
    lat = context.client_context.custom["location"]["lat"]
    lon = context.client_context.custom["location"]["lon"]
    imsi = context.client_context.custom['imsi']

    apiUrl = 'https://map.yahooapis.jp/geoapi/V1/reverseGeoCoder?lat=' + str(lat) + '&lon=' + str(lon) + '&appid=' + os.environ['yahooMapApi']
    response = urllib.request.Request(apiUrl)
    with urllib.request.urlopen(response) as res:
        data = res.read()
    root = ET.fromstring(data)
    titl = root[1][0][1].text
    
    mapUrl = 'http://maps.google.co.jp/maps?q=' + str(lat) + ',' + str(lon)
    body = "\n" + titl + " にいます\n" + mapUrl

    ts = datetime.now() + timedelta(hours=9)
    ts = ts.strftime('%Y/%m/%d %H:%M:%S')

    if (clickType == 'SINGLE'):
        subject = 'SINGLE'
        body = str(ts) + body
    elif (clickType == 'DOUBLE'):
        subject = 'DOUBLE'
        body = str(ts) + body
    elif (clickType == 'LONG'):
        subject = 'LONG'
        body = str(ts) + body
    else:
        subject = 'failed'
        body = 'failed'

    ses.send_email(Source=from_address,
                   Destination={'ToAddresses': to_address},
                   Message={'Subject': {'Data': subject}, 'Body': {'Text': {'Data': body}}})

2019/05/12

iPadでSIMの携帯基地局情報を使った位置取得

iPadだとiPhoneと違って設定画面に直接APN情報を入力できるからキャリア以外のSIMを使うときはプロファイル入れるのが面倒なのでAPN情報を設定画面に直接入力しちゃうんだよね

SORACOM AirはAPIやメタデータで接続している携帯基地局の情報を取得できるので試してみたんだけど...
iPadにSORACOMのSIM入れても何故かradioTypeがGSMってなってしまうのです...
国内用SORACOM AirだとradioTypeはLTEとなってないと携帯基地局の情報を取得できないのです

MR04LNにSORACOMのSIM入れたときはradioTypeがLTEになってたんだけど、iPadだと同じAPIをたたいてもradioTypeがGSMとなってしまうので携帯基地局の情報を取れないものだと思い込んでだんだ

ふと素直にSORACOMのプロファイルをiPadにインストールしてみたら、何事もなかったかのようにradioTypeがLTEとなって携帯基地局の情報を取得できました
その代わり?Webコンソールからは何故か携帯基地局からの位置取得ができなくなってしまいました…
なんで?

う~ん、何だか違う気がする...
外出先でモバイルルーターに一回接続したらまたradioTypeがGSMになっちゃった...
モバイルルーターを切断してモバイル通信をオンオフしてもradioTypeがGSMのままだ...
結局再起動させないとradioTypeがLTEとして認識しなかった

そもそもSORACOM AirをiPadに入れていろいろ触ってみるというのが間違ってるか...

2018/11/12

SORACOM LTE-M Button 買ってみた!!

SORACOM LTE-M Buttonを買って遊んでみました

単純にボタンを押したらメール送信ならほぼスマホアプリのAWS 1-Clickだけで実現できました

ただ最初はボタンの1回押し、2回押し、長押しを認識してくれるか情報がなかったので、ネットで検索してAWS Enterprise IoT Buttonのサンプルコードを参考にてコードを書き加えてみました

ボタンを押した状態は「clickType」で取得できるみたいです

追加でボタンを押した時間を含めたかったんだけど、「reportTime」に入ってる時間は標準時間なので+9時間して使ってます

本当はボタンの残クリック回数を取得したかったのですが、「remainingLife」は残クリック回数か残日数の小さい方を示しているらしいのでif文で分岐することにしました
当分は残日数の方が表示され続けますね...

メールは確認用に2箇所に送信するためにボタンのイベントに入ってる「to_address」ではなく「clickType」の分岐の中で配列を作り直してます
配列を作り直したので、最後の「ses.send_email」の中の'ToAddresses'には「to_address」を直接入れてます


from __future__ import print_function
import boto3
import json
import logging
import dateutil.parser
from datetime import datetime, timedelta

logger = logging.getLogger()
logger.setLevel(logging.INFO)
ses = boto3.client('ses')

def check_email(email):
    result = ses.get_identity_verification_attributes(Identities=[email])
    attr = result['VerificationAttributes']
    if (email not in attr or attr[email]['VerificationStatus'] != 'Success'):
        logging.info('Verification email sent. Please verify it.')
        ses.verify_email_identity(EmailAddress=email)
        return False
    return True

def lambda_handler(event, context):
    logging.info('Received event: ' + json.dumps(event))

    clicktype = event['deviceEvent']['buttonClicked']['clickType']
    attributes = event['placementInfo']['attributes']
    from_address = attributes['email']
  to_address = attributes['email']

    if not check_email(from_address):
        logging.error('From email is not verified')
        return

    if not check_email(to_address):
        logging.error('To email is not verified')
        return

    dsn = event['deviceInfo']['deviceId']
    remainLife = event['deviceInfo']['remainingLife']
    lifeBatttery = int(remainLife) * 15
    lifeDays = int(remainLife) * 3.65
    if lifeBatttery <= lifeDays:
        life = str(int(round(lifeBatttery,0))) + '回'
    else:
        life = str(int(round(lifeDays,0))) + '日'
    click_type = event['deviceEvent']['buttonClicked']['clickType']
    reportTime = event['deviceEvent']['buttonClicked']['reportedTime']
    ts = datetime.strptime(reportTime[:19], "%Y-%m-%dT%H:%M:%S")
    tdelta = timedelta(hours=9)
    ts += tdelta
    
    if (clicktype == "SINGLE"):
        to_address = []
        to_address.append("test1@example")
        to_address.append("test2@example")
        subject = 'SINGLE'
        body ='SINGLE\n' + str(ts) + '\n' + life
    elif (clicktype == "DOUBLE"):
        to_address = []
        to_address.append("test1@example")
        to_address.append("test2@example")
        subject = 'DOUBLE'
        body ='DOUBLE\n' + str(ts) + '\n' + life
    elif (clicktype == "LONG"):
        to_address = []
        to_address.append("test1@example")
        to_address.append("test2@example")
        subject = 'LONG'
        body ='LONG\n' + str(ts) + '\n' + life
        
    ses.send_email(Source=from_address,
                   Destination={'ToAddresses': to_address},
                   Message={'Subject': {'Data': subject}, 'Body': {'Text': {'Data': body}}})


LONGイベントには何を設定しようかな?