예제 #1
0
def respond_with_json(
    start_response: StartResponse,
    json: str | bytes | Any,
    *,
    status: HTTPStatus = HTTPStatus.OK,
    extra_headers: Sequence[Header] = [],
) -> Iterable[bytes]:
    """Prepare a JSON WSGI response.

    >>> def handler(start_response, request):
    ...     return respond_with_json(start_response, {"foo": "bar"})

    The JSON text to return can be supplied as a string, as an UTF-8-encoded
    bytestring, or as any object that can be serialized using json.dumps().

    The default response status of "200 OK" can be overridden with the
    "status" keyword argument.
    """

    if isinstance(json, bytes):
        encoded = json
    elif isinstance(json, str):
        encoded = json.encode("utf-8")
    else:
        encoded = dumps_json(json).encode("utf-8")

    return respond_with_content(
        start_response,
        encoded,
        status=status,
        content_type="application/json; charset=utf-8",
        extra_headers=extra_headers,
    )
예제 #2
0
def store_alert(teamUUID, sensorUUID, mes_dict):
    """Pomocí HTTP příkazu post zašle mes_dict na Aimtec API jako Alert"""
    url_alert = url_base + '/alerts'
    headers_base_alert = {
        'Content-Type': 'application/json',
        'teamUUID': teamUUID
    }

    alert = dict_format_for_API_alert(mes_dict)

    logging.info(alert)

    body_alert = {
        'createdOn': alert['created_on'],
        'sensorUUID': sensorUUID,
        'temperature': str(round(alert['temperature'], 1)),
        'lowTemperature': alert['lowTemperature'],
        'highTemperature': alert['highTemperature']
    }

    response = requests.post(url_alert,
                             data=dumps_json(body_alert),
                             headers=headers_base_alert)
    logout = 'Storing alert to API for teamUUID = ' + teamUUID
    logging.info(logout)

    return response
예제 #3
0
def store_meas(teamUUID, sensorUUID, mes_dict):
    """Pomocí HTTP příkazu post zašle mes_dict na Aimtec API jako měření"""
    url_measurement = url_base + '/measurements'
    headers_base_measurement = {
        'Content-Type': 'application/json',
        'teamUUID': teamUUID
    }

    measurement = dict_format_for_API_meas(mes_dict)
    logging.info(measurement)

    body_measurement = {
        'createdOn': measurement['created_on'],
        'sensorUUID': sensorUUID,
        'temperature': str(round(measurement['temperature'], 1)),
        'status': 'TEST'
    }

    response = requests.post(url_measurement,
                             data=dumps_json(body_measurement),
                             headers=headers_base_measurement)
    logout = 'Storing measurement to API for teamUUID = ' + teamUUID
    logging.info(logout)
    logging.info(response)

    return response
예제 #4
0
async def request(method: str,
                  url: str,
                  params: dict = None,
                  data: Any = None,
                  json_body: bool = False,
                  timeout: int = 10,
                  **kwargs) -> AiohttpResp:
    """
    原始网络请求封装。
    Args:
        method     (str)                 : 请求方法。
        url        (str)                 : 请求 URL。
        params     (dict, optional)      : 请求参数。
        data       (Any, optional)       : 请求载荷。
        json_body  (bool, optional)      : 载荷是否为 JSON
        timeout    (int, optional)       : 超时时间
    Returns:
        返回 aiohttp 请求对象
    """
    method = method.upper()

    # 使用自定义 UA
    DEFAULT_HEADERS = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
    }
    headers = DEFAULT_HEADERS

    if params is None:
        params = {}

    # 合并参数
    config_ = {
        "method": method,
        "url": url,
        "params": params,
        "data": data,
        "headers": headers,
    }
    # 支持自定义参数
    config_.update(kwargs)

    if json_body:
        config_["headers"]["Content-Type"] = "application/json"
        config_["data"] = dumps_json(config_["data"])
    # 如果用户提供代理则设置代理
    if not proxy_addr == '' and not proxy_port == '':
        config_["proxy"] = f"socks5://{proxy_addr}:{proxy_port}"
    elif not http_addr == '' and not http_port == '':
        config_["proxy"] = f"http://{http_addr}:{http_port}"
    session = aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=timeout))
    resp = await session.request(**config_)
    # 返回请求
    try:
        resp_data = await resp.text()
    except UnicodeDecodeError:
        resp_data = await resp.read()
    content = await resp.content.read()
    status_code = resp.status
    await session.close()
    return AiohttpResp(resp_data, content, status_code)
