评论

NFC接口读取ndf数据,写入数据解析参数示例

nfc使用ndef 标签写入参数解析示例

/**


 * 


 * @param {*stringToBuffer} str 


 *  将字符串转成 buffer 参数


 */


const stringToBuffer = function (str{


    // 首先将字符串转为16进制


    if (!str) {


        return new Uint8Array().buffer;


    }


    let val = ""


    for (let i = 0; i < str.length; i++) {


        if (val === '') {


            val = str.charCodeAt(i).toString(16)


        } else {


            val += ',' + str.charCodeAt(i).toString(16)


        }


    }


    // 将16进制转化为ArrayBuffer


    return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h{


        return parseInt(h, 16)


    })).buffer


}


let records = [{


    id: stringToBuffer(params.id),


    payload: stringToBuffer(params.payload + ""),


    type: stringToBuffer(params.type),


    tnf: params.tnf || 1


}];




/**


 * 


 * @param {*} arr 


 * 将读取的数据转换成字符串


 */


function byteToString(arr{


    if (typeof arr === 'string') {


        return arr;


    }


    var str = '',


        _arr = arr;


    for (var i = 0; i < _arr.length; i++) {


        var one = _arr[i].toString(2),


            v = one.match(/^1+?(?=0)/);


        if (v && one.length == 8) {


            var bytesLength = v[0].length;


            var store = _arr[i].toString(2).slice(7 - bytesLength);


            for (var st = 1; st < bytesLength; st++) {


                store += _arr[st + i].toString(2).slice(2);


            }


            str += String.fromCharCode(parseInt(store, 2));


            i += bytesLength - 1;


        } else {


            str += String.fromCharCode(_arr[i]);


        }


    }


    return str;


}






function ab2hex(buffer{
    var hexArr = Array.prototype.map.call(
        new Uint8Array(buffer),



        function (bit{
            return ('00' + bit.toString(16)).slice(-2)
        }
    )
    return hexArr.join('');
}


NFCAdapter.onDiscovered((res) => {



    console.log("onDiscovered res=>", res);



    if (!res.techs.includes(NFCAdapter.tech.ndef)) {
        return
    }





    let aid = parseInt(ab2hex(res.id), 16);



    // {id: ArrayBuffer(4), techs: Array(3)}



    if (res.messages) {
        let cordsArray = res.messages[0].records;
        cordsArray.find((item) => {
            let payload = byteToString(new Uint8Array(item.payload))
            let id = byteToString(new Uint8Array(item.id))
            let type = byteToString(new Uint8Array(item.type))
        })
    }
});


https://developers.weixin.qq.com/miniprogram/dev/framework/device/nfc.html


最后一次编辑于  2021-01-09  
点赞 2
收藏
评论

9 个评论

  • 王健
    王健
    2023-08-01
    let records = [{
      id: stringToBuffer('1'),
      type: stringToBuffer('U'),
      payload: stringToBuffer('-weixin://xxxxx'),
    },{
      id: stringToBuffer('2'),
      type: stringToBuffer('android.com:pkg'),
      payload: stringToBuffer('com.tencent.mm'),
    }];
    


    2023-08-01
    赞同
    回复
  • 王健
    王健
    2023-08-01

    我用这段代码写入nfc数据。

    android arr 的部分呢似乎不起作用。效果就是 ,ios 成功了。拉起小程序进入了对应的页面。

    但是android 的 没有反应。 无法拉起微信。


    2023-08-01
    赞同
    回复
  • 哇咔咔
    哇咔咔
    2023-05-24

    NFC定义的数据类型需要载荷内容被定义在RTD文档中, NFC论坛具体定义了以下RTD:

    1、NFC 文本RTD(T) ,可携带Unicode字符串。文本记录可包含在NDEF信息中作为另一条记录的描述文本。

    2、NFC URI RTD(U),可用于存储网站地址,邮件,和电话号码,存储成经过优化的二进制形式

    3、NFC 智能海报RTD(Sp),用于将URL,短信或电话号码编入NFC论坛标签,及如何在设备间传递这些信息。

    4、NFC 通用控制RTD。

    5、NFC 签名RTD。

    比如 url类型 是 85  使用
    String.fromCharCode(85) // U
    
    2023-05-24
    赞同
    回复
  • 还得是你呀
    还得是你呀
    2023-02-20

    就微信隔路,读个NFC还得这么费劲的解

    2023-02-20
    赞同
    回复
  • 元芳
    元芳
    2021-08-17

    大哥,请问一下为什么我使用这种写法会报错呢?

         const records = [{
                id: aid.buffer,
                payload: WriteBlockCommand.buffer,
                typenew Uint8Array([1]).buffer,
                tnfnew Uint8Array([2]).buffer,
            }];
            console.log(records[0])
              //写入
              ndef_adapter.writeNdefMessage({
                records: records,
                successfunction (res{
                  let data = new Uint8Array(res.data);
                  console.log(PageBlockNum,'写入成功, 接收数据如下:', res);
                },
                failfunction (err{
                  var end=new Date();
                  var time=end-begin;
                  console.log('写入失败', err,"time is=",time);
                }
              })
    


    错误信息:写入失败,parse NdefMessage failed,errcode:13012

    2021-08-17
    赞同
    回复 1
    • 同步
      同步
      2021-08-17
      2021-08-17
      回复
  • 七月上
    七月上
    2021-08-06

    大哥,这个可以读取身份证信息嘛?

    2021-08-06
    赞同
    回复 2
    • 同步
      同步
      2021-08-06
      这个不能的吧
      2021-08-06
      回复
    • 七月上
      七月上
      2021-08-06回复同步
      好吧,谢谢大哥
      2021-08-06
      回复
  • 光影寻梦
    光影寻梦
    2021-06-28

    很有用,已经解决了问题

    2021-06-28
    赞同
    回复
  • yanmingwei
    yanmingwei
    2021-04-12

    哥,您这代码里面没看到哪里有写数据的呀?求写数据代码。

    2021-04-12
    赞同
    回复 3
    • 同步
      同步
      2021-04-12
      2021-04-12
      1
      回复
    • 李豪
      李豪
      2021-06-18回复同步
      这里面的params.id、type、tnf都需要怎么传,我这边需要向设备发送一个字符串就行,该怎么配置这个四个参数
      2021-06-18
      回复
    • 同步
      同步
      2021-06-18
      字符串,你用
      2021-06-18
      回复
  • Trip
    Trip
    2021-01-14

    怎么读NDEF

    数据

    2021-01-14
    赞同
    回复 2
    • 同步
      同步
      2021-01-14
      我这边用的是 
      NFCAdapter.onDiscovered 这个接口读取的
      2021-01-14
      回复
    • 王同學
      王同學
      2023-08-15回复同步
      大哥,不返回messages nfc-a类型卡 这个坑知道怎么填吗
      2023-08-15
      回复
登录 后发表内容