2017-09-22 11:24:34 qq_36017059 阅读数 11178

直接把蓝牙相关工具封装js文件,然后通过page页面调用即可


//page功能实现页面

import { scan } from '../../util/bles';
import { openDoor } from '../../util/bles';
const app = getApp();

Page({
  // 调试log输出
  data: {
    text: '',
    arr:[]
  },
onLoad() {
  app.getUserInfo().then(
    user => this.setData({
    user,
    }),
  );
},

scanBle () { 
    const that = this; 
    // let  mAdvertisData = 'asfasfasgdgwerjertjwpejwioejrioweg';
    // that.setData({ 
    //         text: mAdvertisData.substring(0 , 2) + mAdvertisData.charAt(2),
    //       })
          


    my.offBluetoothDeviceFound();
    my.onBluetoothDeviceFound({
      success: (resFound) => {
        my.getBluetoothDevices({
          success: (resFouned) => {
            that.setData({
              arr: resFouned.devices,
            });
          },
        });
      },
    });   
    scan(function(e){
      that.setData({ 
            text:e,
        })
    });
}, 

onClickItem (e) {
    const that = this; 
    openDoor(e,function(result){
        that.setData({ 
            text:result,
        })
    })
}, 

});

封装的ble功能js文件(因为涉及保密项目比如门禁,保险柜等,有些数据都是随便写的,改成自己的就行了)

let timeoutID;
let log = '';
let mDeviceID = "E6:3B:97:21:14:42:12:54";//  android
let uuid_service = "0000fdasde6-0000-1000-8000-0080asd5f9b34fb";
let uuid_descriptorId = "0000asd2902-0000-1000-8000-0080a5f9b34fb"; // 只有android 会用到
let uuid_characteristicId = "0000fade8-0000-1000-8000-00805f9b3412r12fb";
let uuid_char_write = "0000fdeasdfa7-0000-1000-8000-00805f9b34fasdfasdb";
// let mAdvertisData = "888832454e4asdfa344asdfa44575766";
let mAdvertisData = "8888325939514aasdfa955446945";
let data_openDoor = "fe0fas1186501010asdf002016fb1";
let data_openDoor2 = "b9asdfasc1b4c7e1csfaaasdfa7af41d672188f02";

export function scan(callback){
    callback.call(this,'搜索中...');
    my.getSystemInfo({
            success: (resSystem) => {                       
                let os = resSystem.platform;
                if(os == 'Android'){
             
                }else{
                    uuid_service = "FDE6";
                    uuid_characteristicId = "FDE8";
                    uuid_char_write = "FDE7";
                    mDeviceID = "ABEB31F5-5B05-4346-98E8-401FE0asdaffasd62A1F7";//  ios
                }          
            },
        })  
    my.openBluetoothAdapter({ 
        success: function (resOpen) { // 搜索到蓝牙回调
              // 开始扫描
              my.stopBluetoothDevicesDiscovery();
              my.startBluetoothDevicesDiscovery({
                services:[uuid_service],

              });

              setTimeout(function(){
                   my.stopBluetoothDevicesDiscovery();
                      callback.call(this,'搜索完成');
                },3000)

          }, 
      fail:function(resOpen){ // 请打开蓝牙
         callback.call(this,'请打开蓝牙');
      }
    }) 
}

