370 lines
12 KiB
JavaScript
370 lines
12 KiB
JavaScript
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
|
||
|
||
}
|