Operações suportadas pelo Mifare

As operações suportadas pelo Mifare são as seguintes:

Detect

Operação responsável por ativar a antena e aguardar a aproximação de um cartão.

  • Retorno de sucesso: A intent de retorno conterá o parâmetro result, que é uma String com o valor “R00”, e o parâmetro data, que é um ByteArray contendo o identificador do cartão.
  • Retorno de erro: O parâmetro result retornará uma String com um valor diferente de “R00”, e o identificador do cartão não será retornado no parâmetro data.

Exemplo de chamada Detect:

 Intent("cielo.lio.cashless.mifare.DETECT")
    .setPackage("cielo.lio.cashless")
    .putExtra("cbType", 'B')
    .putExtra("cbPackage", packageName)
    .putExtra("cbAction", cbAction)
    .let(::startService)

O parâmetro cbType é customizável e pode ser personalizado conforme a necessidade. A resposta da intent não precisa, obrigatoriamente, ser tratada via Broadcast. Você pode escolher entre as seguintes opções:

  • B: Broadcast
  • S: Service
  • A: Activity

Authenticate

Operação responsável por autenticar-se no setor para que possa operar. É importante que a intent contenha as informações de setor, chave e tipo de chave (sector, key, keyType).

Exemplo de chamada Authenticate:

Intent("cielo.lio.cashless.mifare.AUTHENTICATE")
    .setPackage("cielo.lio.cashless")
    .putExtra("cbType", 'B')
    .putExtra("cbPackage", packageName)
    .putExtra("cbAction", cbAction)
    .putExtra("sector", "1".toByte())
    .putExtra("key", MifareClassic.KEY_DEFAULT)
    .putExtra("keyType", 'A')
    .let(::startService)

Read

Operação responsável por realizar a leitura nos blocos e setores. É importante que a intent tenha as informações de setor e bloco (sector, block).

Exemplo de chamada Read:

Intent("cielo.lio.cashless.mifare.READ")
    .setPackage("cielo.lio.cashless")
    .putExtra("cbType", 'B')
    .putExtra("cbPackage", packageName)
    .putExtra("cbAction", cbAction)
    .putExtra("sector", "1".toByte())
    .putExtra("block", "0".toByte())
    .let(::startService)

Write

Operação responsável por escrever em um setor e bloco específico. É importante adicionar na intent as informações de setor, bloco e data (sector, block e data).

Exemplo de chamada Write:

 Intent("cielo.lio.cashless.mifare.WRITE")
    .setPackage("cielo.lio.cashless")
    .putExtra("cbType", 'B')
    .putExtra("cbPackage", packageName)
    .putExtra("cbAction", cbAction)
    .putExtra("sector", "1".toByte())
    .putExtra("block", "0".toByte())
    .putExtra("data", "100".toByteArray())
    .let(::startService)

Increment

Operação responsável pelo incremento de valor em um bloco específico. É importante conter na intent as informações de setor, do bloco e valor (sector, block e value).

Exemplo de chamada Increment:

Intent("cielo.lio.cashless.mifare.INCREMENT")
    .setPackage("cielo.lio.cashless")
    .putExtra("cbType", 'B')
    .putExtra("cbPackage", packageName)
    .putExtra("cbAction", cbAction)
    .putExtra("sector", "1".toByte())
    .putExtra("block", "0".toByte())
    .putExtra("value", "5".toByte())
    .let(::startService)

Decrement

Operação responsável pelo decremento de valor em um bloco específico. É importante conter na intent as informações de setor, do bloco e valor (sector, block e value).

Exemplo de chamada Decrement:

 Intent("cielo.lio.cashless.mifare.DECREMENT")
    .setPackage("cielo.lio.cashless")
    .putExtra("cbType", 'B')
    .putExtra("cbPackage", packageName)
    .putExtra("cbAction", cbAction)
    .putExtra("sector", "1".toByte())
    .putExtra("block", "0".toByte())
    .putExtra("value", "5".toByte())
    .let(::startService)

Deactivate


Operação responsável pelo encerramento do serviço. Use quando estiver terminado.

Exemplo de chamada Deactivate:

Intent("cielo.lio.cashless.mifare.DEACTIVATE")
 .setPackage("cielo.lio.cashless")
 .putExtra("cbType", 'B')
 .putExtra("cbPackage", packageName)
 .putExtra("cbAction", cbAction)
 .let(::startService)

Backup e restore

Operações de transferência dos dados de um bloco para outro, também conhecida em algumas documentações do Mifare como transfer. É importante que a intent contenha informações de setor, bloco e bloco de destino (sector, block e destinationBlock).

Exemplo de chamada:

 Intent("cielo.lio.cashless.mifare.BACKUP")
    .setPackage("cielo.lio.cashless")
    .putExtra("cbType", 'B')
    .putExtra("cbPackage", packageName)
    .putExtra("cbAction", cbAction)
  .putExtra("block", "1".toByte())
  .putExtra("destinationBlock", "2".toByte())
    .let(::startService)

  Intent("cielo.lio.cashless.mifare.RESTORE")
    .setPackage("cielo.lio.cashless")
    .putExtra("cbType", 'B')
    .putExtra("cbPackage", packageName)
    .putExtra("cbAction", cbAction)
  .putExtra("block", "1".toByte())
  .putExtra("destinationBlock", "2".toByte())
    .let(::startService)

Retorno das operações

Os componentes responsáveis por tratar os retornos das operações podem variar, como broadcasts, services ou intents. Apesar das diferenças, todos compartilham um ponto em comum: o uso de uma intent como parâmetro. Essa intent deve conter os seguintes atributos:

ATRIBUTODESCRIÇÃODOMÍNIO
resultR00 significa sucesso, qualquer outro valor significa falha.String
detailMensagem de retorno.String
dataEm caso de operação de leitura, o parâmetro retorna o que foi lido do cartão, para outras operações o retorno é nulo.byteArray
ℹ️

Apresentamos uma classe de exemplo implementada em Kotlin que realiza o consumo da API do Mifare. Para essa demonstração, optamos por disponiblizar um exemplo de solução que trata o retorno das operações Mifare utilizando Broadcast. Clique aqui para ver exemplo de solução.


Did this page help you?