Беспроводная передача данных удаленному приемнику



Мы поможем в написании ваших работ!


Мы поможем в написании ваших работ!



Мы поможем в написании ваших работ!


ЗНАЕТЕ ЛИ ВЫ?

Беспроводная передача данных удаленному приемнику



Так же для соединения нескольких устройств, можно прибегнуть к беспроводному каналу связи, который может увеличить мобильность нашей системы. Самыми распространенными системами беспроводной передачи данных на данный момент являются:

· Zigbee

· Bluetooth

· Wi-fi

Технология передачи данных Bluetooth (стандарт IEEE 802.15) – технология, которая позволяет создать беспроводную передачу данных. Передача данных идет на частоте 2.4 ГГц , которая является не лицензируемой, и на расстоянии от 10 до 100 метров. Даная технология позволяет общаться мобильному телефон, персональному компьютеру и другим устройствам, не имея прямой видимость. Существует несколько топологий соединения данной системы:

· Точка – точка

· Точка – многоточек

Рисунок 32 – Разные вариант топологии сети a) один подчиненный б) несколько подчиненных в) распределенная сеть

Обозначения:

M – основное (master)

S – подчиненное (slave)

Данный тип связи можно отнести к централизованному типу, так как в одной сети не может находиться два основных устройства (master). Скорость передачи данных может достигать 1 Мб/сек. Максимальной количество устройств в одной сети может быть не более 7.

ZigBee является технологией беспроводной передачи данных, работающий по стандарту IEEE 802.15.4. Возможны три варианта топологи в сети ZigBee:

a. Звезда

b. Каждое с каждым

c. Кластерное дерево

Рисунок 33 – Пример топологии сети ZigBee

Существую два типа устройства данного тип: с ограниченным (RFD) и полным (FFD) функционалом. Данное разделение сделано для уменьшения стоимости устройств. RFD устройство может использоваться только в топологии «звезда», так же оно не может выступать в роли маршрутизатора сети, обмен данными возможен только с координатором, как правило питание производится через пальчиковые батарейки. FFD устройства могут использоваться в трех вариантах топологии сети (звезда, каждое с каждым, кластерное дерево), имеет возможность быть координатором и выполнять маршрутизацию данных, как правило питается от внешнего источника питания. Имеется три варианта передачи данных по сети ZigBee:

· Периодическая посылка информации

· Прерывистая посылка информации

· Повторяющаяся посылка информации

Периодическая посылка информации характерна для счетчиков или беспроводных датчиков. Большую часть времени данное устройство находится в состоянии сна. В некоторый момент времени устройство выходит и сна, производит поиск сигнала маяка, найдя его, осуществляет передачу данных и засыпает. Это способствует очень низкому энергопотреблению, что позволяет устройству питаться от батарейки. ZigBee работает на частоте 2.4-2.483 ГГц, скорость передачи данных составляет 250 кбит/с, время непрерывной работы от батареи достигает до 1000 дней, максимальное количество устройств в одной сети может достигать 65535 устройств.

Wi-fi является самым распространённым основным стандартом создания беспроводных сетей, работящая по стандарту IEEE 802.11. Основное назначение данных типов сетей является доступов в интернет. Существует несколько основных индексов, пользующиеся наибольшей популярностью у производителей: a, b, g и i. Остальные же буквенные обозначения представляют собой усовершенствования, исправления и дополнения уже существующих технических решений. Распространение данной технологии можно связать с её высокой пропускной способность, огромным количеством устройств в одной сети и хорошими показателями дальности связи. Технологии типа a,b,g,n отличаются скоростью передачей данных, которое составляет 54, 11, 54, 750 Мб/с соответственно. Расстояние передачи данных в помещении достигает 50-100 метров, что является очень хорошим показателем. Такие технологии, как Bluetooth и ZigBee, не могу похвастаться такими хорошими показателями дальности передачи сигналов.

 

 

Таблица 5 – Сравнительная характеристика стандартов технологии Wi-Fi

Стандарт Пропускная способность Радиус действия Частоты, ГГц
802.11a До 54 Мбит/с До 100 метров 5,0
802.11b До 11 Мбит/с 2,4
802.11g До 54 Мбит/с 2,4
802.11n До 300 Мбит/с 2,4 - 2,5
802.11ac До 3.4 Гбит/с 2,4 + 5,0

 

Для решения поставленной задачи по передачи данных так же можно воспользоваться и беспроводным способом передачи данных. Проведя обзор существующих решений по передачи данных была собрана таблица 6.

 

Таблица 6 – Сравнительная характеристика беспроводных технологий передачи данных.

Технология беспроводной передачи данных (стандарт) ZigBee (IEEE 802.15.4) Wi-Fi (IEEE 802.11b) Bluetooth (IEEE 802.15.1)
Частотный диапазон 2.4-2.483 ГГц 2.4-2.483 ГГц 2.4-2.483 ГГц
Пропускная способность, кбит/с 723.1
Размер стека протокола, кбайт 32-64 более 1000 более 250
Время непрерывной работы от батареи, дни 100-1000 0,5-5 1-10
Максимальное количество узлов в сети
Диапазон действия, м (среднее значение)* 10-100 20-300 10-100
Область применения Удаленный мониторинг и управление Передача мультимедийной информации Замещение проводного соединения

 

Для решения поставленной задачи подходит технология беспроводной передачи данных Wi-fi. Она обладает хорошими показателями: скорость передачи, диапазон действия. Так же данная технология имеет высокий показатель использования, что позволит без труда найти устройство, подходящее под Raspberry pi 2. Так же не придется писать драйверов для работы с данным адаптером, что сэкономит временные затраты.

Далее необходимо будет разобраться с протоколом передачи данных, которых существует огромное количество. Так для беспроводной и проводной передачи данных существуют общие протоколы, которые работаю при разных способах передачи данных.

Протокол передачи данных IP

Межсетевой протокол IP (Internet Protocol) – является протоколом, соединивший различные компьютерные сети в сеть Интернет. IP – адрес является основной частью данного протокола. Данные протокол не гарантирует доставки пакета до места назначения. Информация может прийти не в том порядке, что была отправлена. Так же она может быть повреждена и может быть продублирована или же не прийти. Для гарантии безошибочной доставки информации необходимо обратиться к протоколам более высокого уровня, например TCP или UDP. Существует четыре уровня протоколов:

· Прикладного уровня (Application layer), например: HTTP, DNS, FTP

· Транспортного уровня (Transport layer), например: UDP, TCP

· Сетевого уровня (Internet layer), например: IP

· Канального уровня (Link layer), например: IEEE 802.11, Ethernet

 

TCP (Transmission Control Protocol) является набором сетевых протоколов передачи информации, включая Интернет. Данный протокол работает над протоколом IP. Обмен данными осуществляется с использованием протокола 4 уровня. Так же производится проверка поступивших данных. Если информация доставлена в не полном размере или же искажена, производится повторная посылка данных. Для начала посылки сообщений необходимо, что бы было открыто соединение между клиентом и сервером. После соединения двух устройств, сервер отсылает синхронизирующий порядковый номер, который идентифицирует соединение, и подтверждение. После этого осуществляется общения между двумя устройствами. После каждого полученного сообщения в ответ всегда отправляется подтверждение о получении.

Таблица 7 – Заголовки TCP

Основным преимуществом данного протокола является его гарантия о доставки сообщений. Данная гарантия порой требует большую временную затрату.

Так же существует более быстрый протокол посылки данных UDP (User Datagram Protocol). В данном протоколе имеется только самый необходимый набор механизмом для передачи данных. Получая быстродействие, данный протокол имеет некоторые недостатки:

· Поступление сообщений может осуществляется в любом порядке. Таки образом первое отосланное сообщением может оказаться последним.

· Нет гарантии доставки

Плюсами являются:

· Быстрая посылка

· Не требует открытия соединения

· Моментальная посылка данных.

Существует два способа посылки сообщений в сеть: однонаправленное и широковещательная передача. Первая характеризуется посылкой из одного узла в другой. Второй же способ отправляет всем узлам сети или рассылка идет в выбранную группу узлов. Чаще всего при отсылки широковещательных или групповых сообщений потребность в подтверждении о получении отпадает. Хорошим примером является

· Просмотр онлайн трансляций

· Служба времени

Если при посылки данной информации было необходимо получать подтверждение о поставки информации, то нагрузка на сервер бы возросла в несколько раз.

Таблица 8 – Заголовки UDP

Для решение поставленной задачи был выбран протокол передачи данных UDP. Это связано с тем что данный протокол обладает быстрой передачей информации. Так как в нашей задаче планируется скорость посылки информации от 20 пакетов в секунду, то нам необходима быстрая посылка информации, без лишних подсоединений к серверу и получения подтверждения о доставки.


Использованные источники

1. http://webspecial.volkswagen.de/innovative-technologies/ новаторские технологии группы Volkswagen AG

2. http://www.irobot.ru/roomba980/ описание режима работы и возможностей робота-пылесоса Roomba 980

3. Магистерская диссертация на тему «Исследование и разработка многопараметрического классификатора минеральных объектов.»/ Шитов Д.Д., Коротаев В.В.

4. Принцип работы и устройство активно-пиксельных датчиков / Овчинников А.М., Ильин А.А., Овчинников М.Ю.

5. http://www.keldysh.ru/papers/2003/prep85/prep2003_85.html / Устройство активно-пиксельных датчиков

 

Приложение А

Технические характеристики Raspberry Pi 2 model B

Приложение Б

Листинг программы.

opencv_capture_dialog.py:

# -*- coding: utf-8 -*-

import sys

import getopt

import os

import algorithms

import image

import video

from Tkinter import *

from tkFileDialog import askopenfilename

 

CAM_NUMBER = 0

CAPTURE_RES = (320,240)

SHOW_IMAGE = True

CONTINUES_IMAGE = True

 

ALGORITHM = algorithms.shipFounder

ALG_ARGS = 180

 

def main():

root = Tk()

root.withdraw()

arg = askopenfilename()

videoCapture = len(arg) == 0

if videoCapture:

obj = video.RaspPiCapture(CAPTURE_RES,SHOW_IMAGE)

obj.setAlgorithm(ALGORITHM,ALG_ARGS)

obj.run()

else:

imageInput = (arg[-3:] == 'jpg' or

arg[-3:] == 'png' or

arg[-4:] == 'jpeg')

videoInput = (arg[-3:] == 'avi' or

arg[-3:] == 'mpg')

if imageInput:

obj = image.Image(arg,SHOW_IMAGE)

obj.setAlgorithm(ALGORITHM,ALG_ARGS)

if CONTINUES_IMAGE:

obj.runContinues()

else:

obj.run()

if videoInput:

obj = video.VideoPlayer(arg,SHOW_IMAGE)

obj.setAlgorithm(ALGORITHM,ALG_ARGS)

obj.run()

os.system("pause")

obj.closeAll()

return

if __name__ == "__main__":

main()

image.py:

import cv2

import sys

import time

import numpy

 

class Image():

def __init__(self,fileName,showImage):

self.fileName = fileName

self.font = cv2.FONT_HERSHEY_SIMPLEX

self.showImage = showImage

self.algorithmHandler = None

self.algArgs = None

def run(self):

start = time.time()

frame = cv2.imread(self.fileName)

if self.algorithmHandler != None:

frame = self.algorithmHandler(frame,self.algArgs)

if self.showImage:

cv2.namedWindow(self.fileName, cv2.WINDOW_AUTOSIZE )

totalTime = time.time() - start

self.drawNumber(frame,totalTime,2)

print 'Time: ' + str(round(totalTime,2)) + 's'

asp = frame.shape[0]/frame.shape[1]

cv2.imshow(self.fileName,frame)

self.waitForAkey()

self.closeAll()

 

else:

totalTime = time.time() - start

print 'Time: ' + str(round(totalTime,2)) + 's'

return

def runContinues(self):

start = time.time()

frameNumber = 0

frame = cv2.imread(self.fileName)

while True:

if self.algorithmHandler != None:

imProccesed = self.algorithmHandler(frame,self.algArgs)

 

if self.showImage:

cv2.namedWindow(self.fileName, cv2.WINDOW_AUTOSIZE )

totalTime = time.time() - start

self.drawNumber(imProccesed,totalTime,2)

cv2.imshow(self.fileName,imProccesed)

if cv2.waitKey(10) & 0xFF == ord('q'):

break

else:

if frameNumber == 100:

break

 

frameNumber += 1

 

totalTime = time.time() - start

avrgFps = frameNumber/totalTime

print 'Frames: ' + str(int(frameNumber))

print 'Time: ' + str(round(totalTime,2)) + 's'

print 'FPS: ' + str(int(avrgFps))

return

def closeAll(self):

cv2.destroyAllWindows()

def setAlgorithm(self,algorithm,args):

self.algorithmHandler = algorithm

self.algArgs = args

def waitForAkey(self):

while True:

if cv2.waitKey(10) & 0xFF == ord('q'):

return

def drawNumber(self,frame,number,roundNum):

string = 'Time: ' + str(round(number,roundNum)) + 's'

scale = 0.3

white = (255,255,255)

black = (0,0,0)

pts = numpy.array([[0,0],[100,0],[100,30],[0,30]])

 

cv2.fillPoly(frame, [pts], black)

cv2.putText(frame,string,(10,10),self.font,scale,white)

return

##obj = Image('test.jpg',True)

##obj.runContinues()

 

 

video.py:

import cv2

import sys

import time

import os

import numpy

import io

import picamera

 

class RaspPiCapture():

def __init__(self,resolution,showImage):

print 'init'

self.resolution = resolution

 

self.font = cv2.FONT_HERSHEY_SIMPLEX

self.showImage = showImage

self.algorithmHandler = None

self.algArgs = None

return

def outputs(self):

stream = io.BytesIO()

fps = 0

 

while True:

start = time.time()

 

yield stream

stream.seek(0)

data = numpy.fromstring(stream.getvalue(), dtype=numpy.uint8)

frame = cv2.imdecode(data, 1)

if self.algorithmHandler != None:

frame = self.algorithmHandler(frame,self.algArgs)

 

if self.showImage:

cv2.namedWindow( "Raspberri Pi Camera Capture", cv2.WINDOW_AUTOSIZE )

self.drawNumber(frame,fps,0)

cv2.imshow('Raspberri Pi Camera Capture', frame)

 

if cv2.waitKey(10) & 0xFF == ord('q'):

self.closeAll()

break

else:

if self.frameNumber == 30000:

break

 

stream.seek(0)

stream.truncate()

fps = 1.0/(time.time() - start)

self.frameNumber += 1

 

return

 

def run(self):

print 'run'

totalStart = time.time()

self.frameNumber = 0

with picamera.PiCamera() as camera:

camera.resolution = self.resolution

camera.framerate = 90

camera.video_stabilization = False

camera.exposure_mode = 'off' #'spotlight'#'auto'

#camera.shutter_speed = int(2500)

 

time.sleep(2)

start = time.time()

camera.capture_sequence(

self.outputs(),

format='jpeg',

use_video_port=True)

 

totalTime = time.time() - start

self.closeAll()

avrgFps = self.frameNumber /totalTime

print 'Resolution: ' + str(self.resolution)

print 'Frames: ' + str(int(self.frameNumber))

print 'Time: ' + str(round(totalTime,2)) + ' s'

print 'FPS: ' + str(round(avrgFps,1))

return

def closeAll(self):

cv2.destroyAllWindows()

return

def setAlgorithm(self,algorithm,args):

print 'algo'

self.algorithmHandler = algorithm

self.algArgs = args

return

def drawNumber(self,frame,number,roundNum):

string = 'Fps: ' + str(round(number,roundNum)) + 's'

scale = 0.3

white = (255,255,255)

black = (0,0,0)

pts = numpy.array([[0,0],[100,0],[100,30],[0,30]])

 

cv2.fillPoly(frame, [pts], black)

cv2.putText(frame,string,(10,10),self.font,scale,white)

return

class VideoCapture():

def __init__(self,camNumber,resolution,showImage):

self.cap = cv2.VideoCapture(camNumber)

self.cap.set(3,resolution[0])

self.cap.set(4,resolution[1])

self.cap.set(cv2.CAP_PROP_FPS,100)

self.cap.set(cv2.CAP_PROP_CONVERT_RGB,True)

self.font = cv2.FONT_HERSHEY_SIMPLEX

self.showImage = showImage

self.algorithmHandler = None

self.algArgs = None

return

def run(self):

totalStart = time.time()

frame = 0

fps = 0

 

while True:

start = time.time()

ret, self.frame = self.cap.read()

if not ret:

break

if self.algorithmHandler != None:

self.frame = self.algorithmHandler(self.frame,self.algArgs)

 

if self.showImage:

cv2.namedWindow( "Camera Capture", cv2.WINDOW_AUTOSIZE )

self.drawNumber(self.frame,fps,0)

cv2.imshow('Camera Capture', self.frame)

else:

cv2.namedWindow( "Camera Capture", cv2.WINDOW_AUTOSIZE )

if cv2.waitKey(10) & 0xFF == ord('q'):

break

 

frame += 1

fps = 1.0/(time.time() - start)

totalTime = time.time() - totalStart

avrgFps = frame/totalTime

print 'Frames: ' + str(int(frame))

print 'Time: ' + str(round(totalTime,2)) + 's'

print 'FPS: ' + str(int(avrgFps))

return

def closeAll(self):

self.cap.release()

cv2.destroyAllWindows()

return

def setAlgorithm(self,algorithm,args):

self.algorithmHandler = algorithm

self.algArgs = args

return

def drawNumber(self,frame,number,roundNum):

string = 'Fps: ' + str(round(number,roundNum)) + 's'

scale = 0.3

white = (255,255,255)

black = (0,0,0)

pts = numpy.array([[0,0],[100,0],[100,30],[0,30]])

 

cv2.fillPoly(frame, [pts], black)

cv2.putText(frame,string,(10,10),self.font,scale,white)

return

class VideoPlayer():

def __init__(self,fileName,showImage):

self.cap = cv2.VideoCapture(fileName)

self.font = cv2.FONT_HERSHEY_SIMPLEX

self.showImage = showImage

self.algorithmHandler = None

self.algArgs = None

self.fileName = fileName

return

def run(self):

totalStart = time.time()

frame = 0

fps = 0

 

while True:

start = time.time()

ret, self.frame = self.cap.read()

if not ret:

break

if self.algorithmHandler != None:

self.frame = self.algorithmHandler(self.frame,self.algArgs)

 

if self.showImage:

cv2.namedWindow( self.fileName, cv2.WND_PROP_FULLSCREEN )

self.drawNumber(self.frame,fps,0)

cv2.imshow(self.fileName, self.frame)

if cv2.waitKey(10) & 0xFF == ord('q'):

break

 

frame += 1

fps = 1.0/(time.time() - start)

totalTime = time.time() - totalStart

avrgFps = frame/totalTime

print 'Frames: ' + str(int(frame))

print 'Time: ' + str(round(totalTime,2)) + 's'

print 'FPS: ' + str(int(avrgFps))

 

self.waitForAkey()

self.closeAll()

return

def closeAll(self):

self.cap.release()

cv2.destroyAllWindows()

return

def setAlgorithm(self,algorithm,args):

self.algorithmHandler = algorithm

self.algArgs = args

return

 

def waitForAkey(self):

while True:

if cv2.waitKey(10) & 0xFF == ord('q'):

return

def drawNumber(self,frame,number,roundNum):

string = 'FPS: ' + str(round(number,roundNum)) + 's'

scale = 0.3

white = (255,255,255)

black = (0,0,0)

pts = numpy.array([[0,0],[100,0],[100,30],[0,30]])

 

cv2.fillPoly(frame, [pts], black)

cv2.putText(frame,string,(10,10),self.font,scale,white)

return

raspberry_pi_capture:

# -*- coding: utf-8 -*-

import algorithms

import image

import video

import socket

CAPTURE_RES = (480,320)

SHOW_IMAGE = False

ALGORITHM = algorithms.shipFounder

ALG_ARGS = 140

def main():

 

obj = video.RaspPiCapture(CAPTURE_RES,SHOW_IMAGE)

obj.setAlgorithm(ALGORITHM,ALG_ARGS)

obj.run()

return

if __name__ == "__main__":

main()

algorithms.py:

import cv2

import image

import numpy as np

import socket

import time

TCP_IP = "192.168.1.101"

TCP_PORT = 5005

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((TCP_IP, TCP_PORT))

def threshold(img,threshold):

_,thresh = cv2.threshold(img[:,:,2],threshold,255,cv2.THRESH_BINARY)

return thresh

def shipFounder(img,threshold):

 

 

radius = max(img.shape[0]/256+1,3)

img = cv2.blur(img,(radius,radius))

_,thresh = cv2.threshold(img[:,:,1],threshold,255,cv2.THRESH_BINARY)

_,contours, hierarchy = cv2.findContours(

thresh,

cv2.RETR_CCOMP,

cv2.CHAIN_APPROX_NONE)

if len(contours) > 0:

contours = sorted(contours, key=len,reverse=True)

 

rect = cv2.minAreaRect(contours[0])

box = np.int0(cv2.boxPoints(rect))

 

cv2.drawContours(img,[box],0,(0,255,0),1)

middle = (box[0]+box[2])/2

cv2.circle(img, (middle[0],middle[1]), 2, (255,0,0),-1)

cv2.drawContours(img,contours,-1,(0,0,255),1)

 

mes=middle

s.listen(1)

conn, addr = s.accept()

print(mes)

data=np.array(mes[0],dtype=np.int32)

print('1')

x = data.tostring()

try:

conn.send(x)

except socket.error:

conn.close()

 

 

return img

##obj = image.Image('test.jpg',True)

##obj.setAlgorithm(shipFounder,200)

##obj.run()



Последнее изменение этой страницы: 2016-06-26; просмотров: 118; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.228.229.51 (0.009 с.)