This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【CC2541测评】CC2541迷你开发套件项目应用评测+微信小程序控制cc2541by无聊达

Other Parts Discussed in Thread: CC2541

在手机越来越普及,物联网越来越火,微信小程序越来越流行的今天,不论是大学生还是工程师,都应该学习微信小程序物联网开发,让自己时刻处于时代的前沿。

微信小程序的优势
1、对用户使用上来说,确实方便,要用的时候打开,不用的时候关掉,即用即走。这点比需要下载,还要占用手机内存空间的APP要好。
2、主要的样式代码都封装在微信小程序里面,所以打开速度比普通的H5要快,接近原生APP。
3、可以调用比H5更多的手机系统功能来进行开发,例如GPS定位、录音、拍视频、重力感应等,能开发更丰富的使用场景。
4、在安卓手机上可以添加到手机桌面,看上去跟原生APP差不多,但仅限安卓手机,iphone就不行了。
5、运行速度跟APP差不多,也能做出很多H5不做到的功能,开发成本跟H5差不多,相对来说开发成本比APP要低。

学完了微信小程序,就等同学会了支付宝小程序,快应用等小程序的开发,并且可以同时运行在IOS和Android手机上,小程序一定是未来物联网不可或缺的一部分。

1、新建小程序项目

一 ,小程序开发工具如何下载我就不多说了,下载地址developers.weixin.qq.com/.../download.html

二,安装完毕,打开小程序开发工具,扫码登录

三,新建项目,需要填写的有小程序的项目名称,目录,AppID建议先使用测试号,点击新建

四,新建lanyatest目录和lanyatest页面,并在app.json中将此页面移到最上方

五、初始化蓝牙适配器(wx.openBluetoothAdapter)

注意
其他蓝牙相关 API 必须在 wx.openBluetoothAdapter 调用之后使用。否则 API 会返回错误(errCode=10000)。
在用户蓝牙开关未开启或者手机不支持蓝牙功能的情况下,调用 wx.openBluetoothAdapter 会返回错误(errCode=10001),表示手机蓝牙功能不可用。此时小程序蓝牙模块已经初始化完成,可通过 wx.onBluetoothAdapterStateChange 监听手机蓝牙状态的改变,也可以调用蓝牙模块的所有API。

wx.openBluetoothAdapter({
  success (res) {
    console.log(res)
  }
})

六、获取蓝牙适配器状态(getBluetoothAdapterState)

通常在上一步成功初始化蓝牙适配器的情况下,这一步都不会有问题,res中的参数有两个,discovering标明是否正在搜索设备,available标明蓝牙适配器是否可用

wx.getBluetoothAdapterState({
  success (res) {
    console.log(res)
  }
})

七、搜索蓝牙设备(startBluetoothDevicesDiscovery)

开始搜寻附近的蓝牙外围设备。此操作比较耗费系统资源,请在搜索并连接到设备后调用 wx.stopBluetoothDevicesDiscovery 方法停止搜索

// 以微信硬件平台的蓝牙智能灯为例,主服务的 UUID 是 FEE7。传入这个参数,只搜索主服务 UUID 为 FEE7 的设备
wx.startBluetoothDevicesDiscovery({
  services: ['FEE7'],
  success (res) {
    console.log(res)
  }
})

八、获取蓝牙设备列表(getBluetoothDevices)

获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。

该接口获取到的设备列表为蓝牙模块生效期间所有搜索到的蓝牙设备,若在蓝牙模块使用流程结束后未及时调用 wx.closeBluetoothAdapter 释放资源,会存在调用该接口会返回之前的蓝牙使用流程中搜索到的蓝牙设备,可能设备已经不在用户身边,无法连接。
蓝牙设备在被搜索到时,系统返回的 name 字段一般为广播包中的 LocalName 字段中的设备名称,而如果与蓝牙设备建立连接,系统返回的 name 字段会改为从蓝牙设备上获取到的 GattName。若需要动态改变设备名称并展示,建议使用 localName 字段。

// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
  var hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function(bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
  )
  return hexArr.join('');
}
wx.getBluetoothDevices({
  success: function (res) {
    console.log(res)
    if (res.devices[0]) {
      console.log(ab2hex(res.devices[0].advertisData))
    }
  }
})

九、连接已发现的蓝牙设备(createBLEConnection)

连接低功耗蓝牙设备。

