バスロケ等のプログラム例

ble信号を取得し、ファイルに書き出すプログラム例

定期的に実行し、信号が得られなかったときは情報なしで記録

#!/usr/bin/python
# coding: UTF-8
'''
ble信号をスキャンしてデータをcsvファイルに書き出す
 - scan関数は、引数で指定する時間、信号を待ち受け、得られた結果を返す
 - 信号がなかったら空のデータを書き出す
 - 信号あった時は、その中からaddrTypeがrandomなものを拾い出し、それを書き出す
 - sleepは必要ないかもしれない
 - Ctrl-Cを押すとファイルを閉じ終了
 - ble検出モジュールbluepyのマニュアルURL:
      bluepy manual page: http://ianharvey.github.io/bluepy-doc/
'''
import time
import numpy as np
from datetime import datetime, timedelta

import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages/bluepy')
from bluepy.btle import Scanner, DefaultDelegate

# initial
try:
    scanner = Scanner().withDelegate(DefaultDelegate())
    post_interval = 0.5  # interval of scanning
except :
    print "no device"
    sys.exit()

# file for output
outfile = open("bleTest.csv","w")

while True:
    try:
        devices = scanner.scan(post_interval)
        if len(devices)==0:
            print ",,,%s" %(datetime.now().strftime("%H:%M:%S") )
        else:
            for dev in devices:
                if dev.addrType=="random":
                    dateNow = datetime.now()
                    timeStr = dateNow.strftime("%H:%M:%S")
                    outfile.write("%s (%s), %d, %s\n" % (dev.addr, dev.addrType, dev.rssi, dateNow)) # file output
                    print "Device %s (%s), RSSI=%d dB, %s" % (dev.addr, dev.addrType, dev.rssi, timeStr)
        time.sleep(post_interval)
    except KeyboardInterrupt:
        outfile.close()
    except :
        print "no device"
        sys.exit()
        break

gpsとbleデータを取得し、サーバーに送信するプログラム例

#!/usr/bin/python
# coding:utf-8
'''
gpsデータとbleデータを取得し、サーバに送信する
 - 送信先URLはpostUrlで指定
 - gpsデータ取得モジュールはpythonに標準で入っている
   - gpsデータを取得するOS上のモジュールgpsdはインストールしておくこと
 - bleデータ取得にはbluepyモジュールを使う
   - bluepyモジュールをインストールした場所をpathに加える
 - それぞれのモジュールは並行して動かせていない、順々におこなうので、その分、時間はずれる
'''
import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages/bluepy')
import requests
import json
import struct
import uuid
from gps import *
from time import *
import time
import threading
from datetime import datetime
from pytz import timezone
from bluepy.btle import Scanner, DefaultDelegate

postUrl = "http://8tops.yamanashi.ac.jp/~toyoki/busloc/post_test.php"
gpsd = None #seting the global variable
def isNaN(num):
    return num != num

class GpsPoller(threading.Thread):
    '''
    GPSデータ取得のためのクラス
    '''
    def __init__(self):
        threading.Thread.__init__(self)
        global gpsd #bring it in scope
        gpsd = gps(mode=WATCH_ENABLE) #starting the stream of info
        self.current_value = None
        self.running = True #setting the thread running to true

    def run(self):
        global gpsd
        while gpsp.running:
            gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer

if __name__ == '__main__':
    # instance for BLE
    scanner = Scanner().withDelegate(DefaultDelegate())
    ble_get_interval = 0.5  # interval of scanning BLEs
    try:
        devices = scanner.scan(ble_get_interval)
        haveBleDevice = True
    except :
        haveBleDevice = False
    # macアドレスの16進表示
    mac_address = ":".join( [hex( fragment )[2:].zfill( 2 ) for fragment in struct.unpack( "BBBBBB", struct.pack( "!Q", uuid.getnode() )[2:] )] )
    # 送信用基本データ ("name"は今のところダミー)
    dt = {
        "name": "RaspberryPI 1",
        "mac": mac_address,
    }
    # create the instance for gps device
    gpsp = GpsPoller() # create the thread
    try:
        gpsp.start() # gpsデータ検索窓口
        while True:
            # GPSデータ取得
            if gpsd.utc != ""  and  (not isNaN(gpsd.fix.latitude)):
                dt["lat"] = gpsd.fix.latitude
                dt["lng"] = gpsd.fix.longitude
                t_utc = timezone('UTC').localize(datetime.strptime(gpsd.utc,"%Y-%m-%dT%H:%M:%S.%fZ"))
                now = datetime.strftime(t_utc.astimezone(timezone('Asia/Tokyo')), "%Y-%m-%d %H:%M:%S")
                dt['time'] = now
            else:
                dt["time"] = datetime.now().strftime("%H:%M:%S")
            # BLEデータ取得
            if haveBleDevice :
                bleDevices = scanner.scan(ble_get_interval)
                if len(bleDevices) != 0:
                    for dev in bleDevices:
                        if dev.addrType=="random":
                            dt["bleAddr"] = dev.addr
                            dt["bleRssi"] = dev.rssi
                            print dev.addr
            # データ送信
            res = requests.post(
                postUrl,
                data=json.dumps(dt))
            time.sleep(5) #set to whatever
    except (KeyboardInterrupt, SystemExit): #when you press ctrl+c
        # print "\nKilling Thread..."
        gpsp.running = False
        gpsp.join() # wait for the thread to finish what it's doing
        #print "Done.\nExiting."