专栏首页腾讯云IoT【IoT应用创新大赛】基于LoRa的智慧办公场景方案
原创

【IoT应用创新大赛】基于LoRa的智慧办公场景方案

前言

随着物联网技术的发展,越来越多的应用需求被提及,整个物联网产业链的基础设施也得到快速发展。以腾讯、阿里为首的头部云计算企业,纷纷推出了物联网设备接入的基础设施(嵌入式系统 + 物联网管理平台),极大的方便了物联网应用场景的落地。在此借【腾讯云loT应用创新大赛】的机会,跟各位从业者一起分享下:如何站在巨人的肩膀上快速落地应用。

本次分享的场景是:智慧办公场景。实际上是传统智能家居在办公职场的延伸,由一个家庭变成了一个公司,一座办公楼,一个园区。

传统智能家居组网方案(如Wi-Fi,Zigbee,蓝牙等)的终端数量和维护复杂度,在办公环境大量设备的情况下,变得更加困难。办公场景下的“智能家居”特点是:终端数量大,数据量小、统一管理。还有一个限制就是,大部分需要后装,线路改造麻烦。LoRa 作为距离远、容量大、星形网络、无线通信,正好满足智慧办公场景的需求,这也正是本方案选择 LoRa 作为底层通信技术的原因。

本方案代码详见 Github

视频:

演示视频

PPT:

腾讯云IoT应用创新大赛.pptx

零:必要资源

本着 可重复、可验证 的原则,本方案尽量选择腾讯云为大家准备的硬件资源。唯一额外使用的硬件资源就是树莓派,网上有多种型号可以选择,大家可以在淘宝上【树莓派】关键字,根据自己的需求购买。

0.0 硬件组成
  • 树莓派4B+:用于运行HomeBridge服务、腾讯云 Iot-Explorer 通信服务。
  • iPhone(iOS 10以上版本):识别语音指令。
  • P-NUCLEO-LRWAN3 开发套件:LoRaWAN 终端执行节点、LoRaWAN 网关接入腾讯云。
0.1 语言 & 应用 & 插件
  • 语言

Python :逻辑控制模块开发,连接腾讯云Iot-Explore 与 homebridge。 C :LoRaWAN 节点功能开发。 JavaScript :腾讯云Iot-Explore 二进制数据解析。

  • 应用

homebridge: 模拟苹果 HomeKit 协议,桥接非苹果认证设备。 iOS 家庭App:关联设备,以便通过Siri语音控制。

  • 插件

homebridge-better-http-rgb :通过 http/https 控制灯。

壹:方案框架

  • 物理层次
    物理层次.jpg
  • 数据链路
数据链路.jpg

贰:技术实现

第一步:安装并启动 HomeBridge 服务
  1. 启动树莓派,通过有线网络连接电脑和树莓派,配置Wi-Fi。参考树莓派装载系统并配置网络
  2. 安装 HomeBridge。参考HomeBridge在树莓派上的安装
  3. 安装 homebridge-better-http-rgb。参考此链接。(https://www.npmjs.com/package/homebridge-better-http-rgb),注意命令前面添加 sudo
  4. 配置(模拟)需要控制的设备。

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": []
}
  1. 开机启动 HomeBridge。

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 
第二步:构建逻辑控制 HTTP 服务
  1. 安装 Flask 。 pip3 install flask
  2. 安装 tencentcloud-sdk-python 。 pip3 install tencentcloud-sdk-python
  3. 编写逻辑控制服务。

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)
  1. 开机启动 app_tencent_iot_demo.py。

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
第三步:IotExplore 添加产品及解析脚本
  1. 登陆腾讯云并前往物联网开发平台
  2. 创建项目。
创建项目.jpg
  1. 创建产品。
创建产品.jpg
  1. 点击创建的产品,添加产品属性。
led_switch属性.jpg
heartbeat_period属性.jpg
  1. 更新设备类型为 Class C,以便设备能及时收到下行数据。
修改ClaasC.jpg
  1. 确定应用层通信协议,添加数据解析脚本。
//上行,设备上报数据
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;
}
  1. 根据需要进行设备调试。
