RONUA
ROmanian .NET User Association --- Asociaţia Romană a Utilizatorilor .NET
Comunitatea dezvoltatorilor software pe .NET Framework
Getting started with Microsoft Tag Web Services

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 Smile).
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 Smile, 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 Smile.

 

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 Smile).  

<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 Smile. 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

Comments

tudor.t wrote re: Getting started with Microsoft Tag Web Services
on Mon, Feb 22 2010 9:37 AM

Sa inteleg ca nu exista o modalitate de a genera tag-ul in intregime pe propriul web server (fara a depinde de web service-ul de la Microsoft) ?

MrSmersh wrote re: Getting started with Microsoft Tag Web Services
on Mon, Feb 22 2010 11:54 AM

Well generarea si descifrarea se face doar prin serverele MS, in cazul Microsoft Tag. Am inteles (am vazut un studiu de caz a unei aplicatii interne Microsoft Smile) ca pe undeva exista o biblioteca HCCB si atunci ai independenta de serverele MS... Dar nu e publica acea biblitoteca.

MrSmersh wrote re: Getting started with Microsoft Tag Web Services
on Mon, Feb 22 2010 12:02 PM

Si sa subliniez, pina acuma aveai nevoie de tag trebuia de mina sa mergi pe site si sa iti faci tag-ul, acuma site iti ofera un web service sa faci astea. Si pentru 80% din aplicatii zic ca e indeajuns. Da as vrea si eu full control, dar si asa ma descurc si inca foarte bine Smile

Catalin's Blog wrote Microsoft Tag Takes Off
on Thu, May 27 2010 7:23 PM

sau iara ma lasa Zoli sa fac anunturi din astea faine Vestea zilei prin lumea de mobile, din punctul

(c) RONUA 2004-2009
Powered by Community Server (Commercial Edition), by Telligent Systems