iOS 蓝牙开发之NFC读写

如今便携设备越来越盛行,各设备、工具之间的通信及其产生的数据以更一种更有效的方式发挥出更大用途。为此,苹果放开了NFC的功能,但仅限于读的操作。本次记录:仅限于支持有蓝牙读卡相关设备的进行蓝牙NFC<公交卡>的相关读写操作。
在首页的置顶文章中有说到蓝牙相关的连接等操作,贴上地址:CoreBlueTooth相关

使用连接上的蓝牙设备在进行读写卡操作之前,理论上有进行相应一下几个操作:

  • 激活指令(在进行通道指令之前激活)
  • 通道指令(通道指令又分:读取指令,写卡指令)

1.寻卡操作:

/*

 通过NFC接口依次执行四条指令

 00A4000002DDF1

 00B0950808

 805C000204

 并保存四个指令的执行结果

 res1

    通过NFC指令判断卡片充值能否继续
    00A4000002DDF1
    00A4000002ADF1
    若返回值为6A81或6A82则可以继续

 res2

 res4

 羊城通卡号从res2中截取

 cardnum = res2.substring(6, 16);

 余额的计算

 hexbal = res4.substring(0, 8);

 bal = parseInt(hexbal, 16) / 100;

 */


a>选择指令类型:公交卡

b>选择指令类型:余额记录

c>验证卡片有效性:

d>读取余额指令:


e>使用记录指令:

读写卡过程中蓝牙设备接收数据小于等于20个字节,如下:

  • //发送数据相关

    -(Boolean)wtireDataToCharacteristic:(CBCharacteristic *)characteristic  writeData:(NSData *)writeData{

        if (self.currentPeripheral == nil) { //  当前活动的蓝牙设备字典

            return NO;

        }

        if (self.manager == nil) {

            return NO;

        }

        if (characteristic == nil) {

            return NO;

        }

        

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            int idx = 0;

            for (idx=0; idx+20 <= writeData.length; idx+=20) {

                NSRange range = NSMakeRange(idx, 20);

                NSData *sendTemp = [writeData subdataWithRange:range];

                

                writeFinishFlag = 0;

                [self.currentPeripheral writeValue:sendTemp forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];

                

                int i = 0;

                while (!writeFinishFlag && (++i < 20)){

                    [NSThread sleepForTimeInterval:0.001f];

                    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

                }

                NSLog(@"发送数据:%@", sendTemp);

            }

            

            if (writeData.length % 20 != 0) {

                NSRange range = NSMakeRange(idx, writeData.length % 20);

                NSData *sendTemp = [writeData subdataWithRange:range];

                

                writeFinishFlag = 0;

                [self.currentPeripheral writeValue:sendTemp forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];

                int i = 0;

                while (!writeFinishFlag && (++i < 20)){

                    [NSThread sleepForTimeInterval:0.001f];

                    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

                }

                NSLog(@"发送数据:%@", sendTemp);

            }

        });

        return YES;

    }

写卡操作涉及到公交卡公司相关指令<1.保密。2.加密协议获取动态指令>,但是具体相关的写卡操作会在后续更新。
待续~~~

你可能感兴趣的:(iOS 蓝牙开发之NFC读写)