在前文中我提到,在本次光电竞赛中我设计了一款小程序,需要借助树莓派,利用传感器采集数据并上传至小程序的云开发数据库,再通过小程序读取数据库中的数据,绘制温度变化曲线。获取数据并绘制曲线的功能已经在前文实现,现在需要做的就是,如何将本地的数据上传至云开发数据库。
要想实现数据的传输,最重要的一点就是获取到微信公众平台的 access_token。而要想得到 access_token,就需要提供小程序的 AppID 和 AppSecret,这两者都可以在微信公众平台中获取到。
这里我们可以定义一个函数来获取 access_token:
1
2
3
4
5
6
7
8
9
10
| def access_token():
"""
获取 access_token
"""
APPID = '' # 小程序ID
APPSECRET = '' # 小程序秘钥
WECHAT_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + APPID + '&secret=' + APPSECRET
response = requests.get(WECHAT_URL)
result = response.json()
return result["access_token"] # 将返回值解析获取 access_token
|
正常情况下,返回的 JSON 数据包内容为:
1
| {"access_token":"ACCESS_TOKEN","expires_in":7200}
|
至此,我们就得到了 access_token。接下来就要上传数据。我想要上传的数据为:
1
2
3
4
5
| openId = 'o2XBq5FtxdiSDfJRpxfVi74QhQSQ'
tempName = 'GuanQirui'
tempTemp = '36.5'
tempLct = '杭州'
tempDate = '2020-07-12'
|
openId
为微信用户的唯一标识,这段字符串表示该段数据是属于「我」这个用户的。在小程序中,我们上传数据后可以发现,每一组数据都有自己的 openId
,因此每个用户只能访问到属于自己 openId
的数据。所以说,如果不上传 openId
,尽管这段数据存放在数据库中,你也无法通过小程序访问。tempName
到 tempData
这几个数据就是自己定义的数据,分别表示姓名、温度、地点、日期。
数据上传的格式应该和在小程序中使用 JavaScript 编写的上传函数相同。在小程序中的代码为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| const db = wx.cloud.database()
db.collection('temp').add ({
data: {
name: this.data.name,
temperature: this.data.temperature,
location: this.data.location,
date: this.data.date
},
success: res => {
this.setData ({
counterId: res._id,
count: 1
})
},
})
|
其中,temp
是数据库中存放这组数据的集合名称。从这段代码可以看出,数据上传的关键是 db.collection().add
这部分函数。
另外,上传数据的接口为:
https://api.weixin.qq.com/tcb/databaseadd?access_token=ACCESS_TOKEN
我们再定义一个函数对数据进行上传:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| def databaseAdd(access_token):
"""
新建记录并对内容进行定义
"""
url = 'https://api.weixin.qq.com/tcb/databaseadd?access_token=' + access_token
query = 'db.collection("temp").add({data:{_openid:"'+ openId +'",name:"'+ tempName +'",temperature:"'+ tempTemp +'",location: "'+ tempLct +'",date:"'+ tempDate +'"}})'
data = {
"env": "toolbox-01",
"query": query
}
response = requests.post(url, data=json.dumps(data))
result = response.json()
print(result)
|
其中,data
中的 env
是数据库的名称。我们执行以上的函数,即可在小程序云开发的后台查看到新添加的数据。
对云开发数据库中的数据进行获取的方法类似。比如现在有一个名为 user
的数据集合,数据中包含了用户的姓名 name
和位置 location
,我们想要获取到有关 Tony 用户的所有数据。同样定义一个函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| def databaseQuery(access_token):
"""
检索数据库,获取 tempName 用户数据
"""
url = 'https://api.weixin.qq.com/tcb/databasequery?access_token=' + access_token
#query = 'db.collection("user").limit(100).get()'
query = 'db.collection("user").where({"name":"' + tempName + '"}).get()'
data = {
"env": "toolbox-01",
"query": query
}
response = requests.post(url, data=json.dumps(data))
length = len(response.json()['data'])
user = response.json()['data'][length - 1]
user_dict = ast.literal_eval(user)
openId = user_dict.get('_openid')
location = user_dict.get('location')
print(openId)
print(location)
|
其中, tempName = Tony
,函数打印出了有关 Tony 的最新数据中对应的 _openid
和 location
信息。
因为我想要实现的功能仅为本地数据的上传,数据的修改和删除操作均在小程序端执行,所以就没有编写有关修改和删除的函数。感兴趣的读者可以自行查阅网上相关资料自行编写。