building dash7 apps with opentag
DESCRIPTION
Excellent primer on the DASH7 open source firmware environment called OpenTag that now supports DASH7 Mode 2, which enables multi-hop communications, better crypto and sensor support, multi-channel architecture, and much more in a very small (sub 20kb) stack.TRANSCRIPT
Copyright © DASH7 Alliance
OpenTag: Office Hours
JP Norair 12 May 2011
[email protected]: 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 band8 channels
Compact Stacktyp. 16KB
Optimized forMicro Power
Optimized forLow Latency(Bursty Data)
Universal Interoperability
Adaptive Data Rate28 - 200 kbps
Very FastMulticast
Copyright © DASH7 Alliance
About DASH7 Alliance
• Specification 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 Junein 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 supportSignup, 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 supportSignup, 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
Don’t understand Git? Google is your friend
(Git documentation is good)
Copyright © DASH7 Alliance
How You Can Help
Beta Testing DocumentingCore
Development
Copyright © DASH7 Alliance
How You Can Help
Beta Testing DocumentingCore
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 find 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 DocumentingCore
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 find bugs and have questions.
‣ Send messages on developers mailing list (sourceforge).
‣ Skype me, for quick info
• Currently just me (officially)
• Requires a good understanding of the code and specification
‣ 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 DocumentingCore
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 find bugs and have questions.
‣ Send messages on developers mailing list (sourceforge).
‣ Skype me, for quick info
• Currently just me (officially)
• Requires a good understanding of the code and specification
‣ 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 specification
• 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
official 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
official compliance testing
SS Version 1.0:Bundling of official 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
official compliance testing
SS Version 1.0:Bundling of official code packages for platforms
position
Copyright © DASH7 Alliance
Planned Platform Support (Official)
Beta 0:CC430, POSIX Simulator
Beta 1:Beta 0 + ADuCRF101 +
SX1231 Module
Beta 2:No additional, planned
“official” platforms
Copyright © DASH7 Alliance
Planned Platform Support (Official)
Beta 0:CC430, POSIX Simulator
Beta 1:Beta 0 + ADuCRF101 +
SX1231 Module
Beta 2:No additional, planned
“official” platforms
“Official” just means that I personally know it works. If you develop a
working platform and send one to me, I will make it official
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 DerivationFeature 1: Normalized RSSI
Without Normalized RSSIDevices need to know
configurations of all other devices in the network
With Normalized RSSIDevices 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 DerivationFeature 1: Normalized RSSI
DASH7 Mode 2 Foreground Frame ArchitectureLength(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 DerivationFeature 1: Normalized RSSI
DASH7 Mode 2 Foreground Frame ArchitectureLength(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 filter out transmissions that are too far
away (configurable)
Copyright © DASH7 Alliance
DASH7 Mode 2 Has Two Features that Enable Location Derivation(2) Buferring Location Data
Location CoordinateFlags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Data may contain normalized RSSI’s 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 ListLocation 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 CoordinateFlags Device ID Loc. Data
1 Byte 2/8 Bytes 3 Bytes
Data may contain normalized RSSI’s 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 ListLocation 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 RSSIAngle 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 RSSIAngle 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 configured to automatically normalize and
populate the location list.
Copyright © DASH7 Alliance
OpenTag Implements Normalized RSSI
DASH7 Location Features
Usage
Normalized RSSIAngle 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 configured 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 LocationUsing large numbers of low-cost, battery-powered fixed position nodes is cheap and precise
Fixed Position Node
Mobile Node
Node with Location Algorithm (knows positions of fixed nodes)
(packet data)
Copyright © DASH7 Alliance
One Example of Using RSSI for LocationUsing large numbers of low-cost, battery-powered fixed 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 MultihoppingDASH7‘s 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
AutomatedBuilt-in, available to
application layerRequires 3rd Party
routing table algorithm
Copyright © DASH7 Alliance
DASH7 Mode 2 & OpenTag Support Limited MultihoppingDASH7‘s 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
AutomatedBuilt-in, available to
application layerRequires 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 protocolData Link Layer
(M2DLL)Data Link Layer
(M2DLL)Mode 2 Network ProtocolMode 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 protocolData Link Layer
(M2DLL)Data Link Layer
(M2DLL)Mode 2 Network ProtocolMode 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 user’s 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 it’s 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 user’s 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 it’s 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 SoC’s/SiP’s, 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 don’t 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 1000’s)
‣ 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 configuration
Connection Model 2(Bursty, queued data)
Node
Node Node
Node
NodeCollector
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, DeleteRead, Write, Create, Delete
POSIX-like, with optional cryptoPOSIX-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 files 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 files by DASH7 itself, using an Application Subprotocol (included in OpenTag), as long as you have appropriate user access to the files you want.
• The Application Subprotocol for file 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 & 240North America uses the FCC
part 15 license-free spec
Limited ERC 70-03Some 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 & Japanhave their own regulations for
license-free 433 MHz use
Copyright © DASH7 Alliance
433 MHz Regulatory Policy Summary
Regulation Complexity Usage Notes Simplified Specification
FCC Part 15.231 High General Use
Spectrum: 420 - 450 MHz (20 MHz)Max EIRP: highly variable, but effectively -2.4 dBmMax Duty Cycle: highly variable, but effectively 50%Max TX time: highly variable, but effectively 100 msBeacons: requires very low duty cycle, or alternatively ! -14.4 dBm
FCC Part 15.240 Moderate For Containers onlySimilar 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 UseSpectrum: 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 dBmMax 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 dBmMax 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:[email protected]
Subject: “OpenTag Question”