You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TDRObuSDK.js 29KB

hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
hace 1 año
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. }