精华内容
下载资源
问答
  • 该资源为学习蓝牙协议及小程序制作所做,注释详细。 可直接在微信开发者工具上直接打开调试。
  • 微信小程序发送Http请求到springboot后台的打包代码,该资源为个人学习记录之用
  • 微信小程序的特点是无需下载App,只要是安装有微信的一部智能手机,几乎就可以运行微信小程序。基于这个特点,我设计了一款小程序版的蓝牙串口助手,适用于简单的蓝牙串口调试工作。 从事蓝牙相关产品研发的兄弟们...

    微信小程序的特点是无需下载App,只要是安装有微信的一部智能手机,几乎就可以运行微信小程序。基于这个特点,我设计了一款小程序版的蓝牙串口助手,适用于简单的蓝牙串口调试工作。

    从事蓝牙相关产品研发的兄弟们知道,手机端的像LightBlue,BLE Scanner, Nordic的nRF Connect等软件已经做的挺好了(LightBlue好像只有iOS版本),但使用下来总感觉有一些东西满足不了我的需求,比如:UUID是一串很长的字符,一般128bit,16Byte,本身不方便记,实际操作时,需要先扫描出Service UUID,点击后再扫描出相应Characteristic UUID,然后再选择是否notify,是read,还是write。read还好,wirte时需要再选择是ASCII码还是HEX数,此时如果系统弹出来的是一个中文键盘,你几乎已经崩溃了……

    总之,这些软件扫描Characteristic是OK的,但对其操作(Read/Notify,Write)是比较困难的。基于这些痛点我设计了一款串口调试界面的UI,像普通串口调试助手一样收发数据,针对ASCII、HEX不同场景自定义键盘。像HEX键盘,输入时可以自动根据是否是一个Byte添加空格,从操作和视觉上都比较简单:HEX键盘

    细节这里先不作过多渲染,我们先讲蓝牙操作流程,微信小程序关于蓝牙的API中有三个位置(两部分)涉及蓝牙:
    一、是把手机当做外设广播,让其它设备连接手机的。
    二、是把手机当做主设备,扫描并连接外围设备的。我们这里讲的是这一部分。
    三、还有就是蓝牙的开关操作。
    我把相应的API复制出来一览,其中“蓝牙”部分是不管作主机从机都用得到的API:

    一、外围设备(手机作为外设相应的API):

    wx.onBLEPeripheralConnectionStateChanged
    wx.offBLEPeripheralConnectionStateChanged wx.createBLEPeripheralServer
    BLEPeripheralServer BLEPeripheralServer.addService
    BLEPeripheralServer.close
    BLEPeripheralServer.offCharacteristicReadRequest
    BLEPeripheralServer.offCharacteristicSubscribed
    BLEPeripheralServer.offCharacteristicUnsubscribed
    BLEPeripheralServer.offCharacteristicWriteRequest
    BLEPeripheralServer.onCharacteristicReadRequest
    BLEPeripheralServer.onCharacteristicSubscribed
    BLEPeripheralServer.onCharacteristicUnsubscribed
    BLEPeripheralServer.onCharacteristicWriteRequest
    BLEPeripheralServer.removeService BLEPeripheralServer.startAdvertising
    BLEPeripheralServer.stopAdvertising
    BLEPeripheralServer.writeCharacteristicValue

    二、低功耗蓝牙(手机作为主设备相应的扫描API):

    wx.writeBLECharacteristicValue wx.setBLEMTU
    wx.readBLECharacteristicValue wx.onBLEConnectionStateChange
    wx.onBLECharacteristicValueChange wx.offBLEConnectionStateChange
    wx.offBLECharacteristicValueChange
    wx.notifyBLECharacteristicValueChange wx.makeBluetoothPair
    wx.getBLEDeviceServices
    wx.getBLEDeviceRSSI
    wx.getBLEDeviceCharacteristics wx.createBLEConnection
    wx.closeBLEConnection

    三、蓝牙:

    wx.stopBluetoothDevicesDiscovery wx.startBluetoothDevicesDiscovery
    wx.openBluetoothAdapter
    wx.onBluetoothDeviceFound
    wx.onBluetoothAdapterStateChange wx.offBluetoothDeviceFound
    wx.offBluetoothAdapterStateChange wx.getConnectedBluetoothDevices
    wx.getBluetoothDevices
    wx.getBluetoothAdapterState
    wx.closeBluetoothAdapter

    在通信操作中,一般被连接的设备叫「从机」,从机的程序相对比较“难”写,这里的难是加引号的,不是代码难写,是逻辑功能要考虑的比较全面,主机要什么,从机该回什么,这一切都要设置好。而主机在逻辑功能上可以选择“想要就要,不要想就不要”的操作逻辑。所以在这一方面,个人认为主机代码是相对简单的。但主机既然可以选择性要东西,那就需要有一个交互的UI,比如键盘交互,输入长度等内容,所以主机一般需要有一块屏幕。

    所以今天我们讲的是手机作蓝牙主机,蓝牙模块作蓝牙从机。其中蓝牙外设有两个服务,一个透传数据服务,一个设置服务(用以设置波特率等信息)

    手机端的流程:

    1.打开蓝牙
    wx.openBluetoothAdapter

    2.打开蓝牙sucess的回调开始扫描蓝牙设备
    wx.startBluetoothDevicesDiscovery

    3.扫描sucess回调中发现蓝牙设备(发现的设备存在devices数组里,这个变量直接用,应该是库里定义过,把它setData到页面显示即可)
    wx.onBluetoothDeviceFound

    4.选择蓝牙设备建立连接
    wx.createBLEConnection

    5.获取设备服务
    wx.getBLEDeviceServices

    6.获取设备特征值
    wx.getBLEDeviceCharacteristics

    到这一步我们就可以获得设备服务的特征值了,对其进行读写操作了,各个软件的区别也主要在此,前面是顺序执行下来问题不大,但服务有好几个,每个服务又有不同的特征值,每个特征值又有不同读写特性,大部分软件是让用户像操作目录一下一层层进入,不对的话,再一层层退出,我在这里做了个改进,就是遍历所有所有的所有特征值,存储下来,让用户选择:
    设备服务特征值选择界面
    如上图所示,右侧图上面是所有服务的特征值,下面操作picker选择notify/indecate, write, read,互不干扰。选择完如左图所示,正常的收发操作就是基于这样一个串口调试界面,也可以对只有read属性的特征值单独读。
    在这里插入图片描述

    这样对蓝牙设备的连接调试就算完成了,但对于一款串口助手来讲,这还不够,今天先写到这儿,另附上小程序码,欢迎各位体验交流。

    在这里插入图片描述

    展开全文
  • 小程序是用于连接我电的校内新闻网,方便同学们随时随地了解校园动态,掌握最新通知。APP界面设计风格简约,包含前端展示UI和后端服务器部分,此仓库为客户端源码。
  • 用这块小程序可实现零基础制作属于自己的小程序去控制多个硬件。 思来想去觉得应该写几篇教程,我负责Arduino系列的制作分享,下面我们从点亮LED开始我们的智能硬件之旅。 二、准备工作 准备arduino开发板、蓝牙...
  • 微信小程序连接物联网4. 阿里云物联网M2M规则转发完成的样子 前言 折腾宿舍远程开门的这两周里碰壁不少,还好功能实现了。我想还有很多和我有同一想法的人。所以记录过程下来供参考少走弯路吧。我不是电子专业的...

    索引

    这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及。

    微信小程序连接物联网(一):初始化ESP8266 NodeMCU
    微信小程序连接物联网(二):NodeMCU Lua学习笔记
    微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台

    前言

    折腾宿舍远程开门的这两周里碰壁不少,还好功能实现了。我想还有很多和我有同一想法的人。所以记录过程下来供参考少走弯路吧。我不是电子专业的学生,且这个Nodemcu也没涉及到底层知识,文中有错误的地方欢迎指正。

    整个制作的耗材成本

    1. Esp8266 NodeMCU Lua芯片(30元)
    2. MG90S舵机(12元)
    3. 迷你充电宝(6元)
    4. USB数据线

    源码下载地址

    收到很多做毕设的小伙伴私信,这里补上完整的项目源码:
    https://gitee.com/koevas/IOT-wechat

    思路

    在这里插入图片描述

    在这里插入图片描述

    1. 使用MQTT.fx客户端工具测试

    官网:MQTT.fx

    阿里云文档(使用MQTT.fx接入物联网平台):
    https://help.aliyun.com/document_detail/140507.html

    先在阿里云物联网平台创建一个产品,ProductKey为产品密钥
    在这里插入图片描述
    再创建两个设备
    一个是宿舍门的被控端,用在nodemcu连接
    一个是宿舍门的控制端,用在微信小程序连接
    在这里插入图片描述
    创建完设备获取到三元组,记录下来
    在这里插入图片描述
    在MQTT.fx上填写连接信息,用{}的变量请换成自己的三元组。
    在这里插入图片描述

    产品密钥:{ProductKey}
    设备名字:{DeviceName}
    设备密钥:{DeviceSecret}

    Profile Name: Class_Door	# 在MQTT.fx里的名字,随便写
    Profile Type: MQTT Broker	# 类型为MQTT代理
    Broker Address: {ProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com	# 设备名 + 域名后缀
    Broker Port: 1883	# MQTT协议的连接端口,默认为1883
    Client ID: {DeviceName}|securemode=3,signmethod=hmacsha1|
    

    用户名:

    User Name: {DeviceName}&{ProductKey}
    

    密码:
    密码需经过HmacSHA1算法加密生成,可以用 在线加密解密工具 生成
    加密所需的明文为:

    clientId{DeviceName}deviceName{DeviceName}productKey{ProductKey}
    

    加密所需的密钥为:

    {DeviceSecret}
    

    在这里插入图片描述

    连接成功后订阅消息,然后在阿里云物联网在线调试上发送一条数据,测试有没有收到。
    在这里插入图片描述

    2. Nodemcu连接阿里云物联网

    使用MG90S舵机,可以旋转角度为0-180°,产生的扭矩足够打开宿舍的门锁,电源接到esp8266的Vin、GND口。PWM信号线接到esp8266的D3口。
    在这里插入图片描述
    打开esplorer编写init.lua烧录进esp8266里

    连接wifi代码

    -- wifi config
    station_cfg = {}
    station_cfg.ssid = "gzta"
    station_cfg.pwd = "12345678"
    
    -- wifi connect
    print('Setting up WIFI...')
    wifi.setmode(wifi.STATION)
    wifi.sta.config(station_cfg)
    
    -- wifi eventmon
    wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)
        print("wifi connecting...")
    end)
    
    wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
        print("wifi connect:" .. wifi.sta.getip())
    end)
    
    wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
        print("wifi disconnect...")
    end)
    

    控制舵机旋转角度的代码,用于打开门锁,旋转3秒后恢复到原来的位置。

    -- Open the door for 3 seconds
    function DoorOpen()
        pin = 3
        -- 20 - 130
        pwm.setup(pin, 50, 40)
        pwm.start(pin)
        print("start move position")
        tmr.create():alarm(3000, tmr.ALARM_SINGLE, function()
            print("recover position")
            pwm.setduty(pin, 120)
            pwm.stop(pin)
        end)
    end
    

    完整代码如下:
    更改自己的wifi配置、topic、物联网三元组即可

    
    -- wifi config
    station_cfg = {}
    station_cfg.ssid = "gzta"
    station_cfg.pwd = "12345678"
    
    -- topic
    topic0 = "/a1UlGaNjWAO/Class_Door/user/message"
    
    -- aliyun IOT config
    ProductKey = "换成自己的"
    DeviceName = "换成自己的"
    DeviceSecret = "换成自己的"
    
    mqttAddress = ProductKey .. ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
    mqttPort = 1883
    ClientID = DeviceName .. "|securemode=3,signmethod=hmacsha1|"
    UserName = DeviceName .. "&" .. ProductKey
    hmac_data = "clientId" .. DeviceName .. "deviceName" .. DeviceName .. "productKey" .. ProductKey
    Password = crypto.toHex(crypto.hmac("sha1", hmac_data, DeviceSecret))
    
    -- wifi connect
    print('Setting up WIFI...')
    wifi.setmode(wifi.STATION)
    wifi.sta.config(station_cfg)
    
    -- wifi eventmon
    wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)
        print("wifi connecting...")
    end)
    
    wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
        print("wifi connect:" .. wifi.sta.getip())
    end)
    
    wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
        print("wifi disconnect...")
    end)
    
    -- aliyun iot connect
    MQTT_connect_Flag = 0
    myMQTT = mqtt.Client(ClientID, 120, UserName, Password)
    
    Connect_timer = tmr.create()
    Connect_timer:alarm(1000, tmr.ALARM_SEMI, function()
        if myMQTT ~= nil then
            print("MQTT client connect...")
            myMQTT:connect(mqttAddress, mqttPort, 0, mqtt_connect, mqtt_disconnect)
        end
    end)
    
    function mqtt_connect(client)
        print("mqtt connect success")
        myMQTT = client
        MQTT_connect_Flag = 1
        client:subscribe(topic0, 0, function(client)
            print("subscribe success")
        end)
        Connect_timer:stop()
    end
    
    function mqtt_disconnect(client, reason)
        print("mqtt connect Fail:" .. reason)
        MQTT_connect_Flag = 0
        Connect_timer:start()
    end
    
    
    -- mqtt client offline event
    myMQTT:on("offline", function(client)
        print("mqtt client offline event")
        Connect_timer:start()
    end)
    
    -- mqtt client message event
    myMQTT:on("message", function(client, topic, data)
        print(topic .. ":" .. data)
        t = sjson.decode(data)
        if t["method"] == "thing.service.DoorOpen" then
            DoorOpen()
        end
    end)
    
    -- Open the door for 3 seconds
    function DoorOpen()
        pin = 3
        -- 20 - 130
        pwm.setup(pin, 50, 40)
        pwm.start(pin)
        print("start move position")
        tmr.create():alarm(3000, tmr.ALARM_SINGLE, function()
            print("recover position")
            pwm.setduty(pin, 120)
            pwm.stop(pin)
        end)
    end
    
    

    3. 微信小程序连接物联网

    需要用到两个js库,分别是

    主要流程:

    1. 新建一个小程序项目。复制mqtt.min.js和hex_hmac_sha1.js放到小程序项目的utils目录中,目录结构如下:
      在这里插入图片描述
    2. 配置开发者后台socket 合法域名 为:wss://productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com(替换productKey为自己的产品key)
      在这里插入图片描述

    核心的js代码参考了这篇博客,因为自己的宿舍小程序还有一些登录验证的代码,所以就不放出自己小程序完整的js代码了

    var mqtt = require('../../utils/mqtt.min.js')
    const crypto = require('../../utils/hex_hmac_sha1.js');
    Page({
      data: {
       
      },
      
      // 发送开门指令,仅供参考,使用时请修改自己的topic
      command_opendoor(){
        var connectText = '{ "method": "thing.service.DoorOpen"}'
        client.publish('/a1UlGaNaaa/Door_Console/user/message', connectText, function (err){
          if (!err) {
            console.log('开门指令发送成功!');
          }
        })
      },
      
      onLoad: function () {
        this.doConnect()
      },
      
      doConnect(){
        const deviceConfig = {
          productKey: "替换",
          deviceName: "替换",
          deviceSecret: "替换",
          regionId: "cn-shanghai"
        };
        const options = this.initMqttOptions(deviceConfig);
        console.log(options)
        //替换productKey为你自己的产品的
        const client = mqtt.connect('wxs://productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com',options)
        client.on('connect', function () {
          console.log('连接服务器成功')
          //订阅主题,替换productKey和deviceName(这里的主题可能会不一样,具体请查看后台设备Topic列表或使用自定义主题)
          client.subscribe('/productKey/deviceName/get', function (err) {
            if (!err) {
               console.log('订阅成功!');
            }
          })
        })
    	//接收消息监听
        client.on('message', function (topic, message) {
          // message is Buffer
          console.log('收到消息:'+message.toString())
         //关闭连接 client.end()
        })
      },
      //IoT平台mqtt连接参数初始化
     initMqttOptions(deviceConfig) {
    
        const params = {
          productKey: deviceConfig.productKey,
          deviceName: deviceConfig.deviceName,
          timestamp: Date.now(),
          clientId: Math.random().toString(36).substr(2),
        }
        //CONNECT参数
        const options = {
          keepalive: 60, //60s
          clean: true, //cleanSession不保持持久会话
          protocolVersion: 4 //MQTT v3.1.1
        }
        //1.生成clientId,username,password
        options.password = this.signHmacSha1(params, deviceConfig.deviceSecret);
        options.clientId = `${params.clientId}|securemode=2,signmethod=hmacsha1,timestamp=${params.timestamp}|`;
        options.username = `${params.deviceName}&${params.productKey}`;
    
        return options;
      },
    
    /*
      生成基于HmacSha1的password
      参考文档:https://help.aliyun.com/document_detail/73742.html?#h2-url-1
    */
     signHmacSha1(params, deviceSecret) {
    
        let keys = Object.keys(params).sort();
        // 按字典序排序
        keys = keys.sort();
        const list = [];
        keys.map((key) => {
          list.push(`${key}${params[key]}`);
        });
        const contentStr = list.join('');
        return crypto.hex_hmac_sha1(deviceSecret, contentStr);
      }
    })
    

    前端界面(有点丑Emmm):
    在这里插入图片描述

    4. 阿里云物联网M2M规则转发

    由于MQTT协议里同一ClientID只能有一个连接,如果是用同一个ClientID 在不同地方登录,会先把最先登录的ClientID踢下线。所以微信小程序和NodeMCU不能共用一个设备。 既然如此,就将微信小程序和NodeMCU划分为两个不同设备。使用规则转发的方式通信。当微信小程序设备端发布消息时,NodeMCU端也同样能收到消息。

    阿里云物联网平台官方文档:

    基于规则引擎的M2M设备间通信
    云产品流转概述

    新建规则查询语句:
    将微信小程序端收到的数据同时完整地转发给Nodemcu端

    SELECT * FROM "/a1UlGaNaaa/Door_Console/user/message"
    

    在这里插入图片描述

    完成的样子

    在这里插入图片描述
    远程宿舍开门的功能需求简单,又无其他业务需求,就不需要利用到个人服务器保存什么数据了。所有操作只与阿里云的物联网平台交互

    展开全文
  • 使用微信小程序扫码连接蓝牙实现流程图 使用微信小程序的扫码功能连接蓝牙,具体操作如下 实现流程图 Created with Raphaël 2.2.0准备好二维码小程序调用扫码功能小程序获取到二维码内容(我这里为蓝牙的名字)...

    使用微信小程序的扫码功能连接蓝牙,具体操作如下

    实现流程图

    Created with Raphaël 2.2.0 准备好二维码 小程序调用扫码功能 小程序获取到二维码内容(我这里为蓝牙的名字) 小程序通过搜索到该蓝牙名后连接 结束

    首先,准备需要使用的二维码
    这里我们可以使用网上的二维码生成器,把需要的信息写入然后就能自动生成二维码了。我使用的是蓝牙的名字
    使用蓝牙的名字生成一个二维码

    调用微信小程序的蓝牙扫码功能
    界面

    在这里插入图片描述
    以下是该功能代码

    // index.wxml
    <button class='btn1'  bindtap="click">
        <image class='btnImg' src='../../images/button.png'></image>扫码
     </button>
    
    // index.js
    Page({
      data: {
        deviceName: "",
      },
      onLoad: function () {
      },
      onShow: function () {
      },
     
      /* 点击事件 */
      click: function (event) { 
        var that = this;
        //调用扫码功能
        wx.scanCode({
          success: (res) => {
            console.log(res)
            that.setData({
              deviceName: res.result
            })
            //获取到二维码中的蓝牙设备名后跳转到连接页面
                  var title = that.data.deviceName;
                  wx.redirectTo({
                    url: '../detail/detail?id=' + title
                  })   
          },
          fail: (res) => {
            wx.showToast({
              title: '扫码失败',
              icon: 'success',
              duration: 2000
            })
          },
        })  
      },
    })
    
    

    通过二维码获取到蓝牙设备名后连接
    下面直接贴代码,只需要修改js就够了

    //detail.js
    data: {
        deviceId: '',
      },
      //获取二维码中的蓝牙name,然后连接
      onLoad: function(options) {
        wx.showLoading({
          title: '请打开蓝牙',
        });
        console.log(options);
        this.setData({
          deviceName: options.id,
        });
        console.log('设备的Name', this.data.deviceName);
        var that = this;
    
        var deviceName = options.id;
        wx.closeBluetoothAdapter({
          success: function(res) {
            console.log('关闭蓝牙模块');
            /* 初始化蓝牙适配器 */
            wx.openBluetoothAdapter({
              success: function(res) {
                console.log('初始化蓝牙适配器成功');
                wx.hideLoading();
                wx.showLoading({
                  title: '请稍后....',
                });
                wx.startBluetoothDevicesDiscovery({
                  allowDuplicatesKey: false,
                  success: function(res) {
                    console.log('这里是开始搜索附近设备', res);
                    //添加延迟
                    setTimeout(() => {
                      wx.getBluetoothDevices({
                        success: function(res) {
                          console.log(res)
                          //在搜索到的所有蓝牙中找到需要连接的那一个蓝牙
                          for (var i = 0; i < res.devices.length; i++) {
                            if (res.devices[i].name == deviceName) {
                              that.setData({
                                deviceId: res.devices[i].deviceId,
                              })
                              console.log(res.devices[i].deviceId)
                              wx.hideLoading();
                              /* 连接中动画 */
                              wx.showLoading({
                                title: '正在连接...',
                              });
                              that.CreateBLEConnection();
                            }
                          }
                        },
                        fail: function() {
                          console.log("搜索蓝牙设备失败")
                        }
                      });
                    }, 1300);
                  },
                });
              },
            })
          }
        });
      },
      //连接蓝牙
      CreateBLEConnection: function() {   
        var that = this;
        wx.stopBluetoothDevicesDiscovery({
          success: function(res) {
            console.log('停止搜索设备', res)
          }
        })
        /* 开始连接蓝牙设备 */
        wx.createBLEConnection({
          deviceId: that.data.deviceId,
          success: function(res) {
            console.log('连接成功', res);
            wx.hideLoading();
            /* 获取设备的服务UUID */
            wx.getBLEDeviceServices({
              deviceId: that.data.deviceId,
              success: function(service) {
                var all_UUID = service.services; //取出所有的服务
                console.log('所有的服务', all_UUID);
                var UUID_lenght = all_UUID.length; //获取到服务数组的长度
                /* 遍历服务数组 */
                for (var index = 0; index < UUID_lenght; index++) {
                  var ergodic_UUID = all_UUID[index].uuid; //取出服务里面的UUID
                  var UUID_slice = ergodic_UUID.slice(4, 8); //截取4到8位
                  /* 判断是否是我们需要的FFE0 */
                  if (UUID_slice == 'FFE0' || UUID_slice == 'ffe0') {
                    var index_uuid = index;
                    that.setData({
                      serviceId: all_UUID[index_uuid].uuid //确定需要的服务UUID
                    });
                  };
                };
                console.log('需要的服务UUID', that.data.serviceId)
                that.Characteristics(); //调用获取特征值函数
              },
            });
          },
        })
      },
      Characteristics: function() {
        var that = this;
        var device_characteristics = [];
        var characteristics_uuid = {};
        wx.getBLEDeviceCharacteristics({
          deviceId: that.data.deviceId,
          serviceId: that.data.serviceId,
          success: function(res) {
            var characteristics = res.characteristics; //获取到所有特征值
            var characteristics_length = characteristics.length; //获取到特征值数组的长度
            console.log('获取到特征值', characteristics);
            console.log('获取到特征值数组长度', characteristics_length);
    
            /* 遍历获取characteristicsId */
            for (var index = 0; index < characteristics_length; index++) {
              var characteristics_UUID = characteristics[index].uuid; //取出特征值里面的UUID
              var characteristics_slice = characteristics_UUID.slice(4, 8); //截取4到8位
              /* 判断是否是我们需要的FFE1 */
              if (characteristics_slice == 'FFE1' || characteristics_slice == 'ffe1') {
                var index_uuid = index;
                that.setData({
                  characteristicsId: characteristics[index_uuid].uuid //确定的写入UUID
                });
              };
            };
            console.log('写入characteristicsId', that.data.characteristicsId);
            that.SendTap(); //发送指令
          },
        })
      },
      /* 发送指令 */
      SendTap: function() {
        var that = this;
        var value_ascii = "";
        var value_initial = "01"; //发送的信息
        console.log('输入框中的值', value_initial);
        /* 以Ascii字符发送 */
        var value_split = value_initial.split(''); //将字符一个一个分开
        console.log('value_split', value_split);
        for (var i = 0; i < value_split.length; i++) {
          value_ascii = value_ascii + value_split[i].charCodeAt().toString(16); //转为Ascii字符后连接起
        }
        var value = value_ascii;
        console.log('转为Ascii码值', value);
        var write_function = that.write(value); //调用数据发送函数
      },
      write: function(str) {
        var that = this;
        var value = str;
        console.log('value', value);
        /* 将数值转为ArrayBuffer类型数据 */
        var typedArray = new Uint8Array(value.match(/[\da-f]{2}/gi).map(function(h) {
          return parseInt(h, 16)
        }));
        var buffer = typedArray.buffer;
        wx.writeBLECharacteristicValue({
          deviceId: that.data.deviceId,
          serviceId: that.data.serviceId,
          characteristicId: that.data.characteristicsId,
          value: buffer,
          success: function(res) {
            console.log('数据发送成功', res);
            wx.showToast({
              title: '发送成功',
              icon: 'success',
              duration: 2000
            })
          },
          fail: function(res) {
            console.log('调用失败', res);
            /* 调用失败时,再次调用 */
            wx.writeBLECharacteristicValue({
              deviceId: that.data.deviceId,
              serviceId: that.data.serviceId,
              characteristicId: that.data.characteristicsId,
              value: buffer,
              success: function(res) {
                console.log('第2次数据发送成功', res);
                wx.showToast({
                  title: '发送成功',
                  icon: 'success',
                  duration: 2000
                })
              },
              fail: function(res) {
                console.log('第2次调用失败', res);
                /* 调用失败时,再次调用 */
                wx.writeBLECharacteristicValue({
                  deviceId: that.data.deviceId,
                  serviceId: that.data.serviceId,
                  characteristicId: that.data.characteristicsId,
                  value: buffer,
                  success: function(res) {
                    console.log('第3次数据发送成功', res);
                    wx.showToast({
                      title: '发送成功',
                      icon: 'success',
                      duration: 2000
                    })
                  },
                  fail: function(res) {
                    console.log('第3次调用失败', res);
                  }
                });
              }
            });
          }
        });
      },
    
      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function() {
        var that = this;
        wx.closeBLEConnection({
          deviceId: that.data.deviceId,
          success: function(res) {
            console.log('断开设备连接', res);
          }
        });
      },
    })
    

    注意:代码中的UUID提取出的FFE0,FFE1是我自己的设备的,不同的蓝牙UUID也会不同,需要自己修改,这数据一般在自己使用蓝牙模块的介绍文档里给出

    展开全文
  • 当打开手机蓝牙后去连接蓝牙,会出现连接不上情况,报错10003,此时不管是重启小程序还是重新关闭打开蓝牙,都不能正常连接蓝牙设备。10003是微信蓝牙连接经常碰到的问题,微信官方给出的文档中就简单的描述为...

    当打开手机蓝牙后去连接蓝牙,会出现连接不上情况,报错10003,此时不管是重启小程序还是重新关闭打开蓝牙,都不能正常连接蓝牙设备。10003是微信蓝牙连接经常碰到的问题,微信官方给出的文档中就简单的描述为“connection fail”,备注为“连接失败”。然而,实际上出现连接失败的状况有很多,比如蓝牙设备被占用或者上次蓝牙连接未断开导致无法连接;根据deviceId连接蓝牙时,蓝牙设备未开启或异常导致无法连接。

    既然是因为没有断开蓝牙连接导致的,那就在关闭手机蓝牙时去断开蓝牙;然而,在蓝牙状态监听中调用断开连接函数,返回错误(10001(not available)当前蓝牙适配器不可用)。

    没有找到现成的解决方案,就只有跟踪代码了,在关键方法中加日志;发现,在顶部栏关闭手机蓝牙时,小程序中无法断开蓝牙连接,报错(10001(not available)当前蓝牙适配器不可用);后来又在偶然情况下,清除了蓝牙设备的绑定关系,重新进入蓝牙搜索页面,发现这样操作后竟然能成功连接上蓝牙。

    微信小程序蓝牙连接问题分析及解决

    上述问题定位中,可以发现应该是没有断开上次蓝牙连接导致的,重新搜索蓝牙以后再连接可以解决该问题;于是只能考虑重新搜索蓝牙后再连接的方法,在出现10003错误后,重新搜索蓝牙,并且在找到对应的设备后进行蓝牙连接;修改代码反复测试,根据日志显示,确实是出现了10003,然后进入搜索模块,搜到指定设备后进行蓝牙连接,之后连接成功,这个方案解决了该问题。

    wx.createBLEConnection({

    deviceId: deviceId,

    success: function (res) { //连接成功

    initnotifyCharacteristic(notifyCharacteristic);// 指定特征值,并进行数据交互

    // 已连接

    _bthConnectStaus = BTH_STATUS_CONNECTED;

    },

    fail: function (res) {// 连接蓝牙失败

    _bthConnectStaus = BTH_STATUS_DISCONNECT;

    // 回调上层蓝牙连接失败

    callback(res.errCode, connectfailed)

    }

    然后根据fail中的res.errCode判断是否10003。

    if(code ==10003) { //  部分android手机特殊情况下需要重新搜索才能连接蓝牙,此时报错10003,进行蓝牙搜索(ps:原因可能是系统中将手机蓝牙关闭导致连接状态不能改为断开,导致下次无法连接同一个设备)

    var timeId = setTimeout(function () {

    stopSearchBluetooth();

    callback(false, timout)

    }, 5000); // 最多搜索5s

    searchBluetooth(function (res) {

    if (res.devices === undefined ||res.devices === null) {

    return;

    }

    for (var i = 0; i < res.devices.length; i++) {

    if (res.devices[i] &&res.devices[i].deviceId == deviceId) { // 搜索到该设备

    console.log(searchDeviceAndReConnect:find device and re connect);

    clearTimeout(timeId);

    stopSearchBluetooth() // 停止搜索

    callback(true, finddevice);// 找到设备,在回调函数中连接蓝牙

    break;

    }

    }

    }, function (res) {

    clearTimeout(timeId);

    stopSearchBluetooth() // 停止搜索

    callback(false, searchBluetoothfail)

    });

    }

    上述代码提供了一个简单的流程,当连接出现10003错误时,搜索蓝牙设备,找到后,重新连接蓝牙。

    当然10003,不只是该问题才报的错,所有,在设备没有打开蓝牙时也报10003,而因为加了搜索逻辑,在设备没有打开蓝牙时的提醒就会慢一点(设备蓝牙没打开需要提醒用户打开设备蓝牙),不过好在这一点影响不大,目前没有好的思路去解决,后续再慢慢研究。

    考虑到只有部分手机出现10003错误,所以会先连接一次蓝牙,报错10003才进行,以免其他手机会因为搜索蓝牙导致连接蓝牙采集数据的速度减慢;10003出现的情况很多,不过基本上可以从上一次蓝牙连接是否结束来定位,重新搜索蓝牙后进行连接也是基于上次蓝牙连接未断开这一情况。


    强力推荐小程序培训学院提供更多小程序制作入门视频教程,更多资讯关注小程序开发教程

    展开全文
  • 淘宝客优惠券领取微信小程序前台和后台源码 源码描述: 一、源码特点 1、这是一个微信小程序对接淘宝的淘宝客api自助搜索优惠券领取程序,简单易学,有兴趣的欢迎下载 2、后台采用asp.netMvc框架开发、实现了调用...
  • Django微信小程序后台开发教程

    万次阅读 多人点赞 2018-10-19 20:38:05
    Django微信小程序后台开发教程1 申请小程序,创建hello world小程序2 添加交互框和按钮3 在服务器配置hello django4 实现计算器接口5 配置服务器将后端与微信小程序连接5.1 uwsgi配置5.2 http协议(80端口)下的...
  • 大家好下面我给大家介绍的是基于微信小程序开发的手机端平台通过蓝牙设备或者WIfi设备来实现无线控制和数据传输。如图这是我们微信小程序做的界面。 –   这里我制作的例程用了四种模式,如果大家想修改或自己做...
  • 微信小程序-python结合制作的《请假小程序

    千次阅读 热门讨论 2020-06-23 22:21:09
    展望 19 摘要 请假小程序是前端使用微信小程序,后台使用Python制作的供学生申请课堂请假、老师或辅导员查看并批假的移动端小程序。已导入该系统的学生登录请假小程序,可以在请假标签页进行请假申请,填写好相关...
  • 项目实路饭店,商铺存在共享的wifi的地方,只需要贴出二维码,用户扫描后自动连接小程序 缺点:android6版本 ios11版本图片演示实现代码(IOS没看懂文档说明 只简单的带过 希望能实现的朋友@我一下)// pages/wifi/wifi.js...
  • 简单的微信小程序与Java后台的连接

    万次阅读 多人点赞 2018-06-20 19:48:53
    最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的,然后查找资料发现结合了...
  • 使用 微信小程序制作一款学习类软件,仅供学习参考使用。 开发环境 微信web开发者工具: 目录 开发环境搭建 [微信小程序开发工具的安装与使用]() []() 微信小程序 知识点讲解]() Hello World! [初始化一个 ...
  • 1、前言 微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的...这篇文章分享了一个基于WebSocket长连接的微信小程序——简单的剪刀石头布小游戏的制作过程,希望能对想要在微信小程序中使用 WebS...
  • 之前公众号推过一个校徽头像制作的工具类小程序,通过图片叠加的技术,实现头像与校徽图片的叠加,并生成新的头像图片,今天首先教大家制作小程序前台界面。 1、创建工程 打开微信开发者工具,新建一个工程,输入...
  • 微信小程序开发 环境准备 第一,需要准备一个微信开发者账号。 如果还没有开发者账号,需要到微信开公众平台申请一个账号。网址:微信公众平台 1)注册一个小程序的开发者账号 填写未被微信公众号注册过的邮箱。 ...
  • python连接mysql简单小程序

    千次阅读 2017-04-17 15:09:29
    前提条件: 1、安装mysql数据库。 2、新建表,表结构: 3、编译器PyCharm安装 ...# 连接数据库 connect = pymysql.Connect( host='localhost', port=3306, user='root', passwd
  • 微信小程序电商实战

    千人学习 2018-07-02 19:23:44
    实战开发电商从下单到购物车到支付整个流程
  • 下面就介绍:商家如何自己零成本免费制作点餐小程序。 1. 手机微信搜索:小商店助手。进入小程序后,选择免费开店。 2. 选择小商店类型。如果没有营业执照,可以选择个人。个人/个体户类型的小程序收款是...
  • 微信小程序签到功能实现

    千次阅读 2019-11-28 13:56:36
    最近接到一个任务,是给一个线上的小程序添加一个签到的功能,具体功能包括: 1:按7天一轮显示时间 2:只计算连续签到天数,断签后自动归零 3:签到之后可以获得积分,连续签到前六天每天积分为1,六天之后每天积分...
  • 后台新建小程序 获取小程序APPID和secret 小程序管理后台,开发设置里面获取 直达地址:https://mp.weixin.qq.com/wxamp/devprofile/get_profile?token=297816861&lang=zh_CN 饿了么外卖链接 饿了么外卖链接,...
  • 用于连接打印机,方便快捷使用,安装后可使电脑与打印机连接 ,打印资料。方便快捷,适用于惠普的型号机器,用于连接打印机,方便快捷使用,安装后可使电脑与打印机连接 ,打印资料。方便快捷,适用于惠普的型号机器...
  • 小程序始于微信,直面10亿用户,需求...学习完该课不仅能学到小程序的设计及制作技术,还能培养市场思维、用户思维、设计思维,并且掌握如何利用自身技术制作出吸引用户,产出更多商业价值的产品。网盘文件,永久连接
  • 微信小程序实现课程表

    万次阅读 2019-04-21 23:01:57
    效果图 完整代码GitHub地址
  • 垃圾分类小程序 — 微信小程序源码分享

    千次阅读 多人点赞 2020-04-22 17:55:01
    这是一款个人开发的微信小程序,集 文字查询、语音识别、拍照识别其垃圾分类的小工具,可以使用微信扫码下方二维码立即体验哦。 源码地址:...
  • (开源)微信小程序控制esp8266

    万次阅读 多人点赞 2020-06-29 18:43:25
    微信小程序控制esp8266第一、远程App控制或手动控制下载esp8266示例程序第二、微信小程序开发 流程说明:首先要使esp8266能够联网,能联网就可以控制,使用示例程序,修改WIFI、密钥等信息即可联网控制。微信小程序...
  • 很多单位都有定期或者不定期的知识测试或者技能考核的要求,用来...那么微信在线答题小程序需要怎样开发呢,我们公司自己就已经有开发答题小程序,大家可以在小程序中直接搜索“答题王”即可进入体验。在此和大家分...
  •  使用我们的小程序商城系统,可以很容易的制作出一套属于自己的网上卖酒小程序,我们的系统可以支持随意的拖拽设计,同时还有很多海量的模板供你直接选择。  做好的小程序,还能在附近小程序里展示,住在附近的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,855
精华内容 43,542
关键字:

怎样制作小程序链接