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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. var bleCode = require("./JLZJConfig.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 serviceId;
  10. var characticId;
  11. var dev;
  12. export function scan_StartScanBleDevice(nameFlag, callBack) {
  13. var devs = [];
  14. initBluetoothAdapte(function(res) {
  15. if (res.code == bleCode.bleSuccessCode()) {
  16. wx.startBluetoothDevicesDiscovery({
  17. services: ["FEE7"],
  18. success: function(res) {
  19. wx.onBluetoothDeviceFound(function(res) {
  20. var scandevices = res.devices;
  21. for (var i = 0; i < scandevices.length; i++) {
  22. var scan_dev = scandevices[i];
  23. if (nameFlag != null) {
  24. if (scan_dev.name.indexOf(nameFlag) != -1) {
  25. devs.push(scan_dev)
  26. }
  27. } else {
  28. if (scan_dev.name.length > 0) {
  29. devs.push(scan_dev)
  30. }
  31. }
  32. }
  33. if (devs.length > 0) {
  34. callBack.call(this, {
  35. code: successCode,
  36. msg: "搜索设备成功",
  37. data: devs
  38. })
  39. }
  40. })
  41. },
  42. fail: function(err) {
  43. var msg = "";
  44. if (err) {
  45. msg = bluetoothErrMsg(err.errCode)
  46. }
  47. callBack.call(this, {
  48. code: bleCode.bleErrorCode(),
  49. msg: msg,
  50. data: null
  51. })
  52. }
  53. })
  54. } else {
  55. callBack.call(this, res)
  56. }
  57. })
  58. };
  59. export function scan_stopScanBleDevice(callBack) {
  60. wx.stopBluetoothDevicesDiscovery({
  61. success: function(res) {
  62. callBack.call(this, {
  63. code: successCode,
  64. msg: "停止扫描成功",
  65. data: null
  66. })
  67. },
  68. fail: function(err) {
  69. var msg = "";
  70. if (err) {
  71. msg = bluetoothErrMsg(err.errCode)
  72. }
  73. callBack.call(this, {
  74. code: errorCode,
  75. msg: msg,
  76. data: null
  77. })
  78. }
  79. })
  80. };
  81. function initBluetoothAdapte(callBack) {
  82. wx.openBluetoothAdapter({
  83. success: function(res) {
  84. wx.getBluetoothAdapterState({
  85. success: function(res) {
  86. if (res.available == true && res.discovering == false) {
  87. callBack.call(this, {
  88. code: successCode,
  89. msg: "初始化蓝牙模块成功",
  90. data: null
  91. })
  92. }
  93. if (res.available == false) {
  94. callBack.call(this, {
  95. code: errorCode,
  96. msg: "蓝牙适配器不可用",
  97. data: null
  98. })
  99. }
  100. if (res.discovering == true) {
  101. callBack.call(this, {
  102. code: errorCode,
  103. msg: "正在搜索设备",
  104. data: null
  105. })
  106. }
  107. },
  108. fail: function(err) {
  109. var msg = "";
  110. if (err) {
  111. msg = bluetoothErrMsg(err.errCode)
  112. }
  113. callBack.call(this, {
  114. code: errorCode,
  115. msg: msg,
  116. data: null
  117. })
  118. }
  119. })
  120. },
  121. fail: function(err) {
  122. var msg = "";
  123. if (err) {
  124. msg = bluetoothErrMsg(err.errCode)
  125. }
  126. callBack.call(this, {
  127. code: errorCode,
  128. msg: msg,
  129. data: null
  130. })
  131. }
  132. })
  133. }
  134. function closeBluetoothAdapte(callBack) {
  135. wx.getBluetoothAdapterState({
  136. success: function(res) {
  137. wx.closeBluetoothAdapter({
  138. success: function(res) {
  139. callBack.call(this, {
  140. code: successCode,
  141. msg: "关闭蓝牙模块成功",
  142. data: null
  143. })
  144. },
  145. fail: function(err) {
  146. callBack.call(this, {
  147. code: errorCode,
  148. msg: err.errmsg,
  149. data: null
  150. })
  151. }
  152. })
  153. },
  154. fail: function(err) {
  155. var msg = "";
  156. if (err) {
  157. msg = bluetoothErrMsg(err.errCode)
  158. }
  159. callBack.call(this, {
  160. code: errorCode,
  161. msg: msg,
  162. data: null
  163. })
  164. }
  165. })
  166. }
  167. export function connectDevice(device, callBack) {
  168. dev = device;
  169. getConnectedDevice(function(res) {
  170. if (res.code == bleCode.bleSuccessCode()) {
  171. wxConnectDevice(function(res) {
  172. callBack.call(this, res)
  173. })
  174. } else {
  175. callBack.call(this, res)
  176. }
  177. })
  178. };
  179. //dis连接设备
  180. export function disConnectDevice(callBack) {
  181. wxDisConnectDevice(function(res) {
  182. callBack.call(this, res)
  183. })
  184. };
  185. export function onDeviceConnectStateChange(callBack) {
  186. wx.onBLEConnectionStateChange(function(res) {
  187. if (res.connected == true) {
  188. callBack.call(this, {
  189. code: bleCode.successCode(),
  190. data: res.deviceId,
  191. msg: "设备连接"
  192. })
  193. } else {
  194. callBack.call(this, {
  195. code: bleCode.ondisConnect(),
  196. data: res.deviceId,
  197. msg: "设备断开"
  198. })
  199. }
  200. })
  201. };
  202. function wxConnectDevice(callBack) {
  203. console.log("连接设备对象:" + JSON.stringify(dev));
  204. wx.createBLEConnection({
  205. deviceId: dev.deviceId,
  206. success: function(res) {
  207. callBack.call(this, {
  208. code: bleCode.bleSuccessCode(),
  209. msg: "蓝牙物理连接成功",
  210. data: dev
  211. })
  212. },
  213. fail: function(err) {
  214. var msg = "";
  215. if (err) {
  216. msg = bluetoothErrMsg(err.errCode)
  217. }
  218. callBack.call(this, {
  219. code: bleCode.bleErrorCode(),
  220. msg: msg,
  221. data: null
  222. })
  223. }
  224. })
  225. }
  226. function getConnectedDevice(callBack) {
  227. wx.getConnectedBluetoothDevices({
  228. services: ["fee7"],
  229. success: function(res) {
  230. if (res.devices.length > 0) {
  231. callBack.call(this, {
  232. code: bleCode.bleErrorCode(),
  233. msg: "蓝牙被占用",
  234. data: res.services[0]
  235. })
  236. } else {
  237. callBack.call(this, {
  238. code: bleCode.bleSuccessCode(),
  239. msg: "可连接设备",
  240. data: null
  241. })
  242. }
  243. },
  244. fail: function(err) {
  245. var msg = "";
  246. if (err) {
  247. msg = bluetoothErrMsg(err.errCode)
  248. }
  249. callBack.call(this, {
  250. code: bleCode.bleErrorCode(),
  251. msg: msg,
  252. data: null
  253. })
  254. }
  255. })
  256. }
  257. function wxDisConnectDevice(callBack) {
  258. if (dev != null) {
  259. wx.closeBLEConnection({
  260. deviceId: dev.deviceId,
  261. success: function(res) {
  262. wx.closeBluetoothAdapter({
  263. success: function(res) {
  264. callBack.call(this, {
  265. code: bleCode.bleSuccessCode(),
  266. msg: "设备断开连接成功",
  267. data: null
  268. })
  269. },
  270. fail: function(err) {
  271. callBack.call(this, {
  272. code: bleCode.bleErrorCode(),
  273. msg: "设备断开连接成功," + err.errmsg,
  274. data: null
  275. })
  276. }
  277. })
  278. },
  279. fail: function(err) {
  280. var msg = "";
  281. if (err) {
  282. msg = bluetoothErrMsg(err.errCode)
  283. }
  284. callBack.call(this, {
  285. code: bleCode.bleErrorCode(),
  286. msg: msg,
  287. data: null
  288. })
  289. }
  290. })
  291. } else {
  292. callBack.call(this, {
  293. code: bleCode.bleSuccessCode(),
  294. msg: "暂无设备连接",
  295. data: null
  296. })
  297. }
  298. }
  299. export function findDeviceServices(device, callBack1, callBack2) {
  300. getDeviceService(device, function(res) {
  301. getDeviceCharacteristics(device, res.data, function(res1) {
  302. callBack1.call(this, res1)
  303. }, function(res2) {
  304. if (res2.code == bleCode.bleSuccessCode()) {
  305. wx.onBLECharacteristicValueChange(function(res) {
  306. console.log("接收数据<<=============:" + dataTool.bufferTohex(res.value).toLocaleUpperCase());
  307. callBack2.call(this, {
  308. code: bleCode.bleSuccessCode(),
  309. msg: "特征值发生变化",
  310. data: {
  311. value: dataTool.bufferTohex(res.value).toLocaleUpperCase()
  312. }
  313. })
  314. })
  315. } else {
  316. callBack2.call(this, res2)
  317. }
  318. })
  319. })
  320. };
  321. function getDeviceService(device, callBack) {
  322. //获取蓝牙低功耗设备所有服务 (service)。
  323. wx.getBLEDeviceServices({
  324. deviceId: device.deviceId, //设备ID
  325. success: function(res) {
  326. var services = res.services;
  327. for (var i = 0; i < services.length; i++) {
  328. if ("0000FEE7" == res.services[i].uuid.substr(0, 8)) {
  329. callBack.call(this, {
  330. code: bleCode.bleSuccessCode(),
  331. msg: "寻找服务成功",
  332. data: res.services[i].uuid
  333. })
  334. }
  335. }
  336. }
  337. })
  338. }
  339. function getDeviceCharacteristics(device, serviceId, callBack1, callBack2) {
  340. //获取蓝牙低功耗设备某个服务中所有特征
  341. wx.getBLEDeviceCharacteristics({
  342. deviceId: device.deviceId,
  343. serviceId: serviceId,
  344. success: function(res) {
  345. var charactertics = res.characteristics;
  346. for (var i = 0; i < charactertics.length; i++) {
  347. var charact = charactertics[i];
  348. if (charact.properties.read == true) {
  349. //读取蓝牙低功耗设备特征值的二进制数据。注意:必须设备的特征支持 read 才可以成功调用。
  350. wx.readBLECharacteristicValue({
  351. deviceId: device.deviceId,
  352. serviceId: charact_serviceId,
  353. characteristicId: charact.uuid,
  354. success: function(res) {}
  355. })
  356. }
  357. if (charact.properties.write == true) {
  358. callBack1.call(this, {
  359. code: bleCode.bleSuccessCode(),
  360. msg: null,
  361. data: {
  362. id: {
  363. devId: device.deviceId,
  364. serId: serviceId,
  365. charactId: charact.uuid
  366. }
  367. }
  368. })
  369. }
  370. if (charact.properties.notify == true || charact.properties.indicate == true) {
  371. wx.notifyBLECharacteristicValueChange({
  372. deviceId: device.deviceId,
  373. serviceId: serviceId,
  374. characteristicId: charact.uuid,
  375. state: true,
  376. success: function(res) {
  377. callBack2.call(this, {
  378. code: bleCode.bleSuccessCode(),
  379. msg: "开启设备监听成功",
  380. data: res
  381. })
  382. },
  383. fail: function(err) {
  384. var msg = "";
  385. if (err) {
  386. msg = bluetoothErrMsg(err.errCode)
  387. }
  388. callBack2.call(this, {
  389. code: bleCode.bleErrorCode(),
  390. msg: msg,
  391. data: null
  392. })
  393. }
  394. })
  395. }
  396. }
  397. }
  398. })
  399. }
  400. export function setParams(id) {
  401. deviceId = id.devId;
  402. serviceId = id.serId;
  403. characticId = id.charactId;
  404. console.log("写数据各项ID:" + JSON.stringify(id))
  405. };
  406. export function sendMessageToDevice(cmdArray, callBack) {
  407. var cmd = dataTool.strToBuffer(cmdArray[0]);
  408. var i = 0;
  409. wx.writeBLECharacteristicValue({
  410. deviceId: deviceId,
  411. serviceId: serviceId,
  412. characteristicId: characticId,
  413. value: cmd,
  414. success: function(res) {
  415. if (i < cmdArray.length - 1) {
  416. i++;
  417. onfire.fire("send", i)
  418. } else {
  419. onfire.clear();
  420. console.info("所有数据发送完成 共:" + cmdArray.length + "包");
  421. console.info("发送数据=============>>::" + cmdArray);
  422. callBack.call(this, {
  423. code: successCode,
  424. msg: "数据发送成功",
  425. data: cmdArray
  426. })
  427. }
  428. },
  429. fail: function(err) {
  430. console.log("writeBLECharacteristicValue fail:" + JSON.stringify(err));
  431. var msg = "";
  432. if (err) {
  433. msg = bluetoothErrMsg(err.errCode)
  434. }
  435. callBack.call(this, {
  436. code: bleCode.bleErrorCode(),
  437. msg: msg,
  438. data: null
  439. })
  440. }
  441. });
  442. onfire.on("send", i => {
  443. var cmd1 = dataTool.strToBuffer(cmdArray[i]);
  444. wx.writeBLECharacteristicValue({
  445. deviceId: deviceId,
  446. serviceId: serviceId,
  447. characteristicId: characticId,
  448. value: cmd1,
  449. success: function(res) {
  450. if (i < cmdArray.length - 1) {
  451. i++;
  452. onfire.fire("send", i)
  453. } else {
  454. onfire.clear();
  455. console.info("所有数据发送完成 共:" + cmdArray.length + "包");
  456. console.info("发送数据=============>>:" + cmdArray);
  457. callBack.call(this, {
  458. code: successCode,
  459. msg: "数据发送成功",
  460. data: cmdArray
  461. })
  462. }
  463. },
  464. fail: function(err) {
  465. console.log("writeBLECharacteristicValue fail:" + JSON.stringify(err));
  466. var msg = "";
  467. if (err) {
  468. msg = bluetoothErrMsg(err.errCode)
  469. }
  470. callBack.call(this, {
  471. code: bleCode.bleErrorCode(),
  472. msg: msg,
  473. data: null
  474. })
  475. }
  476. })
  477. })
  478. };
  479. function bluetoothErrMsg(errorCode) {
  480. switch (errorCode) {
  481. case 0:
  482. return "正常";
  483. break;
  484. case 1e4:
  485. return "未初始化蓝牙适配器";
  486. break;
  487. case 10001:
  488. return "当前蓝牙适配器不可用";
  489. break;
  490. case 10002:
  491. return "没有找到指定设备";
  492. break;
  493. case 10003:
  494. return "连接失败:操作超时";
  495. break;
  496. case 10004:
  497. return "蓝牙设备没有找到指定服务";
  498. break;
  499. case 10005:
  500. return "蓝牙设备没有找到指定特征值";
  501. break;
  502. case 10006:
  503. return "当前设备连接已断开";
  504. break;
  505. case 10007:
  506. return "当前特征值不支持此操作";
  507. break;
  508. case 10008:
  509. return "其余所有系统上报的异常";
  510. break;
  511. case 10009:
  512. return "安卓系统版本低于4.3不支持BLE";
  513. break;
  514. default:
  515. return "操作失败";
  516. break
  517. }
  518. }