12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091 |
- const mServiceId_i = 'FEE7';
- const mWriteUUID_i = 'FEC7';
- const mReadUUID_i = 'FEC7';
- const mNotifyUUID_i = 'FEC8';
- const mActiviceReadUUID_i = 'FEC9';
- const mServiceId = ('0000FEE7-0000-1000-8000-00805F9B34FB').toLowerCase();
- const mWriteUUID = ('0000FEC7-0000-1000-8000-00805F9B34FB').toLowerCase();
- const mReadUUID = ('0000FEC7-0000-1000-8000-00805F9B34FB').toLowerCase();
- const mNotifyUUID = ('0000FEC8-0000-1000-8000-00805F9B34FB').toLowerCase();
- const mActiviceReadUUID = ('0000FEC9-0000-1000-8000-00805F9B34FB').toLowerCase();
- const WECHAT_PRO_HEAD_MAGIC_NUMBER = 0xFE;
- const WECHAT_PRO_HEAD_PACK_VERSION = 0x01;
- const WECHAT_CMD_ECI_REQ_AUTH = 0x2711; //握手数据(设备--->手机)
- const WECHAT_CMD_ECI_REQ_SEND_DATA = 0x2712;
- const WECHAT_CMD_ECI_REQ_INIT = 0x2713; //初始化 (设备--->手机)
- const WECHAT_CMD_ECI_RESP_AUTH = 0x4E21; //握手数据 (手机--->设备)
- const WECHAT_CMD_ECI_RESP_INIT = 0x4E23; //初始化 (手机--->设备)
- const WECHAT_CMD_ECI_PUSH_RECV_DATA = 0x7531; //发送指令数据(手机--->设备)
- const ETC_PRO_SINGLE_PACK_SIZE = 105; /* ETC–≠“È∑÷∞¸≥§∂» */
- const BLE_CTL_START_BIT = 0x80; //分包后,此包是否为起始包
- const BLE_ETC_PRO_HEAD_ST = 0x33; /* ETC(33协议头标识) */
- const MAX_WECHAT_SEND_LEN = 255;
- const MAX_BLE_SIZE = 20;
- const KYunNanObuMultiplePackages = 1;
-
- let mDeviceId = 0;
- let service = {}; //服务
- let writeCharVal = {}; //写入特征值
- let readCharVal = {}; //读取特征值
- let notifyCharVal = {}; //通知特征值
- let activiceReadCharVal = {}; //读取特征值
- let mPacketLen = 0;
- let mRecvDataCache = [];
- let mUnpacketDataCache = [];
- let mIsInitCmdSend = false;
- let mEtcRawData = [];
- let mEtcRawDataLen = 0;
- let maxLenPerPacket = 100;
- let mReturnedRawCmdData = 0;
- let mAbCmdBuf = [];
- let mnCmdBufLen = 0;
- let mTransData = [];
- let mSingleEtcProtoData = [];
- let mLenBuf = [];
- let mBytesNumOfDataLen = 0;
- let receiveDataCallBack = null;
- let m_IsIOS = true;
- let m_isConn = false;
- let mCurrentPacketNum = 0;
- let mConnCount = 2;
- let beginTime = 0;
-
- function getVersion() {
- var version = "v1.0.0.8.2024020401"
- return version;
- }
- /**
- 通过蓝牙,连接OBU设备
-
- @param deviceId 需要连接的蓝牙外围设备ID
- @param callback_1 回调函数 连接结果
- code=0表示连接成功,code = 非0 连接失败
- @param callback_2 回调函数 时时监听连接状态
- code=0表示监听连接成功,code = 1表示监听到断开连接
- */
- function connectDevice(device, callback_1, callback_2) {
- beginTime = new Date();
- m_IsIOS = my.getSystemInfoSync().platform.toLowerCase() == 'ios' ? true : false;
- let deviceId = device.deviceId
- // if (m_isConn && mDeviceId == deviceId) {
- // callback_1(makeRes(0, [], '已连接'))
- // return;
- // }
- // if (mDeviceId == 0) {
- conn(device, callback_1, callback_2)
- // } else {
- // my.disconnectBLEDevice({
- // deviceId: mDeviceId,
- // complete: function(e) {
- // conn(device, callback_1, callback_2)
- // }
- // })
- // }
- }
-
- function conn(device, callback_1, callback_2) {
- let deviceId = device.deviceId
- my.connectBLEDevice({
- deviceId: deviceId,
- success: function(res) {
- console.log('connectBLEDevice')
- mDeviceId = deviceId;
- my.getBLEDeviceServices({
- deviceId: deviceId,
- success: function(res) {
- console.log('getBLEDeviceServices:' + JSON.stringify(res))
- var isExistsService = false
- for (var i = 0; i < res.services.length; i++) {
- console.log('res.services[i].serviceId:' + res.services[i].serviceId +
- ',mServiceId:' + mServiceId)
- if (res.services[i].serviceId == (m_IsIOS ? mServiceId_i :
- mServiceId)) {
- console.log('res.services[i].serviceId == mServiceId')
- service: res.services[i]
- isExistsService = true;
- break;
- }
- }
- if (isExistsService) {
- my.getBLEDeviceCharacteristics({
- deviceId: deviceId,
- serviceId: (m_IsIOS ? mServiceId_i : mServiceId),
- success: function(res) {
- console.log('getBLEDeviceCharacteristics' + JSON
- .stringify(res))
- for (var i = 0; i < res.characteristics
- .length; i++) {
- if (res.characteristics[i].characteristicId == (
- m_IsIOS ? mWriteUUID_i : mWriteUUID)) {
- writeCharVal: res.characteristics[i]
- }
- if (res.characteristics[i].characteristicId == (
- m_IsIOS ? mReadUUID_i : mReadUUID)) {
- readCharVal: res.characteristics[i]
- }
- if (res.characteristics[i].characteristicId == (
- m_IsIOS ? mNotifyUUID_i : mNotifyUUID
- )) {
- notifyCharVal: res.characteristics[i]
- }
- if (res.characteristics[i].characteristicId == (
- m_IsIOS ? mActiviceReadUUID_i :
- mActiviceReadUUID)) {
- activiceReadCharVal: res.characteristics[i]
- }
- }
-
- my.offBLEConnectionStateChanged();
-
- my.onBLEConnectionStateChanged(function(res) {
- // 该方法回调中可以用于处理连接意外断开等异常情况
- console.log(
- '改变onBLEConnectionStateChange');
- if (res.connected) {
- console.log('connected true')
- m_isConn = true;
- callback_2(makeRes(0, [], '蓝牙已连接'))
- } else {
- console.log('connected false')
- var endTime = +new Date();
- if ((endTime - beginTime) >= 3000) {
- mIsInitCmdSend = false;
- m_isConn = false;
- console.log('00000000');
- callback_2(makeRes(-1, [],
- '蓝牙已断开'))
- }
- }
- })
-
- my.offBLECharacteristicValueChange();
-
- my.notifyBLECharacteristicValueChange({
- deviceId: deviceId,
- serviceId: (m_IsIOS ? mServiceId_i :
- mServiceId),
- characteristicId: (m_IsIOS ?
- mNotifyUUID_i : mNotifyUUID),
- state: true,
- success: function(res) {
- my.onBLECharacteristicValueChange(
- function(res) {
- console.log(
- '收到数据:' +
- res.value)
-
-
- let pRead =
- str2Bytes(res
- .value)
- if (pRead.length >
- 0 && pRead !=
- null) {
- if (pRead[0] ==
- WECHAT_PRO_HEAD_MAGIC_NUMBER &&
- pRead[1] ==
- WECHAT_PRO_HEAD_PACK_VERSION
- ) {
- mPacketLen =
- (pRead[
- 2] <<
- 8) |
- pRead[
- 3];
- }
-
- mRecvDataCache
- .push.apply(
- mRecvDataCache,
- pRead)
- console.log(
- 'mRecvDataCache pushedData:' +
- ab2hexArr(
- mRecvDataCache
- ))
- console.log(
- 'mPacketLen:' +
- mPacketLen
- )
- console.log(
- 'mRecvDataCacheLen:' +
- mRecvDataCache
- .length)
- if (mRecvDataCache
- .length ==
- mPacketLen ||
- mRecvDataCache
- .length ==
- 2 *
- mPacketLen
- ) {
- let pData =
- mRecvDataCache
- let nCmdID =
- (pData[
- 4] <<
- 8) |
- pData[5]
-
- switch (
- nCmdID
- ) {
- case WECHAT_CMD_ECI_REQ_AUTH: {
- console
- .log(
- 'WECHAT_CMD_ECI_REQ_AUTH'
- )
- let data =
- makeHandShakeStep1WithETC()
- mRecvDataCache
- = []
-
- write
- (
- data)
- }
- break;
- case WECHAT_CMD_ECI_REQ_INIT: {
- console
- .log(
- 'WECHAT_CMD_ECI_REQ_INIT'
- )
- let data =
- makeHandShakeStep2WithETC()
- write
- (
- data)
-
- setTimeout
- (function() {
- let dataInit =
- makeInitWithETC()
- mRecvDataCache
- = []
- write
- (
- dataInit)
- mIsInitCmdSend
- =
- true
- },
- 20
- )
- }
- break;
- case WECHAT_CMD_ECI_REQ_SEND_DATA: {
- console
- .log(
- 'WECHAT_CMD_ECI_REQ_SEND_DATA'
- )
- console
- .log(
- 'test WECHAT_CMD_ECI_REQ_SEND_DATA......befor'
- )
- if (
- mIsInitCmdSend) {
- console
- .log(
- ' WECHAT_CMD_ECI_REQ_SEND_DATA......call back'
- )
- m_isConn
- =
- true
- callback_1
- (makeRes(
- 0,
- [],
- '连接成功'
- ))
- mIsInitCmdSend
- =
- false
- }
- console
- .log(
- ' WECHAT_CMD_ECI_REQ_SEND_DATA......after'
- )
- mEtcRawData
- = []
- mEtcRawDataLen
- =
- 0
- let op =
- unpaketProto(
- mRecvDataCache
- )
- if (!
- op
- ) {
- if (mEtcRawData[
- 0
- ] ==
- 0xB2
- ) {
- maxLenPerPacket
- =
- mEtcRawData[
- 3
- ];
- } else {
- mUnpacketDataCache
- .push
- .apply(
- mUnpacketDataCache,
- mEtcRawData
- )
- console
- .log(
- '******返回未解析的指令数据包为:' +
- ab2hexArr(
- mUnpacketDataCache
- )
- )
-
- if (mCurrentPacketNum ==
- 0
- ) {
- mReturnedRawCmdData
- = []
- let errorcode =
- unpackXXCmdPacket(
- mUnpacketDataCache
- )
- console
- .log(
- '******解析后的指令数据为' +
- mReturnedRawCmdData
- )
- if (
- receiveDataCallBack) {
- console
- .log(
- 'callbackData' +
- mReturnedRawCmdData
- )
- receiveDataCallBack
- (makeRes(
- errorcode,
- mReturnedRawCmdData,
- errorcode ==
- 0 ?
- '收到数据成功' :
- '数据透传失败'
- ))
-
- }
- mUnpacketDataCache
- = []
- }
- }
- } else {
- mUnpacketDataCache
- .push
- .apply(
- mUnpacketDataCache,
- mEtcRawData
- )
- }
- mRecvDataCache
- = []
- }
- break;
- default:
- break;
- }
- }
- }
- })
- },
- fail: function(e) {
- callback_1(makeRes(-1, [],
- '连接失败'))
- }
- })
- },
- fail: function(res) {
- callback_1(makeRes(-1, [], '连接失败'))
- }
- })
- }
- },
- fail: function(res) {
- callback_1(makeRes(-1, [], '连接失败'))
- }
- })
- },
- fail: function(res) {
- // if (mConnCount > 0) {
- // console.log(mConnCount)
- // mConnCount--
- // connectDevice(device, callback_1, callback_2)
- // } else {
- // console.log(mConnCount)
- // mConnCount = 2
- // m_isConn = false;
- // callback_1(-1, [], '连接失败')
- // }
- callback_1(makeRes(-1, [], '连接失败'))
- }
- })
- }
-
- //断开与OBU设备的蓝牙连接
- function disconnectDevice(callBack) {
-
- console.log('income disconnectDevice')
- if (receiveDataCallBack) {
- receiveDataCallBack = null
- }
- mIsInitCmdSend = false;
- if (!m_isConn) {
- callBack(makeRes(-1, [], '未连接'))
- return;
- }
- console.log(' disconnectDevice begin')
- let data = makeDisconnectWithETC();
- // mIsInitCmdSend = false;
- mRecvDataCache = []
-
- console.log(' disconnectDevice begin2')
- write(data)
-
- my.disconnectBLEDevice({
- deviceId: mDeviceId,
- success: function(res) {
- m_isConn = false;
- callBack(makeRes(0, [], '断开成功'))
- console.log(' disconnectDevice success')
- },
- fail: function(e) {
- console.log('error:' + e.errMsg)
- console.log(' disconnectDevice false')
- callBack(makeRes(-1, [], '断开失败'))
- }
- })
- }
-
- /**
- 数据透传
-
- @param cmd 指令[]
- @param cmdtype 明文:IC:10、ESAM:20
- @param callBack 回调函数
- status 成功为 true,失败为 false
- data NSData 回应数据(明文)+ 签名
- errorMsg 报错信息
- */
- function transCmd(cmd, cmdtype, callBack) {
- if (callBack) {
- receiveDataCallBack = callBack;
- }
-
- if (!m_isConn) {
- receiveDataCallBack(makeRes(-2, [], '连接失败'))
- return;
- }
-
- let cmdType = 0;
- if (cmdtype == '10') {
- cmdType = 0xA3;
- } else if (cmdtype == '20') {
- cmdType = 0xA8;
- }
-
- let totalMutableData = []
- for (var i = 0; i < cmd.length; i++) {
- let obj = str2Bytes(cmd[i]);
- console.log('##### cmd_:' + ab2hexArr(obj))
- let oneData = makeMutiPackageData(obj, i + 1)
- console.log('##### oneData:' + ab2hexArr(oneData))
- totalMutableData.push.apply(totalMutableData, oneData);
- }
- console.log('totalMutableData:' + ab2hexArr(totalMutableData))
- let totalChar = totalMutableData;
- let pbChar = [];
- pbChar[0] = 0xA1;
- pbChar[1] = totalMutableData.length;
- pbChar.push.apply(pbChar, totalChar);
- let reallyData = pbChar;
- console.log('reallyData:' + ab2hexArr(reallyData))
-
- mTransData = []
- if (!makeXXCmdPacket(cmdType, reallyData)) {
- subReqDataAndMakeEtcProtoPacket(mTransData)
- }
- }
-
- function makeMutiPackageData(xxCmdData, dataIndex) {
- let index = 0;
- let cmdDataLen = xxCmdData.length;
- let cmdPacketDataLen = cmdDataLen + 12;
- let pbData = []
- pbData[index++] = 0xA4; //1
- pbData[index++] = 0x00; //Len2 1字节长度,真实数值后续代码算 2
-
- //stable data
- pbData[index++] = 0x38; //3
- pbData[index++] = 0x01; //4
- pbData[index++] = dataIndex; //5
- pbData[index++] = 0x39; //6
-
- pbData[index++] = cmdDataLen; //Len3
-
- pbData.push.apply(pbData, xxCmdData)
- index += cmdDataLen;
- //stable data
- pbData[index++] = 0x3C;
- pbData[index++] = 0x01;
- pbData[index++] = 0x00;
- // pbData[index++] = 0x00;
- // pbData[index] = 0x00;
-
- pbData[1] = cmdDataLen + 3 + 2 + 3;
- return pbData;
- }
-
- function subReqDataAndMakeEtcProtoPacket(etcProtoData) {
- let hr = 0;
- let totalDataLen = etcProtoData.length;
- let blockSize = maxLenPerPacket;
- let offset = 0
- //if (blockSize == undefined)
- if (!blockSize) {
- blockSize = 100
- }
-
- let YuShu = totalDataLen % blockSize;
-
- let PackNumOffset = 0;
- let PackNum = (YuShu == 0) ? (totalDataLen / blockSize) : (parseInt(totalDataLen / blockSize) + 1);
- let LastPackSize = (YuShu == 0) ? ETC_PRO_SINGLE_PACK_SIZE : YuShu;
-
- let pSendBuf = etcProtoData;
- let sendBuff = [];
- mSingleEtcProtoData = [];
-
- let _pack = {}
- _pack.perPackSize = blockSize
- _pack.finalPackSize = LastPackSize
- _pack.packNum = PackNum
-
- if (totalDataLen > blockSize) {
- for (; offset < (totalDataLen - blockSize); offset += blockSize) {
- _pack.packNumOffset = PackNumOffset;
- sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, offset + blockSize))
- let sendBuffDataLen = sendBuff.length;
- if (sendBuffDataLen == 0)
- return;
- hr = makeSingleEtcProtocolPaket(sendBuff, _pack)
- if (hr != 0) {
- return hr;
- }
- PackNumOffset++;
- hr = tranmitBleBlock()
- if (hr != 0) {
- return hr;
- }
- sendBuff = []
- }
- }
- _pack.packNumOffset = PackNumOffset;
-
- sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, totalDataLen))
- let data = sendBuff.slice(0, totalDataLen - offset)
- hr = makeSingleEtcProtocolPaket(data, _pack)
- if (hr != 0) {
- return hr;
- }
-
- console.log('tranmitBleBlock(' + mSingleEtcProtoData.length + '):' + ab2hexArr(mSingleEtcProtoData))
- return tranmitBleBlock()
- }
-
- function makeSingleEtcProtocolPaket(ectCmdRawData, sPack) {
- let SendCTL = sPack.packNum - sPack.packNumOffset - 1;
- let IsLastPack = ((sPack.packNumOffset + 1) == sPack.packNum) ? 1 : 0;
- let DataLen = 0;
- let SendLen = 0;
-
- let etcCmdRawDataLen = ectCmdRawData.length;
- let etcCmdRawBufLen = etcCmdRawDataLen + 5;
- let etcCmdRawBuf = [];
- SendCTL = (sPack.packNumOffset == 0) ? (BLE_CTL_START_BIT | SendCTL) : SendCTL;
-
- DataLen = IsLastPack ? sPack.finalPackSize : sPack.perPackSize; //ETC_PRO_SINGLE_PACK_SIZE;
-
- /* 33协议组包*/
- etcCmdRawBuf[SendLen++] = BLE_ETC_PRO_HEAD_ST; //ST
- etcCmdRawBuf[SendLen++] = 0x00; //sPack.packNumOffset+1;//0x00;
- etcCmdRawBuf[SendLen++] = SendCTL; //CTL
- etcCmdRawBuf[SendLen++] = etcCmdRawDataLen; //LEN
- etcCmdRawBuf.push.apply(etcCmdRawBuf, ectCmdRawData);
- SendLen += ectCmdRawData.length;
- etcCmdRawBuf[SendLen++] = XorVerify(etcCmdRawBuf.slice(1), (ectCmdRawData.length + 3)); //BCC校验,从SN到DATA
-
- console.log('*****makeSingleEtcPacket : ' + ab2hexArr(etcCmdRawBuf))
- return makeSingleProtoPacket(etcCmdRawBuf)
- }
-
- function XorVerify(buf, len) {
- let TempVerify = 0x00;
- let i = 0;
- for (i = 0; i < len; i++) {
- TempVerify ^= buf[i];
- }
- return TempVerify
- }
-
- function AppSetVarints(inValue) {
- if (inValue < 128) {
- mLenBuf[0] = inValue;
- mBytesNumOfDataLen = 1;
- } else {
- mLenBuf[0] = (inValue & 0x7F) | 0x80;
- mLenBuf[1] = (inValue >> 7) & 0x7F;
- mBytesNumOfDataLen = 2;
- }
- }
-
- function makeSingleProtoPacket(etcEnclosurBuf) {
- let index = 0;
- let ManufactoryDefineKeyValue = 0; //厂商自定义数据长度,根据不同值设置不同数据
-
- let sDataLen = etcEnclosurBuf.length;
- if (sDataLen == 0 || sDataLen > (MAX_WECHAT_SEND_LEN - 12)) {
- console.log('[ERROR] Wechat send len error, return!')
- return 1;
- }
- mLenBuf = []
- mBytesNumOfDataLen = 0;
- AppSetVarints(sDataLen)
- let protoBufLen = sDataLen + 11 + mBytesNumOfDataLen + ManufactoryDefineKeyValue;
- let protoBuf = [];
-
- protoBuf[index++] = WECHAT_PRO_HEAD_MAGIC_NUMBER;
- protoBuf[index++] = WECHAT_PRO_HEAD_PACK_VERSION;
- protoBuf[index++] = (protoBufLen >> 8) & 0xff;
- protoBuf[index++] = (protoBufLen) & 0xff;
- protoBuf[index++] = (WECHAT_CMD_ECI_PUSH_RECV_DATA >> 8) & 0xff;
- protoBuf[index++] = (WECHAT_CMD_ECI_PUSH_RECV_DATA) & 0xff;
- protoBuf[index++] = 0x00;
- protoBuf[index++] = 0x00;
-
- /* 变长包体,key1-value1 - key2-value2 - key3-value3... ,value=len+data 具体可参考protobuf协议*/
- protoBuf[index++] = 0x0A; //可认为固定值
- protoBuf[index++] = 0x00;
-
- protoBuf[index++] = 0x12; //data域key值;
- protoBuf[index++] = mLenBuf[0]; //data域lenth
- if (mBytesNumOfDataLen == 2) {
- protoBuf[index++] = mLenBuf[1];
- }
- protoBuf.push.apply(protoBuf, etcEnclosurBuf)
- index += sDataLen;
-
- if (ManufactoryDefineKeyValue == 2) //暂时未用到
- {
- protoBuf[index++] = 0x18;
- protoBuf[index++] = 0x00;
- }
-
- if (ManufactoryDefineKeyValue == 3) //暂时未用到
- {
- protoBuf[index++] = 0x18;
- protoBuf[index++] = 0x91;
- protoBuf[index++] = 0x4e;
- }
- mSingleEtcProtoData = []
- mSingleEtcProtoData.push.apply(mSingleEtcProtoData, protoBuf.slice(0, index))
- console.log('*****makeSingleProtoPacket : ' + ab2hexArr(mSingleEtcProtoData))
- return 0;
- }
-
- function tranmitBleBlock() {
- let totalDataLen = mSingleEtcProtoData.length;
- let blockSize = MAX_BLE_SIZE;
- let offset = 0;
- if (blockSize <= 0) {
- return 1;
- }
-
- let pSendBuf = mSingleEtcProtoData;
- let sendBuff = [];
- if (totalDataLen > blockSize) {
- for (; offset < totalDataLen - blockSize; offset += blockSize) {
- sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, blockSize + offset))
- let data = sendBuff.slice(0, blockSize)
-
- console.log('tranmitBleBlock part:(' + blockSize + '),data:' + ab2hexArr(data))
- writeData(data)
- sendBuff = []
- sleep(100)
- }
- }
-
- sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, totalDataLen))
- let data = sendBuff.slice(0, totalDataLen - offset)
- console.log('tranmitBleBlock part:(' + (totalDataLen - offset) + '),data:' + ab2hexArr(data))
- writeData(data)
- return 0;
- }
-
- function sleep(delay) {
- var start = (new Date()).getTime();
- while ((new Date()).getTime() - start < delay) {
- continue;
- }
- }
-
-
- function write(arrayBuffer) {
- console.log('发送:' + ab2hex(arrayBuffer))
- my.writeBLECharacteristicValue({
- deviceId: mDeviceId,
- serviceId: (m_IsIOS ? mServiceId_i : mServiceId),
- characteristicId: (m_IsIOS ? mWriteUUID_i : mWriteUUID),
- value: ab2hex(arrayBuffer),
- success: function(res) {
- console.log('发送成功')
- },
- fail: function(e) {
- console.log('发送失败')
- }
- })
- }
-
- function writeData(data) {
- // let arrayBuffer = new Uint8Array(data).buffer;
- console.log('发送Data:' + data)
- my.writeBLECharacteristicValue({
- deviceId: mDeviceId,
- serviceId: (m_IsIOS ? mServiceId_i : mServiceId),
- characteristicId: (m_IsIOS ? mWriteUUID_i : mWriteUUID),
- value: ab2hex(data),
- success: function(res) {
- console.log('发送成功')
- },
- fail: function(e) {
- console.log('发送失败')
- }
- })
- }
-
- function ab2hex(buffer) {
- let hexArr = Array.prototype.map.call(
- new Uint8Array(buffer),
- function(bit) {
- return ('00' + bit.toString(16)).slice(-2)
- }
- )
- return hexArr.join('');
- }
-
- function ab2DecArr(buffer) {
- return new Uint8Array(buffer);
- }
-
- function ab2hexArr(arr) {
- let hexArr = Array.prototype.map.call(
- arr,
- function(bit) {
- return ('00' + bit.toString(16)).slice(-2)
- }
- )
- return hexArr;
- }
-
- function str2Bytes(str) {
- var pos = 0;
- var len = str.length;
- if (len % 2 != 0) {
- return null;
- }
- len /= 2;
- var hexA = new Array();
- for (var i = 0; i < len; i++) {
- var s = str.substr(pos, 2);
- var v = parseInt(s, 16);
- hexA.push(v);
- pos += 2;
- }
- return hexA;
- }
-
- function makeHandShakeStep1WithETC() {
- let cBuff = []
- let index = 0
- cBuff[index++] = 0xFE;
- cBuff[index++] = 0x01;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x0E;
- cBuff[index++] = 0x4E;
- cBuff[index++] = 0x21;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x01;
- cBuff[index++] = 0x0A;
- cBuff[index++] = 0x02;
- cBuff[index++] = 0x08;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x12;
- cBuff[index] = 0x00;
- return new Uint8Array(cBuff).buffer;
- }
-
- function makeHandShakeStep2WithETC() {
- let cBuff = []
- let index = 0
- cBuff[index++] = 0xFE;
- cBuff[index++] = 0x01;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x13;
- cBuff[index++] = 0x4E;
- cBuff[index++] = 0x23;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x02;
- cBuff[index++] = 0x0A;
- cBuff[index++] = 0x02;
- cBuff[index++] = 0x08;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x10;
- cBuff[index++] = 0xB4;
- cBuff[index++] = 0x24;
- cBuff[index++] = 0x18;
- cBuff[index++] = 0xF8;
- cBuff[index++] = 0xAC;
- cBuff[index] = 0x01;
- return new Uint8Array(cBuff).buffer;
- }
-
- function makeInitWithETC() {
- let cBuff = []
- let index = 0
- cBuff[index++] = 0xFE;
- cBuff[index++] = 0x01;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x14;
- cBuff[index++] = 0x75;
- cBuff[index++] = 0x31;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x02;
- cBuff[index++] = 0x0A;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x12;
- cBuff[index++] = 0x06;
- cBuff[index++] = 0x33;
- cBuff[index++] = 0x0A;
- cBuff[index++] = 0x80;
- cBuff[index++] = 0x01;
- cBuff[index++] = 0xA2;
- cBuff[index++] = 0x29;
- cBuff[index++] = 0x18;
- cBuff[index] = 0x00;
- return new Uint8Array(cBuff).buffer;
- }
-
- function makeDisconnectWithETC() {
- let cBuff = []
- let index = 0
- cBuff[index++] = 0xFE;
- cBuff[index++] = 0x01;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x14;
- cBuff[index++] = 0x75;
- cBuff[index++] = 0x31;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x02;
- cBuff[index++] = 0x0A;
- cBuff[index++] = 0x00;
- cBuff[index++] = 0x12;
- cBuff[index++] = 0x06;
- cBuff[index++] = 0x33;
- cBuff[index++] = 0x0A;
- cBuff[index++] = 0x80;
- cBuff[index++] = 0x01;
- cBuff[index++] = 0xAE;
- cBuff[index] = 0x25;
- return new Uint8Array(cBuff).buffer;
- }
-
- function unpaketProto(recvDataCache) {
- let data = recvDataCache.slice(12)
- let dataLen = recvDataCache[13]
-
- let st = data[0];
- let ctl = data[2];
- let dataLet = data[3];
- let ndata = data.slice(4);
- let StartPackFlag = ((ctl & 0x80) > 0) ? true : false
- let CurrentPackNum = ctl & 0x7F;
- mCurrentPacketNum = CurrentPackNum;
-
- let operatorStatus = 0;
- if (st != 0x33) {
- return -1;
- console.log('[ERROR] The received data head ST is not right!')
- }
-
- if (StartPackFlag) {
- operatorStatus = 1;
- }
-
- mEtcRawData = ndata.slice(0, dataLen - 1)
- mEtcRawDataLen = dataLen
- return operatorStatus & CurrentPackNum;
- }
-
- function unpaketProto_1(recvDataCache) {
- let data = recvDataCache.slice(12)
- let dataLen = recvDataCache[13]
-
- let st = data[0];
- let ctl = data[2];
- let dataLet = data[3];
- let ndata = data.slice(4);
- let StartPackFlag = ((ctl & 0x80) > 0) ? true : false
- let CurrentPackNum = ctl & 0x7F;
-
- let operatorStatus = 0;
- if (st != 0x33) {
- return -1;
- console.log('[ERROR] The received data head ST is not right!')
- }
-
- if (StartPackFlag) {
- operatorStatus = 1;
- }
-
- mAbCmdBuf = ndata.slice(0, dataLen - 1)
- mnCmdBufLen = dataLen
- return operatorStatus & CurrentPackNum;
- }
-
- function unpackXXCmdPacket(recvDataCache) {
- mAbCmdBuf = recvDataCache;
- mnCmdBufLen = 0
- // unpaketProto_1(recvDataCache)
- // let cmdStatus = mAbCmdBuf[1];
- // if (cmdStatus != 0) {
- // return 4;
- // }
-
- let abCmdTLVLen = (mAbCmdBuf[4] << 8) + mAbCmdBuf[3];
- if (abCmdTLVLen <= 0) {
- receiveDataCallBack(makeRes(-1, [], '未插卡'))
- return
- }
-
- let abCmdTLVBuf = mAbCmdBuf.slice(5, abCmdTLVLen + 5)
-
-
- if (abCmdTLVBuf[0] == 0xA3 && abCmdTLVBuf[2] == 0xA2) {
- let abCmdTLVBuf1 = abCmdTLVBuf.slice(2, abCmdTLVLen)
-
- let len = abCmdTLVLen - 2;
- while (len > 0) {
- let rData = abCmdTLVBuf1.slice(3, abCmdTLVBuf1[1] - 1 + 3)
- mReturnedRawCmdData.push(bytes2Str(rData))
- abCmdTLVBuf1 = abCmdTLVBuf1.slice(3 + abCmdTLVBuf1[1] - 1, abCmdTLVBuf1.length)
- len = abCmdTLVBuf1.length;
-
-
- }
- } else {
- return 5;
- }
- return 0;
- }
-
- function makeXXCmdPacket(cmdType, reqData) {
- let index = 0;
- let cmdDataLen = reqData.length
- let cmdPacketDataLen = cmdDataLen + 10;
- let pbData = [];
-
- if (KYunNanObuMultiplePackages == 0) {
- pbData[index++] = ((cmdType == 0xA3) ? cmdType : 0xA8); // PICC 通道 0
- pbData[index++] = 0x00; // 明文数据 01 加密数据 1
- pbData[index++] = 0x00; //总长度 2
- pbData[index++] = 0x00; //总长度,后续代码会算 3
-
- pbData[index++] = 0xA1; //4
- pbData[index++] = 0x00; //Len1 1字节长度,真实数值后续代码算 5
- pbData[index++] = 0xA4; //6
- pbData[index++] = 0x00; //Len2 1字节长度,真实数值后续代码算 7
-
- //stable data
- pbData[index++] = 0x38; //8
- pbData[index++] = 0x01; //9
- pbData[index++] = 0x01; //10
- pbData[index++] = 0x39; //11
-
- pbData[index++] = cmdDataLen; //Len3
- pbData.push.apply(pbData, reqData)
- index += cmdDataLen;
- //stable data
- pbData[index++] = 0x3C;
- pbData[index++] = 0x03;
- pbData[index++] = 0x90;
- pbData[index++] = 0x00;
- pbData[index] = 0x00;
-
- pbData[7] = cmdDataLen + 1 + 9; //Len2长度 = 指令数据长度+两组固定数据长度+cmdDatalen自身长度标识1字节
- pbData[5] = pbData[7] + 2; //2包含固定数据0xA4与 pbData[7]本身长度标识1字节
-
- pbData[2] = ((pbData[5] + 2) & 0xff);
- pbData[3] = ((pbData[5]) >> 8) & 0xff; //总长度 小端模式
- } else {
- pbData[index++] = ((cmdType == 0xA3) ? cmdType : 0xA8);
- pbData[index++] = 0x00; //0 明文 1密文
- pbData[index++] = (cmdDataLen & 0xff); //总长度
- pbData[index++] = (cmdDataLen >> 8) & 0xff; //总长度,后续代码会算
- pbData.push.apply(pbData, reqData)
- }
-
- mTransData.push.apply(mTransData, pbData.slice(0, pbData[5] + 6))
- return 0;
- }
-
- // function str2Bytes(str) {
- // var pos = 0;
- // var len = str.length;
- // if (len % 2 != 0) {
- // return null;
- // }
- // len /= 2;
- // var hexA = new Array();
- // for (var i = 0; i < len; i++) {
- // var s = str.substr(pos, 2);
- // var v = parseInt(s, 16);
- // hexA.push(v);
- // pos += 2;
- // }
- // return hexA;
- // }
-
- function bytes2Str(arr) {
- var str = "";
- for (var i = 0; i < arr.length; i++) {
- var tmp = arr[i].toString(16);
- if (tmp.length == 1) {
- tmp = "0" + tmp;
- }
- str += tmp;
- }
- return str;
- }
-
- function makeRes(code, data, msg) {
- return {
- code: code,
- data: data,
- msg: msg
- }
- }
-
- module.exports = {
- getVersion: getVersion,
- connectDevice: connectDevice,
- transCmd: transCmd,
- disconnectDevice: disconnectDevice
- }
|