本文章来自程序汪背后的私活小团队,开发共享电动车的小程序,希望把这些真实案例分享出来,大家能学到点东西,比如硬件怎么通过手机蓝牙操控,商业项目怎么推广,软件怎么和硬件配合,电动车技术方案是什么样的等等。
B站【我是程序汪】
共享电动车项目
开发项目情况
-
前端vue 小程序uniapp PC端页面
-
后端 技术栈 springboot
-
开发周期90天
-
开发人数 2人
-
整体费用是8万(不含硬件部分)
-
走的公司合同
-
云服务器3台
技术选型
-
核心框架:Spring Boot
-
数据库连接池:Druid
-
缓存:redis
-
数据库:mysql
-
小程序蓝牙接口
项目背景
背景很简单城市交通非常容易堵车,但是小电动就比较舒服了,10公里内短途交通选择小电动是非常方便快捷的,我们这个共享电动车 还车话需要到指定的地方才可以,下面我们简单看看这个项目的核心功能吧
很多功能很共享单车差不多
核心流程
流程比较复杂,我画了一个简单点的,下面主要讲下扫码开锁这个流程,中间涉及了小程序,后端服务,腾讯IOT,硬件设备,硬件内部细节不讲了,这部分是硬件兄弟开发的,我只负责跟硬件接口对接就可以
运营维护人员需要定期检查电动车的电量情况,这里硬件部分是每10分钟会上报电池的具体情况,方便运营维护师傅保养维修电动车
这里可骑行的公里数是后端服务查询硬件查询出来的电量计算出来的
而一公里耗电大约0.02度电(1.2度电/56km=0.02度电/公里)
这是硬件提供的数据
去超市购买一个小东西出来可以继续骑车,这个需求点一直有,但好多共享单车都没有
蓝牙开锁接口
这是蓝牙开锁的代码,大家可以参考uniapp
openBluetoothAdapter() {
wx.openBluetoothAdapter({
success: (res) => {
console.log('openBluetoothAdapter success', res)
this.startBluetoothDevicesDiscovery()
this.iflan=true;
},
fail: (res) => {
if (res.errCode === 10001) {
wx.showToast({
title: '请打开蓝牙',
icon: "none"
})
wx.onBluetoothAdapterStateChange(function (res) {
console.log('onBluetoothAdapterStateChange', res)
if (res.available) {
this.startBluetoothDevicesDiscovery()
}
})
}
}
})
},
startBluetoothDevicesDiscovery() {
console.log(123)
if (this._discoveryStarted) {
return
}
this._discoveryStarted = true
wx.startBluetoothDevicesDiscovery({
allowDuplicatesKey: true,
services: [
"FFE0",
// "F0A0", // BM30广播模块需加上,如使用连接模块可忽略
],
success: (res) => {
console.log('startBluetoothDevicesDiscovery success', res)
this.onBluetoothDeviceFound()
},
fail(res){
console.log(res);
console.log('失败')
}
})
},
uni.openBluetoothAdapter(OBJECT)
初始化蓝牙模块
OBJECT 参数说明
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
https://uniapp.dcloud.net.cn/api/system/bluetooth.html#openbluetoothadapter
下面是蓝牙通信协议接口说明
1.通信协议格式
通信只支持蓝牙串口通信方式
2.通信数据格式
帧头 | 源地址 | 目标地址 | 数据长度 | 命令码 | 协议版本 | 数据 | 校验和 |
2字节 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | N字节 | 1字节 |
0x3B、0xB3 | 异或 |
l帧头:2字节,固定为0x3B、0xB3
l源地址: 1字节, 默认0
l目标地址:1字节,默认1
l数据长度:1字节,包括命令码、协议版本和数据域的长度。
l命令码:1字节
l协议版本:1字节,表示当前的协议版本,起始版本为0x10
l数据:0-N字节,N小于等于250
l校验和:1字节, 异或校验,为本帧数据包括帧头,源地址,目标地址,数据长度,命令码,协议版本,数据在内的全部数据做异或校验。
本协议中没有特殊说明的数据格式全部为16进制,大于1字节的数据发送时高字节在前,低字节在后
获取电动车电量
可以获取电池的各种健康数据,电动车最核心的价值就是电池
获取电动车经纬度
蓝牙和硬件的接口文档分享 百度网盘
链接: https://pan.baidu.com/s/1Xne_9wbugNIsGQfMzn06jA
密码: 3jo6
硬件兄弟开发的电池保护板
下面是对接腾讯IOT平台SDK的DEMO,大家也可以去腾讯官方去看详细的SDK说明
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.cvm.v20170312.CvmClient;
import com.tencentcloudapi.cvm.v20170312.models.DescribeInstancesRequest;
import com.tencentcloudapi.cvm.v20170312.models.DescribeInstancesResponse;
public class DescribeInstances {
public static void main(String[] args) {
try {
// 为了保护密钥安全,建议将密钥设置在环境变量中或者配置文件中,请参考本文凭证管理章节。
// 硬编码密钥到代码中有可能随代码泄露而暴露,有安全隐患,并不推荐。
// Credential cred = new Credential("SecretId", "SecretKey");
Credential cred = new Credential(System.getenv("TENCENTCLOUD_SECRET_ID"), System.getenv("TENCENTCLOUD_SECRET_KEY"));
CvmClient client = new CvmClient(cred, "ap-shanghai");
DescribeInstancesRequest req = new DescribeInstancesRequest();
DescribeInstancesResponse resp = client.DescribeInstances(req);
System.out.println(DescribeInstancesResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
PC端
目前主要功能 如图
参考资料
-
https://uniapp.dcloud.net.cn/api/system/bluetooth.html#openbluetoothadapter
-
https://github.com/TencentCloud/tencentcloud-sdk-java
-
https://cloud.tencent.com/document/product/1081
-
https://baike.baidu.com/item/MQTT/3618851?fromtitle=MQTT%E5%8D%8F%E8%AE%AE&fromid=56980070&fr=aladdin
其他有趣项目
欢迎添加程序汪VX itwang007
标签:电动车,字节,res,开发周期,蓝牙,硬件,万接,共享,com From: https://blog.csdn.net/u011091199/article/details/137122114