前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5分钟开发一个物联网小程序【IoT迷你赛】

5分钟开发一个物联网小程序【IoT迷你赛】

原创
作者头像
jcdhlzq
修改2020-04-20 12:13:20
2.2K0
修改2020-04-20 12:13:20
举报
文章被收录于专栏:腾讯云IoT腾讯云IoT

前言

说起计算机领域当今科技方向“云大物移智”,听起来非常地高大上。今天小哥就花5分钟带领各位看官感受一下其中的“物联网”。

准备工作

1、手上一套智能楼宇套件

2、登录腾讯云物联网开发平台https://console.cloud.tencent.com/iotexplorer

3、新建一个项目“门窗告警Demo”,点击进入项目,新建产品“demo”,点击demo进入产品开发。

4、配置数据模板如下图所示:

数据模板
数据模板

5、点击下一步,进入设备开发,配置LoRaWAN的网关参数,如下图所示:

网关参数
网关参数

6、编写上行和下行数据解析协议的脚本并提交。

上行协议脚本

代码语言:txt
复制
function RawToProtocol(fPort, bytes) {
    const COMMAND_A1_UNBOUND = 0x02;
    const COMMAND_A1_BOUND = 0x03;
    const COMMAND_07_FLAG_MODE = 0x05;
    const COMMAND_07_LEN_MODE = 1;
    const COMMAND_07_FLAG_VER = 0x90;
    const COMMAND_07_LEN_VER = 3;
    const COMMAND_07_FLAG_DELAY = 0x9c;
    const COMMAND_07_LEN_DELAY = 2;
    const COMMAND_07_FLAG_ULPRD = 0x9d;
    const COMMAND_0f_ALERT_KIND = 0x20;
    const COMMAND_0f_ALERT_OPEN = 2;
    const COMMAND_0f_ALERT_CLOSE = 4;
    
    var data = {
        "method": "report",
        "clientToken" : new Date(),
        "params" : {}
    };
    switch (bytes[0]) {
        case 0xA1:
        if (bytes[1] == COMMAND_A1_UNBOUND) {
            data.params.bound = 0;
        } else if (bytes[1] == COMMAND_A1_BOUND) {
            data.params.bound = 1;
        }
        break;
        case 0x07:
        for (let i = 1; i < bytes.length; i++) {
            if (bytes[i] == COMMAND_07_FLAG_MODE) {
                i += COMMAND_07_LEN_MODE;
            } else if (bytes[i] == COMMAND_07_FLAG_VER) {
                i += COMMAND_07_LEN_VER;
            } else if (bytes[i] == COMMAND_07_FLAG_DELAY) {
                i += COMMAND_07_LEN_DELAY;
            } else if (bytes[i] == COMMAND_07_FLAG_ULPRD) {
                data.params.period = bytes[i+1] | (bytes[i+2] << 8);
            }
        }
        break;
        case 0x00:
        if (bytes[5] & 0x80) {
            data.params.isOpen = 0;
        } else {
            data.params.isOpen = 1;
        }
        break;
        case 0x0f:
        if (bytes[1] == COMMAND_0f_ALERT_KIND) {
            if (bytes[2] == COMMAND_0f_ALERT_OPEN) {
                data.params.isOpen = 1;
            } else if (bytes[2] == COMMAND_0f_ALERT_CLOSE) {
                data.params.isOpen = 0;
            }
        }
        break;
    }
    return data;
}

下行协议脚本

代码语言:txt
复制
function ProtocolToRaw(obj) {
    var data = new Array();
    var i = 0;

    data[i++] = 8;// fport=8
    data[i++] = 1;// confirmed mode
    for (var property in obj.params) {
        if ((property == "bound") && (obj.params[property] == 1)) {
            data[i++] = 0xA1;
            data[i++] = 0x03;
        }
        if (property == "period") {
            data[i++] = 0x9D;
            data[i++] = 0x00;
            data[i++] = obj.params[property] & 0x00FF;
            data[i++] = (obj.params[property] >> 8) & 0x00FF;
        }
    }
    return data;
}

7、提交协议脚本之后,点击导航栏的设备调试,如下图所示

8、点击新建设备,如下图所示,其中DevEUI扫描智慧楼宇套件中的设备后面的二维码获得,AppKey统一为2b7e151628aed2a6abf7158809cf4f3c

9、点击设备进入调试页面,设置bound为1并发送。如下图所示:

绑定设备
绑定设备

10、根据 《门磁传感器RHF1S020DWS规格书》中的操作说明,按照章节 3.8 进入无线固件升级, 将磁铁贴近门磁传感器(CE标志面的对面),红色LED从慢闪逐渐常亮后挪开磁铁, 即可让设备会自动重置复位。触发真正的绑定操作

11、从https://github.com/Tencent/TencentOS-tiny下载示例代码和说明文档。

12、恭喜你,准备工作完成了~

5分钟开发一个门窗告警小程序

TencentOS tiny 提供了两种开发方式:普通开发方式(使用SDK调用腾讯云API)和云开发方式(在云函数中调用腾讯云API),我们采用普通的SDK开发方式。其设计如下图所示:

物联网小程序实现
物联网小程序实现

具体操作如下:

一、打开微信开发者工具,没有安装的看官,请询问度娘。

二、导入项目: TencentOS_tiny\tools\Mini_Program\iotexplorer_mp_demo

注:AppID本地开发可以暂用测试号,或者从小程序管理后台信息中获取。

三、打开app.js,按照注释说明获取其中的productIddeviceNamesecretIdsecretKey的值,这里是小程序和物理设备通信的关键。

配置访问设备的信息
配置访问设备的信息

四、然后就是业务逻辑相关的开发,先看下最终的效果

最终效果
最终效果

其中所有的实现均在pages/index目录下,如下图所示

业务逻辑代码目录
业务逻辑代码目录

五、修改模板页面文件index.wxml,其中设备信息相关无需修改,只需修改表单controlDeviceData中的表单项的样式即可,代码如下:

代码语言:txt
复制
  <form bindsubmit="controlDeviceData">
    <view style="display:flex; flex-direction:row; justify-content: space-between;">
      <view style="font-weight: bold;">
      <!-- 修改标题 -->
        防盗告警 Demo
      </view>
      <view>
        <button type="primary" size="mini" bindtap="queryDeviceData">查询</button>
        <button style="margin-left:20rpx" type="primary" size="mini" form-type="submit">发送</button>
      </view>
    </view>
    <view class="box">
      <view class="cell">
      <!-- 修改说明:绑定状态 -->
        <view>绑定</view>
        <view>
        <!-- 修改变量名称为deviceData.bound.Value -->
          <switch name="bound" checked="{{deviceData.bound.Value}}" />
        </view>
      </view>
      <view class="cell">
      <!-- 修改说明:开关状态 -->
        <view>开关状态</view>
        <view>
        <!-- 修改样式和文本 -->
          <span name="isOpen">{{deviceData.isOpen.Value==1? '开':'关'}}</span>
        </view>
      </view>
      <view class="cell">
      <!-- 修改说明:周期 -->
        <view>周期</view>
        <view>
        <!-- 修改样式和变量 -->
          <input name="period" type="number" confirm-type="done" style="width:60px; border:1px solid lightgray; border-radius:25px" value="{{deviceData.period.Value}}"/>
        </view>
      </view>
    </view>
  </form>

六、修改index.jsqueryDeviceData方法,增加门窗打开时的手机震动提示

代码语言:txt
复制
  queryDeviceData()
  { 
    let that = this
    wx.showLoading()

    // 实例化一个请求对象
    let req = new iotmodel.DescribeDeviceDataRequest();
    req.DeviceName = app.globalData.deviceName;
    req.ProductId = app.globalData.productId;

    // 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
    this.data.client.DescribeDeviceData(req, function (err, response) {
      if (err) {
        console.log("err:", err);
        wx.showToast({
          title: "查询失败 " + err,
          icon: 'none',
          duration: 3000
        })
        return;
      }
      wx.showToast({
        title: "查询成功",
        icon: 'none',
        duration: 1000
      })
      let deviceData = JSON.parse(response.Data)
      that.setData({
        deviceData: deviceData
      })
      console.log(that.data.deviceData);
      // 门窗打开时进行震动提示
      if(that.data.deviceData.isOpen) {
        wx.vibrateLong({
          complete: (res) => {console.log(res)},
        })
      }
    });
  },

七、修改index.jscontrolDeviceData方法,正确读取周期设置

代码语言:txt
复制
  controlDeviceData(e) {
    let that = this
    wx.showLoading()

    let data = e.detail.value
    // 这里不需要了,直接注释掉
    // if (data.period) {
    //   data.period = 1
    // } else {
    //   data. = 0
    // }
    console.log('form data:', e.detail.value)

    // 实例化一个请求对象
    let req = new iotmodel.ControlDeviceDataRequest();
    req.DeviceName = app.globalData.deviceName;
    req.ProductId = app.globalData.productId;
    req.Data = JSON.stringify(data);

    // 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
    this.data.client.ControlDeviceData(req, function (err, response) {
      if (err) {
        console.log(err);
        wx.showToast({
          title: "操作失败 " + err,
          icon: 'none',
          duration: 3000
        })
        return;
      }
      console.log(err)
      wx.showToast({
        title: "操作成功",
        icon: 'none',
        duration: 1000
      })
    });
  },

八、点击开发者工具右上角上传按钮即可上传到微信小程序开发者平台。

九、配置域名。在小程序管理后台进行服务器域名配置:进入微信公众平台小程序后台 - 开发 - 开发设置 - 服务器域名 - 输入域名如下两个域名之一,也可两个都添加。

如果使用物联网开发平台 IoT Explorer,输入域名: iotexplorer.tencentcloudapi.com。 如果使用物联网通信平台 IoT Hub,输入域名:iotcloud.tencentcloudapi.com

十、然后提交审核,审核通过之后即可发布。

各位看官,怎么样,物联网开发起来是不是也没有想象中的那么高大上,那么困难呢。嘻嘻~当然这只是一个简单的demo,如果想要开发更丰富更强大的物联网应用,还是需要费一波功夫的,那就不是5分钟能够解决的问题啦。

本文没有进行过多的复杂的原理和物联网知识的介绍,不过,如果本文能让看官老爷们消除对物联网的gap,有那么一点点喜欢上物联网,想来那也是极好的~

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

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

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

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

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 准备工作
  • 5分钟开发一个门窗告警小程序
相关产品与服务
物联网
腾讯连连是腾讯云物联网全新商业品牌,它涵盖一站式物联网平台 IoT Explorer,连连官方微信小程序和配套的小程序 SDK、插件和开源 App,并整合腾讯云内优势产品能力,如大数据、音视频、AI等。同时,它打通腾讯系 C 端内容资源,如QQ音乐、微信支付、微保、微众银行、医疗健康等生态应用入口。提供覆盖“云-管-边-端”的物联网基础设施,面向“消费物联”和 “产业物联”两大赛道提供全方位的物联网产品和解决方案,助力企业高效实现数字化转型。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档