export function openDoor(e, callback){
    callback.call(this , '准备校验');
    mDeviceID = e.target.dataset.value.deviceId;
        mAdvertisData = e.target.dataset.value.advertisData;
        if (mAdvertisData == "888832454e434444575766"|| mAdvertisData == "888832454E434444575766"){     
            data_openDoor = "fe01186501010002016fb1";
            data_openDoor2 = "b9c1b4c7e1c7af41d672188f02";
        }else if(mAdvertisData == "8888325939514955446945" ){
            data_openDoor = "fe01186501010002494059";
            data_openDoor2 = "341a593cdafb0b04cb35fcea6a";
        }

   
    mAdvertisData = e.target.dataset.value.advertisData;

  let time = 0;

   // 支付宝下一个版本优化
    // my.disconnectBLEDevice({
    //     deviceId:mDeviceID,
    //     success: (resState) => {
    //     callback.call(this,'校验中'+ JSON.stringify(e));
    //     },
    //     fail:()=>{
    //         callback.call(this,'校验失败,蓝牙可能累了,请断开蓝牙休息一下!');
    //     }
    // });

  my.stopBluetoothDevicesDiscovery();// 连接之前最好停止扫描
  my.offBLEConnectionStateChanged();
  my.onBLEConnectionStateChanged({
    success: (resState) => {
      callback.call(this,'校验中.');
      if (resState.connected){
                my.getBLEDeviceServices({
                    deviceId: mDeviceID,
                    success: (resServices) => {  // 获取服务成功       
                            callback.call(this,'开门中'); 
                            my.getBLEDeviceCharacteristics({
                              deviceId: mDeviceID,
                              serviceId: uuid_service,
                              success: (resChar) => { // 获取特征值成功
                                       callback.call(this,'开门中.');          
                                       my.notifyBLECharacteristicValueChange({// 第二步:设置接受到char通知
                                        deviceId: mDeviceID,
                                        serviceId: uuid_service,
                                        characteristicId: uuid_characteristicId,
                                        descriptorId: uuid_descriptorId,
                                        success: (resValue) => { // 通知成功
                                              callback.call(this,'开门中..'); 
                                              my.onBLECharacteristicValueChange({//第三步:设置接受char数据监听
                                                  success: (resChange) => {
                                                    clearTimeout(timeoutID);
                                                      my.offBLECharacteristicValueChange();// 移除低功耗蓝牙设备的特征值变化事件的监听。
                                                      my.offBLEConnectionStateChanged();// 移除低功耗蓝牙连接的错误事件的监听。
                                                      my.disconnectBLEDevice({
                                                        deviceId: mDeviceID, // 蓝牙设备id
                                                        success: (resDisConnect) => { // 断开设备成功
                                                            callback.call(this,'开门成功');
                                                        },
                                                        fail: (resDisConnect) => { // 断开设备失败
                                                            callback.call(this,'开门成功..'); 
                                                            my.closeBluetoothAdapter({
                                                                success: (res) => {
                                                                    callback.call(this,'开门成功...'); 
                                                                    },
                                                                fail:(res) => {
                                                                    callback.call(this,'开门成功....'); 
                                                                    },
                                                         });
                                                        }
                                                      });
                                                      time=10;
                                                    callback.call(this,'开门成功!');  
                                                  }
                                              });

                                              
                                              my.writeBLECharacteristicValue({// 第四步通信1
                                                deviceId: mDeviceID,
                                                serviceId: uuid_service,
                                                characteristicId: uuid_char_write,
                                                value: data_openDoor,
                                                    success: (resWrite) => { // 写入成功
                                                    callback.call(this,'开门中...');  
                                                        setTimeout(function(){ // 第二包数据,为了适配部分手机延时50ms
                                                          my.writeBLECharacteristicValue({// 第四步通信1
                                                            deviceId: mDeviceID,
                                                            serviceId: uuid_service,
                                                            characteristicId: uuid_char_write,
                                                            value: data_openDoor2,
                                                                success: (resWrite) => {  // 写入成功                         
                                                                },
                                                                fail:(resWrite) => {// 写入失败1
                                                                    time=10;
                                                                },
                                                          }); 
                                                            },50)
                                                    },
                                              }); 
                                      },
                                      fail:(resValue) => {// 通知失败
                                        callback.call(this,'开门中..');
                                      },
                                  });


                                    
                              },
                              fail:(resChar) => {// 获取特征值失败
                                 callback.call(this,'开门中..');
                              },
                            });
                                                 
                    },
                    fail:(resServices) => {// 获取服务失败
                        callback.call(this,'开门中');  
                    },
                });
           }else{// 连接中断1
                callback.call(this,'校验中..');  
              if(time++<2){ // ios手机可能会出现连接后马上断开,尝试重连三次
                  my.connectBLEDevice({ //第一步:连接ble,
                      deviceId: mDeviceID
                  }) 
              }else{
             callback.call(this,'校验中...'); 
              }
          }
    },
    fail: function (resState) { // 连接中断2
        callback.call(this,'校验中....'); 
        if(time++<2){ // ios手机可能会出现连接后马上断开,尝试重连三次
            my.connectBLEDevice({ // 第一步:连接ble,
                deviceId: mDeviceID
            }) 
        } else {
            callback.call(this,'校验中.....');
        }
      }
  });

  // 第一步:连接ble,
  my.connectBLEDevice({ 
      deviceId: mDeviceID,
  }) 
    
 timeoutID = setTimeout(function(){
        my.offBLECharacteristicValueChange();// 移除低功耗蓝牙设备的特征值变化事件的监听。
        my.offBLEConnectionStateChanged();// 移除低功耗蓝牙连接的错误事件的监听。
        my.disconnectBLEDevice({
        deviceId: mDeviceID, // 蓝牙设备id
        success: (resDisConnect) => {
             clearTimeout(timeoutID);
            // that.setData({ 
            //     text: "连接超时" ,
            // })
        },
        fail: (resDisConnect) => {
             clearTimeout(timeoutID);
            // that.setData({ 
            //     text: "连接超时.." ,
            // })
        }
        });
    },5000)//开门时间限定5s
}




