Files
mht.js/utils/UnderlyingUpdate.js
2025-10-22 07:50:31 +08:00

370 lines
12 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}