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:
| ATRIBUTO | DESCRIÇÃO | DOMÍNIO |
|---|---|---|
| result | R00 significa sucesso, qualquer outro valor significa falha. | String |
| detail | Mensagem de retorno. | String |
| data | Em 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.
Updated 3 months ago