Microsoft Tag este implementarea tehnologiei Microsoft High Performance Color Barcode (detalii despre aici: http://en.wikipedia.org/wiki/Microsoft_Tag).
Ce este pe scurt? Este un barcode 2D foarte lizibil, ce poate fi citit de cam practic toate smartphones (de la iPhone la Nokia) de pe piata care au camera.
Implementarea Microsoft Tag a HCCB "codeaza" in barcode un link, sau un contact card sau un numar/text.
Problema cea mare, pina acuma, era ca aceste barcode se puteau crea si rendera numai pe site Microsoft Tag http://en.wikipedia.org/wiki/Microsoft_Tag http://www.microsoft.com/tag/ (better link
).
Dar intre timp s-a deschis o cale sa se faca aceste lucruri si programatic, folosind Microsoft Tag Web Services. Si hai sa incercam sa vedem daca ce zic la Microsoft Tag Developer Center (http://www.microsoft.com/tag/content/support/developer/) asa si e.
Pas 1 e obtinerea uni API key http://tag.microsoft.com/ws/accessrequest.aspx?wa=wsignin1.0. Am presupus ca sintem deja inregistrati pe site Microsoft Tag (asta e doar o asociere Live ID la site).
Vrem sa facem o aplicatie consola cu care sa creeze un tag pentru un link specificat (parametru linie de comanda 2), cu numele specificat (parametru linie de comanda 1), in categoria specificata (parametru linie de comanda 3) folosind API key (token) specificat (parametru linie de comanda 4), si sa faca render la el.
O sa incerc sa folosesc cit mai mult din codul exemplu dat in How To (https://ws.tag.microsoft.com/howto/) pentru conciziune.
Facem un proiect consola nomal. Nu cred ca are rost sa insist cum se face.
Adaugam o referenta la serviciu https://ws.tag.microsoft.com/MIBPService.wsdl

Acuma ca avem referinta putem sa trecem la treaba.
Sa vedem cum as face eu codul de facut o categorie
/// <summary>
/// Creates a category.
/// </summary>
/// <param name="categoryName"> The name of the category used
/// to organize tags. </param>
/// <param name="accessToken">The API key.
</param>
private static void CreateCategory(string categoryName, string accessToken)
{
try
{
MIBPContractClient OMIBPClient = new MIBPContractClient();
UserCredential oCredential = new UserCredential();
oCredential.AccessToken = accessToken;
Category oCat = new Category();
oCat.Name = categoryName;
oCat.UTCStartDate = DateTime.Now;
//Not specified so until the end of the world
//oCat.UTCEndDate = new DateTime(yyyy, mm, dd);
OMIBPClient.CreateCategory(oCredential, oCat);
}
catch (Exception Ex)
{
Console.WriteLine(Ex.Message);
throw;
}
}
E destul de codul, ar fi de comentat ca si categoriile au date de existenta, daca gindim ca s-a vizat si zona de advertising, conferinte unele tag nu ar trebui sa fie active in afara unor date.
Sa facem si un tag acuma
/// <summary>
/// Creates a tag.
/// </summary>
/// <param name="tagName">The tag name.</param>
/// <param name="targetUrl">The link "encoded" in tag.</param>
/// <param name="categoryName">The name of the category where
/// the tag will pe placed.</param>
/// <param name="accessToken">The API key.</param>
private static void CreateTag(string tagName, string targetUrl, string categoryName, string accessToken)
{
try
{
MIBPContractClient OMIBPClient = new MIBPContractClient();
UserCredential oCredential = new UserCredential();
oCredential.AccessToken = accessToken;
URITag uriTag = new URITag();
uriTag.Title = tagName;
uriTag.MedFiUrl = targetUrl;
uriTag.UTCStartDate = DateTime.Now;
//Not specified so until the end of the world
//uriTag.UTCEndDate = new DateTime(yyyy, mm, dd);
OMIBPClient.CreateTag(oCredential, categoryName, uriTag);
}
catch(Exception Ex)
{
Console.WriteLine(Ex.Message);
throw;
}
}
La fel codul zic ca e relativ clar. Ce e mai nebulos este relatia dintre intervalul de timp al categorie si al tag. Din cite am incercat o categorie nu poate contine tags care sint valabile in afara perioadei ei de valabilitate.
Ok am facut barcodes dar cum le obtin si le folosesc(salvez pe disk printez etc)?
/// <summary>
/// Renders a barcode.
/// </summary>
/// <param name="tagName">The name of the tag to be rendered.</param>
/// <param name="categoryName">The category where the tag is placed.</param>
/// <param name="accessToken">The API key.</param>
/// <remarks>The result is jpeg placed on C drive root named MsTag.</remarks>
private static void RenderBarcodeAsJpeg(string tagName, string categoryName, string accessToken)
{
try
{
MIBPContractClient OMIBPClient = new MIBPContractClient();
UserCredential oCredential = new UserCredential();
oCredential.AccessToken = accessToken;
byte[] oBarcode = OMIBPClient.GetBarcode(oCredential, categoryName, tagName,
ImageTypes.jpeg, (float)0.75,
DecorationType.HCCBRP_DECORATION_NONE,
false);
//render the oBarcode byte array into an image.
FileStream fileStream = new FileStream("C:\\MsTag.jpg", FileMode.Create, FileAccess.Write);
fileStream.Write(oBarcode, 0, oBarcode.Length);
fileStream.Close();
}
catch (Exception Ex)
{
Console.WriteLine(Ex.Message);
throw;
}
}
Aici e poate interesant de explicat parametrii de la GetBarcode (care daca nu am fost clar sint aceeasi ca parametrii de randare de pe site)
ImageTypes spune ca ce vrem sa randam imaginea, poate fi jpeg, tiff, gif, png, wmf, pdf.
(float)0.75 e dimensiunea imaginii randate in inch, de la 0,75 la 2.
DecorationType spune cum vrea sa arate tag-ul, adica cu doar barcode sau border cu instructiuni, mai simplu sau nu etc.
false e parametrul bool care spune ca vrem un sa fie alb negru sau color (false). Da, High Performance Color Barcode merge si alb negru
, cool nu?
Acuma sa asamblam cele 3 metode in un program consola nu cred ca trebuie explicat, e doar un caz de citit parametrii din linia de comanda si pasat la metode.
static void Main(string[] args)
{
if(args.Length == 4)
{
CreateCategory(args[2], args[3]);
CreateTag(args[0], args[1], args[2], args[3]);
RenderBarcodeAsJpeg(args[0], args[2], args[3]);
}
else
{
Console.WriteLine("Usage exe tagName targetUrl categoryName accessToken");
}
}
Sa rulam programelul cu parametrii astia
MyBlog http://ronua.ro/CS/blogs/catalin/default.aspx Samples xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
Si sa vedem ce am obtinut

Verificam si pe site sa vedem acolo ce se intimpla

Si avem categoria Samples si tag MyBlog. Ca tag e corect va las pe voi sa verificati
.
Note din aceasta aventura:
Nu am cum sa verific daca un tag sau o categorie exista. Doar daca procesez exceptiile, dar nu cred ca e critica problema.
Tags si categoriile sint create in contul de pe site Microsoft Tag asociat API key. Nu pot creea in contul altuia, sa zicem ca as vrea sa creez in contul firmei folosind API key meu.
Si 3 care va arata ca e bine sa cititi pina la capat, se plimba ceva date ca volum(de exemplu la randare). Si deci ca sa mearga aplicatia ar fi frumos sa faceti aceste modificari in app.config (eu am pus un 1 inaintea valorii default
).
<basicHttpBinding>
<binding name="BasicHttpBinding_IMIBPContract"
...maxBufferSize="165536" ... maxReceivedMessageSize="165536">
...
<readerQuotas ... maxArrayLength="116384"
...
OK Exista si un help privitor la API http://tag.microsoft.com/apihelp/, e cam Microsoft
. How To mentionat mai sus e in schimb OK.
Ei ati vazut ca nu e greu, e chiar banal? Si HCCB e una din cele mai inovative si game changing tehnologii de la Microsoft in vremurile recente.
Si daca ai API cite aplicatii faine poti sa faci? Eu zic sky is the limit, si indemnul meu e: ce mai stati cereti un API Key si faceti aplicatii.
Late edit: Acuma ca Zoli ne-a citit http://zoli.herczeg.ro/2010/02/22/microsoft-tag-web-services/ (Multumim!), am corectat ceva typos si continui cu intrebare, sa pun si sursele? Sau e destul de clar cum si ce se asambleaza?
Posted
Sun, Feb 21 2010 10:15 PM
by
MrSmersh