2018-07-08 21:52:11 weixin_39793905 阅读数 11277

近来一个朋友问:手写一个日历,为什么在安卓能遍历显示,而苹果里却不显示,你遇到过遍历不出的bug吗?

首先解决下上述问题,我总结下我印象深刻的几个坑~

1.回答下最开始的那个问题,手写一个日历,为什么在安卓能遍历显示,而苹果里却不显示?

首先确定这并不是遍历的bug,肯定是兼容性问题,遍历这是最基本的语法,问题肯定出在遍历的数据处理阶段,看了代码果不其然,结论就是:ios 系统的问题,比如newDate(“2018-08-08”),在ios会出现NaN的情况,ios只支持newDate(“2018/08/08”)

2.video 视频格式m3u8,在ios里边儿不能播放,但是安卓能正常播放?

分析

官方给的例子,是mp4格式的文件,ios可以播放,微信小程序开发者平台的论坛也有类似的问题,但是没有准确的答案,我开始考虑转换下格式,奈何,技术不够,尝试添加在image 标签 添加 custom-cache={{cache}} ,data 中添加 cache:false问题解决了。

解决
    <video src="{{sbDress}}" controls   custom-cache="{{cache}}"></video>

3.微信小程序WxParse 包含图片安卓端无法加载

分析

wxparse 是微信小程序用于解析富文本编辑器生成代码的插件,用于展示一般的图文。在安卓手机端如果内容包含图片的标签时整个内容都无法加载出来,在手机端查看console,发现安卓机在console.dir()的时候报错,这是由于安卓机不支持console.dir()的语法。

结论:

这是安卓机不支持console.dir()的语法,使用console.log()代替。

4.安卓上图片会出现卡顿,变形,然后才会显示正常的图片大小

分析

开发文档里写明:注:image组件默认宽度300px、高度225px,开发时所有image的小图标都使用了mode=”widthFixed”,只设置了宽度,让高度自适应,就会出现图片加载时初始化高度位225px,加载完毕才显示mode的高度,由于安卓机这个卡顿教明显,才会出现瞬时的变形。

结论

今后使用image 标签,尽量固定宽高。

5.navigationBar 在安卓机中位置为左边,在苹果中居中显示,那么标题字数多了之后苹果就会默认使用…代替剩余的文字

分析

这个也不是bug,只不过时显示问题,目前版本6.6.0里支持在window属性里设置navigationStyle由默认样式修改为custom,支持自定义样式。所谓的自定义样式,就是默认导航,只剩一个胶囊的导航。

结论

app.json里边儿设置window{“navitionStyle”:”custom”},后要自己使用在wxml,and wxss里写样式显示头部的导航栏。

注意

由于该属性是微信6.6.0才支持,所以需要将其他的window属性照常写,来兼容低版本。

2018-10-12 18:59:07 IT_aLun 阅读数 2996

1、问题描述:

(1)使用微信小程序的  wx.playBackgroundAudio(Object object) 等不再维护的接口向 wx.getBackgroundAudioManager 中转移,来管理微信小程序的后台播放器播放音乐。

(2)在微信开发者工具中可以播放背景音乐,真机调试:Android手机可以正常播放背景音乐;但是 ios 在真机调试的时候不能正常播放,没有声音。

2、代码:

(1)app.json:              

{
    "pages": [
        "pages/video/index"
    ],
    "window": {
        ...
    },
    "requiredBackgroundModes": ["audio"] // 后台播放音乐必须设置
}

(2)index.js:         

 /** 背景音乐播放 **/
const backgroundAudioManager = wx.getBackgroundAudioManager();
backgroundAudioManager.title = ''; // 没有播放的原因
// backgroundAudioManager.epname = '';  // 可注释,没有影响
// backgroundAudioManager.singer = '';  // 可注释,没有影响
// backgroundAudioManager.coverImgUrl = '';  // 可注释,没有影响
// 设置了 src 之后会自动播放
backgroundAudioManager.src =  'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46';
backgroundAudioManager.onError((err) => { // 真机调试
    console.log(err) 
})

3、问题原因 和 解决办法:

