您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933
  1. const mServiceId_i = 'FEE7';
  2. const mWriteUUID_i = 'FEC7';
  3. const mReadUUID_i = 'FEC7';
  4. const mNotifyUUID_i = 'FEC8';
  5. const mActiviceReadUUID_i = 'FEC9';
  6. const mServiceId = ('0000FEE7-0000-1000-8000-00805F9B34FB').toLowerCase();
  7. const mWriteUUID = ('0000FEC7-0000-1000-8000-00805F9B34FB').toLowerCase();
  8. const mReadUUID = ('0000FEC7-0000-1000-8000-00805F9B34FB').toLowerCase();
  9. const mNotifyUUID = ('0000FEC8-0000-1000-8000-00805F9B34FB').toLowerCase();
  10. const mActiviceReadUUID = ('0000FEC9-0000-1000-8000-00805F9B34FB').toLowerCase();
  11. const WECHAT_PRO_HEAD_MAGIC_NUMBER = 0xFE;
  12. const WECHAT_PRO_HEAD_PACK_VERSION = 0x01;
  13. const WECHAT_CMD_ECI_REQ_AUTH = 0x2711; //握手数据(设备--->手机)
  14. const WECHAT_CMD_ECI_REQ_SEND_DATA = 0x2712;
  15. const WECHAT_CMD_ECI_REQ_INIT = 0x2713; //初始化 (设备--->手机)
  16. const WECHAT_CMD_ECI_RESP_AUTH = 0x4E21; //握手数据 (手机--->设备)
  17. const WECHAT_CMD_ECI_RESP_INIT = 0x4E23; //初始化 (手机--->设备)
  18. const WECHAT_CMD_ECI_PUSH_RECV_DATA = 0x7531; //发送指令数据(手机--->设备)
  19. const ETC_PRO_SINGLE_PACK_SIZE = 105; /* ETC–≠“È∑÷∞¸≥§∂» */
  20. const BLE_CTL_START_BIT = 0x80; //分包后,此包是否为起始包
  21. const BLE_ETC_PRO_HEAD_ST = 0x33; /* ETC(33协议头标识) */
  22. const MAX_WECHAT_SEND_LEN = 255;
  23. const MAX_BLE_SIZE = 20;
  24. const KYunNanObuMultiplePackages = 1;
  25. let mDeviceId = 0;
  26. let service = {}; //服务
  27. let writeCharVal = {}; //写入特征值
  28. let readCharVal = {}; //读取特征值
  29. let notifyCharVal = {}; //通知特征值
  30. let activiceReadCharVal = {}; //读取特征值
  31. let mPacketLen = 0;
  32. let mRecvDataCache = [];
  33. let mUnpacketDataCache = [];
  34. let mIsInitCmdSend = false;
  35. let mEtcRawData = [];
  36. let mEtcRawDataLen = 0;
  37. let maxLenPerPacket = 100;
  38. let mReturnedRawCmdData = 0;
  39. let mAbCmdBuf = [];
  40. let mnCmdBufLen = 0;
  41. let mTransData = [];
  42. let mSingleEtcProtoData = [];
  43. let mLenBuf = [];
  44. let mBytesNumOfDataLen = 0;
  45. let receiveDataCallBack = null;
  46. let m_IsIOS = true;
  47. let m_isConn = false;
  48. let mCurrentPacketNum = 0;
  49. let mConnCount = 2;
  50. let beginTime = 0;
  51. function getVersion(){
  52. var version = "v1.0.0.8.2024020401"
  53. return version ;
  54. }
  55. /**
  56. 通过蓝牙,连接OBU设备
  57. @param deviceId 需要连接的蓝牙外围设备ID
  58. @param callback_1 回调函数 连接结果
  59. code=0表示连接成功,code = 非0 连接失败
  60. @param callback_2 回调函数 时时监听连接状态
  61. code=0表示监听连接成功,code = 1表示监听到断开连接
  62. */
  63. function connectDevice(device, callback_1, callback_2) {
  64. beginTime = new Date();
  65. m_IsIOS = my.getSystemInfoSync().platform.toLowerCase() == 'ios' ? true : false;
  66. let deviceId = device.deviceId
  67. // if (m_isConn && mDeviceId == deviceId) {
  68. // callback_1(makeRes(0, [], '已连接'))
  69. // return;
  70. // }
  71. // if (mDeviceId == 0) {
  72. conn(device, callback_1, callback_2)
  73. // } else {
  74. // my.disconnectBLEDevice({
  75. // deviceId: mDeviceId,
  76. // complete: function(e) {
  77. // conn(device, callback_1, callback_2)
  78. // }
  79. // })
  80. // }
  81. }
  82. function conn(device, callback_1, callback_2) {
  83. let deviceId = device.deviceId
  84. my.connectBLEDevice({
  85. deviceId: deviceId,
  86. success: function(res) {
  87. console.log('connectBLEDevice')
  88. mDeviceId = deviceId;
  89. my.getBLEDeviceServices({
  90. deviceId: deviceId,
  91. success: function(res) {
  92. console.log('getBLEDeviceServices:' + JSON.stringify(res))
  93. var isExistsService = false
  94. for (var i = 0; i < res.services.length; i++) {
  95. console.log('res.services[i].serviceId:' + res.services[i].serviceId + ',mServiceId:' + mServiceId)
  96. if (res.services[i].serviceId == (m_IsIOS ? mServiceId_i : mServiceId)) {
  97. console.log('res.services[i].serviceId == mServiceId')
  98. service: res.services[i]
  99. isExistsService = true;
  100. break;
  101. }
  102. }
  103. if (isExistsService) {
  104. my.getBLEDeviceCharacteristics({
  105. deviceId: deviceId,
  106. serviceId: (m_IsIOS ? mServiceId_i : mServiceId),
  107. success: function(res) {
  108. console.log('getBLEDeviceCharacteristics' + JSON.stringify(res))
  109. for (var i = 0; i < res.characteristics.length; i++) {
  110. if (res.characteristics[i].characteristicId == (m_IsIOS ? mWriteUUID_i : mWriteUUID)) {
  111. writeCharVal: res.characteristics[i]
  112. }
  113. if (res.characteristics[i].characteristicId == (m_IsIOS ? mReadUUID_i : mReadUUID)) {
  114. readCharVal: res.characteristics[i]
  115. }
  116. if (res.characteristics[i].characteristicId == (m_IsIOS ? mNotifyUUID_i : mNotifyUUID)) {
  117. notifyCharVal: res.characteristics[i]
  118. }
  119. if (res.characteristics[i].characteristicId == (m_IsIOS ? mActiviceReadUUID_i : mActiviceReadUUID)) {
  120. activiceReadCharVal: res.characteristics[i]
  121. }
  122. }
  123. my.offBLEConnectionStateChanged();
  124. my.onBLEConnectionStateChanged(function(res) {
  125. // 该方法回调中可以用于处理连接意外断开等异常情况
  126. console.log('改变onBLEConnectionStateChange');
  127. if (res.connected) {
  128. console.log('connected true')
  129. m_isConn = true;
  130. callback_2(makeRes(0, [], '蓝牙已连接'))
  131. } else {
  132. console.log('connected false')
  133. var endTime = +new Date();
  134. if ((endTime - beginTime) >= 3000) {
  135. mIsInitCmdSend = false;
  136. m_isConn = false;
  137. console.log('00000000');
  138. callback_2(makeRes(-1, [], '蓝牙已断开'))
  139. }
  140. }
  141. })
  142. my.offBLECharacteristicValueChange();
  143. my.notifyBLECharacteristicValueChange({
  144. deviceId: deviceId,
  145. serviceId: (m_IsIOS ? mServiceId_i : mServiceId),
  146. characteristicId: (m_IsIOS ? mNotifyUUID_i : mNotifyUUID),
  147. state: true,
  148. success: function(res) {
  149. my.onBLECharacteristicValueChange(function(res) {
  150. console.log('收到数据:' + res.value)
  151. let pRead = str2Bytes(res.value)
  152. if (pRead.length > 0 && pRead != null) {
  153. if (pRead[0] == WECHAT_PRO_HEAD_MAGIC_NUMBER &&
  154. pRead[1] == WECHAT_PRO_HEAD_PACK_VERSION) {
  155. mPacketLen = (pRead[2] << 8) | pRead[3];
  156. }
  157. mRecvDataCache.push.apply(mRecvDataCache, pRead)
  158. console.log('mRecvDataCache pushedData:' + ab2hexArr(mRecvDataCache))
  159. console.log('mPacketLen:' + mPacketLen)
  160. console.log('mRecvDataCacheLen:' + mRecvDataCache.length)
  161. if (mRecvDataCache.length == mPacketLen || mRecvDataCache.length == 2*mPacketLen) {
  162. let pData = mRecvDataCache
  163. let nCmdID = (pData[4] << 8) | pData[5]
  164. switch (nCmdID) {
  165. case WECHAT_CMD_ECI_REQ_AUTH:
  166. {
  167. console.log('WECHAT_CMD_ECI_REQ_AUTH')
  168. let data = makeHandShakeStep1WithETC()
  169. mRecvDataCache = []
  170. write(data)
  171. }
  172. break;
  173. case WECHAT_CMD_ECI_REQ_INIT:
  174. {
  175. console.log('WECHAT_CMD_ECI_REQ_INIT')
  176. let data = makeHandShakeStep2WithETC()
  177. write(data)
  178. setTimeout(function() {
  179. let dataInit = makeInitWithETC()
  180. mRecvDataCache = []
  181. write(dataInit)
  182. mIsInitCmdSend = true
  183. }, 20)
  184. }
  185. break;
  186. case WECHAT_CMD_ECI_REQ_SEND_DATA:
  187. {
  188. console.log('WECHAT_CMD_ECI_REQ_SEND_DATA')
  189. console.log('test WECHAT_CMD_ECI_REQ_SEND_DATA......befor')
  190. if (mIsInitCmdSend) {
  191. console.log(' WECHAT_CMD_ECI_REQ_SEND_DATA......call back')
  192. m_isConn = true
  193. callback_1(makeRes(0, [], '连接成功'))
  194. mIsInitCmdSend = false
  195. }
  196. console.log(' WECHAT_CMD_ECI_REQ_SEND_DATA......after')
  197. mEtcRawData = []
  198. mEtcRawDataLen = 0
  199. let op = unpaketProto(mRecvDataCache)
  200. if (!op) {
  201. if (mEtcRawData[0] == 0xB2) {
  202. maxLenPerPacket = mEtcRawData[3];
  203. } else {
  204. mUnpacketDataCache.push.apply(mUnpacketDataCache, mEtcRawData)
  205. console.log('******返回未解析的指令数据包为:' + ab2hexArr(mUnpacketDataCache))
  206. if (mCurrentPacketNum == 0) {
  207. mReturnedRawCmdData = []
  208. let errorcode = unpackXXCmdPacket(mUnpacketDataCache)
  209. console.log('******解析后的指令数据为' + mReturnedRawCmdData)
  210. if (receiveDataCallBack) {
  211. console.log('callbackData' + mReturnedRawCmdData)
  212. receiveDataCallBack(makeRes(errorcode, mReturnedRawCmdData, errorcode == 0 ? '收到数据成功' : '数据透传失败'))
  213. }
  214. mUnpacketDataCache = []
  215. }
  216. }
  217. } else {
  218. mUnpacketDataCache.push.apply(mUnpacketDataCache, mEtcRawData)
  219. }
  220. mRecvDataCache = []
  221. }
  222. break;
  223. default:
  224. break;
  225. }
  226. }
  227. }
  228. })
  229. },
  230. fail: function(e) {
  231. callback_1(makeRes(-1, [], '连接失败'))
  232. }
  233. })
  234. },
  235. fail: function(res) {
  236. callback_1(makeRes(-1, [], '连接失败'))
  237. }
  238. })
  239. }
  240. },
  241. fail: function(res) {
  242. callback_1(makeRes(-1, [], '连接失败'))
  243. }
  244. })
  245. },
  246. fail: function(res) {
  247. // if (mConnCount > 0) {
  248. // console.log(mConnCount)
  249. // mConnCount--
  250. // connectDevice(device, callback_1, callback_2)
  251. // } else {
  252. // console.log(mConnCount)
  253. // mConnCount = 2
  254. // m_isConn = false;
  255. // callback_1(-1, [], '连接失败')
  256. // }
  257. callback_1(makeRes(-1, [], '连接失败'))
  258. }
  259. })
  260. }
  261. //断开与OBU设备的蓝牙连接
  262. function disconnectDevice(callBack) {
  263. console.log('income disconnectDevice')
  264. if (receiveDataCallBack){
  265. receiveDataCallBack = null
  266. }
  267. mIsInitCmdSend = false;
  268. if (!m_isConn) {
  269. callBack(makeRes(-1, [], '未连接'))
  270. return;
  271. }
  272. console.log(' disconnectDevice begin')
  273. let data = makeDisconnectWithETC();
  274. // mIsInitCmdSend = false;
  275. mRecvDataCache = []
  276. console.log(' disconnectDevice begin2')
  277. write(data)
  278. my.disconnectBLEDevice({
  279. deviceId: mDeviceId,
  280. success: function(res) {
  281. m_isConn = false;
  282. callBack(makeRes(0, [], '断开成功'))
  283. console.log(' disconnectDevice success')
  284. },
  285. fail: function(e) {
  286. console.log('error:' + e.errMsg)
  287. console.log(' disconnectDevice false')
  288. callBack(makeRes(-1, [], '断开失败'))
  289. }
  290. })
  291. }
  292. /**
  293. 数据透传
  294. @param cmd 指令[]
  295. @param cmdtype 明文:IC:10、ESAM:20
  296. @param callBack 回调函数
  297. status 成功为 true,失败为 false
  298. data NSData 回应数据(明文)+ 签名
  299. errorMsg 报错信息
  300. */
  301. function transCmd(cmd, cmdtype, callBack) {
  302. if (callBack) {
  303. receiveDataCallBack = callBack;
  304. }
  305. if (!m_isConn) {
  306. receiveDataCallBack(makeRes(-2, [], '连接失败'))
  307. return;
  308. }
  309. let cmdType = 0;
  310. if (cmdtype == '10') {
  311. cmdType = 0xA3;
  312. } else if (cmdtype == '20') {
  313. cmdType = 0xA8;
  314. }
  315. let totalMutableData = []
  316. for (var i = 0; i < cmd.length; i++) {
  317. let obj = str2Bytes(cmd[i]);
  318. console.log('##### cmd_:' + ab2hexArr(obj))
  319. let oneData = makeMutiPackageData(obj, i + 1)
  320. console.log('##### oneData:' + ab2hexArr(oneData))
  321. totalMutableData.push.apply(totalMutableData, oneData);
  322. }
  323. console.log('totalMutableData:' + ab2hexArr(totalMutableData))
  324. let totalChar = totalMutableData;
  325. let pbChar = [];
  326. pbChar[0] = 0xA1;
  327. pbChar[1] = totalMutableData.length;
  328. pbChar.push.apply(pbChar, totalChar);
  329. let reallyData = pbChar;
  330. console.log('reallyData:' + ab2hexArr(reallyData))
  331. mTransData = []
  332. if (!makeXXCmdPacket(cmdType, reallyData)) {
  333. subReqDataAndMakeEtcProtoPacket(mTransData)
  334. }
  335. }
  336. function makeMutiPackageData(xxCmdData, dataIndex) {
  337. let index = 0;
  338. let cmdDataLen = xxCmdData.length;
  339. let cmdPacketDataLen = cmdDataLen + 12;
  340. let pbData = []
  341. pbData[index++] = 0xA4; //1
  342. pbData[index++] = 0x00; //Len2 1字节长度,真实数值后续代码算 2
  343. //stable data
  344. pbData[index++] = 0x38; //3
  345. pbData[index++] = 0x01; //4
  346. pbData[index++] = dataIndex; //5
  347. pbData[index++] = 0x39; //6
  348. pbData[index++] = cmdDataLen; //Len3
  349. pbData.push.apply(pbData, xxCmdData)
  350. index += cmdDataLen;
  351. //stable data
  352. pbData[index++] = 0x3C;
  353. pbData[index++] = 0x01;
  354. pbData[index++] = 0x00;
  355. // pbData[index++] = 0x00;
  356. // pbData[index] = 0x00;
  357. pbData[1] = cmdDataLen + 3 + 2 + 3;
  358. return pbData;
  359. }
  360. function subReqDataAndMakeEtcProtoPacket(etcProtoData) {
  361. let hr = 0;
  362. let totalDataLen = etcProtoData.length;
  363. let blockSize = maxLenPerPacket;
  364. let offset = 0
  365. //if (blockSize == undefined)
  366. if(!blockSize)
  367. {
  368. blockSize = 100
  369. }
  370. let YuShu = totalDataLen % blockSize;
  371. let PackNumOffset = 0;
  372. let PackNum = (YuShu == 0) ? (totalDataLen / blockSize) : (parseInt(totalDataLen / blockSize) + 1);
  373. let LastPackSize = (YuShu == 0) ? ETC_PRO_SINGLE_PACK_SIZE : YuShu;
  374. let pSendBuf = etcProtoData;
  375. let sendBuff = [];
  376. mSingleEtcProtoData = [];
  377. let _pack = {}
  378. _pack.perPackSize = blockSize
  379. _pack.finalPackSize = LastPackSize
  380. _pack.packNum = PackNum
  381. if (totalDataLen > blockSize) {
  382. for (; offset < (totalDataLen - blockSize); offset += blockSize) {
  383. _pack.packNumOffset = PackNumOffset;
  384. sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, offset + blockSize))
  385. let sendBuffDataLen = sendBuff.length ;
  386. if (sendBuffDataLen == 0)
  387. return ;
  388. hr = makeSingleEtcProtocolPaket(sendBuff, _pack)
  389. if (hr != 0) {
  390. return hr;
  391. }
  392. PackNumOffset++;
  393. hr = tranmitBleBlock()
  394. if (hr != 0) {
  395. return hr;
  396. }
  397. sendBuff = []
  398. }
  399. }
  400. _pack.packNumOffset = PackNumOffset;
  401. sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, totalDataLen))
  402. let data = sendBuff.slice(0, totalDataLen - offset)
  403. hr = makeSingleEtcProtocolPaket(data, _pack)
  404. if (hr != 0) {
  405. return hr;
  406. }
  407. console.log('tranmitBleBlock(' + mSingleEtcProtoData.length + '):' + ab2hexArr(mSingleEtcProtoData))
  408. return tranmitBleBlock()
  409. }
  410. function makeSingleEtcProtocolPaket(ectCmdRawData, sPack) {
  411. let SendCTL = sPack.packNum - sPack.packNumOffset - 1;
  412. let IsLastPack = ((sPack.packNumOffset + 1) == sPack.packNum) ? 1 : 0;
  413. let DataLen = 0;
  414. let SendLen = 0;
  415. let etcCmdRawDataLen = ectCmdRawData.length;
  416. let etcCmdRawBufLen = etcCmdRawDataLen + 5;
  417. let etcCmdRawBuf = [];
  418. SendCTL = (sPack.packNumOffset == 0) ? (BLE_CTL_START_BIT | SendCTL) : SendCTL;
  419. DataLen = IsLastPack ? sPack.finalPackSize : sPack.perPackSize; //ETC_PRO_SINGLE_PACK_SIZE;
  420. /* 33协议组包*/
  421. etcCmdRawBuf[SendLen++] = BLE_ETC_PRO_HEAD_ST; //ST
  422. etcCmdRawBuf[SendLen++] = 0x00; //sPack.packNumOffset+1;//0x00;
  423. etcCmdRawBuf[SendLen++] = SendCTL; //CTL
  424. etcCmdRawBuf[SendLen++] = etcCmdRawDataLen; //LEN
  425. etcCmdRawBuf.push.apply(etcCmdRawBuf, ectCmdRawData);
  426. SendLen += ectCmdRawData.length;
  427. etcCmdRawBuf[SendLen++] = XorVerify(etcCmdRawBuf.slice(1), (ectCmdRawData.length + 3)); //BCC校验,从SN到DATA
  428. console.log('*****makeSingleEtcPacket : ' + ab2hexArr(etcCmdRawBuf))
  429. return makeSingleProtoPacket(etcCmdRawBuf)
  430. }
  431. function XorVerify(buf, len) {
  432. let TempVerify = 0x00;
  433. let i = 0;
  434. for (i = 0; i < len; i++) {
  435. TempVerify ^= buf[i];
  436. }
  437. return TempVerify
  438. }
  439. function AppSetVarints(inValue) {
  440. if (inValue < 128) {
  441. mLenBuf[0] = inValue;
  442. mBytesNumOfDataLen = 1;
  443. } else {
  444. mLenBuf[0] = (inValue & 0x7F) | 0x80;
  445. mLenBuf[1] = (inValue >> 7) & 0x7F;
  446. mBytesNumOfDataLen = 2;
  447. }
  448. }
  449. function makeSingleProtoPacket(etcEnclosurBuf) {
  450. let index = 0;
  451. let ManufactoryDefineKeyValue = 0; //厂商自定义数据长度,根据不同值设置不同数据
  452. let sDataLen = etcEnclosurBuf.length;
  453. if (sDataLen == 0 || sDataLen > (MAX_WECHAT_SEND_LEN - 12)) {
  454. console.log('[ERROR] Wechat send len error, return!')
  455. return 1;
  456. }
  457. mLenBuf = []
  458. mBytesNumOfDataLen = 0;
  459. AppSetVarints(sDataLen)
  460. let protoBufLen = sDataLen + 11 + mBytesNumOfDataLen + ManufactoryDefineKeyValue;
  461. let protoBuf = [];
  462. protoBuf[index++] = WECHAT_PRO_HEAD_MAGIC_NUMBER;
  463. protoBuf[index++] = WECHAT_PRO_HEAD_PACK_VERSION;
  464. protoBuf[index++] = (protoBufLen >> 8) & 0xff;
  465. protoBuf[index++] = (protoBufLen) & 0xff;
  466. protoBuf[index++] = (WECHAT_CMD_ECI_PUSH_RECV_DATA >> 8) & 0xff;
  467. protoBuf[index++] = (WECHAT_CMD_ECI_PUSH_RECV_DATA) & 0xff;
  468. protoBuf[index++] = 0x00;
  469. protoBuf[index++] = 0x00;
  470. /* 变长包体,key1-value1 - key2-value2 - key3-value3... ,value=len+data 具体可参考protobuf协议*/
  471. protoBuf[index++] = 0x0A; //可认为固定值
  472. protoBuf[index++] = 0x00;
  473. protoBuf[index++] = 0x12; //data域key值;
  474. protoBuf[index++] = mLenBuf[0]; //data域lenth
  475. if (mBytesNumOfDataLen == 2) {
  476. protoBuf[index++] = mLenBuf[1];
  477. }
  478. protoBuf.push.apply(protoBuf, etcEnclosurBuf)
  479. index += sDataLen;
  480. if (ManufactoryDefineKeyValue == 2) //暂时未用到
  481. {
  482. protoBuf[index++] = 0x18;
  483. protoBuf[index++] = 0x00;
  484. }
  485. if (ManufactoryDefineKeyValue == 3) //暂时未用到
  486. {
  487. protoBuf[index++] = 0x18;
  488. protoBuf[index++] = 0x91;
  489. protoBuf[index++] = 0x4e;
  490. }
  491. mSingleEtcProtoData = []
  492. mSingleEtcProtoData.push.apply(mSingleEtcProtoData, protoBuf.slice(0, index))
  493. console.log('*****makeSingleProtoPacket : ' + ab2hexArr(mSingleEtcProtoData))
  494. return 0;
  495. }
  496. function tranmitBleBlock() {
  497. let totalDataLen = mSingleEtcProtoData.length;
  498. let blockSize = MAX_BLE_SIZE;
  499. let offset = 0;
  500. if (blockSize <= 0) {
  501. return 1;
  502. }
  503. let pSendBuf = mSingleEtcProtoData;
  504. let sendBuff = [];
  505. if (totalDataLen > blockSize) {
  506. for (; offset < totalDataLen - blockSize; offset += blockSize) {
  507. sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, blockSize + offset))
  508. let data = sendBuff.slice(0, blockSize)
  509. console.log('tranmitBleBlock part:(' + blockSize + '),data:' + ab2hexArr(data))
  510. writeData(data)
  511. sendBuff = []
  512. sleep(100)
  513. }
  514. }
  515. sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, totalDataLen))
  516. let data = sendBuff.slice(0, totalDataLen - offset)
  517. console.log('tranmitBleBlock part:(' + (totalDataLen - offset) + '),data:' + ab2hexArr(data))
  518. writeData(data)
  519. return 0;
  520. }
  521. function sleep(delay) {
  522. var start = (new Date()).getTime();
  523. while ((new Date()).getTime() - start < delay) {
  524. continue;
  525. }
  526. }
  527. function write(arrayBuffer) {
  528. console.log('发送:' + ab2hex(arrayBuffer))
  529. my.writeBLECharacteristicValue({
  530. deviceId: mDeviceId,
  531. serviceId: (m_IsIOS ? mServiceId_i : mServiceId),
  532. characteristicId: (m_IsIOS ? mWriteUUID_i : mWriteUUID),
  533. value: ab2hex(arrayBuffer),
  534. success: function(res) {
  535. console.log('发送成功')
  536. },
  537. fail: function(e) {
  538. console.log('发送失败')
  539. }
  540. })
  541. }
  542. function writeData(data) {
  543. // let arrayBuffer = new Uint8Array(data).buffer;
  544. console.log('发送Data:' + data)
  545. my.writeBLECharacteristicValue({
  546. deviceId: mDeviceId,
  547. serviceId: (m_IsIOS ? mServiceId_i : mServiceId),
  548. characteristicId: (m_IsIOS ? mWriteUUID_i : mWriteUUID),
  549. value: ab2hex(data),
  550. success: function(res) {
  551. console.log('发送成功')
  552. },
  553. fail: function(e) {
  554. console.log('发送失败')
  555. }
  556. })
  557. }
  558. function ab2hex(buffer) {
  559. let hexArr = Array.prototype.map.call(
  560. new Uint8Array(buffer),
  561. function(bit) {
  562. return ('00' + bit.toString(16)).slice(-2)
  563. }
  564. )
  565. return hexArr.join('');
  566. }
  567. function ab2DecArr(buffer) {
  568. return new Uint8Array(buffer);
  569. }
  570. function ab2hexArr(arr) {
  571. let hexArr = Array.prototype.map.call(
  572. arr,
  573. function(bit) {
  574. return ('00' + bit.toString(16)).slice(-2)
  575. }
  576. )
  577. return hexArr;
  578. }
  579. function str2Bytes(str) {
  580. var pos = 0;
  581. var len = str.length;
  582. if (len % 2 != 0) {
  583. return null;
  584. }
  585. len /= 2;
  586. var hexA = new Array();
  587. for (var i = 0; i < len; i++) {
  588. var s = str.substr(pos, 2);
  589. var v = parseInt(s, 16);
  590. hexA.push(v);
  591. pos += 2;
  592. }
  593. return hexA;
  594. }
  595. function makeHandShakeStep1WithETC() {
  596. let cBuff = []
  597. let index = 0
  598. cBuff[index++] = 0xFE;
  599. cBuff[index++] = 0x01;
  600. cBuff[index++] = 0x00;
  601. cBuff[index++] = 0x0E;
  602. cBuff[index++] = 0x4E;
  603. cBuff[index++] = 0x21;
  604. cBuff[index++] = 0x00;
  605. cBuff[index++] = 0x01;
  606. cBuff[index++] = 0x0A;
  607. cBuff[index++] = 0x02;
  608. cBuff[index++] = 0x08;
  609. cBuff[index++] = 0x00;
  610. cBuff[index++] = 0x12;
  611. cBuff[index] = 0x00;
  612. return new Uint8Array(cBuff).buffer;
  613. }
  614. function makeHandShakeStep2WithETC() {
  615. let cBuff = []
  616. let index = 0
  617. cBuff[index++] = 0xFE;
  618. cBuff[index++] = 0x01;
  619. cBuff[index++] = 0x00;
  620. cBuff[index++] = 0x13;
  621. cBuff[index++] = 0x4E;
  622. cBuff[index++] = 0x23;
  623. cBuff[index++] = 0x00;
  624. cBuff[index++] = 0x02;
  625. cBuff[index++] = 0x0A;
  626. cBuff[index++] = 0x02;
  627. cBuff[index++] = 0x08;
  628. cBuff[index++] = 0x00;
  629. cBuff[index++] = 0x10;
  630. cBuff[index++] = 0xB4;
  631. cBuff[index++] = 0x24;
  632. cBuff[index++] = 0x18;
  633. cBuff[index++] = 0xF8;
  634. cBuff[index++] = 0xAC;
  635. cBuff[index] = 0x01;
  636. return new Uint8Array(cBuff).buffer;
  637. }
  638. function makeInitWithETC() {
  639. let cBuff = []
  640. let index = 0
  641. cBuff[index++] = 0xFE;
  642. cBuff[index++] = 0x01;
  643. cBuff[index++] = 0x00;
  644. cBuff[index++] = 0x14;
  645. cBuff[index++] = 0x75;
  646. cBuff[index++] = 0x31;
  647. cBuff[index++] = 0x00;
  648. cBuff[index++] = 0x02;
  649. cBuff[index++] = 0x0A;
  650. cBuff[index++] = 0x00;
  651. cBuff[index++] = 0x12;
  652. cBuff[index++] = 0x06;
  653. cBuff[index++] = 0x33;
  654. cBuff[index++] = 0x0A;
  655. cBuff[index++] = 0x80;
  656. cBuff[index++] = 0x01;
  657. cBuff[index++] = 0xA2;
  658. cBuff[index++] = 0x29;
  659. cBuff[index++] = 0x18;
  660. cBuff[index] = 0x00;
  661. return new Uint8Array(cBuff).buffer;
  662. }
  663. function makeDisconnectWithETC() {
  664. let cBuff = []
  665. let index = 0
  666. cBuff[index++] = 0xFE;
  667. cBuff[index++] = 0x01;
  668. cBuff[index++] = 0x00;
  669. cBuff[index++] = 0x14;
  670. cBuff[index++] = 0x75;
  671. cBuff[index++] = 0x31;
  672. cBuff[index++] = 0x00;
  673. cBuff[index++] = 0x02;
  674. cBuff[index++] = 0x0A;
  675. cBuff[index++] = 0x00;
  676. cBuff[index++] = 0x12;
  677. cBuff[index++] = 0x06;
  678. cBuff[index++] = 0x33;
  679. cBuff[index++] = 0x0A;
  680. cBuff[index++] = 0x80;
  681. cBuff[index++] = 0x01;
  682. cBuff[index++] = 0xAE;
  683. cBuff[index] = 0x25;
  684. return new Uint8Array(cBuff).buffer;
  685. }
  686. function unpaketProto(recvDataCache) {
  687. let data = recvDataCache.slice(12)
  688. let dataLen = recvDataCache[13]
  689. let st = data[0];
  690. let ctl = data[2];
  691. let dataLet = data[3];
  692. let ndata = data.slice(4);
  693. let StartPackFlag = ((ctl & 0x80) > 0) ? true : false
  694. let CurrentPackNum = ctl & 0x7F;
  695. mCurrentPacketNum = CurrentPackNum;
  696. let operatorStatus = 0;
  697. if (st != 0x33) {
  698. return -1;
  699. console.log('[ERROR] The received data head ST is not right!')
  700. }
  701. if (StartPackFlag) {
  702. operatorStatus = 1;
  703. }
  704. mEtcRawData = ndata.slice(0, dataLen - 1)
  705. mEtcRawDataLen = dataLen
  706. return operatorStatus & CurrentPackNum;
  707. }
  708. function unpaketProto_1(recvDataCache) {
  709. let data = recvDataCache.slice(12)
  710. let dataLen = recvDataCache[13]
  711. let st = data[0];
  712. let ctl = data[2];
  713. let dataLet = data[3];
  714. let ndata = data.slice(4);
  715. let StartPackFlag = ((ctl & 0x80) > 0) ? true : false
  716. let CurrentPackNum = ctl & 0x7F;
  717. let operatorStatus = 0;
  718. if (st != 0x33) {
  719. return -1;
  720. console.log('[ERROR] The received data head ST is not right!')
  721. }
  722. if (StartPackFlag) {
  723. operatorStatus = 1;
  724. }
  725. mAbCmdBuf = ndata.slice(0, dataLen - 1)
  726. mnCmdBufLen = dataLen
  727. return operatorStatus & CurrentPackNum;
  728. }
  729. function unpackXXCmdPacket(recvDataCache) {
  730. mAbCmdBuf = recvDataCache;
  731. mnCmdBufLen = 0
  732. // unpaketProto_1(recvDataCache)
  733. // let cmdStatus = mAbCmdBuf[1];
  734. // if (cmdStatus != 0) {
  735. // return 4;
  736. // }
  737. let abCmdTLVLen = (mAbCmdBuf[4] << 8) + mAbCmdBuf[3];
  738. if (abCmdTLVLen <= 0) {
  739. receiveDataCallBack(makeRes(-1, [], '未插卡'))
  740. return
  741. }
  742. let abCmdTLVBuf = mAbCmdBuf.slice(5, abCmdTLVLen + 5)
  743. if (abCmdTLVBuf[0] == 0xA3 && abCmdTLVBuf[2] == 0xA2) {
  744. let abCmdTLVBuf1 = abCmdTLVBuf.slice(2, abCmdTLVLen)
  745. let len = abCmdTLVLen - 2;
  746. while (len > 0) {
  747. let rData = abCmdTLVBuf1.slice(3, abCmdTLVBuf1[1] - 1 + 3)
  748. mReturnedRawCmdData.push(bytes2Str(rData))
  749. abCmdTLVBuf1 = abCmdTLVBuf1.slice(3 + abCmdTLVBuf1[1] - 1, abCmdTLVBuf1.length)
  750. len = abCmdTLVBuf1.length;
  751. }
  752. } else {
  753. return 5;
  754. }
  755. return 0;
  756. }
  757. function makeXXCmdPacket(cmdType, reqData) {
  758. let index = 0;
  759. let cmdDataLen = reqData.length
  760. let cmdPacketDataLen = cmdDataLen + 10;
  761. let pbData = [];
  762. if (KYunNanObuMultiplePackages == 0) {
  763. pbData[index++] = ((cmdType == 0xA3) ? cmdType : 0xA8); // PICC 通道 0
  764. pbData[index++] = 0x00; // 明文数据 01 加密数据 1
  765. pbData[index++] = 0x00; //总长度 2
  766. pbData[index++] = 0x00; //总长度,后续代码会算 3
  767. pbData[index++] = 0xA1; //4
  768. pbData[index++] = 0x00; //Len1 1字节长度,真实数值后续代码算 5
  769. pbData[index++] = 0xA4; //6
  770. pbData[index++] = 0x00; //Len2 1字节长度,真实数值后续代码算 7
  771. //stable data
  772. pbData[index++] = 0x38; //8
  773. pbData[index++] = 0x01; //9
  774. pbData[index++] = 0x01; //10
  775. pbData[index++] = 0x39; //11
  776. pbData[index++] = cmdDataLen; //Len3
  777. pbData.push.apply(pbData, reqData)
  778. index += cmdDataLen;
  779. //stable data
  780. pbData[index++] = 0x3C;
  781. pbData[index++] = 0x03;
  782. pbData[index++] = 0x90;
  783. pbData[index++] = 0x00;
  784. pbData[index] = 0x00;
  785. pbData[7] = cmdDataLen + 1 + 9; //Len2长度 = 指令数据长度+两组固定数据长度+cmdDatalen自身长度标识1字节
  786. pbData[5] = pbData[7] + 2; //2包含固定数据0xA4与 pbData[7]本身长度标识1字节
  787. pbData[2] = ((pbData[5] + 2) & 0xff);
  788. pbData[3] = ((pbData[5]) >> 8) & 0xff; //总长度 小端模式
  789. } else {
  790. pbData[index++] = ((cmdType == 0xA3) ? cmdType : 0xA8);
  791. pbData[index++] = 0x00; //0 明文 1密文
  792. pbData[index++] = (cmdDataLen & 0xff); //总长度
  793. pbData[index++] = (cmdDataLen >> 8) & 0xff; //总长度,后续代码会算
  794. pbData.push.apply(pbData, reqData)
  795. }
  796. mTransData.push.apply(mTransData, pbData.slice(0, pbData[5] + 6))
  797. return 0;
  798. }
  799. function str2Bytes(str) {
  800. var pos = 0;
  801. var len = str.length;
  802. if (len % 2 != 0) {
  803. return null;
  804. }
  805. len /= 2;
  806. var hexA = new Array();
  807. for (var i = 0; i < len; i++) {
  808. var s = str.substr(pos, 2);
  809. var v = parseInt(s, 16);
  810. hexA.push(v);
  811. pos += 2;
  812. }
  813. return hexA;
  814. }
  815. function bytes2Str(arr) {
  816. var str = "";
  817. for (var i = 0; i < arr.length; i++) {
  818. var tmp = arr[i].toString(16);
  819. if (tmp.length == 1) {
  820. tmp = "0" + tmp;
  821. }
  822. str += tmp;
  823. }
  824. return str;
  825. }
  826. function makeRes(code, data, msg) {
  827. return { code: code, data: data, msg: msg }
  828. }
  829. module.exports = {
  830. getVersion:getVersion,
  831. connectDevice: connectDevice,
  832. transCmd: transCmd,
  833. disconnectDevice: disconnectDevice
  834. }