예제 #5
0
def Load_last_data_from_DB(
    teamname, status, day_avg, minimum, maximum
):  #metoda nacte poslednich 10 hodnot pro dany tym a vraci dve struktury jednu se statusem offline druhou s predanym statusem
    teamQuery = Query()
    send = [0, 0]
    ID = teams_send_dict[teamname]
    last_data = []
    time = []
    for i in range(-10, 0):
        last_data.append(
            db.search(teamQuery.team == teamname)[i]['temperature'][:-11])
        time.append(db.search(teamQuery.team == teamname)[i]['time'][11:-7])
    slovnik_k_odeslani = {
        "id": ID,
        "status": status,
        "data": last_data,
        "times": time,
        "max": maximum,
        "min": minimum,
        "avg": day_avg
    }  #vytvoreni struktury s predanym statusem
    slovnik_k_odeslani = dumps_json(slovnik_k_odeslani)
    slovnik_offline = {
        "id": ID,
        "status": 'offline',
        "data": last_data,
        "times": time,
        "max": maximum,
        "min": minimum,
        "avg": day_avg
    }  #vytvoreni struktury se statusem offline
    slovnik_offline = dumps_json(slovnik_offline)
    send[0] = slovnik_k_odeslani
    send[1] = slovnik_offline

    return (send)
예제 #6
0
def login(body_login):
    """Přihlásí uživatele pomocí přihlašovacích údajů v body_login na AIMTEC API"""
    url_login = url_base + '/login'
    headers_base_login = {'Content-Type': 'application/json'}

    login_data = loads_json(
        requests.post(url_login,
                      data=dumps_json(body_login),
                      headers=headers_base_login).text)
    logout = 'Logged in as ' + login_data['username']
    logging.info(logout)
    logout = 'teamUUID:', login_data['teamUUID']
    logging.info(logout)

    return login_data
예제 #7
0
def login():
    """Metoda vraci UUID tymu, a zaroven updatuje headers o dane teamUUID"""

    url_login = url_base + '/login'
    body_login = {'username': '******', 'password': '******'}
    # login
    login_data = loads_json(
        requests.post(url_login,
                      data=dumps_json(body_login),
                      headers=headers_base).text)
    print('\nLogin data:', login_data)

    teamUUID = login_data['teamUUID']
    print('\nteamUUID:', teamUUID)
    headers_post.update({'teamUUID': teamUUID})

    return (teamUUID)
예제 #8
0
def write_json_to_file(filepath: Path,
                       jsonstr: Dict[str, str],
                       indent: int = 4,
                       eof_line=True):
    """Dosyaya JSON yazar.
    Dosya bulunamazsa ekrana raporlar hata fırlatmaz

    Arguments:
        filepath {Path} -- Okunacak dosyanın yolu
        jsonstr {Dict[str, str]} -- JSON objesi
        indent {int} -- JSON yazımı için varsayılan girinti uzunluğu
        eof_line {bool} -- Dosyanın sonuna '\\n' koyar

    Returns:
        bool -- Yazma işlemi başarılı ise `True`
    """
    jsonstr = dumps_json(jsonstr, indent=4)
    jsonstr += "\n" if eof_line else ""
    return write_to_file(filepath, jsonstr)