第四步:终端节点开发
  • 搭建开发环境。请参考腾讯云Iot部门给出的参考文档
  • 根据协议编码。建议使用Tencent-TinyOS,后期更换硬件平台更方便。
第五步:集成测试
  • 硬件准备。

LoRaWAN 网关上电并连接互联网。 确认节点已经接入腾讯云IotExplorer。 确认树莓派和iPone 手机接入同一WiFi。

  • 测试体验。

叁:总结 & 拓展

方案本身无特别的自创技术,都是在站在巨人的肩膀上开始集成。本方案的技术框架,只能作为DIY使用,在真正的产品中,工程的复杂度还是偏高,需要使用类似边缘计算的方式来架构产品,形成 【端--云--边】 的产品结构,才能正真的市场化。

3.1 方案要点:
  • 充分利用 Apple 的智能家居技术能力, 通过 Siri 获取目标设备与执行动作。
  • LoRaWAN 网络服务器使用腾讯云提供的Iot Explore,利用平台能力,降低集成复杂度。
  • 使用 HomeBridge 桥接客制化设备,遇到复杂控制终端,可编写插件,自由扩展。
3.2 运用拓展:
  • 更多的控制终端,控制场景更加丰富:窗帘、空调、门禁等。
  • 更多的输入终端,场景自动化: 温湿度传感器、亮度传感器、空间占用传感器。
  • 更多的逻辑控制单元,运营自动化:设备状态实时看板、运维监控。

肆:致谢 & 广告

感谢腾讯云IoT创新大赛组委会为大家提供的开发套件及技术支持,没有最好,只有更好。

枫芒科技 是一家关注企业办公效能的创业公司,我们深信物联网技术能为企业带来经济效益,而不仅仅是噱头。欢迎有需要的老板联系我们!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 韩国TMTG上线 Coinsuper交易所!

    TMTG将于香港时间8月16日08:08:08pm上线香港领先的数字资产交易平台Coinsuper(币成),开放迈达斯金(TMTG)的充值/提现功能,同步开启T...

    区块链领域
  • 你真的了解小程序的自定义编译功能嘛?

    微信开发者工具最新的版本里面已经校验了app.json里面的重复pages,之前可以直接把你想要的page放在第一行,默认就会先加载这个page,现在只能通过自...

    连胜
  • urllib学习二

    昨天我们看了一下urlib库的get请求功能,今天我们来看一下POST的请求。首先我们需要看一下一个post请求都有哪些内容。

    菜鸟小白的学习分享
  • 理解卷积神经网络中的输入与输出形状 | 视觉入门

    即使我们从理论上理解了卷积神经网络,在实际进行将数据拟合到网络时,很多人仍然对其网络的输入和输出形状(shape)感到困惑。本文章将帮助你理解卷积神经网络的输入...

    磐创AI
  • Flash/Flex学习笔记(44):万有引力与粒子系统

    万有引用公式: ? 其中G为万有引力常数 var numParticles:uint=50;//粒子总数 var G:Number=0.03;//万有引力常数 ...

    菩提树下的杨过
  • 前端基础-JavaScript数据类型转换

    cwl_java
  • 测序成本降低百万倍?数据猿带中科院专家为你大揭秘

    数据猿导读 如果说过去十年互联网的发展是“科技发展的车轮”,那么这十年间基因技术的发展就完全称得上是“科技发展的曲速引擎”。 ? 来源:数据猿 记者:大文 本文...

    数据猿
  • snowflake升级版全局id生成

    1. 背景 分布式系统或者微服务架构基本都采用了分库分表的设计,全局唯一id生成的需求变得很迫切。 传统的单体应用,使用单库,数据库中自增id可以很方便实现。分...

    aoho求索
  • PHP漏洞函数总结

    1.MD5 compare漏洞 PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不...

    企鹅号小编
  • TP5中paginate方法丢失url参数的问题

    一个简单的应用场景。现在需要在后台对用户产品数据进行搜索,可以对产品名称使用模糊检索,也可以使用产品类别进行分类搜索。因为搜索条件是两个表单项,所以简单了区分搜...

    世纪访客

扫码关注云+社区

领取腾讯云代金券