随着物联网技术的发展,越来越多的应用需求被提及,整个物联网产业链的基础设施也得到快速发展。以腾讯、阿里为首的头部云计算企业,纷纷推出了物联网设备接入的基础设施(嵌入式系统 + 物联网管理平台),极大的方便了物联网应用场景的落地。在此借【腾讯云loT应用创新大赛】的机会,跟各位从业者一起分享下:如何站在巨人的肩膀上快速落地应用。
本次分享的场景是:智慧办公场景。实际上是传统智能家居在办公职场的延伸,由一个家庭变成了一个公司,一座办公楼,一个园区。
传统智能家居组网方案(如Wi-Fi,Zigbee,蓝牙等)的终端数量和维护复杂度,在办公环境大量设备的情况下,变得更加困难。办公场景下的“智能家居”特点是:终端数量大,数据量小、统一管理。还有一个限制就是,大部分需要后装,线路改造麻烦。LoRa 作为距离远、容量大、星形网络、无线通信,正好满足智慧办公场景的需求,这也正是本方案选择 LoRa 作为底层通信技术的原因。
本方案代码详见 Github。
视频:
PPT:
本着 可重复、可验证 的原则,本方案尽量选择腾讯云为大家准备的硬件资源。唯一额外使用的硬件资源就是树莓派,网上有多种型号可以选择,大家可以在淘宝上【树莓派】关键字,根据自己的需求购买。
Python :逻辑控制模块开发,连接腾讯云Iot-Explore 与 homebridge。 C :LoRaWAN 节点功能开发。 JavaScript :腾讯云Iot-Explore 二进制数据解析。
homebridge: 模拟苹果 HomeKit 协议,桥接非苹果认证设备。 iOS 家庭App:关联设备,以便通过Siri语音控制。
homebridge-better-http-rgb :通过 http/https 控制灯。
sudo
。cd ~/.homebridge vim config.json
添加下面内容
{
"bridge": {
"name": "Homebridge",
"username": "DC:A6:32:64:5B:41",
"port": 51826,
"pin": "888-88-888"
},
"description": "Homebridge",
"accessories": [
{
"accessory": "HTTP-RGB",
"name": "灯1",
"service": "Light",
"http_method": "POST",
"switch": {
"status": "http://localhost:8006/light/api/v1.0/d896e0004500001b/1/",
"powerOn": "http://localhost:8006/light/api/v1.0/d896e0004500001b/1/on",
"powerOff": "http://localhost:8006/light/api/v1.0/d896e0004500001b/1/off"
}
}
],
"platforms": []
}
cd /etc/systemd/system vim homebridge@pi.service
添加下面内容。
[Unit]
Description=Homebridge
After=network.target
[Service]
Type=simple
User=pi
ExecStart=/usr/local/bin/homebridge
[Install]
WantedBy=multi-user.target
常用命令
#更新系统服务设置
sudo systemctl --system daemon-reload
#设置 HomeBridge 开机启动
sudo systemctl enable homebridge@pi.service
#常用操作
sudo systemctl stop homebridge@pi.service
sudo systemctl status homebridge@pi.service
journalctl -f -n 50 -u homebridge@pi.service
pip3 install flask
pip3 install tencentcloud-sdk-python
cd ~/ mkdir tencent_iot_explorer cd tencent_iot_explorer vim app_tencent_iot_demo.py
添加下面内容。
import json
from flask import Flask
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.iotexplorer.v20190423 import iotexplorer_client, models
cred = credential.Credential("你的腾讯云账号ID", "你的腾讯云账号Key")
httpProfile = HttpProfile()
httpProfile.endpoint = "iotexplorer.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
app = Flask(__name__)
light_state = 0
def light_state_set(dev_uuid, key_num, state):
try:
client = iotexplorer_client.IotexplorerClient(cred, "ap-guangzhou", clientProfile)
req = models.ControlDeviceDataRequest()
params = {'ProductId': '你的产品ID', 'DeviceName': dev_uuid, 'Data': "{\"key1_state\":1}"}
if state == 1 and key_num == 1:
params['Data'] = "{\"led_switch\":1}"
if state == 0 and key_num == 1:
params['Data'] = "{\"led_switch\":0}"
req.from_json_string(json.dumps(params))
resp = client.ControlDeviceData(req)
print(resp.to_json_string())
except TencentCloudSDKException as err:
print(err)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/light/api/v1.0/<string:dev_uuid>/<string:led_num>/', methods=['GET'])
def light_get_status(dev_uuid, led_num):
return str(light_state)
@app.route('/light/api/v1.0/<string:dev_uuid>/<string:key_num>/<string:st>', methods=['POST'])
def light_set_status(dev_uuid, key_num, st):
global light_state
if st == 'on':
light_state = 1
light_state_set(dev_uuid, int(key_num), 1)
elif st == 'off':
light_state = 0
light_state_set(dev_uuid, int(key_num), 0)
return str(light_state)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8006)
cd /etc/systemd/system
vim fmtech@pi.service
添加下面内容。
[Unit]
Description=fmtech-iot-demo
After=network.target
[Service]
Type=simple
User=pi
ExecStart=python3 /home/pi/tencent_iot_explorer/app_tencent_iot_demo.py
[Install]
WantedBy=multi-user.target
常用命令
#更新系统服务设置
sudo systemctl --system daemon-reload
#设置 fmtech 开机启动
sudo systemctl enable fmtech@pi.service
#常用操作
sudo systemctl stop fmtech@pi.service
sudo systemctl status fmtech@pi.service
journalctl -f -n 50 -u fmtech@pi.service
//上行,设备上报数据
function RawToProtocol(fPort, bytes) {
var COMMAND_STATE_REPORT = 0x00;
var COMMAND_CONFIG_REPORT = 0x02;
var COMMAND_STATE_GET = 0x80;
var COMMAND_CONFIG_GET = 0x81;
var COMMAND_HEARTBEAT_SET = 0x82;
var COMMAND_LED_STATE_SET = 0x84;
var data = {
"method": "report",
"clientToken": new Date(),
"params": {}
};
var cmd = bytes[0]; // command
var porocol_ver = bytes[1]; // 协议版本
if (cmd === COMMAND_STATE_REPORT) {
data.params.led_switch = bytes[2] & 0x01;
return data;
}
if (cmd === COMMAND_CONFIG_REPORT) {
data.params.heartbeat_period = bytes[2];
return data;
}
return data;
}
// 下行,服务端下发数据
function ProtocolToRaw(obj) {
var COMMAND_STATE_REPORT = 0x00;
var COMMAND_CONFIG_REPORT = 0x02;
var COMMAND_STATE_GET = 0x80;
var COMMAND_CONFIG_GET = 0x81;
var COMMAND_HEARTBEAT_SET = 0x82;
var COMMAND_LED_STATE_SET = 0x84;
var payloadArray = []
// 追加下行帧头部
payloadArray = payloadArray.concat(0x0a); // 设备短应用程序端口
payloadArray = payloadArray.concat(0x01); // LoRa数据包类型,1 confirm包,0 非confirm包
var params = obj['params'];
if (params.hasOwnProperty('heartbeat_period')) {
var heartbeat_period = params['heartbeat_period'];
payloadArray = payloadArray.concat(COMMAND_HEARTBEAT_SET);
payloadArray = payloadArray.concat(0x01);
payloadArray = payloadArray.concat(heartbeat_period);
return payloadArray;
}
if (params.hasOwnProperty('led_switch')) {
var state = params['led_switch'];
payloadArray = payloadArray.concat(COMMAND_LED_STATE_SET);
payloadArray = payloadArray.concat(0x01);
payloadArray = payloadArray.concat(state);
return payloadArray;
}
return payloadArray;
}
LoRaWAN 网关上电并连接互联网。 确认节点已经接入腾讯云IotExplorer。 确认树莓派和iPone 手机接入同一WiFi。
方案本身无特别的自创技术,都是在站在巨人的肩膀上开始集成。本方案的技术框架,只能作为DIY使用,在真正的产品中,工程的复杂度还是偏高,需要使用类似边缘计算的方式来架构产品,形成 【端--云--边】 的产品结构,才能正真的市场化。
感谢腾讯云IoT创新大赛组委会为大家提供的开发套件及技术支持,没有最好,只有更好。
枫芒科技 是一家关注企业办公效能的创业公司,我们深信物联网技术能为企业带来经济效益,而不仅仅是噱头。欢迎有需要的老板联系我们!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。