예제 #9
0
def store_measurement(temp):
    '''
    Sends the new measurement over the Aimtec REST API.
    temp = currently measured temperature
    '''
    url_base = 'https://uvb1bb4153.execute-api.eu-central-1.amazonaws.com/Prod'
    headers_base = {'Content-Type': 'application/json'}

    # login
    url_login = url_base + '/login'
    body_login = {'username': '******', 'password': '******'}

    login_data = loads_json(
        requests.post(url_login,
                      data=dumps_json(body_login),
                      headers=headers_base).text)
    teamUUID = login_data['teamUUID']  #saves team UUID

    # get sensors
    url_sensors = url_base + '/sensors'
    headers_sensors = dict(headers_base)
    headers_sensors.update({'teamUUID': teamUUID})

    sensors_data = requests.get(url_sensors, headers=headers_sensors)
    sensor_data_text = loads_json(sensors_data.text)
    sensorUUID = sensor_data_text[0]['sensorUUID']  #saves sensor UUID

    # create measurement
    url_measurements = url_base + '/measurements'
    headers_measurements = headers_sensors
    now = datetime.now()
    date_time = str(now).split(' ')
    date_time[1] = date_time[1][:-3] + "+00:00"
    createdOn = date_time[0] + 'T' + date_time[
        1]  #sets the time in the acceptable format

    body_measurements = {
        'createdOn': createdOn,
        'sensorUUID': sensorUUID,
        'temperature': str(temp),
        'status': 'OK'
    }
    requests.post(url_measurements,
                  data=dumps_json(body_measurements),
                  headers=headers_measurements)

    # create alert if the temperature steps out of the bounds
    lowTemp = 0.0
    highTemp = 25.0
    if temp < lowTemp or temp > highTemp:
        url_alerts = url_base + '/alerts'
        headers_alerts = headers_sensors
        now = datetime.now()
        date_time = str(now).split(' ')
        date_time[1] = date_time[1][:-3] + "+00:00"
        createdOn = date_time[0] + 'T' + date_time[
            1]  #sets the time in the acceptable format

        body_alerts = {
            'createdOn': createdOn,
            'sensorUUID': sensorUUID,
            'temperature': str(temp),
            'lowTemperature': str(lowTemp),
            'highTemperature': str(highTemp)
        }
        requests.post(url_alerts,
                      data=dumps_json(body_alerts),
                      headers=headers_alerts)
예제 #10
0
def on_message(client, userdata, msg):
    now = datetime.datetime.now()
    if (msg.payload == 'Q'):
        client.disconnect()
    data = str(msg.payload)
    team_name = re.search('(?<="team_name": ").+?(?=",)', data,
                          re.DOTALL).group().strip()  #vyhledani jmena tymu
    team_name = str(team_name)
    created_on = re.search(
        '(?<="created_on": ").+?(?=", "temperature")', data,
        re.DOTALL).group().strip()  #vyhledani kdy byla teplota nactena
    temperature = re.search('(?<="temperature": ).+?(?=})', data,
                            re.DOTALL).group().strip()
    data = {
        "createdOn": created_on[:-3] + "+01:00",
        "sensorUUID": sensor_UUID,
        "temperature": temperature,
        'status': 'TEST'
    }  #vytvoreni struktury dat k poslani
    temperature_float = float(temperature)
    global New_data
    global hour_stats
    global day_stats
    global alert
    global offline_data
    status = "online"
    if team_name == "green":  #test zda se jedna o zeleny tym
        b = requests.post(url_post,
                          data=dumps_json(data),
                          headers=headers_post)
        if (
            (temperature_float < minimum or temperature_float > maximum)
                and alert == False
        ):  #vyhodnoceni zda se teplota nachazi v danem rozmezi a zaroven jeste nebyl zaslan alert
            dataalert = {
                "createdOn": created_on[:-3] + "+01:00",
                "sensorUUID": sensor_UUID,
                "temperature": temperature,
                "lowTemperature": minimum,
                "highTemperature": maximum
            }
            url_alert = url_base + '/alerts'
            b = requests.post(url_alert,
                              data=dumps_json(dataalert),
                              headers=headers_post)
            alert = True
        if (temperature_float > minimum and temperature_float < maximum
                and alert):  #zmena teploty zpet do standartnich hodnot
            alert = False
        if alert == True:
            status = "alert"
    #Vypocet statistickych dat
    if day_stats.day != datetime.datetime.now(
    ).day:  #pulnoc nulovani statistik
        day_stats.midnight()

    index_stats = teams_dict[team_name]  #zjisteni indexu daneho tymu
    Stats_update(temperature_float, team_name,
                 index_stats)  #volani metody pro update statistik

    db.insert({
        'team': team_name,
        'time': created_on,
        'temperature': temperature
    })  #vlozeni dat do databaze
    load_data = Load_last_data_from_DB(
        team_name, status, day_stats.avg[index_stats],
        day_stats.min[index_stats],
        day_stats.max[index_stats])  #nacteni dat do bufferu
    Data_to_be_send[int(teams_dict[team_name])] = load_data[
        0]  #buffer dat k odeslani poslednich 10 hodnot daneho tymu
    offline_data[int(teams_dict[team_name])] = load_data[
        1]  #poslednich 10 hodnot se statusem offline v pripade vypadku cidla

    if hour_stats.hour != datetime.datetime.now().hour:  #detekce zmeny hodiny
        hour_stats.fullhour(
        )  #volani metody z tridy hour_stats pro ulozeni dat do databaze
    New_data[teams_dict[
        team_name]] = 1  #signalizace pro asynchroni metodu ze prisla nova teplota
