diff --git a/entry/src/main/ets/common/service/usbService.ts b/entry/src/main/ets/common/service/usbService.ts index 10a2f615..2d44dc05 100644 --- a/entry/src/main/ets/common/service/usbService.ts +++ b/entry/src/main/ets/common/service/usbService.ts @@ -1,15 +1,9 @@ // 导入USB接口api包。 import usb from '@ohos.usbManager'; +const LOGTAG = 'USBSERVICES' -function stringToUint8Array(str){ - var arr = []; - for (var i = 0, j = str.length; i < j; ++i) { - arr.push(str.charCodeAt(i)); - } - var tmpUint8Array = new Uint8Array(arr); - return tmpUint8Array -} +//字符串转字节 function stringToArr(str){ var arr = []; for (var i = 0, j = str.length; i < j; ++i) { @@ -18,61 +12,81 @@ function stringToArr(str){ return arr } +//plc数据转成无锡科研所usb字节数据 +function plcStrToWXCodeArr(wuXiDataStr){ + const arr = stringToArr(wuXiDataStr); + //数据包总长度 有效长度 + let packetSize = 65,maxDataSize = 63; + let packetArr = [] + const loop = Math.ceil(arr.length / maxDataSize) + for(let i = 0; i< loop; i++){ + const thisPacket = arr.slice(i * maxDataSize,(i + 1) * maxDataSize) + const oSize = maxDataSize - thisPacket.length; + //补齐0x00 + if(oSize > 0){ + let oSizeArr = [] + for(let j = 0;j < oSize;j++){oSizeArr.push(0)} + // packetArr.push([0,thisPacket.length].concat(thisPacket).concat(oSizeArr)); + }else{ + packetArr.push([thisPacket.length].concat(thisPacket)); + } + } + return packetArr +} + const initUsbServicesFn = () => { // 获取设备列表。 let deviceList : Array = usb.getDevices(); deviceList.forEach(async (device:usb.USBDevice) => { const {vendorId,productId} = device; - console.log('surenjun',JSON.stringify(device)); + console.log(LOGTAG,JSON.stringify(device)); //无锡所检测设备接入 if(vendorId === 6790 && productId === 58409){ // if(vendorId === 2385 && productId === 5734){ // 申请操作指定的device的操作权限。 try { - + let bool = usb.hasRight(device.name); + console.info(LOGTAG,'bool =>' + bool) const isExit = await usb.requestRight(device.name); - console.info('surenjun',isExit) + console.info(LOGTAG,'isExit =>' + isExit) if(isExit){ let devicepipe : usb.USBDevicePipe = usb.connectDevice(device); let interfaces = device.configs[0].interfaces[0]; let ret = usb.claimInterface(devicepipe, interfaces,true); - console.info('surenjun',ret); + console.info(LOGTAG,'ret =>' + ret); + if(ret === 0 ){ - let outEndpoint : usb.USBEndpoint = interfaces.endpoints[0]; - const outputData = new Uint8Array(65); // 要发送的数据包 - setInterval(()=>{ + let outEndpoint : usb.USBEndpoint = interfaces.endpoints[1]; + let inEndpoint : usb.USBEndpoint = interfaces.endpoints[0]; + setInterval(async ()=>{ const wuXiDataStr = '$KSXT,20240320134841021,118.27269490,32.20290610,46.5220,190.31,0.13,0,5,0.00,3,3,25,20,0,0,0,0,0,0,E046,0081,1308,0xFFFFFFFF*'; - // const wuXiDataStr = '$KSXT,19700101091317.10,117.13159937,31.80907367,24.973,269.4,0.91,,11.232,,4,,,,,,,,,,0005,0001,816,0xFFFFFFF' - const arr = stringToArr(wuXiDataStr); - const firstArr = [0x00,63].concat(arr.slice(0,63)); - const secondArr = [0x00,62].concat(arr.slice(64,127)).concat([0x00]); - // $KSXT,19700101091317.10,117.13159937,31.80907367,24.973,269.4,0.91,,11.232,,4,,,,,,,,,,00017,0010,816,0xFFFFFFF - // $KSXT,20190719020615.80,117.12960038,31.80900947,23.8370,89.50,1.96,89.90,33.623,0.00,3,3,33,32,-1192.153,-2413.781,-30.162,,,,1.10,1.0,*BB - if(wuXiDataStr){ - // 发送数据,在device信息中选取对应数据发送的endpoint来做数据传输。(endpoint.direction == 0) - console.info('surenjun',firstArr.join(',')) - let buffer = new Uint8Array(128); - usb.bulkTransfer(devicepipe, outEndpoint, buffer).then((dataLength : number) => { - if (dataLength >= 0) { - console.info("surenjun usb writeData result write length : " + dataLength); - } else { - console.info("surenjun writeData failed"); + const codeArr = plcStrToWXCodeArr(wuXiDataStr); + // console.info(LOGTAG,firstArr) + // console.info(LOGTAG,secondArr) + + for(let i = 0; i < codeArr.length;i++){ + try { + console.info(LOGTAG,codeArr[i]) + const f = await usb.bulkTransfer(devicepipe, outEndpoint, new Uint8Array(codeArr[i])) + console.info(LOGTAG,f) + } catch (e) { + console.info(LOGTAG,JSON.stringify(e)) } - }).catch((error) => { - console.info(" surenjunusb writeData error : " + JSON.stringify(error)); - }); } - },200) + },2000) + }else{ - console.info('surenjun','usb claimInterface failed') + console.info(LOGTAG,'usb claimInterface failed') } - }; + }else{ + console.info(LOGTAG,'isExit =>' +'false') + } } catch (e) { - + console.info(LOGTAG,'e=>' + JSON.stringify(e)) } } @@ -80,4 +94,5 @@ const initUsbServicesFn = () => { } + export default initUsbServicesFn