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.

JLAlipayBleManager.js 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. var bleCode = require('./JLConfig.js');
  2. var onfire = require('./onfire.js');
  3. var dataTool = require('./dataTool.js');
  4. var successCode = bleCode.bleSuccessCode();
  5. var errorCode = bleCode.bleErrorCode();
  6. var serviceId = 'FEE7';
  7. var charact_serviceId = serviceId;
  8. var deviceId;
  9. var characticId;
  10. var TAG = " JLAlipayBleManager.js ";
  11. var dev;
  12. export function scan_StartScanBleDevice(nameFlag, callBack) {
  13. var devs = [];
  14. initBluetoothAdapte((res) => {
  15. my.startBluetoothDevicesDiscovery({
  16. services: ['FEE7'],
  17. success: (res) => {
  18. my.onBluetoothDeviceFound({
  19. success: (res) => {
  20. console.log(TAG + " onBluetoothDeviceFound " + JSON.stringify(
  21. res));
  22. var scandevices = res.devices;
  23. for (var i = 0; i < scandevices.length; i++) {
  24. var scan_dev = scandevices[i];
  25. if (nameFlag != null) {
  26. if (scan_dev.name.startsWith(nameFlag)) {
  27. devs.push(scan_dev)
  28. }
  29. } else {
  30. if (scan_dev.name && scan_dev.deviceId) {
  31. devs.push(scan_dev)
  32. }
  33. }
  34. }
  35. if (devs.length > 0) {
  36. callBack.call(this, {
  37. code: successCode,
  38. err_msg: '搜索设备成功',
  39. data: devs,
  40. msg: ''
  41. })
  42. }
  43. }
  44. })
  45. },
  46. fail: (err) => {
  47. var msg = '';
  48. if (err) {
  49. msg = bluetoothErrMsg(err.error)
  50. }
  51. callBack.call(this, {
  52. code: errorCode,
  53. err_msg: msg,
  54. data: null
  55. })
  56. }
  57. })
  58. })
  59. }
  60. export function scan_stopScanBleDevice(callBack) {
  61. my.stopBluetoothDevicesDiscovery({
  62. success: (res) => {
  63. callBack.call(this, {
  64. code: successCode,
  65. err_msg: '停止扫描成功',
  66. data: null,
  67. msg: ''
  68. })
  69. },
  70. fail: (err) => {
  71. var msg = '';
  72. if (err) {
  73. msg = bluetoothErrMsg(err.error)
  74. }
  75. callBack.call(this, {
  76. code: errorCode,
  77. err_msg: msg,
  78. data: null,
  79. msg: ''
  80. })
  81. }
  82. })
  83. }
  84. export function connectDevice(device, callBack) {
  85. dev = device;
  86. getConnectedDevice((res) => {
  87. console.log(TAG + "getConnectedDevice " + JSON.stringify(res));
  88. if (res.code == successCode) {
  89. wxConnectDevice(function(res) {
  90. if (res.code == errorCode) {
  91. if (res.code == errorCode) {
  92. wxConnectDevice(function(res) {
  93. if (res.code == errorCode) {
  94. wxConnectDevice(function(res) {
  95. callBack.call(this, res)
  96. })
  97. } else {
  98. callBack.call(this, res)
  99. }
  100. })
  101. } else {
  102. callBack.call(this, res)
  103. }
  104. } else {
  105. callBack.call(this, res)
  106. }
  107. })
  108. } else {
  109. callBack.call(this, res)
  110. }
  111. })
  112. }
  113. export function disConnectDevice(callBack) {
  114. wxDisConnectDevice(function(res) {
  115. callBack.call(this, res)
  116. })
  117. }
  118. export function findDeviceServices(device, callBack1, callBack2, callBack3) {
  119. var soft_ver = '';
  120. var hard_ver = '';
  121. var serial_ver = '';
  122. var protocol_ver = '';
  123. getDeviceService(device, function(res) {
  124. getDeviceCharacteristics(device, {
  125. ser_fee7: res.data.fee7,
  126. ser_180a: res.data.s180A
  127. }, (res1) => {
  128. callBack1.call(this, res1)
  129. }, (res2) => {
  130. if (res2.code == successCode) {
  131. my.onBLECharacteristicValueChange({
  132. success: (res) => {
  133. console.log(JSON.stringify(res));
  134. if (res.serviceId.substr(0, 4).startsWith('fee7') || res.serviceId
  135. .substr(0, 8).startsWith('0000fee7') || res.serviceId.substr(0,
  136. 4).startsWith('FEE7') || res.serviceId.substr(0, 8)
  137. .startsWith('0000FEE7')) {
  138. console.log('RECV <<================:' + res.value);
  139. callBack2.call(this, {
  140. code: successCode,
  141. msg: '收到设备数据',
  142. data: {
  143. value: res.value
  144. }
  145. })
  146. }
  147. }
  148. })
  149. } else {
  150. callBack2.call(this, res2)
  151. }
  152. }, (res3) => {
  153. my.onBLECharacteristicValueChange({
  154. success: (res) => {
  155. if (res.characteristicId.substr(0, 4).startsWith('2a26') || res
  156. .characteristicId.substr(0, 8).startsWith('00002a26') || res
  157. .characteristicId.substr(0, 4).startsWith('2A26') || res
  158. .characteristicId.substr(0, 8).startsWith('00002A26')) {
  159. protocol_ver = dataTool.hexToString(res.value);
  160. console.log('协议版本:' + protocol_ver);
  161. callBack3.call(this, {
  162. code: 0,
  163. data: {
  164. protocol: protocol_ver
  165. },
  166. err_msg: '获取版本成功'
  167. })
  168. }
  169. }
  170. })
  171. })
  172. })
  173. }
  174. export function setParams(id) {
  175. deviceId = id.devId;
  176. serviceId = id.serId;
  177. characticId = id.charactId;
  178. console.log('写数据各项ID:' + JSON.stringify(id))
  179. }
  180. export function onDeviceConnectStateChange(callBack) {
  181. my.offBLECharacteristicValueChange();
  182. my.onBLEConnectionStateChanged((res) => {
  183. if (res.connected == false) {
  184. wxDisConnectDevice((res) => {
  185. callBack.call(this, {
  186. code: errorCode,
  187. err_msg: '设备断开连接',
  188. data: ''
  189. })
  190. })
  191. }
  192. if (res.connected == true) {
  193. callBack.call(this, {
  194. code: successCode,
  195. err_msg: '设备已连接',
  196. data: ''
  197. })
  198. }
  199. })
  200. }
  201. export function sendMessageToDevice(cmdArray, callBack) {
  202. var i = 0;
  203. var cmd = cmdArray[i];
  204. my.writeBLECharacteristicValue({
  205. deviceId: deviceId,
  206. serviceId: serviceId,
  207. characteristicId: characticId,
  208. value: cmdArray[0],
  209. success: (res) => {
  210. if (i < cmdArray.length - 1) {
  211. console.log('SEND ================>>:' + cmdArray[0]);
  212. i++;
  213. onfire.fire('send', i)
  214. } else {
  215. onfire.clear();
  216. console.log('SEND ================>>:' + cmdArray[0]);
  217. callBack.call(this, {
  218. code: successCode,
  219. msg: '数据发送成功',
  220. data: cmdArray,
  221. })
  222. }
  223. },
  224. fail: (err) => {
  225. console.log('writeBLECharacteristicValue fail:' + JSON.stringify(err));
  226. var msg = '';
  227. if (err) {
  228. msg = bluetoothErrMsg(err.error)
  229. }
  230. callBack.call(this, {
  231. code: errorCode,
  232. msg: msg,
  233. data: null
  234. })
  235. }
  236. });
  237. onfire.on('send', (i) => {
  238. var cmd1 = cmdArray[i];
  239. my.writeBLECharacteristicValue({
  240. deviceId: deviceId,
  241. serviceId: serviceId,
  242. characteristicId: characticId,
  243. value: cmd1,
  244. success: (res) => {
  245. if (i < cmdArray.length - 1) {
  246. console.log('SEND ================>>:' + cmd1);
  247. i++;
  248. onfire.fire('send', i)
  249. } else {
  250. onfire.clear();
  251. console.log('SEND ================>>:' + cmd1);
  252. callBack.call(this, {
  253. code: successCode,
  254. msg: '数据发送成功',
  255. data: cmdArray
  256. })
  257. }
  258. },
  259. fail: (err) => {
  260. console.log('writeBLECharacteristicValue fail:' + JSON.stringify(err));
  261. var msg = '';
  262. if (err) {
  263. msg = bluetoothErrMsg(err.error)
  264. }
  265. callBack.call(this, {
  266. code: errorCode,
  267. msg: msg,
  268. data: null
  269. })
  270. }
  271. })
  272. })
  273. }
  274. function getDeviceService(device, callBack) {
  275. console.log('getDeviceService:' + device);
  276. my.getBLEDeviceServices({
  277. deviceId: device.deviceId,
  278. success: (res) => {
  279. var services = res.services;
  280. var ser_180A = '';
  281. var ser_FEE7 = '';
  282. for (var i = 0; i < services.length; i++) {
  283. if (services[i].serviceId.substr(0, 4).startsWith('fee7') || services[i].serviceId.substr(0,
  284. 8).startsWith('0000fee7') || services[i].serviceId.substr(0, 4).startsWith(
  285. 'FEE7') || services[i].serviceId.substr(0, 8).startsWith('0000FEE7')) {
  286. ser_FEE7 = res.services[i].serviceId
  287. }
  288. if (services[i].serviceId.substr(0, 4).startsWith('180a') || services[i].serviceId.substr(0,
  289. 8).startsWith('0000180a') || services[i].serviceId.substr(0, 4).startsWith(
  290. '180A') || services[i].serviceId.substr(0, 8).startsWith('0000180A')) {
  291. ser_180A = res.services[i].serviceId
  292. }
  293. }
  294. callBack.call(this, {
  295. code: bleCode.bleSuccessCode(),
  296. err_msg: '寻找服务成功',
  297. data: {
  298. fee7: ser_FEE7,
  299. s180A: ser_180A
  300. },
  301. msg: ''
  302. })
  303. },
  304. })
  305. }
  306. function getDeviceCharacteristics(device, serviceId, callBack1, callBack2, callBack3) {
  307. my.getBLEDeviceCharacteristics({
  308. deviceId: device.deviceId,
  309. serviceId: serviceId.ser_180a,
  310. success: (res) => {
  311. var charactertics = res.characteristics;
  312. for (var i = 0; i < charactertics.length; i++) {
  313. var ch = charactertics[i];
  314. if (ch.properties.read == true) {
  315. my.readBLECharacteristicValue({
  316. deviceId: device.deviceId,
  317. serviceId: serviceId.ser_180a,
  318. characteristicId: ch.characteristicId,
  319. success: (res) => {},
  320. })
  321. }
  322. }
  323. },
  324. fail: (err) => {
  325. var msg = '';
  326. if (err) {
  327. msg = bluetoothErrMsg(err.error)
  328. }
  329. callBack3.call(this, {
  330. code: errorCode,
  331. msg: msg,
  332. data: null
  333. })
  334. },
  335. complete: function(com) {
  336. callBack3.call(this, {
  337. code: successCode,
  338. err_msg: "",
  339. data: null,
  340. msg: ''
  341. })
  342. }
  343. });
  344. my.getBLEDeviceCharacteristics({
  345. deviceId: device.deviceId,
  346. serviceId: serviceId.ser_fee7,
  347. success: (res) => {
  348. var charactertics = res.characteristics;
  349. for (var i = 0; i < charactertics.length; i++) {
  350. var charact = charactertics[i];
  351. if (charact.properties.read == true) {
  352. my.readBLECharacteristicValue({
  353. deviceId: device.deviceId,
  354. serviceId: serviceId.ser_fee7,
  355. characteristicId: charact.characteristicId,
  356. success: function(res) {},
  357. })
  358. }
  359. if (charact.properties.write == true) {
  360. callBack1.call(this, {
  361. code: successCode,
  362. err_msg: null,
  363. data: {
  364. id: {
  365. devId: device.deviceId,
  366. serId: serviceId.ser_fee7,
  367. charactId: charact.characteristicId
  368. }
  369. },
  370. msg: ''
  371. })
  372. }
  373. if (charact.properties.notify == true || charact.properties.indicate == true) {
  374. my.notifyBLECharacteristicValueChange({
  375. deviceId: device.deviceId,
  376. serviceId: serviceId.ser_fee7,
  377. characteristicId: charact.characteristicId,
  378. success: (res) => {
  379. callBack2.call(this, {
  380. code: successCode,
  381. err_msg: '开启设备监听成功',
  382. data: res,
  383. msg: ''
  384. })
  385. },
  386. fail: (err) => {
  387. var msg = '';
  388. if (err) {
  389. msg = bluetoothErrMsg(err.error)
  390. }
  391. callBack2.call(this, {
  392. code: errorCode,
  393. msg: msg,
  394. data: null
  395. })
  396. },
  397. })
  398. }
  399. }
  400. },
  401. fail: (err) => {
  402. var msg = '';
  403. if (err) {
  404. msg = bluetoothErrMsg(err.error)
  405. }
  406. callBack3.call(this, {
  407. code: errorCode,
  408. msg: msg,
  409. data: null
  410. })
  411. },
  412. })
  413. }
  414. function wxDisConnectDevice(callBack) {
  415. if (dev != null) {
  416. my.offBluetoothAdapterStateChange();
  417. my.offBLECharacteristicValueChange();
  418. my.offBluetoothDeviceFound();
  419. my.offBLEConnectionStateChanged();
  420. my.disconnectBLEDevice({
  421. deviceId: dev.deviceId,
  422. success: (res) => {
  423. my.closeBluetoothAdapter({
  424. success: (res) => {
  425. callBack.call(this, {
  426. code: successCode,
  427. err_msg: '设备断开连接成功',
  428. data: null,
  429. msg: ''
  430. })
  431. },
  432. fail: (err) => {
  433. callBack.call(this, {
  434. code: successCode,
  435. err_msg: '设备断开连接成功',
  436. data: null,
  437. msg: ''
  438. })
  439. },
  440. })
  441. },
  442. fail: (err) => {
  443. var msg = '';
  444. if (err) {
  445. msg = bluetoothErrMsg(err.error)
  446. }
  447. callBack.call(this, {
  448. code: errorCode,
  449. msg: msg,
  450. data: null
  451. })
  452. },
  453. })
  454. } else {
  455. callBack.call(this, {
  456. code: errorCode,
  457. err_msg: '暂无设备连接',
  458. data: null,
  459. msg: ''
  460. })
  461. }
  462. }
  463. function getConnectedDevice(callBack) {
  464. my.getConnectedBluetoothDevices({
  465. success: (res) => {
  466. if (res.devices.length > 0) {
  467. callBack.call(this, {
  468. code: errorCode,
  469. err_msg: '蓝牙被占用',
  470. data: res.services[0],
  471. msg: ''
  472. })
  473. } else {
  474. callBack.call(this, {
  475. code: successCode,
  476. err_msg: '可连接设备',
  477. data: null,
  478. msg: ''
  479. })
  480. }
  481. },
  482. fail: (err) => {
  483. var msg = '';
  484. if (err) {
  485. msg = bluetoothErrMsg(err.error)
  486. }
  487. callBack.call(this, {
  488. code: errorCode,
  489. msg: msg,
  490. data: null
  491. })
  492. },
  493. })
  494. }
  495. function wxConnectDevice(callBack) {
  496. if (dev.deviceId && dev.name) {
  497. my.connectBLEDevice({
  498. deviceId: dev.deviceId,
  499. success: (res) => {
  500. callBack.call(this, {
  501. code: successCode,
  502. err_msg: '蓝牙物理连接成功',
  503. data: dev,
  504. msg: ''
  505. })
  506. },
  507. fail: (err) => {
  508. var msg = '';
  509. if (err) {
  510. msg = bluetoothErrMsg(err.error)
  511. }
  512. callBack.call(this, {
  513. code: errorCode,
  514. err_msg: msg,
  515. data: null,
  516. msg: ''
  517. })
  518. },
  519. })
  520. } else {
  521. callBack.call(this, {
  522. code: errorCode,
  523. err_msg: msg,
  524. data: null,
  525. msg: ''
  526. })
  527. }
  528. }
  529. function initBluetoothAdapte(callBack) {
  530. my.openBluetoothAdapter({
  531. success: (res) => {
  532. my.getBluetoothAdapterState({
  533. success: (res) => {
  534. if (!res.available) {
  535. callBack.call(this, {
  536. code: errorCode,
  537. msg: '抱歉,您的手机蓝牙暂不可用',
  538. data: null
  539. });
  540. return
  541. }
  542. if (res.discovering) {
  543. callBack.call(this, {
  544. code: errorCode,
  545. msg: '抱歉,蓝牙正在搜索设备',
  546. data: null
  547. });
  548. return
  549. }
  550. callBack.call(this, {
  551. code: successCode,
  552. msg: '本机蓝牙可用',
  553. data: null
  554. })
  555. },
  556. })
  557. },
  558. fail: (err) => {
  559. var msg = '';
  560. if (err) {
  561. msg = bluetoothErrMsg(err.error)
  562. }
  563. callBack.call(this, {
  564. code: errorCode,
  565. msg: msg,
  566. data: null
  567. })
  568. },
  569. })
  570. }
  571. function bluetoothErrMsg(errorCode) {
  572. switch (errorCode) {
  573. case 12:
  574. return '手机蓝牙未打开';
  575. break;
  576. case 10000:
  577. return '未初始化蓝牙适配器';
  578. break;
  579. case 10001:
  580. return '当前蓝牙适配器不可用';
  581. break;
  582. case 10002:
  583. return '没有找到指定设备';
  584. break;
  585. case 10003:
  586. return '连接失败:操作超时';
  587. break;
  588. case 10004:
  589. return '蓝牙设备没有找到指定服务';
  590. break;
  591. case 10005:
  592. return '蓝牙设备没有找到指定特征值';
  593. break;
  594. case 10006:
  595. return '当前设备连接已断开';
  596. break;
  597. case 10007:
  598. return '当前特征值不支持此操作';
  599. break;
  600. case 10008:
  601. return '其余所有系统上报的异常';
  602. break;
  603. case 10009:
  604. return '安卓系统版本低于4.3不支持BLE';
  605. break;
  606. case 10010:
  607. return '没有找到指定描述符';
  608. break;
  609. case 10011:
  610. return '设备 id 不可用/为空';
  611. break;
  612. case 10012:
  613. return '服务 id 不可用/为空';
  614. break;
  615. case 10013:
  616. return '特征 id 不可用/为空';
  617. break;
  618. case 10014:
  619. return '发送的数据为空或格式错误';
  620. break;
  621. case 10015:
  622. return '操作超时';
  623. break;
  624. case 10016:
  625. return '缺少参数';
  626. break;
  627. case 10017:
  628. return '写入特征值失败';
  629. break;
  630. case 10018:
  631. return '读取特征值失败';
  632. break;
  633. default:
  634. return '操作失败';
  635. break
  636. }
  637. }