RFID tags now work on metal

There has been a long standing rumor in the marketplace that RFID tags are not compatible with metal surfaces. While this may have been true at one time, new developments in the technology make this a problem of the past.

A number of vendors now make metal mount RFID tags, this month ODIN technologies has published a benchmark study of different products that are now available in the marketplace which make metal mounting possible.

Many companies who have wanted to utilize RFID have hedged because of this problem. The tags in the study were read in operational settings where metal surfaces such as shelves or server racks were present and potentially inhibit successful tag reads. You can see the study here. In short, the following tags were tested and deemed appropriate for adhesion to metal surfaces:
  • Avery Dennison: AD-900, AD-902, AD-908
  • Confidex: Halo, Ironside, Steelwave
  • Emerson & Cummings: Ecopad
  • Intermec: Large Rigid, Small Rigid
  • Omni-ID: Flex, Micro, Mini
  • Sontec: C0101, P01016BTTROI: MMT-3001, MMT-3004, PC-102
You can read the report here:

Metal Mount RFID Tags Benchmarked By ODIN Technologies

How can BizTalk and RFID work together?

Radio Frequency Identification tags (RFID) are becoming widely adopted by business as a cost cutting tool. BizTalk Server is also widely adopted for its ability to integrate systems and by proxy cut costs. BizTalk is ideal for RFID solutions to transition the physical event to a digital process in an automated way. Let’s take a look at a real world example of how they can work together.

BizTalk interfaces with RFID in one of 2 ways:
  • At the moment an RFID tag is printed
  • At the moment an RFID tag is read

BizTalk initiates and correlates a print job

Let’s say you manufacture computers, and your computers are made to order. You want to make sure your customer gets the computer they actually ordered, so it’s important to identify it.

So your customer places an order on your B2B website. A BizTalk workflow is initiated that gathers up all the requirements for the order and passes it on to the ERP system for fulfillment. Once the ERP system shows the order fulfilled, BizTalk is then tasked with tagging the machine for delivery. BizTalk initiates the printing of the RFID tag and correlates it to that specific order; the printed sticker is attached to the new computer.

RFID and BizTalk initiate the delivery cycle

So the new computer is built, checked and packaged for delivery. A truck arrives at the loading dock, and a forklift places a load of orders on a palette and moves it to the loading bay. While in the process of loading the palette on the truck the passive RFID tags pass under an RFID reader.

This action is sensed by BizTalk because the RFID reader is attached to a BizTalk server which is ‘subscribed’ for listening to messages from that reader and kicks off an advanced shipping notice message to the client. At the same time, BizTalk checks to make sure that the RFID reader’s location matches the truck in that location to make sure the correct truck is delivering the order. The advanced shipping notice is received by the customer to notify them their order is on its way, and the invoicing process begins.


Uh oh, one year later, computer breaks

So your company has a great warranty plan and unfortunately something went wrong with that computer that was purchased a year ago. How can RFID be of help?

Well, your call center logs a call and BizTalk receives a message that this computer (with a known RFID tag) will be sent to the service center to be repaired. Eventually it will arrive and when it does, the RFID reader at the shipping dock will recognize the tag and notify BizTalk of its arrival. BizTalk updates the call center’s call with this status. The customer can now know the computer arrived for repair.

A technician is assigned to the repair, and BizTalk passed the details of this computer to that technicians work queue.

BizTalk waits for the repair to take place and notifies the call center when it’s complete. The computer is working again and needs to be sent back to the client.

The RFID tagged computer goes under an RFID reader when it’s being loaded and same ‘workflow’ that happened when the computer was originally sent takes place with an advanced shipping notice and, since its under warranty, a 0$ invoice is created.

Automation

If you’ll notice, all the steps here took place with almost no human intervention. There was no person at the loading dock checking off shipments, nobody faxing invoices or shipping notices, and nobody needed to reconcile the shipments at the end of the day.

If it were just BizTalk being used, some level of automation would be present, but with the combination of BizTalk and RFID, it’s possible to automate it all and that is where using them together is such a cost saver: less human interaction means less man-hours and fewer mistakes.

Microsoft acquires Covast's B2B technology

Microsoft has acquired Covast's advanced B2B technology to make it available as part of upcoming BizTalk Server 2006 R3 release.

The acquisition is expected to merge into R3 as superset of pieces to BizTalk Server 2006 R2's EDI component.