若小程序在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需进行搜索操作。

注意
请保证尽量成对的调用 createBLEConnection 和 closeBLEConnection 接口。安卓如果多次调用 createBLEConnection 创建连接,有可能导致系统持有同一设备多个连接的实例,导致调用 closeBLEConnection 的时候并不能真正的断开与设备的连接。
蓝牙连接随时可能断开,建议监听 wx.onBLEConnectionStateChange 回调事件,当蓝牙设备断开时按需执行重连操作
若对未连接的设备或已断开连接的设备调用数据读写操作的接口,会返回 10006 错误,建议进行重连操作。

wx.createBLEConnection({
  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
  deviceId,
  success (res) {
    console.log(res)
  }
})

十、停止搜索蓝牙设备(stopBluetoothDevicesDiscovery)

停止搜寻附近的蓝牙外围设备。若已经找到需要的蓝牙设备并不需要继续搜索时,建议调用该接口停止蓝牙搜索。

wx.stopBluetoothDevicesDiscovery({
  success (res) {
    console.log(res)
  }
})

十一、获取蓝牙设备所有service(getBLEDeviceServices)

获取蓝牙设备所有服务(service)。

wx.getBLEDeviceServices({
  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
  deviceId,
  success (res) {
    console.log('device services:', res.services)
  }
})

十二、获取所有特征值(getBLEDeviceCharacteristics)

获取蓝牙设备某个服务中所有特征值(characteristic)。

wx.getBLEDeviceCharacteristics({
  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
  deviceId,
  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
  serviceId,
  success (res) {
    console.log('device getBLEDeviceCharacteristics:', res.characteristics)
  }
})

十三、启用特征值变化(notifyBLECharacteristicValueChange)

启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值。注意:必须设备的特征值支持 notify 或者 indicate 才可以成功调用。

另外,必须先启用 notifyBLECharacteristicValueChange 才能监听到设备 characteristicValueChange 事件

wx.notifyBLECharacteristicValueChange({
  state: true, // 启用 notify 功能
  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
  deviceId,
  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
  serviceId,
  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
  characteristicId,
  success (res) {
    console.log('notifyBLECharacteristicValueChange success', res.errMsg)
  }
})



十四、接收蓝牙返回消息(onBLECharacteristicValueChange)

监听低功耗蓝牙设备的特征值变化事件。必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification

 

// ArrayBuffer转16进制字符串示例
function ab2hex(buffer) {
  let hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function(bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
  )
  return hexArr.join('');
}
wx.onBLECharacteristicValueChange(function(res) {
  console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
  console.log(ab2hex(res.value))
})

 

十五、发送信息到蓝牙(writeBLECharacteristicValue)

向低功耗蓝牙设备特征值中写入二进制数据。注意:必须设备的特征值支持 write 才可以成功调用。

 

// 向蓝牙设备发送一个0x00的16进制数据
let buffer = new ArrayBuffer(1)
let dataView = new DataView(buffer)
dataView.setUint8(0, 0)

wx.writeBLECharacteristicValue({
  // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
  deviceId,
  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
  serviceId,
  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
  characteristicId,
  // 这里的value是ArrayBuffer类型
  value: buffer,
  success (res) {
    console.log('writeBLECharacteristicValue success', res.errMsg)
  }
})

十六、断开蓝牙设备连接(closeBLEConnection)

断开与低功耗蓝牙设备的连接。

wx.closeBLEConnection({
  deviceId,
  success (res) {
    console.log(res)
  }
})

更加详细的内容可以到这里看:https://blog.csdn.net/qq_34234087/article/details/89202665

因为ti论坛的文本编辑器太反人类了,我不想传图了,传个演示视频上来

cc2541 mini套件使用感受:

相对于以前使用的蓝牙串口模块来说,直接使用cc2541是便宜了许多,但是上手难度颇大,到手里之后玩了大半个月才上手。

在开始学习之前,推荐大家阅读《蓝牙4.0 BLE开发完全手册---物联网开发技术实战》这本书,这本书从基础讲起,确实对初学者很有用,初学者在论坛里逛了多久都没有用,因为你没有基础,甚至看不懂论坛里的人在讨论啥,只有看了了这本书,才能较快地入门osal开发。

正版图书链接:product.dangdang.com/23237630.html

当然也有dao版电子书,已经有大佬分享过了:

e2echina.ti.com/.../156405