2015-12-29 4 views
0

У меня есть система позиционирования, которая отправляет данные из тега, который он отслеживает, на определенный порт, 8787. У меня есть скрипт Python, который затем берет эту строку данных и пересылает ее в определенный порт для моей базы данных 8011. Есть три теги, которые отправляют данные. Система позиционирования жестко закодирована для отправки на порт 8787, а база данных - это Oracle и принимает данные только от порта 8011, следовательно, необходимость пересылки данных.При пересылке данных через python, как я могу выделить строки данных?

Вот строка данных каждый тег посылаемых (это всегда в этом формате):

{ "ID": "0xDECA38303180234E", "метка": 1450653835,723 "MSGID": 6825, "координаты ": {" х ": 4,160," у ": 2,368," г ": - 0,604," заголовок ": 0,000," ПКФ ": 65}," тез ": [{" якоря ":" 0xDECA323031300FBF "" расстояние ": 4,343," TQF ": 64," RSSI ": - 48}, {" якоря ":" 0xDECA323030901DE2" , "расстояние": 0,779, "TQF": 32, "RSSI": - 46}, {» якорь ":" 0xDECA313032901F24" , "расстояние": 1,223, "TQF": 32, "RSSI": - 44}, { "якоря": "0xDECA353034301E99", "расстояние": 4,929, "TQF": 32, "RSSI ": -46}]}

Когда это один тег, передающий данные, скрипт python считывает каждую строку отдельно, а затем пересылает каждую строку данных по одному. Когда есть два или более тега, скрипт python группирует входящие строки данных и отправляет их вместе, что вызывает ошибки в базе данных, поскольку она настроена на прием определенного формата. Я могу распечатать их отдельно с помощью модифицированной команды печати, но я не могу пересылать каждую строку данных отдельно.

Вот скрипт Python, который пересылает данные:

import socket 
from pip._vendor import requests 
import json 
import time 


port = 8787 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
s.bind(("", port)) 
print ("waiting on port:", port) 

while 1: 
#var_data = s.recvfrom(1024) 
    var_headers = {'Content-type': 'application/json'} 
    var_data, addr = s.recvfrom(16029) 
    print (var_data) 
    var_data_json = json.dumps(var_data) #@UndefinedVariable 
    #print (var_data_json) 

    response = requests.post('http://localhost:8011/SB_PositionLocatingService/PositionLocatingProxyService', data=var_data, headers=var_headers) 

Я пробовал функцию таймера без успеха. Любая помощь была бы наиболее признательна. Благодаря Брайана

Вот как питон потоков данных из одного тега, и он прекрасно работает:

{"id":"0xDECA38303180234D","timestamp":1451680331.477, 

{"id":"0xDECA38303180234D","timestamp":1451680331.478, 

{"id":"0xDECA38303180234D","timestamp":1451680331.479, 

Из двух тегов терпят неудачу, так как он послал в качестве одного:

{"id":"0xDECA38303180234D","timestamp":1451680331.477, 
{"id":"0xDECA38303180235F","timestamp":1451680331.478, 

{"id":"0xDECA38303180234D","timestamp":1451680331.478, 
{"id":"0xDECA38303180235F","timestamp":1451680331.479, 

От три теги терпят неудачу, поскольку они отправляются как один:

{"id":"0xDECA38303180234D","timestamp":1451680331.477, 
{"id":"0xDECA38303180235F","timestamp":1451680331.478, 
{"id":"0xDECA38303180234E","timestamp":1451680331.479, 

{"id":"0xDECA38303180234D","timestamp":1451680331.478, 
{"id":"0xDECA38303180235F","timestamp":1451680331.479, 
{"id":"0xDECA38303180234E","timestamp":1451680331.480, 

что я пытаюсь для двух и трех тегов, так что это разнесены так же, как он с одним тегом:

{"id":"0xDECA38303180234D","timestamp":1451680331.477, 

{"id":"0xDECA38303180235F","timestamp":1451680331.478, 

{"id":"0xDECA38303180234E","timestamp":1451680331.479, 

{"id":"0xDECA38303180234D","timestamp":1451680331.478, 

{"id":"0xDECA38303180235F","timestamp":1451680331.479, 

{"id":"0xDECA38303180234E","timestamp":1451680331.480, 
+0

Вы пробовали разбор объекта JSON, прежде чем отправить его, а затем, используя для цикла, чтобы отправить запрос на почту, порождая новую строку JSON из разобранного объекта? Таким образом, вы можете быть уверены, что каждый входящий объект соответствует одному HTTP-запросу. –

+0

Спасибо! Я дам вам выстрел и дам вам знать, как это работает. –

+0

Вот что я пробовал для его разбора. 'var_data_json = json.dumps (var_data) # @UndefinedVariable печати (var_data_json)' Результаты является одним datastring независимо от того, сколько источников потокового и это не пространство его как это происходит в обновленной записи потока одного тега. Я что-то упускаю? Он также добавляет двойные кавычки на обоих концах строки. –

ответ

0

Я имел быстрый пойти на это, приведенный ниже код. Проблема заключалась в том, что у вас не было возможности узнать, когда закончилось одно чтение, а другое началось. Я заменил ваш цикл тем, который будет постоянно добавлять строку ввода к переменной, а затем постоянно проверять эту переменную для полного чтения. Когда он встретит полное чтение, он переадресует его, оставив оставшуюся строку, которая будет добавлена, и затем проанализируется на следующей итерации.

Берегитесь ...

  • каких-либо изменений в вашей структуре данных: если Regular Expression больше не работает, это не остановит переадресацию на любые данные, и просто сделать массивную строку, пока вы в конечном итоге заканчивается память
  • Любые проблемы с отправкой ваших данных (т.е., если ваш слуховой сервер разрывается, этот код будет продолжать работать)
  • Датчики, отправляющие показания одновременно и смешивающиеся вместе, так что, если один датчик сказал «привет» и другой «bonjour», вы получите строку " ч б е о л п л J о нашего», который бы разорвать этот сценарий. В этом случае вам нужно будет назначить отдельные порты для каждого датчика.

Надеется, что это помогает

# author: Brian Bowles 
# edited by: Dom Weldon, London, 05 Jan 2015 

# load deps 
import socket 
from pip._vendor import requests 
import json 
import re # note: replaced time with re (regular expressions, see: https://docs.python.org/2/library/re.html) 

# adjustable settings 
port_listen       = 8787 
port_forward      = 8011 
forwarding_url      = "http://localhost:{0}/SB_PositionLocatingService/PositionLocatingProxyService".format(port_forward) 
forwarding_headers     = {'Content-type': 'application/json'} 

# start listening on port 
s         = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
s.bind(("", port)) 
print ("waiting on port:", port) 

# We have strings being fired at us from sensors, we need to pick out individual 
# chunks of JSON data then forward them on using a POST request. First, let's 
# process the data every 1024 bytes. 
while var_data = s.recvfrom(1024) 
    # and add each 1024 byte chunk to a big string of all the data we receive. 
    all_input_string    += var_data 

    # an individual sensor sends data in the format below. 
    ''' 
    { 
     "id": "0xDECA38303180234E", 
     "timestamp": 1450653835.723, 
     "msgid": 6825, 
     "coordinates": { 
     "x": 4.16, 
     "y": 2.368, 
     "z": -0.604, 
     "heading": 0, 
     "pqf": 65 
     }, 
     "meas": [ 
     { 
      "anchor": "0xDECA323031300FBF", 
      "dist": 4.343, 
      "tqf": 64, 
      "rssi": -48 
     }, 
     { 
      "anchor": "0xDECA323030901DE2", 
      "dist": 0.779, 
      "tqf": 32, 
      "rssi": -46 
     }, 
     { 
      "anchor": "0xDECA313032901F24", 
      "dist": 1.223, 
      "tqf": 32, 
      "rssi": -44 
     }, 
     { 
      "anchor": "0xDECA353034301E99", 
      "dist": 4.929, 
      "tqf": 32, 
      "rssi": -46 
     } 
     ] 
    } 
    ''' 

    # does it look like we have one *complete* sensor output contained within 
    # our big string? use a regex (albeit a lazy one) to find out 
    # (the regex looks for the string "}]}"" found only at the end of one sensor 
    # reading then returns two strings: the text before it, and the text after 
    # it). 
    match       = re.match('([^\}\]\}]+)(\}\]\})(.*)', all_input_string) 
    if (match): 
     # yes, pick it out of the string and send it on, save the remainder 
     # of the string for the next pass through 
     input_components   = match.groups() 
     reading_to_send    = input_components[0] + input_components[1] # the first complete reading 
     all_input_string   = input_components[2] # the remainder of the string 

     # send off the complete reading 
     print("Received the following data to forward on: {0}".format(reading_to_send)) 
     response     = requests.post(forwarding_port, data=reading_to_send, headers=forwarding_headers) 
     print("Forwarded response. Response code: {0}".format(response.status_code)) 
+0

p.s. - Я не тестировал этот код, так что извините, если он глючит. У него также есть много комментариев, которые помогут объяснить, что я сделал! –