(1)问题原因:backgroundAudioManager.title  很多开发者没有写 或者 backgroundAudioManager.title = '';

(2)问题解决:backgroundAudioManager.title = 'string或者空格';

2019-02-01 15:59:24 huihui_jiang 阅读数 145

@微信小程序----------踩坑记录
关于小程序一些小功能的代码都在这个GitHub上,感兴趣的可以去看看,
https://github.com/huihuijiang/miniProgram 目前有:列表左滑删除,拖拽浮标
一、小程序坑
1.scroll-view横向滚动的时候,包含文字图片等,元素错位,第二个元素掉下去;
hack:给子元素添加

vertical-align:top;

当使用scroll-view横向滚动时要注意几点:
父元素设置宽度,加上这两个样式overflow: hidden; white-space: nowrap;自元素设置成display: inline-block;vertical-align:top;
二、android 和 ios 兼容
1.不定宽高元素使用全铺背景图片,ios没有问题,安卓手机背景图片显示空白
hack:

background-size:cover;(元素加上这一属性)

2.安卓手机缓存严重问题
hack:
在图片后再加上一串随机数
在wxs中:(有些iOS手机不能识别小数的随机数,所以最好用整数

var random = Math.floor(Math.random() * 10 + 1) * 9;

3.ios不支持默认最小定时时间(0或不写)

4.截取字符串遇到表情,安卓没问题,ios会报错;
hack:(判断是否有表情)

var reg = /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/;
var re = new RegExp(reg);
var en = str.slice(27, 29);
if (re.test(en)) {
title = str.slice(0, 27)
} else {
title =str.slice(0, 28)
}

5.getTime()时候,iOS必须把时间格式00-00-00转换成00/00/00

6.小程序获取胶囊按钮返回值(一直在变,目前的兼容代码

		const self = this;
		wx.getSystemInfo({
			success: function (res) {
				self.globalData.phonexh = res.model.indexOf("iPhone X");
				var menuButton = wx.getMenuButtonBoundingClientRect();
				//导航栏高度
				self.globalData.totalTopHeight =
					menuButton.height == menuButton.bottom ?
						menuButton.height :
						res.model.indexOf("iPhone") == 0 || (res.platform == 'android' && res.version == '7.0.3') ?
							menuButton.top + menuButton.height + (menuButton.top - res.statusBarHeight) :
							menuButton.top + menuButton.height + menuButton.top + res.statusBarHeight				
				//状态栏高度
				self.globalData.statusBarHeight = res.statusBarHeight;
				//标题栏高度
				self.globalData.titleBarHeight = self.globalData.totalTopHeight - res.statusBarHeight;

			}
		})

7.iOS使用overflow:auto;滚动会卡顿
hack:
-webkit-overflow-scrolling: touch

8.转发到微信列表的转发信息卡片图,iOS当图片尺寸不对时,会出现空白,安卓会自动截取左上角

9.iOS橡皮筋事件
hack:在page.json文件中
"disableScroll": true

10.iOS短时间多次扫码进入不会执行onload

11.new number()强制转换结果为undefined
hack:用parsefloat

12.iOS图片加上阿里云编辑参数加载失败
Hack:binderror事件中对src重新复制,记得带上随机数,不然会因为路径一样不请求,有时候不是一次就能重新请求成功的,所以下一次获取的时候记得去掉随机数

loadimgerror: function (e) {
        console.log("图片加载失败")
        this.setData({
           Src: e.target.dataset.src.split("?")[0] + '?' + Math.floor(Math.random() * 10 + 1) * 9
        })
    },

在这里插入图片描述
未完待续哦——

2019-07-02 15:22:07 qq_21041889 阅读数 1765

小程序中的时间数据在安卓上能正常显示,但在ios系统上会显示NaN

原因是ios不支持在数据库中传递 2019-07-02这种格式的日期,必须转换为2019/07/02这种格式才会显示正常;

小程序代码示例:

var data= '2019-07-02 15:19:30'
var datatime= data.replace(/\-/g, "/")     //使用replace函数,调用data.replace(/\-/g, "/")将全部的“-”替换为”/“
var newdata = new Date(datatime).getTime() //获取秒数,可自行切换为.getDate()获取天数或.getMonth() + 1获取月份等其他Date操作。。。

或者:

var data = '2019-07-02 15:20:00'
var format = data.replace(/-/g, '/')
var timestamp = Date.parse(new Date(format))

 

小程序日常之采坑

阅读数 239

没有更多推荐了,返回首页