一、简介
本文档主要讲述如何使用创思通信4G Cat1 DTU开发板,基于TencentOS-tiny对接腾讯云物联网开发平台IoT Explorer,演示温度数据上报平台、平台下发控制指令控制继电器、以及如何使用“腾讯连连”小程序。
1. 4G Cat1 DTU开发板
创思通信4G Cat1 DTU开发板资源丰富,板载一颗STM32F103RET6作为主控芯片,板载EC200S 4G Cat1 通信模组,板载一颗DS18B20温度传感器,板载一个继电器模块,如图:
2. TencentOS-tiny物联网操作系统
腾讯物联网操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率。
TencentOS tiny 提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU 及模组芯片上。而且,基于RTOS内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入腾讯云物联网平台。
二、工程说明
通过两种途径拉取TencentOS-tiny源码:
- Github:https://github.com/Tencent/TencentOS-tiny
- Gitee:https://gitee.com/TencentOS/TencentOS-tiny
国内推荐使用gitee拉取:
git clone https://gitee.com/TencentOS/tencentos-tiny.git
拉取源码之后,进入TencentOS-tiny/board/CSTX_STM32F103RE_DTU/
目录之后即可看到官方对该开发板的所有支持。
目录说明如下:
- BSP:板级支持包,存放STM32CubeMX工程文件,生成文件;
- Keil:官方提供示例工程;
- TOS_CONFIG:系统配置文件;
目前Keil文件夹下提供了4个示例工程:
工程名称 | 工程内容 |
---|---|
hello_world | 内核运行示例工程 |
tcp_through_module | 双TCP socket示例工程 |
mqttclient_iot_explorer | 对接IoT Explorer示例工程 |
mqttclient_iot_explorer_ds18b20_relay | 温度上报、指令下发综合示例工程 |
三、运行内核
使用 Keil-MDK 打开hello_world工程,点击编译按钮编译,编译成功之后烧录到开发板(默认使用ST-Link下载器):
下载之后按下开发板上的复位按钮,在串口助手中查看打印日志:
如果在串口助手看到系统每隔1s打印一次日志,则为正常状态。
四、TCP Socket通信测试
1. 搭建TCP服务器
EC200S使用蜂窝网络通信,而本地PC使用的是局域网,如果要建立服务器需要内网穿透,推荐使用云服务器。
在云服务器上新建一个tcpserver-8001.py
文件,编辑如下内容:
# tcpserver.py
from socket import *
host = ''
port = 8001
# 创建server socket
server_socket = socket(AF_INET,SOCK_STREAM)
# 绑定socket监听地址
server_addr = (host,port)
server_socket.bind(server_addr)
# 开始监听,最大允许连接数5
server_socket.listen(5)
# 处理连接请求
try:
while True:
print('waiting for connect...')
#阻塞等待客户端的连接
client_socket, client_addr = server_socket.accept()
# 连接成功后,打印客户端信息
print('a client connnect from:', client_addr)
while(True):
# 向客户端发送数据
client_socket.send('Hello, client!'.encode())
# 接收客户端的数据
data = client_socket.recv(1024)
print('recv data is ', data.decode())
# 接收到quit则关闭socket
if "quit" in data.decode():
break
# 关闭socket
client_socket.close()
server_socket.close()
print("socket closed.")
break
except:
client_socket.close()
server_socket.close()
print("socket closed.")
同理,新建一个tcpserver-8080.py
文件,编辑同样的内容,但需要将端口修改为8080:
port = 8080
运行这两个服务器:
python3 tcpserver-8001.py
python3 tcpserver-8080.py
云服务器需要在安全组放行使用的端口,上面演示8001和8080端口,其它端口使用方法相同。
2. 运行工程
使用 Keil-MDK 打开 tcp_through_module工程:
打开tcp_through_module.c
文件,修改配置。
① 修改本工程所使用的通信模组,将USE_ESP8266
宏定义注释,打开USE_EC200S
,如图:
② 修改TCP服务器配置:
修改完成后,点击编译按钮编译,编译成功之后烧录到开发板(默认使用ST-Link下载器)。
烧录之后按下开发板上的复位按钮,程序开始运行,在串口助手查看日志:
在云服务器上查看打印日志:
五、对接腾讯云物联网开发平台IoT Explorer
1. 云端操作步骤
登录腾讯云物联网开发平台(IoT Explorer),点击“立即使用”进入控制台。
1.1. 新建项目
项目是为了用户面对不同的产品迭代或不同的项目角色而设计的一种隔离机制,便于用户清晰管理物联网项目,并能灵活地配置项目权限。
- 项目下可以建立多个产品与应用,应用默认有权限访问该项目下的所有产品;
- 每个项目会有自己的唯一 ID,数据会根据项目进行隔离,以确保数据安全;
- 项目删除后,该项目所属产品等数据都将被删除且不能恢复;
- 开发平台提供资源级的权限控制,可为不同的子用户分配项目级、产品级的权限控制;
点击新建项目,填写项目名称和简介:
1.2. 产品开发
1.2.1. 新建产品
点击项目名称进入到该项目中,点击新建产品:
填写产品的一些信息:
- 产品名称:名称为中文、字母、数字、下划线的组合,1 - 20位且不能为空。
- 产品品类:选择您所创建产品的所属品类,不同类型产品的属性、事件等数据模板会有所不同。详情请参见 数据模板。
- 设备类型:设备使用2G/3G/4G/Wi-Fi无线通信或有线通信方式,网关可提供云端通信能力,帮助设备与平台通信。
- 认证方式:物联网开发平台提供两种认证方式用于设备与平台之间鉴权认证。
- 证书认证:在创建设备时,平台将为设备生成一个证书文件和一个私钥文件,实现设备与云之间的双向认证。
- 密钥认证:在创建设备时,使用平台为设备随机生成的 PSK。
- 通信方式:您可以选择 Wi-Fi、移动蜂窝(2G/3G/4G)和其他通信方式。
- 数据协议:默认采用数据模板的数据协议,您也可以自定义协议进行透传。
- 描述:字数不能超过80个,您可以根据需要选填。
产品新建成功后,可在产品列表页查看到“智能灯”。
1.2.2. 数据模板
数据模板是将物理实体设备进行数字化描述,构建其数字模型。在物联网开发平台定义数据模板即定义产品功能。完成功能定义后,系统将自动生成该产品的数据模板。
进入产品,点击新建功能:
填写功能信息。
功能类型包含三元素:
- 属性:包括布尔型、整数型、字符型、浮点型、枚举型和时间型等6种基本数据类型;
- 事件:包括告警、故障和信息三种类型,事件型功能属性可以添加具体的事件参数,这些参数可以由属性中6种基本数据类型组成;
- 行为:用于实现更复杂的业务逻辑,可包含输入参数和输出参数,可用于让设备执行某项特定的任务。行为的输入参数和输出参数可添加上述6种属性的基本数据类型。
功能元素 | 功能描述 | 功能标识符 |
---|---|---|
属性 | 用于描述设备的实时状态,支持读取和设置,如模式、亮度、开关等。 | PropertiesId |
事件 | 用于描述设备运行时的事件,包括告警、信息和故障等三种事件类型,可添加多个输出参数,如环境传感器检测到空气质量很差,空调异常告警等。 | EventId |
行为 | 用于描述复杂的业务逻辑,可添加多个调用参数和返回参数,用于让设备执行某项定特定的任务,例如,开锁动作需要知道是哪个用户在什么时间开锁,锁的状态如何等。 | ActionId |
数据类型支持6种:
- 布尔型:非真即假的二值型变量。例如,开关功能。
- 整数型:可用于线性调节的整数变量。例如,空调的温度。
- 字符型:以字符串形式表达的功能点,例如,灯的位置。
- 浮点型:精度为浮点型的功能点。例如,压力值的范围:0.0 - 24.0。
- 枚举型:自定义的有限集合值。例如,灯的颜色:白色、红色、黄色等。
- 时间型:string 类型的 UTC 时间戳(毫秒)。
选择“智能灯”类型后,系统会自动生成标准功能:
数据模板是一个 JSON 格式的文件,使用数据模板协议,用户的设备需按数据模板定义要求传输设备数据到云端,并可使用基于数据模板的诸多业务功能,点击查看json可以看到上面创建功能的json格式:
{
"version": "1.0",
"properties": [
{
"id": "power_switch",
"name": "电灯开关",
"desc": "控制电灯开灭",
"required": true,
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
}
},
{
"id": "color",
"name": "颜色",
"desc": "灯光颜色",
"mode": "rw",
"define": {
"type": "enum",
"mapping": {
"0": "Red",
"1": "Green",
"2": "Blue"
}
}
},
{
"id": "brightness",
"name": "亮度",
"desc": "灯光亮度",
"mode": "rw",
"define": {
"type": "int",
"unit": "%",
"step": "1",
"min": "0",
"max": "100",
"start": "1"
}
},
{
"id": "name",
"name": "灯位置名称",
"desc": "灯位置名称:书房、客厅等",
"mode": "rw",
"required": false,
"define": {
"type": "string",
"min": "0",
"max": "64"
}
}
],
"events": [
{
"id": "status_report",
"name": "DeviceStatus",
"desc": "Report the device status",
"type": "info",
"required": false,
"params": [
{
"id": "status",
"name": "running_state",
"desc": "Report current device running state",
"define": {
"type": "bool",
"mapping": {
"0": "normal",
"1": "fault"
}
}
},
{
"id": "message",
"name": "Message",
"desc": "Some extra message",
"define": {
"type": "string",
"min": "0",
"max": "64"
}
}
]
},
{
"id": "low_voltage",
"name": "LowVoltage",
"desc": "Alert for device voltage is low",
"type": "alert",
"required": false,
"params": [
{
"id": "voltage",
"name": "Voltage",
"desc": "Current voltage",
"define": {
"type": "float",
"unit": "V",
"step": "1",
"min": "0.0",
"max": "24.0",
"start": "1"
}
}
]
},
{
"id": "hardware_fault",
"name": "Hardware_fault",
"desc": "Report hardware fault",
"type": "fault",
"required": false,
"params": [
{
"id": "name",
"name": "Name",
"desc": "Name like: memory,tf card, censors ...",
"define": {
"type": "string",
"min": "0",
"max": "64"
}
},
{
"id": "error_code",
"name": "Error_Code",
"desc": "Error code for fault",
"define": {
"type": "int",
"unit": "",
"step": "1",
"min": "0",
"max": "2000",
"start": "1"
}
}
]
}
],
"profile": {
"ProductId": "FWR8PGACUS",
"CategoryId": "3"
},
"actions": []
}
1.3. 创建测试设备
在【设备调试】页面中,单击【新建设备】,设备名为 dev001:
2. 设备侧操作
使用 Keil-MDK 打开 mqttclient_iot_explorer 工程:
2.1. 配置使用的网络设备
打开mqttclient_iot_explorer.c
文件,修改配置。
① 修改本工程所使用的通信模组,将USE_ESP8266
宏定义注释,打开USE_EC200S
,如图:
2.2. 修改mqtt对接参数
在腾讯云物联网开发平台可以看到一些产品ID、设备ID、设备秘钥三个参数,如图:
接下来进入TencentOS-tiny仓库中的tools目录,使用python运行脚本mqtt_config_gen.py
,按照提示输出刚刚在平台查询到的三个参数,脚本会自动生成mqtt配置参数:
① 输入产品ID;
② 输入设备名称
③ 输入设备秘钥;
④ ⑤ 保持默认,直接回车;
⑥ 需要的生成信息。
接下来在代码中修改配置信息:
2.3. 修改mqtt对接topic
设备向云端上报数据的topic如下:
- 上行请求 Topic:
$thing/up/property/{ProductID}/{DeviceName}
- 上行响应 Topic:
$thing/down/property/{ProductID}/{DeviceName}
这两个topic咋玩呢?
首先订阅上行响应topic,接着向上行请求topic上报数据,上报数据时平台不仅规定了topic,还规定了数据内容,如下:
{
"method":"report",
"clientToken":"clientToken-145023f5-bc9b-4174-ba3b-430ba5956e5c",
"params":
{
"brightness":55,
"name":"bedroom",
"power_switch":1,
"color":2
}
}
其中每一项的意义如下;
参数 | 类型 | 说明 |
---|---|---|
method | String | report 表示设备属性上报。 |
clientToken | String | 用于上下行消息配对标识 |
timestamp | Integer | 属性上报的时间 |
params | JSON | JSON 结构内为设备上报的属性值 |
同时,因为订阅了上行响应topic,所以模组会收到云端下发的响应并通过URC模式上报,云端响应报文整理一下格式如下:
{
"method":"report_reply",
"clientToken":"clientToken-145023f5-bc9b-4174-ba3b-430ba5956e5c",
"code":0,
"status":"success"
}
其中每一项也有具体的含义:
参数 | 类型 | 说明 |
---|---|---|
method | String | report_reply 表示云端接收设备上报后的响应报文 |
clientToken | String | 用于上下行消息配对标识 |
code | Integer | 0表示云端成功收到设备上报的属性 |
status | String | 当code非0的时候, 提示错误信息 |
接下来修改代码,首先根据自己的产品ID和设备ID修改上报topic:
然后修改订阅topic:
2.4. 编译下载
修改完成之后编译工程,下载到开发板中,重新上电开始运行,在串口助手中查看打印日志:
在云端查看上报日志:
点击【设备属性】,点击亮度属性一栏的查看,可以查看曲线显示:
六、综合演示demo
1. demo内容
① 设备端读取DS18B20温度数据,上报到云端平台;
② 平台端下发控制指令,设备侧接收到后打开/关闭继电器;
2. 云端操作步骤
2.1. 新建项目
点击新建项目,填写项目名称和简介:
2.2. 新建产品
点击项目名称进入到该项目中,点击新建产品:
产品新建成功后,可在产品列表页查看到:
2.3. 数据模板
进入产品,点击【数据模板】,点击【导入JSON】,导入下面的JSON代码:
{
"version": "1.0",
"profile": {
"ProductId": "E2IGF491FP",
"CategoryId": "1"
},
"properties": [
{
"id": "TempValue",
"name": "温度",
"desc": "",
"mode": "r",
"define": {
"type": "float",
"min": "-100",
"max": "100",
"start": "0",
"step": "0.1",
"unit": "℃"
},
"required": false
},
{
"id": "relay_status",
"name": "继电器状态",
"desc": "",
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
},
"required": false
}
],
"events": [],
"actions": []
}
导入之后自动根据json文件创建的属性如下:
2.4. 创建设备
点击【设备调试】,进入后点击【新建设备】,创建真实设备:
创建成功之后进入设备,查看到产品ID、设备名称、设备秘钥:
3. 设备侧操作步骤
使用 Keil-MDK 打开 mqttclient_iot_explorer_ds18b20_relay 工程:
按照第五章第2节的方法修改代码文件 mqttclient_iot_explorer_ds18b20_relay.c,此处不再赘述。
修改之后编译工程,下载工程,在串口助手中查看日志:
在云端查看上报数据:
查看温度曲线:
点击【设备调试】,点击继电器状态按钮,切换为【打开】状态,然后下发控制指令:
可以看到设备端已经打开继电器,日志如图:
4. 腾讯连连小程序操作步骤
4.1. 添加家庭
手机端在【微信】搜索【腾讯连连】小程序,首次使用需要进入后点击【我的】->【家庭管理】,添加一个你喜欢的名称即可。
4.2. 添加调试设备
返回【首页】,点击右上角“加号”图标:
进入后点击右上角扫码图标:
在腾讯云物联网开发平台进入【设备调试】,点击对应设备后的【二维码】:
腾讯连连扫描此二维码即可成功添加设备,添加成功之后如图:
点击此设备即可实时查看数据,并下发控制指令:
4.3. 修改腾讯连连显示面板
进入【交互开发】,点击【面板配置】一栏:
在此页面中可以自己根据喜好配置小程序显示面板,如图:
保存之后,在腾讯连连小程序删除设备,重新扫描绑定设备即可生效,如图: