Вы находитесь на странице: 1из 57

Copyright DASH7 Alliance

OpenTag: Ofce Hours


JP Norair
12 May 2011
jpnorair@indigresso.com
skype: jpnorair
Copyright DASH7 Alliance
OpenTag: Ofce Hours
JP Norair
12 May 2011
jpnorair@indigresso.com
skype: jpnorair
!Some information about DASH7 (for noobs)
!What you get [with OpenTag]
!Where to get it
!What you can do to help
!Project Roadmaps
!Answering your Questions
Copyright DASH7 Alliance
DASH7 Mode 2 is a 2nd Generation WSN/IoT/RFID Technology
Mode 2
433 MHz band
8 channels
Compact Stack
typ. 16KB
Optimized for
Micro Power
Optimized for
Low Latency
(Bursty Data)
Universal
Interoperability
Adaptive Data Rate
28 - 200 kbps
Very Fast
Multicast
Copyright DASH7 Alliance
About DASH7 Alliance
Specication Development
! Mode 2 (basically done)
! DNA Middleware layer
! NFC integration
! More
Market Development
ISO Stewardship
Go to dash7.org to see new membership
terms, and other information.
Next Meeting: 21 June
in San Francisco
Copyright DASH7 Alliance
What You Get [with OpenTag]
OpenTag is a very purpose-built OS that uses DASH7 I/O
OpenTag Component What it Does
Low Level Radio Driver PHY & MAC Control
System Event and Session Manager (OS-like)
Network Protocols (M2NP, M2DP, M2AdvP) Routing, Raw Data, Group Synchronization
Transport Protocols (M2QP) Query / Data Acquisition, Data Transfer
Filesystem Read, Write, Create, Delete, Etc.
Application Modules Built-in Apps (none yet)
C API Library functions (Programming apps in C on the same device)
Serial API(s) Client-Server (Communicating the apps via another device)
Copyright DASH7 Alliance
Where to Get it
Signup, Forums, Mailing List, other support Signup, Forums, Mailing List, other support
http://sourceforge.net/projects/opentag
Latest Code Download (use Git) Latest Code Download (use Git)
git clone git://opentag.sourceforge.net/gitroot/opentag/OpenTag_M2
OpenTag and Mode 2 Wiki (in continuous development) OpenTag and Mode 2 Wiki (in continuous development)
http://www.indigresso.com/wiki
Copyright DASH7 Alliance
Where to Get it
Signup, Forums, Mailing List, other support Signup, Forums, Mailing List, other support
http://sourceforge.net/projects/opentag
Latest Code Download (use Git) Latest Code Download (use Git)
git clone git://opentag.sourceforge.net/gitroot/opentag/OpenTag_M2
OpenTag and Mode 2 Wiki (in continuous development) OpenTag and Mode 2 Wiki (in continuous development)
http://www.indigresso.com/wiki
Dont understand Git?
Google is your friend
(Git documentation is good)
Copyright DASH7 Alliance
How You Can Help
Beta Testing Documenting
Core
Development
Copyright DASH7 Alliance
How You Can Help
Beta Testing Documenting
Core
Development
Currently about 3 Beta testers
(you know who you are: if you
want to be recognized, email me)
Download the code, compile,
and play with it. You will nd
bugs and have questions.
! Send messages on developers
mailing list (sourceforge).
! Skype me, for quick info
Copyright DASH7 Alliance
How You Can Help
Beta Testing Documenting
Core
Development
Currently about 3 Beta testers
(you know who you are: if you
want to be recognized, email me)
Download the code, compile,
and play with it. You will nd
bugs and have questions.
! Send messages on developers
mailing list (sourceforge).
! Skype me, for quick info
Currently just me (ofcially)
Requires a good understanding
of the code and specication
! My estimation: will take you
3-6 weeks to get here
Two possibilities
! OT library development
! Porting to other platforms
Copyright DASH7 Alliance
How You Can Help
Beta Testing Documenting
Core
Development
Currently about 3 Beta testers
(you know who you are: if you
want to be recognized, email me)
Download the code, compile,
and play with it. You will nd
bugs and have questions.
! Send messages on developers
mailing list (sourceforge).
! Skype me, for quick info
Currently just me (ofcially)
Requires a good understanding
of the code and specication
! My estimation: will take you
3-6 weeks to get here
Two possibilities
! OT library development
! Porting to other platforms
Currently just me
Requires a good understanding
of the code or specication
Many possibilities
! Wiki
! Formal documents
! Academic research papers
Copyright DASH7 Alliance
Feature Roadmap: Now it is a Race
Copyright DASH7 Alliance
Feature Roadmap: Now it is a Race
SS Pre-alpha & Alpha:
Module testing and simulation
(usually on PC)
Copyright DASH7 Alliance
Feature Roadmap: Now it is a Race
SS Pre-alpha & Alpha:
Module testing and simulation
(usually on PC)
SS Beta 0 (current):
Initial Platform Testing (CC430)
without Serial API, not all
features are complete
Copyright DASH7 Alliance
Feature Roadmap: Now it is a Race
SS Pre-alpha & Alpha:
Module testing and simulation
(usually on PC)
SS Beta 0 (current):
Initial Platform Testing (CC430)
without Serial API, not all
features are complete
SS Beta 1:
Testing platform(s) using Serial
API, and completion of all
features for version 1.0
Copyright DASH7 Alliance
Feature Roadmap: Now it is a Race
SS Pre-alpha & Alpha:
Module testing and simulation
(usually on PC)
SS Beta 0 (current):
Initial Platform Testing (CC430)
without Serial API, not all
features are complete
SS Beta 1:
Testing platform(s) using Serial
API, and completion of all
features for version 1.0
SS Beta 2:
Feature complete debug and
ofcial compliance testing
Copyright DASH7 Alliance
Feature Roadmap: Now it is a Race
SS Pre-alpha & Alpha:
Module testing and simulation
(usually on PC)
SS Beta 0 (current):
Initial Platform Testing (CC430)
without Serial API, not all
features are complete
SS Beta 1:
Testing platform(s) using Serial
API, and completion of all
features for version 1.0
SS Beta 2:
Feature complete debug and
ofcial compliance testing
SS Version 1.0:
Bundling of ofcial code
packages for platforms
Copyright DASH7 Alliance
Feature Roadmap: Now it is a Race
SS Pre-alpha & Alpha:
Module testing and simulation
(usually on PC)
SS Beta 0 (current):
Initial Platform Testing (CC430)
without Serial API, not all
features are complete
SS Beta 1:
Testing platform(s) using Serial
API, and completion of all
features for version 1.0
SS Beta 2:
Feature complete debug and
ofcial compliance testing
SS Version 1.0:
Bundling of ofcial code
packages for platforms
position
Copyright DASH7 Alliance
Planned Platform Support (Ofcial)
Beta 0:
CC430, POSIX Simulator
Beta 1:
Beta 0 + ADuCRF101 +
SX1231 Module
Beta 2:
No additional, planned
ofcial platforms
Copyright DASH7 Alliance
Planned Platform Support (Ofcial)
Beta 0:
CC430, POSIX Simulator
Beta 1:
Beta 0 + ADuCRF101 +
SX1231 Module
Beta 2:
No additional, planned
ofcial platforms
Ofcial just means that I personally
know it works. If you develop a
working platform and send one to
me, I will make it ofcial
Copyright DASH7 Alliance
Case Studies (Comprehensive Answers to Recently Asked Questions)
!How does OpenTag enable location derivation?
!Can OpenTag do multihop and mesh?
!How are events processed?
!How many simultaneous connections are supported?
!How is data stored and logged?
!What is the deal with wireless regulations at 433 MHz?
Copyright DASH7 Alliance
How does OpenTag
enable location derivation?
Copyright DASH7 Alliance
DASH7 Mode 2 Has Two Features that Enable Location Derivation
Feature 1: Normalized RSSI
Without Normalized RSSI
Devices need to know
congurations of all other
devices in the network
With Normalized RSSI
Devices in a network are free to
use different power outputs
Open Loop Closed Loop
Copyright DASH7 Alliance
DASH7 Mode 2 Has Two Features that Enable Location Derivation
Feature 1: Normalized RSSI
DASH7 Mode 2 Foreground Frame Architecture
Length
(Bytes)
TX EIRP
(0.5 dBm)
Subnet
Filter
Frame
Control
Other
Headers
Data
Payload
Footers
(crypto)
CRC
1 Byte 1 Byte 1 Byte 1 Byte 0-52 Bytes 0-249 Bytes 0-40 Bytes 2 Bytes
0-255 -40 to 23.5 (optional) (optional)
Mode 2 transmissions tell the
receiver how much power was used,
so the receiver can normalize the
RSSI dynamically
Copyright DASH7 Alliance
DASH7 Mode 2 Has Two Features that Enable Location Derivation
Feature 1: Normalized RSSI
DASH7 Mode 2 Foreground Frame Architecture
Length
(Bytes)
TX EIRP
(0.5 dBm)
Subnet
Filter
Frame
Control
Other
Headers
Data
Payload
Footers
(crypto)
CRC
1 Byte 1 Byte 1 Byte 1 Byte 0-52 Bytes 0-249 Bytes 0-40 Bytes 2 Bytes
0-255 -40 to 23.5 (optional) (optional)
Mode 2 transmissions tell the
receiver how much power was used,
so the receiver can normalize the
RSSI dynamically
This feature can be used to enable
location derivation and also to lter
out transmissions that are too far
away (congurable)
Copyright DASH7 Alliance
DASH7 Mode 2 Has Two Features that Enable Location Derivation
(2) Buferring Location Data
Location Coordinate
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Data may contain normalized RSSIs
from 1 to 3 antennas, and also angle
of incidence information
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes

coord N
coord 3
coord 2
coord 1
Location List
Location can be derived from
an algorithm that uses data
from multiple coordinates
Copyright DASH7 Alliance
DASH7 Mode 2 Has Two Features that Enable Location Derivation
(2) Buferring Location Data
Location Coordinate
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Data may contain normalized RSSIs
from 1 to 3 antennas, and also angle
of incidence information
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Flags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes

coord N
coord 3
coord 2
coord 1
Location List
Location can be derived from
an algorithm that uses data
from multiple coordinates
DASH7 does not specify the
algorithm to use, just the way
data is stored. The algorithm
is up to you!
Copyright DASH7 Alliance
OpenTag Implements Normalized RSSI
DASH7 Location
Features
Usage
Normalized RSSI
Angle of Incidence
Requires special HW, not
currently tested or
implemented in OpenTag
RSSI is implemented in the Radio
Driver. During any reception,
OpenTag buffers the non-
normalized RSSI value on each
antenna (typically 1) You can get it
by calling radio_rssi()
Copyright DASH7 Alliance
OpenTag Implements Normalized RSSI
DASH7 Location
Features
Usage
Normalized RSSI
Angle of Incidence
Requires special HW, not
currently tested or
implemented in OpenTag
RSSI is implemented in the Radio
Driver. During any reception,
OpenTag buffers the non-
normalized RSSI value on each
antenna (typically 1) You can get it
by calling radio_rssi()
OpenTag can be congured to
automatically normalize and
populate the location list.
Copyright DASH7 Alliance
OpenTag Implements Normalized RSSI
DASH7 Location
Features
Usage
Normalized RSSI
Angle of Incidence
Requires special HW, not
currently tested or
implemented in OpenTag
RSSI is implemented in the Radio
Driver. During any reception,
OpenTag buffers the non-
normalized RSSI value on each
antenna (typically 1) You can get it
by calling radio_rssi()
OpenTag can be congured to
automatically normalize and
populate the location list.
Your algorithm needs to read
this data and do the rest
Copyright DASH7 Alliance
One Example of Using RSSI for Location
Using large numbers of low-cost, battery-powered xed position nodes is cheap and precise
Fixed Position Node
Mobile Node
Node with Location Algorithm
(knows positions of xed nodes)
(packet data)
Copyright DASH7 Alliance
One Example of Using RSSI for Location
Using large numbers of low-cost, battery-powered xed position nodes is cheap and precise
(location list)
(derived location
of mobile node)
(packet data)
Copyright DASH7 Alliance
Can OpenTag [and DASH7]
do Multihop and Mesh?
Copyright DASH7 Alliance
DASH7 Mode 2 & OpenTag Support Limited Multihopping
DASH7s advanced query functionality and long range deprecate needs for complex hopping
One Hop Two Hops 3 to 15 Hops
Routing Support
Integration
All
Anycast Request
Unicast Response
Anycast Request
Unicast Response
Automated
Built-in, available to
application layer
Requires 3rd Party
routing table algorithm
Copyright DASH7 Alliance
DASH7 Mode 2 & OpenTag Support Limited Multihopping
DASH7s advanced query functionality and long range deprecate needs for complex hopping
One Hop Two Hops 3 to 15 Hops
Routing Support
Integration
All
Anycast Request
Unicast Response
Anycast Request
Unicast Response
Automated
Built-in, available to
application layer
Requires 3rd Party
routing table algorithm
If you want to build a mesh
network, you would need to
integrate a routing algorithm.
RPL is one example.
Enables simple repeaters
Copyright DASH7 Alliance
DASH7 Mode 2 Network Routing Template
Routable DASH7 Mode 2 frame, as seen by network protocol
Data Link Layer
(M2DLL)
Data Link Layer
(M2DLL)
Mode 2 Network Protocol Mode 2 Network Protocol
(M2NP)
Mode 2 Network Protocol
(M2NP)
Mode 2 Network Protocol M2DLL
Length
(Bytes)
Data Link
Headers
M2NLS
Header
Routing
Header
M2NP
Payload
M2NLS
Auth. Data
DLLS
Auth. Data
1 Byte 7-38 Bytes 1-25 Bytes 1-18 Bytes 0-245 Bytes 0-20 Bytes 0-20 Bytes
(optional) (optional) (optional) (optional)
For Data Link Layer
Security
For Network Layer
Security
Copyright DASH7 Alliance
DASH7 Mode 2 Network Routing Template
Routable DASH7 Mode 2 frame, as seen by network protocol
Data Link Layer
(M2DLL)
Data Link Layer
(M2DLL)
Mode 2 Network Protocol Mode 2 Network Protocol
(M2NP)
Mode 2 Network Protocol
(M2NP)
Mode 2 Network Protocol M2DLL
Length
(Bytes)
Data Link
Headers
M2NLS
Header
Routing
Header
M2NP
Payload
M2NLS
Auth. Data
DLLS
Auth. Data
1 Byte 7-38 Bytes 1-25 Bytes 1-18 Bytes 0-245 Bytes 0-20 Bytes 0-20 Bytes
(optional) (optional) (optional) (optional)
For Data Link Layer
Security
For Network Layer
Security
The Built-in two hop leverages the Origin and
Destination IDs, which are additional to the
Data Link Layer addressing (Source and Target)
Hop
Control
Hop
Extension
Origin
Device ID
Destination
Device ID
1 Byte 1 Byte 2/8 Bytes 2/8 Bytes
(optional) (optional) (optional)
Copyright DASH7 Alliance
Routing Functions in OpenTag Network Module
Function network_route_ff() is
automatically called by OpenTag when
parsing an incoming frame
! returns 0 if the frame is routed to this device
! returns positive number (corresponding to
routing table index) if frame is routed to a
known device
! returns -1 if frame should be discarded
Function m2np_header() writes a properly
routed M2NP header to a new frame.
! routing algorithm needs to store the routing
information in the m2np data structure, so
m2np_header() can use it.
! m2np data structure is exposed, so you can
put routing algorithm anywhere you want.
So, to implement sophisticated multihop or
mesh routing, you need to integrate your
routing table and routing algorithm into this
function, network_route_ff()
Copyright DASH7 Alliance
Routing Functions in OpenTag Network Module
Function network_route_ff() is
automatically called by OpenTag when
parsing an incoming frame
! returns 0 if the frame is routed to this device
! returns positive number (corresponding to
routing table index) if frame is routed to a
known device
! returns -1 if frame should be discarded
Function m2np_header() writes a properly
routed M2NP header to a new frame.
! routing algorithm needs to store the routing
information in the m2np data structure, so
m2np_header() can use it.
! m2np data structure is exposed, so you can
put routing algorithm anywhere you want.
So, to implement sophisticated multihop or
mesh routing, you need to integrate your
routing table and routing algorithm into this
function, network_route_ff()
Remember, normalized RSSI
information is already part of
DASH7, so routing algorithms
that use link budget data are
well suited.
Copyright DASH7 Alliance
How are events processed?
(and, how good is the event
timing resolution)
Copyright DASH7 Alliance
What is an Event?
(For those among us who are not software nerds)
An event is anything that causes a program to stop doing what it is doing,
and start doing something else.
A Timer expiring
Pushing a Button An API Call
Getting a Sensor
Reading
Some Examples
Copyright DASH7 Alliance
Events in OpenTag
OpenTag includes an event and task manager that runs parallel to the users application
When an event occurs, OpenTag takes control of the system in order to run the task associated with the
event. It gives back control when the Task is done (or when its idle)
Event
(Descending Priority)
Associated Tasks Notes
Internal RF interrupt
API Call
Sensor Detect
System Timer Expires
Low Level Radio Control Transparent to Application
Generate new request Application dependent
Generate new request Application dependent
Automated tasks:
- Listen for data
- Prepare response
- Send Beacon
[Mostly] Transparent to
Application
Copyright DASH7 Alliance
Events in OpenTag
OpenTag includes an event and task manager that runs parallel to the users application
When an event occurs, OpenTag takes control of the system in order to run the task associated with the
event. It gives back control when the Task is done (or when its idle)
Event
(Descending Priority)
Associated Tasks Notes
Internal RF interrupt
API Call
Sensor Detect
System Timer Expires
Low Level Radio Control Transparent to Application
Generate new request Application dependent
Generate new request Application dependent
Automated tasks:
- Listen for data
- Prepare response
- Send Beacon
[Mostly] Transparent to
Application
Needs a dedicated
timer resource.
For SoCs/SiPs,
totally transparent
Copyright DASH7 Alliance
What Actually Happens when an Event Occurs?
Any event must call sys_event_manager() in the system module
(system.c) in order to bind a task to the event that just occurred.
! System Timer Events are managed internally by OpenTag, so when the
system timer expires, the appropriate task is automatically processed.
! The system timer is always running. So events can be queued up
during OpenTag tasks (expired events are discarded).
Event
Occurs
Run Task
Event
Mgr checks
what task is
pending
No Task
Pending
Automated Tasks
(Descending Priority)
Radio RX/TX
Activate Session
Initialize Channel Scan
Send Beacon
Copyright DASH7 Alliance
How Fast is the Event Timing Resolution?
The OpenTag system timer runs at a resolution
of 1 tick, where 1 tick = 1/1024 sec
! Roughly 1 ms
! Allows usage of 32768 Hz crystal as source
There is another timer unit called a short tick
equal to 1/32768 sec (~30.5 s)
! Not used at all in OpenTag library (OTlib)
! Used only for internal radio processes,
although certain radios have internal timers
and dont need to use an MCU timer at all.
! All DASH7 processes are timed in ticks. So
short ticks are only necessary if you are an
optimizer and want to establish internal timer
offsets that are shorter than 1 tick.
The application layer, thus,
needs to have worst case
latency of 1 tick.
Since this is internal, you could use
another clock source and achieve a
higher resolution, but you would need to
write some new driver code.
Copyright DASH7 Alliance
How many simultaneous
connections are supported?
Copyright DASH7 Alliance
This Answer Depends on What You Mean by Connection
Answer: 1
! This is like cable-replacement, which is not
something DASH7 is designed to do well.
! Requires either complex time-slotting (like GSM,
Bluetooth) or even more complex MIMO
(802.11n, CDMA, OFDM) in order to support
multiple isochronous connections via wireless.
Connection Model 1
(Isochronous, streaming data)
Master
Slave Slave Slave
Copyright DASH7 Alliance
This Answer Depends on What You Mean by Connection
Answer: 1
! This is like cable-replacement, which is not
something DASH7 is designed to do well.
! Requires either complex time-slotting (like GSM,
Bluetooth) or even more complex MIMO
(802.11n, CDMA, OFDM) in order to support
multiple isochronous connections via wireless.
Connection Model 1
(Isochronous, streaming data)
Master
Slave Slave Slave
In Hardware language, this is
usually referred to as a bus
Copyright DASH7 Alliance
This Answer Depends on What You Mean by Connection
Answer: a lot (potentially 1000s)
! This is broadcast-query-respond, which DASH7
is designed to do especially well.
! Basic queries of thousands of devices can be
accomplished without much overhead.
! Follow-up dialogs with queried devices is limited
by available memory and idle-time conguration
Connection Model 2
(Bursty, queued data)
Node
Node Node
Node
Node
Collector
Copyright DASH7 Alliance
How is data stored
and logged?
Copyright DASH7 Alliance
Answer: The Built in Filesystem
GFB
(General File Block)
ISFB
(Indexed Short File Block)
Functions
Security
Max File Size
Max Files
Files used by DASH7
Searchable
Executable
File Structure
Read, Write, Create, Delete Read, Write, Create, Delete
POSIX-like, with optional crypto POSIX-like, with optional crypto
65 KB 255 Bytes
256 256
0 33 reserved
No Yes
Yes Yes
Binary (App. Dependent)
Byte-centric, Big-Endian + some les
have standardized structure
Copyright DASH7 Alliance
Using the OpenTag Filesystem (called Veelite)
In C, it is a lot like using the POSIX C library
! FILE* vlFILE*
! fopen() vl_open(), vl_new()
! fclose() vl_close()
! fgetc(), fputc() vl_read(), vl_write()
You can also access les by DASH7 itself,
using an Application Subprotocol (included in
OpenTag), as long as you have appropriate
user access to the les you want.
The Application Subprotocol for le access is
also used over a wire, for the Serial-API, if you
are connecting an OpenTag module to another
piece of HW.
Client
HW
Copyright DASH7 Alliance
What is the deal with wireless
regulations at 433 MHz?
Copyright DASH7 Alliance
433 MHz is Usually Available License-free (or cheaply)
Plus: no regulations in Antarctica!
FCC 15.231 & 240
North America uses the FCC
part 15 license-free spec
Limited ERC 70-03
Some countries use basically the
ERC 70-03 spec, but with certain
limitations (e.g. small fees)
required to use the spectrum.
ERC 70-03 (or similar)
Most countries in the world
use the EU/ISM 433 MHz
spec, or something similar.
Korea & Japan
have their own regulations for
license-free 433 MHz use
Copyright DASH7 Alliance
433 MHz Regulatory Policy Summary
Regulation Complexity Usage Notes Simplied Specication
FCC Part 15.231 High General Use
Spectrum: 420 - 450 MHz (20 MHz)
Max EIRP: highly variable, but effectively -2.4 dBm
Max Duty Cycle: highly variable, but effectively 50%
Max TX time: highly variable, but effectively 100 ms
Beacons: requires very low duty cycle, or alternatively ! -14.4 dBm
FCC Part 15.240 Moderate For Containers only
Similar to 15.231 but with simpler rules, no allowance for beacons,
and longer TX time permitted. In most cases it does not really
improve performance of DASH7 Mode 2 over 15.231.
ETSI ERC 70-03 Low General Use
Spectrum: 433.05 - 434.79 MHz (1.74 MHz)
Class 1: 0 dBm @ 100% duty cycle, max TX 36 sec.
Class 2: 10 dBm @ 10% duty cycle, max TX 36 sec, listen before talk
Korean ETRI Low General Use
Spectrum: 433.67 - 434.17 MHz (500 KHz)
Max EIRP: 0 dBm
Max Duty Cycle: 100%
Max TX time: 100 ms
(Note: for guidance only, I am not an expert on ETRI & RR)
Japanese RR Low Logistics only
Spectrum: 433.67 - 434.17 MHz (500 KHz)
Max EIRP: 0 dBm
Max Duty Cycle: 100%
Max TX time: 100 ms
(Note: for guidance only, I am not an expert on ETRI & RR)
Copyright DASH7 Alliance
How about
that one?
No way! I only
date guys who use
OpenTag
See you next time
Copyright DASH7 Alliance
How about
that one?
No way! I only
date guys who use
OpenTag
See you next time
Send more questions to:
jpnorair@indigresso.com
Subject: OpenTag Question

Вам также может понравиться