/**
*
* @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
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'), }];
我用这段代码写入nfc数据。
android arr 的部分呢似乎不起作用。效果就是 ,ios 成功了。拉起小程序进入了对应的页面。
但是android 的 没有反应。 无法拉起微信。
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
就微信隔路,读个NFC还得这么费劲的解
大哥,请问一下为什么我使用这种写法会报错呢?
const records = [{ id: aid.buffer, payload: WriteBlockCommand.buffer, type: new Uint8Array([1]).buffer, tnf: new Uint8Array([2]).buffer, }]; console.log(records[0]) //写入 ndef_adapter.writeNdefMessage({ records: records, success: function (res) { let data = new Uint8Array(res.data); console.log(PageBlockNum,'写入成功, 接收数据如下:', res); }, fail: function (err) { var end=new Date(); var time=end-begin; console.log('写入失败', err,"time is=",time); } })
错误信息:写入失败,parse NdefMessage failed,errcode:13012
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 p = stringToBuffer("1");
let k = new Uint8Array([1]).buffer;
console.log("p=>", p);
console.log("k=>", k);
你看下结果还是有区别的,records Array 否 二进制对象数组, 需要指明 id, type 以及 payload (均为 ArrayBuffer 类型)
https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.writeNdefMessage.html
大哥,这个可以读取身份证信息嘛?
很有用,已经解决了问题
哥,您这代码里面没看到哪里有写数据的呀?求写数据代码。
function writeNdefMessage() {
let records = [{
id: stringToBuffer(params.id),
payload: stringToBuffer(params.payload + ""),
type: stringToBuffer(params.type),
tnf: params.tnf || 2
}];
self.Ndef.writeNdefMessage({
records: records,
success(res) {
console.log("writeNdefMessage res=>", res)
// capture=> {errMsg: "connect:fail:system internal error", errCode: 13017}errCode: 13017errMsg: "connect:fail:system internal error"__proto__: Object 相关读写操作失败
// self.NdefClose();
if (typeof callback == "function") {
callback({
status: true,
aid: self.aid,
payload: self.payload,
id: self.id,
type: self.type,
});
}
},
fail(err) {
console.log("writeNdefMessage err=>", err)
// self.ERROR(err,params);
if (typeof callback == "function") {
callback(Object.assign({
status: false,
}, err));
}
}
})
}
params = {
id: "",
payload: this.data.sendStr || "123456",
type: "",
tnf: 1,
}
怎么读NDEF
数据
NFCAdapter.onDiscovered 这个接口读取的