예제 #11
0
print(a)
print(type(a))
adict = ast.literal_eval(a)
print(adict)
print(type(adict))
print(adict['source'])

teamUUID = 'f32c6941-bc2d-41b2-8bb3-cb6082427613'  #blue
sensorUUIDblue = 'd384a529-6227-4133-afc9-4f5a16665f1f'
id = 0
#now = datetime.now()
tms = datetime.strptime(adict['created_on'], '%Y-%m-%dT%H:%M:%S.%f')
time = tms.strftime("%Y-%m-%d") + 'T' + tms.strftime("%H:%M:%S.") + str(
    int(tms.strftime("%f")) // 1000) + '+' + '01:00'

url_base = 'https://uvb1bb4153.execute-api.eu-central-1.amazonaws.com/Prod'
url_measurement = url_base + '/measurements'
headers_base = {'Content-Type': 'application/json', 'teamUUID': teamUUID}

#body_measurement = {'id': id, 'createdOn': adict['created_on'], 'sensorUUID': sensorUUIDblue, 'temperature': adict['temperature'], 'status': adict['source'], 'modifiedOn': str(now), 'timestamp': now.timestamp()}
body_measurement = {
    'createdOn': time,
    'sensorUUID': sensorUUIDblue,
    'temperature': str(round(adict['temperature'], 1)),
    'status': 'TEST'
}

F = requests.post(url_measurement,
                  data=dumps_json(body_measurement),
                  headers=headers_base)
예제 #12
0
 def get_json(self):
     dic = copy(self.__dict__)
     dic["header"] = self.header.hex()
     dic["content"] = dumps_pickle(
         self.content).hex()  # Hay que serializarlo de algún modo
     return dumps_json(dic)
예제 #13
0
파일: login.py 프로젝트: smidmatej/ITEsem
#login

import requests
from json import dumps as dumps_json, loads as loads_json

url_base = 'https://uvb1bb4153.execute-api.eu-central-1.amazonaws.com/Prod'
headers_base = {'Content-Type': 'application/json'}

# login
url_login = url_base + '/login'
body_login = {'username': '******', 'password': '******'}

login_data = loads_json(
    requests.post(url_login, data=dumps_json(body_login),
                  headers=headers_base).text)
print('\nLogin data:', login_data)

teamUUID = login_data['teamUUID']
print('\nteamUUID:', teamUUID)

# get sensors
url_sensors = url_base + '/sensors'
headers_sensors = dict(headers_base)
headers_sensors.update({'teamUUID': teamUUID})

sensors_data = requests.get(url_sensors, headers=headers_sensors)
print('\nSensors data:', loads_json(sensors_data.text))