R3 will retain the current R2 functionality but will be more tightly integrated with Covast's reporting capabilities and adapters. Covast's B2B expertise will be expected to add value in specific verticals such as automotive, energy, manufacturing. Let all your Covast clients know.

http://www.covast.com/news/press.asp?id=91

How To Expose the BTS ReceiveLocationName Property

There are some BizTalk properties that are not exposed in any property schemas from BTS 2006 R2. If your development project is such that you can add a new property schema or add a new BizTalk project then it is possible to access these properties from an orchestration. Because they are context properties they are not available for routing.

One such property is the ReceiveLocationName property. While the ReceivePortName property is available in the BTS namespace the ReceiveLocationName property is not. Therefore, this syntax from an example orchestration expression shape results in a compile time error:  strReceiveLocation = myMsg(BTS.ReceiveLocationName);

ReceiveLocationName Property

We can easily see the ReceiveLocationName property in messages that come into BizTalk. The question is how to get its value into an orchestration?

 

Code Example

As you probably know, property values are identified by the property target namespace and property name. We won't ultimately use the following code, but for demonstration purposes in a custom pipeline component we can assess a property value by coding something like this:

// Namespace of the property
//
string
sysNamespace = 
    "http://schemas.microsoft.com/BizTalk/2003/system-properties";
 
// Or instead of hard coding the namespace:
// Assuming the property namespace for ReceivePortName is the same
// for ReceiveLocationName:
//
BTS.ReceivePortName BTSPropReceivePortName = new BTS.ReceivePortName();
sysNamespace = BTSPropReceivePortName.Name.Namespace; 
 
// Assign the receive location name
//
string
receiveLocationName = 
    pInMsg.Context.Read("ReceiveLocationName", sysNamespace);

You can see from the last line of code from above, that to retrieve a message property requires nothing more than knowing the property name and the property target namespace.

Adding a Property Schema

As far as BTS message properties go, they can be assigned Property Schema Base types of MessageDataPropertyBase (default) or MessageContextPropertyBase. MessageDataPropertyBase means that the XPath to the property value in the message must exist. A MessageContextPropertyBase property means that the XPath may or may not exist.

Taking this information into account we can expose the RecieveLocationName using the following steps. Note steps 1 – 4 are just suggestions.

1. Create a property schema, and perhaps create a new BizTalk project.

2. Add a new property schema. Let’s call it “schBTSExtra.xsd”.

3. Change the namespace of the .NET schema type to “BTSExtra”. This is just a shortened namespace similar to the “BTS” namespace in the Microsoft.BizTalk.GlobalPropertySchemas assembly.

4. Open the new schema if it is not already opened.

5. Change the name of Property1 (it was added by default when creating the new property schema) to ReceiveLocationName.

6. Set the Property Schema Base to MessageContextPropertyBase.

7. Highlight the “Schema” node and change the schema’s Target Namespace to
http://schemas.microsoft.com/BizTalk/2003/system-properties

8. Compile the project.

Property Schema Example

That’s all there is to it… now in your orchestration after referencing the new schema project (or you added this schema directly to your orchestration project) you can use an expression such as:

// Trace output from an orchestration expression shape
//
traceMsg = purchaseOrder(BTSExtra.ReceiveLocationName);
if
(traceMsg == null)
{
    traceMsg = "<null>";
}
System.Diagnostics.Trace.WriteLine("Receive Location Name: " + traceMsg);

Here is the result when testing my own orchestration:



External Links from MSDN

RecieveLocationName missing and a workaround

I've had the situation recently where I wanted to set up a receive port and have a large number of receive locations feeding into this port. In normal scenario this works fine but in my case it did not and had to find a workaround for it.

The reason the scenario above did not work is because I needed to know the receive location's name that the message came in on and the only property available from the context within an orchestration is BTS.ReceivePortName which is the same for all the locations.

I did some digging and for some alternatives, one was a custom pipeline which found and promoted the property "ReceiveLocationName", the second was a message context functoid on CodePlex which could retrieve this value from within a map. I didn't like either option and tried to widdle the code from the functoid into something I could use in a small helper class method or even the expression shape. I got the code to work but could never seem to find the ReceiveLocationName property I'd seen mentioned on other blogs. My guess is that it only appears with certain adapters but I couldn't even find it in any of the BizTalk schemas.

I decided to make a U-turn from this custom approach because I was just replacing a large number of receive ports with custom code. So instead of the custom approach I'd been working on I decided to make the initial receive shape in the orchestration direct bound and create 1-n ports which I could leverage in the orchestration without knowing the ReceiveLocationName.