import socket from "./socket.js"; //定义IP和port let ip = '192.168.10.166' //目标ip let port = '8011' //目标端口 let localPort = '8012' //本机端口 let bin = []; //保存读取的数据 var save //保存接收的数据 let binsize = 0; //读取文件 function ReadText(text) { //根据下载的文件路径读取数据 // plus.io.resolveLocalFileSystemURL(text, function(entry) { // //读取文件 // entry.file(function(file) { // var fileReader = new plus.io.FileReader(); // console.log("getFile:" + JSON.stringify(file)); // fileReader.readAsArrayBuffer(file); // 不支持readAsArrayBuffer方式 // fileReader.onload = function(evt) { // let fileSize = file.size; //得到文件数据大小 // const int8array = new Uint8Array(evt.target.result); // const blob = new Blob([evt.target.resul], { type: "text/html" }); // the blob // var blob = new window.File([text, fileName, {type: fileType}]) // console.log(int8array) // const arrayBuffer = uni.base64ToArrayBuffer(base64); // 转换为arrayBuffer格式 // const int8array = new Uint8Array(arrayBuffer); // let ben = [] // for(let i = 0; i < fileSize; i++){ // ben[i] = int8array[i] // } // 解析二进制数据 // var dataView = new DataView(arrayBuffer); // let data = []; //得到文本数据 // for (let i = 0; i < fileSize; i++) { // data.push(dataView.getUint8(i)); // // bin.push(dataView.getUint8(i)); // } // console.log(data) // binsize = fileSize; //发送擦除 01 03 // InUpgrade(fileSize) //写数据 01 06 // WriteData(fileSize,ben) // DeletesText(text) // } // }); // }) // plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) { // // fs.root是根目录操作对象DirectoryEntry // fs.root.getFile(text, { // create: false // }, function(fileEntry) { // fileEntry.file(function(file) { // var fileReader = new plus.io.FileReader(); // console.log("getFile:" + JSON.stringify(file)); // fileReader.readAsText(file, 'utf-8'); // fileReader.onloadend = function(evt) { // const int8array = new Uint8Array(17109); // // type:可以设置别的文件类型 // // var blob = new Blob([(evt.target.result)],{type:"text/plain;charset=utf-8"}); // // console.log(blob); // // console.log("evt.target" + evt.target); // console.log( JSON.stringify(evt.target.result)); // // const blob = new Blob([evt.target.result]); // // for (let i=0;i<17108;i++) { // // int8array[i] = blob[i] // // } // // console.log(blob); // // let base64 = evt.target.result.split(',')[1]; // 获取base64字符串 // // const arrayBuffer = uni.base64ToArrayBuffer(base64); // 转换为arrayBuffer格式 // // console.log(int8array); // } // }); // }); // }); } //下载底层程序 function UpdateUnderlying() { //先扫描 发送 01 01 00 00 00 00 00 00 let saomiao = ['01', '01', '00', '00', '00', '00', '00', '00']; //帧头 socket.sendBytesBroadcast(JSON.stringify(saomiao), ip, port, localPort); } function InBoot() { //进入boot程序 发送 01 0A let boot = ['01', '0A', '00', '00', '00', '00', '00', '00']; //帧头 socket.sendBytesBroadcast(JSON.stringify(boot), ip, port, localPort); } function InUpgrade(fileSize){ //擦除命令 //声明个 1026个元素的数组 然后初始化 let startAddr = new Uint32Array(1) startAddr[0] = 0x08006000; let cachu = new Uint8Array(10); //擦除 //读取文件 // for(let cnt = 0; cnt < bin.length; ) cachu[0] = 0x01; cachu[1] = 0x03; cachu[2] = startAddr[0] >> 24; cachu[3] = startAddr[0] >> 16; cachu[4] = startAddr[0] >> 8; cachu[5] = startAddr[0] >> 0; cachu[6] = (startAddr[0] + fileSize) >> 24 cachu[7] = (startAddr[0] + fileSize) >> 16 cachu[8] = (startAddr[0] + fileSize) >> 8 cachu[9] = (startAddr[0] + fileSize) >> 0 let data = [] for (let cntl = 0; cntl < cachu.length; cntl++) { data[cntl] = cachu[cntl].toString(16) ; } socket.sendBytesBroadcast(JSON.stringify(data), ip, port, localPort); } //写数据 function WriteData(fileSize,data){ //声明个 1026个元素的数组 然后初始化 let FirmwareData = new Uint8Array(1026); let NodeAddr //声明变量 let startAddr = new Uint32Array(1) startAddr[0] = 0x08006000; // let read_data_num // console.log(data) for(let i = 0; i < fileSize; i += 1024){ //i 遍历 文件的数据 每次读取1024 //把得到的文本数据循环赋值给FirmwareData数组 for(let j = 0; j < 1024; j++){ FirmwareData[j] = data[i + j] } // FirmwareData[j] = data[i + j] j=0 1024 1024 // FirmwareData[j] = data[i + j] j=1 1024 1025 // FirmwareData[j] = data[i + j] j=2 1024 1026 // console.log(FirmwareData) //计算CRC let crc_data = crc16_ccitt(FirmwareData,1024); // console.log(crc_data) // console.log("crc_data",crc_data) // //把Crc的值赋给右移8位给数组 // FirmwareData[read_data_num] = crc_data >> 8; // FirmwareData[read_data_num+1] = crc_data ; // read_data_num += 2; // console.log( FirmwareData[read_data_num]) // console.log( FirmwareData[read_data_num+1]) // let cachu = new Uint8Array(10); //擦除 // //读取文件 // cachu[0] = 0x01; // cachu[1] = 0x05; // cachu[2] = (startAddr[0] + i) >> 24; // cachu[3] = (startAddr[0] + i) >> 16; // cachu[4] = (startAddr[0] + i) >> 8; // cachu[5] = (startAddr[0] + i) >> 0; // cachu[6] = (read_data_num) >> 24 // cachu[7] = (read_data_num) >> 16 // cachu[8] = (read_data_num) >> 8 // cachu[9] = (read_data_num) >> 0 // let data1 = [] // for (let cntl = 0; cntl < cachu.length; cntl++) { // data1[cntl] = cachu[cntl].toString(16) ; // } // socket.sendBytesBroadcast(JSON.stringify(data1), ip, port, localPort); // CBL_WriteBlock(FirmwareData,read_data_num) } } function CBL_WriteBlock(FirmwareData,read_data_num ) { // let data = [ '01','06'] // let udpdata = new Uint8Array(1024) //获取文本数据 // let CRC = new Uint8Array(2) // for(let i=0; i < (read_data_num/1026);i++){ //数据取整 // for(let j=0;j < 1026;j++){ //把1026个数据给数组udpdata // udpdata[j] = FirmwareData++; // } // // data.push(udpdata[j].toString(16)) // for (let cnta = 0; cnta < udpdata.length; cnta++) { // data.push(udpdata[cnta].toString(16)) // } // for (let cntl = 0; cntl < CRC.length; cntl++) { // data.push(CRC[cntl].toString(16)) // } // socket.sendBytesBroadcast(JSON.stringify(data), ip, port, localPort); // } // 将数据按 1026 字节为一组进行分组 // const groupSize = 1026 // groupSize[0] = 0x01 // groupSize[1] = 0x06 // const groups = [] // for (let i = 0; i < read_data_num.length; i += groupSize) { // groups.push(FirmwareData.slice(i, i + groupSize)) // } // if(read_data_num % 1026){ //数据取余 534%1206 = 534 // for(let j = 0;j < (read_data_num % 1026); j++){ //数据小于534 j++; // udpdata[j] = *FirmwareData++; //把数据给j // } // i++; // QUdpSocket * msocket = new QUdpSocket; // msocket->bind(QHostAddress::AnyIPv4,8011,QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint); // msocket->writeDatagram((char *)&myudp,((DataNum)%sizeof(Udpdata))+2,QHostAddress("192.168.10.176"),8011); // } } function crc16_ccitt(buf,length){ // console.log(buf) // var myInfo = PersonInfo; // buff && buff( myInfo ); // console.log(buff) // const crc16tab = new Uint16Array([ // ] // ) const crc16tab = [ 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6, 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de, 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485, 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d, 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4, 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc, 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823, 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b, 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12, 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a, 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41, 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49, 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70, 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78, 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f, 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067, 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e, 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256, 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d, 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405, 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c, 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634, 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab, 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3, 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a, 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92, 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9, 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1, 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8, 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0 ]; // console.log(crc16tab.length) // register uint32_t counter; // register uint16_t crc = 0; // let crc // for( let counter = 0; counter < length; counter++) // { // crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ buff[counter]++) & 0x00FF]; // // for( counter = 0; counter < len; counter++) // // crc = (crc<<8) ^ crc16tab[((crc>>8) ^ *(uint8_t *)buf++)&0x00FF]; // } // let crc = 0; const crc = new Uint16Array(1) crc[0] = 0 for (let counter = 0; counter < length; counter++) { const current_byte = buf[counter]; const index = ((crc[0] >> 8) ^ current_byte) & 0x00FF; crc[0] = (crc[0] << 8) ^ crc16tab[index]; } console.log(crc[0]) // const crc1 = (crc[0] >> 8) // const crc2 = (crc[0] << 8) // const buf = crc1^ current_byte // const index1 = buf & 0x00FF; // crc[0] = crc2 ^ crc16tab[index] return crc[0]; } //删除文件 function DeletesText(text) { plus.io.resolveLocalFileSystemURL(text, (entry) => { //读取这个目录对象 entry.remove(function(entry) { console.log('删除成功回调') //删除成功回调 this.resultdata = [] }) }) } //只需要调用一次,相当于初始化,跟定时器一样,操作系统接收到UDP数据后会调用receivedHexMsgCallBack function ReadUpdateUnderlyingUDP() { let data = new Uint8Array(10); socket.bindBroadcast('8011'); //绑定本机接收数据的广播端口 socket.recBroadcastHexMsgCallBack = function(receivedHexMsg) { //硬件服务器返回16进制数据 let msg = receivedHexMsg; let sum = msg.length / 2; //把数组清空 for (let k = 0; k < sum; k++) { let str = msg.substring(k * 2, k * 2 + 2); //0xFF,从字符串中取出2个字符 data[k] = parseInt(str, 16); //强制类型转换,string类型转换成unit8array类型的, 向0f这样的数据无法转成数字 需要先转成10进制 } let boot = ( ((data[1] << 24) & 0xFF000000) | ((data[2] << 16) & 0x00FF0000) | ((data[3] << 8) & 0x0000FF00) | ((data[4]) & 0x000000FF)) //let boot1 = ((data[0] << 32) & 0xFF00000000) | ((data[1] << 24) & 0x00FF000000) | ((data[2] << 16) & 0x0000FF0000) | ((data[3] << 8) & 0x000000FF00) | ((data[4]) & 0x00000000FF) //判断对方在app中还是boot中 if(16777217 === boot) { // 在app程序中就发送一帧 01 0A InBoot() } //接收 else if ( 16777216 === boot){ // 在boot程序就发送 01 03进行擦除 InUpgrade(binsize,bin) } else{} } } export default { UpdateUnderlying, ReadText, ReadUpdateUnderlyingUDP, save }