BleConfigNet.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. const server_uuid = "0000FFE5-0000-1000-8000-00805F9B34FB";
  2. let callback = null
  3. let connecting = false
  4. let connected = false
  5. let deviceId = null
  6. let configTimeout = null
  7. let iccid = ''
  8. /**
  9. * 连接ble设备
  10. * @param {string} mac 设备mac地址
  11. * @param {function} cb 连接的回调
  12. */
  13. function connectBle(mac, cb) {
  14. if (!connecting && !connected) {
  15. deviceId = mac
  16. connecting = true
  17. callback = cb
  18. iccid = ''
  19. uni.createBLEConnection({
  20. deviceId,
  21. success(res) {
  22. console.log('ble连接成功')
  23. //console.log(res)
  24. connected = true
  25. connecting = false
  26. //获取服务
  27. getBleDeviceServices()
  28. },
  29. fail(err) {
  30. console.log(`ble连接失败 code :${err.errCode}`)
  31. connecting = false
  32. connected = false
  33. callback(err)
  34. //errorText = '连接失败!请将手机靠近设备'
  35. }
  36. })
  37. }
  38. }
  39. /**
  40. * 获取ble的特征
  41. * @param {string} deviceId 设备mac地址
  42. */
  43. function getBleDeviceServices() {
  44. setTimeout(() => {
  45. uni.getBLEDeviceServices({
  46. deviceId,
  47. success(res) {
  48. console.log('ble获取服务成功')
  49. for (let service of res.services) {
  50. //console.log(service)
  51. if (server_uuid.toUpperCase() == service.uuid.toUpperCase()) {
  52. //获取特征
  53. getBLEDeviceCharacteristics()
  54. return
  55. }
  56. }
  57. },
  58. fail(err) {
  59. console.log(`ble获取服务失败 code :${err.errCode}`)
  60. closeBLEConnection()
  61. callback(err)
  62. }
  63. })
  64. }, 1000)
  65. }
  66. /**
  67. * 获取特征
  68. */
  69. function getBLEDeviceCharacteristics() {
  70. //setTimeout(() => {
  71. uni.getBLEDeviceCharacteristics({
  72. deviceId,
  73. serviceId: server_uuid,
  74. success(res) {
  75. console.log('ble获取特征成功');
  76. notifyBLECharacteristicValueChange(res.characteristics[0].uuid)
  77. },
  78. fail(err) {
  79. console.log(`获取特征失败 code :${err.errCode}`);
  80. //console.log(err);
  81. closeBLEConnection()
  82. callback(err)
  83. }
  84. })
  85. //}, 1000)
  86. }
  87. /**
  88. * 监听设备发送过来的数据
  89. * @param {string} characteristicId 特征的uuid
  90. */
  91. function notifyBLECharacteristicValueChange(characteristicId) {
  92. setTimeout(() => {
  93. //设置一个超时配网的时间
  94. configTimeout = setTimeout(() => {
  95. closeBLEConnection()
  96. if (callback) {
  97. callback({ errCode: -100 })
  98. }
  99. }, 20 * 1000)
  100. uni.notifyBLECharacteristicValueChange({
  101. state: true,
  102. deviceId,
  103. serviceId: server_uuid,
  104. characteristicId: characteristicId,
  105. })
  106. //监听设备发送过来的数据
  107. uni.onBLECharacteristicValueChange(function (res) {
  108. let buf = Buffer.from(res.value);
  109. let receiveStr = buf.toString()
  110. console.log(`收到数据:${receiveStr}`);
  111. if (receiveStr === 'connect_success') {
  112. //配网成功
  113. closeBLEConnection()
  114. if (callback && iccid && iccid.length > 0) {
  115. callback({ errCode: 0, iccid })
  116. }
  117. } else if (receiveStr.indexOf('failure') >= 0) {
  118. //'配网失败'
  119. closeBLEConnection()
  120. if (callback) {
  121. callback({ errCode: -101 })
  122. }
  123. } else if (receiveStr.indexOf('ic0:') >= 0) { //用来获取iccid的
  124. iccid = receiveStr.substring(4, receiveStr.length);
  125. } else if (receiveStr.indexOf('ic1:') >= 0) { //用来获取iccid的 把ic0 和ic1拼接起来
  126. let ic1 = receiveStr.substring(4, receiveStr.length);
  127. iccid = iccid + ic1;
  128. //发送4G配网指令
  129. let buf = Buffer.from('without_WiFi')
  130. setTimeout(() => { sendCongifCmd(characteristicId, buf.buffer) }, 800)
  131. } else if (receiveStr.indexOf('start_network') >= 0) {
  132. //发送 AIrSMArT_CLOSE指令
  133. setTimeout(() => {
  134. let buf = Buffer.from('AIrSMArT_CLOSE')
  135. sendCongifCmd(characteristicId, buf.buffer)
  136. }, 2000)
  137. }
  138. else if (receiveStr.indexOf('recv_finish') >= 0) {
  139. //todo 设备这里流程没有统一,目前唯一的设备MW-V是收到recv_finish就配网结束了
  140. setTimeout(() => {
  141. closeBLEConnection()
  142. if (callback && iccid && iccid.length > 0) {
  143. callback({ errCode: 0, iccid })
  144. }
  145. }, 1000)
  146. } else if (receiveStr.indexOf('without_WiFi_OK') >= 0) {
  147. //配网成功
  148. closeBLEConnection()
  149. if (callback && iccid && iccid.length > 0) {
  150. callback({ errCode: 0, iccid })
  151. }
  152. }
  153. })
  154. //发送get_iccid数据给设备
  155. setTimeout(() => {
  156. //获取iccid
  157. let buf = Buffer.from('get_iccid')
  158. let buffer = buf.buffer
  159. sendCongifCmd(characteristicId, buffer)
  160. }, 800)
  161. }, 1000)
  162. }
  163. /**
  164. * 发送数据给设备
  165. * @param {string} characteristicId 特征uuid
  166. * @param {ArrayBuffer} buffer 发送的数据
  167. */
  168. function sendCongifCmd(characteristicId, buffer) {
  169. let count = Math.ceil(buffer.byteLength / 20)
  170. //拆分成的ArrayBuffer数组,每个ArrayBuffer不超过20个字节
  171. let buffers = []
  172. for (var i = 0; i < count; i++) {
  173. let size = Math.min(20, buffer.byteLength - i * 20)
  174. let buf = buffer.slice(i * 20, size + i * 20)
  175. buffers.push(buf)
  176. }
  177. //返回的是一个promise对象
  178. function sendData(buffer) {
  179. return uni.writeBLECharacteristicValue({
  180. deviceId,
  181. serviceId: server_uuid,
  182. characteristicId,
  183. value: buffer,
  184. })
  185. };
  186. (async () => {
  187. for (let b of buffers) {
  188. let res = await sendData(b)
  189. //console.log(res);
  190. console.log(`发送的数据为:${Buffer.from(b)} errorCode: ${res[res.length - 1].errCode}`);
  191. }
  192. // let promises = buffers.map((b) => sendData(b))
  193. // let res = await Promise.all(promises)
  194. })();
  195. }
  196. /**
  197. * 关闭ble连接
  198. */
  199. function closeBLEConnection() {
  200. if (deviceId) {
  201. uni.closeBLEConnection({
  202. deviceId,
  203. success(res) {
  204. console.log('ble关闭连接成功');
  205. },
  206. fail(err) {
  207. console.log(`ble关闭连接失败 code :${err.errCode}`);
  208. }
  209. })
  210. //clearInterval(withoutWifiInterval)
  211. clearTimeout(configTimeout)
  212. connected = false
  213. }
  214. }
  215. module.exports = { closeBLEConnection, connectBle };