博客 页面 10

[Arduino物联网开发实战3]语音、定时与设备共享

上一篇:blinker开发实战2-数据反馈

blinker APP提供了语音控制、定时控制、设备分享、房间管理、场景管理、自动化等功能。

对于blinker DIY设备,语音控制和定时控制中可选的动作,都是和设备控制界面上开发者添加的按键相绑定的,不需要添加额外的代码。

语音控制

blinker APP自带的语音控制功能,可以将语音指令绑定到设备控制界面的按键上,设置方法如下:

在编辑模式下,点击按键,进入组件编辑页面,选择 语音设置>添加语音指令 即可添加一条语音指令。
语音指令可对应“on”、“off”、“tap”三种动作。如,选择动作”on”,该按键组件key为“btn-abc”,则触发该语音指令时,APP会向设备发送指令:

{"btn-abc":"on"}

在APP设备列表页,点击右下角的语音按键,即可输入语音指令,语音输入页面如图:

定时控制

blinker设备端SDK已经集成了定时控制功能,用户只需要添加定时组件到设备页面后,点击定时组件即可设置定时任务。
对于DIY设备,定时任务可绑定按键动作,当到了用户设定的时间,设备端即会触发按键对应的动作。
定时操作基本和手机闹钟、倒计时功能一样,这里不做过多描述。

设备共享

blinker设备端SDK集成了用户鉴权功能,搭配blinker APP提供设备共享功能,可以实现多个用户对同一设备的控制。

主用户 共享设备

  1. 在 设备设置页>设备共享 或 用户中心>设备共享>对应设备 可进入 设备共享页
  2. 点击 +添加共享,输入要共享的用户的手机号(用户需已经注册blinker)
  3. 等待用户接受共享

子用户 接受/拒绝 共享

用户中心>设备共享>接受 点击对应设备后的同意/拒绝

主用户 取消共享

  1. 在 设备设置页>设备共享 或 用户中心>设备共享>对应设备 可进入 设备共享页
  2. 点击对应用户的后的取消共享

子用户 取消共享

用户中心>设备共享>接受 点击对应设备后的取消共享

其他说明

  1. 接受的设备不能修改设备相关配置
  2. 设备最多可共享给9位用户使用

下一篇:blinker开发实战4-天猫精灵控制

[Arduino物联网开发实战2]数据反馈

上一篇:blinker开发实战1-控制开关灯

除了控制设备外,blinker还可以接收设备的反馈数据,并显示出来

添加DIY组件

在编辑模式下,点击按键进入编辑组件页面,可以看到 按键类型 有三个选项:普通按键、开关按键、自定义

三种类型区别如下:
普通按键
每次按下发送的指令为  

{"btn-abc":"tap"}

开关按键
按键本身会保存开关状态,默认为off,按下时会发送  

{"btn-abc":"on"}

保存的状态为on时,按下会发送  

{"btn-abc":"off"}

设备端可以发送指令改变当前按键的开关状态  

自定义
可以自定义按下按键发送的指令内容,如

{"btn-abc":"自定义的内容"}

当用户按下按键时,这些指令会发到该设备上,设备上运行的blinker支持库可以解析这些指令,并执行开发者自定义的动作。

以下示例,是使用开关按键控制开关灯,每次开关后,都会返回当前组件的开关状态:

#define BLINKER_WIFI #include <Blinker.h> char auth[] = "Your Device Secret Key";char ssid[] = "Your WiFi network SSID or name";char pswd[] = "Your WiFi network WPA password or WEP key"; // 新建组件对象BlinkerButton Button1("btn-abc"); // 按下按键即会执行该函数void button1_callback(const String & state) {    BLINKER_LOG("get button state: ", state);    if (state=="on") {        digitalWrite(LED_BUILTIN, LOW);        // 反馈开关状态        Button1.print("on");    } else if(state=="off"){        digitalWrite(LED_BUILTIN, HIGH);        // 反馈开关状态        Button1.print("off");    }} void setup() {    // 初始化串口    Serial.begin(115200);    // 初始化有LED的IO    pinMode(LED_BUILTIN, OUTPUT);    digitalWrite(LED_BUILTIN, HIGH);    // 初始化blinker    Blinker.begin(auth, ssid, pswd);    Button1.attach(button1_callback);} void loop() {    Blinker.run();}

心跳包与初始化UI

在blinker app上,点击设备图标进入设备控制页面时,app会向设备发送一个状态查询指令(心跳查询)
此后,WiFi设备,每59秒会返回一次心跳包;Ble设备,每29秒返回一次心跳包
状态查询指令,如下:

{"get":"state"}

默认状态下,WiFi接入设备会返回:

{"state":"online"}

BLE接入设备会返回:

{"state":"connected"}

blinker提供了改写心跳包内容的方法,使用此方法可将一些数据放置在心跳包中返回,该方法可用于数据同步、状态查询。

blinker设备设计原则之一:设备端不主动发送数据,一切反馈都是由客户端(APP)发起。这样设计可以节约服务器资源,避免浪费。

示例程序:

#define BLINKER_WIFI #include <Blinker.h> char auth[] = "Your Device Secret Key";char ssid[] = "Your WiFi network SSID or name";char pswd[] = "Your WiFi network WPA password or WEP key";// 新建组件对象BlinkerButton Button1("btn-abc"); // 按下按键即会执行该函数void button1_callback(const String & state) {    BLINKER_LOG("get button state: ", state);} // 心跳包函数void heartbeat() {    Button1.icon("fas fa-lightbulb");    Button1.color("#fddb00");    Button1.text("关灯","打开啦");    Button1.print("on");} void setup() {    // 初始化串口    Serial.begin(115200);    // 初始化有LED的IO    pinMode(LED_BUILTIN, OUTPUT);    digitalWrite(LED_BUILTIN, HIGH);    // 初始化blinker    Blinker.begin(auth, ssid, pswd);    Button1.attach(button1_callback);    //注册一个心跳包    Blinker.attachHeartbeat(heartbeat);} void loop() {    Blinker.run();}

使用以上示例,可在进入设备控制页面后,初始化界面上的UI。  其中:

    Button1.icon("fas fa-lightbulb");    Button1.color("#fddb00");    Button1.text("关灯","打开啦");

都是对Button1组件进行相关设置,当用户调用Button1.print(“on”);这些设置才会一并发送,APP收到这些数据,即会改变组件上显示的内容。

图标库使用方法

在图标库 (https://fontawesome.com) 中找到要使用的图标,点击进入该图标页面,可以看到其html调用形式,如

<i class="far fa-lightbulb"></i>

其中class内容即是我们设备端程序需要的参数。
arduino程序中调用方法如下:

Button1.icon("far fa-lightbulb");

数据同步

本示例可以将设备端采集的温湿度数据,通过心跳包同步数据的方式,显示到APP上。
通过界面编辑功能,添加两个数据组件,将数据键值分别设为humi和temp,两个组件分别对应温湿度数据。 如图:

可以添加一个调试组件,用以观察APP收到的数据,方便调试程序。

本示例中使用的DHT11/22温湿度传感器库,可在以下地址下载:
https://www.arduino.cn/thread-81585-1-1.html

#define BLINKER_WIFI
 
#include <Blinker.h>
#include <DHT.h>
 
char auth[] = "Your Device Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";
 
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
 
#define DHTPIN D7
 
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
 
DHT dht(DHTPIN, DHTTYPE);
 
float humi_read = 0, temp_read = 0;
 
void heartbeat()
{
    HUMI.print(humi_read);
    TEMP.print(temp_read);
}
 
void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
 
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);
    dht.begin();
}
 
void loop()
{
    Blinker.run();
 
    float h = dht.readHumidity();
    float t = dht.readTemperature();
 
    if (isnan(h) || isnan(t))
    {
        BLINKER_LOG("Failed to read from DHT sensor!");
    }
    else
    {
        BLINKER_LOG("Humidity: ", h, " %");
        BLINKER_LOG("Temperature: ", t, " *C");
        humi_read = h;
        temp_read = t;
    }
 
    Blinker.delay(2000);
}

需要注意的是:blinker下的所有延时操作,都需要使用Blinker.delay(val);替代,否则会导致设备断开连接。

实际效果如下图:

下一篇:blinker开发实战3-语音/定时/设备共享  

[Arduino物联网开发实战1]控制开关灯

上一篇:blinker开发实战0-开发准备

下面是我们的第一个blinker程序,请不要着急编译上传,因为我们还要对其进行简单的配置。

连接配置

在程序中找到名为auth、ssid和pswd的变量,
auth中填入在app中获取到的Secret Key,
ssid和pswd中填入你要连接的WiFi名和密码,如:

char auth[] = "abcdefghijkl"; //上一步中在app中获取到的Secret Keychar ssid[] = "blinkerssid"; //你的WiFi热点名称char pswd[] = "123456789"; //你的WiFi密码

然后编译并上传以下程序:  

#define BLINKER_WIFI #include <Blinker.h> char auth[] = "Your Device Secret Key";char ssid[] = "Your WiFi network SSID or name";char pswd[] = "Your WiFi network WPA password or WEP key"; // 新建组件对象BlinkerButton Button1("btn-abc"); // 按下按键即会执行该函数void button1_callback(const String & state) {    BLINKER_LOG("get button state: ", state);    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));    Blinker.vibrate();} void setup() {    // 初始化串口,并开启调试信息    Serial.begin(115200);        BLINKER_DEBUG.stream(Serial);    // 初始化有LED的IO    pinMode(LED_BUILTIN, OUTPUT);    digitalWrite(LED_BUILTIN, HIGH);    // 初始化blinker    Blinker.begin(auth, ssid, pswd);    Button1.attach(button1_callback);} void loop() {    Blinker.run();}

在APP中点击设备图标,即可进入该设备控制界面,点击按钮就可以控制Arduino上的LED灯开关。

程序解析

以下对blinker设备程序解析:

选择连接方式

blinker支持多种连接方式,

#define BLINKER_WIFI

用于指定设备接入方式,你还可以使用 BLINKER_BLE,不同的接入方式对应的Blinker初始化函数也不同:

蓝牙接入

#define BLINKER_BLE  #include <Blinker.h>   void setup() {      Blinker.begin();  }

WiFi接入

#define BLINKER_WIFI  #include <Blinker.h>   void setup() {      Blinker.begin(auth, ssid, pswd);  }

新建组件并绑定回调函数

新建组件
blinker app上每个UI组件在设备端都可以创建一个对应的对象。创建方式如下:

组件类型  对象名(键名)

app中组件对应的键名可以在界面编辑模式下看到。
使用组件的数据键名创建对应的对象,这个对象就与blinker app界面上的UI组件进行了绑定。
blinker库定义了多种组件类型,对应app上UI组件类型,如
BlinkerSlider  滑块组件
BlinkerRGB   颜色拾取组件
BlinkerNumber  数值组件
BlinkerText   文本组件
如下,创建了按键组件和数值组件对应的对象:

BlinkerButton Button1("btn-abc");BlinkerNumber Number1("num-abc");

回调函数

void button1_callback(const String & state) {    BLINKER_LOG("get button state: ", state);    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));}

绑定回调函数

Button1.attach(button1_callback);

当app中组件触发并发送到设备端时将触发该组件注册的回调函数

Blinker运行时

void loop() {    Blinker.run();}

Blinker.run()语句负责处理Blinker收到的数据,每次运行都会将设备收到的数据进行一次解析。
在使用WiFi接入时,该语句也负责保持网络连接

开启调试信息

你可以在setup中添加以下语句,以查看调试信息

BLINKER_DEBUG.stream(Serial);

用于指定调试信息输出的串口,设备开发时调试使用,项目或产品成型后,可以删除。

如果需要查看更多内部信息,可以添加

BLINKER_DEBUG.debugAll();

下一篇:blinker开发实战2-数据反馈

[Arduino物联网开发实战0]开发准备

郑重提示:物联网开发,需要你有较好的编程基础,如果你没有编程基础或Arduino开发基础,请不要购买下面推荐的硬件,不要阅读本教程,甚至不要用blinker。

在进行物联网项目开发前,需要做好以下准备:

硬件准备

esp8266 / esp32开发板
LED、WS28b20、DHT11/22温湿度传感器、电阻等

推荐开发板:
WiFiduino
nodeMcu
espduino  


软件准备

1.安装Arduino IDE 和 esp8266/esp32扩展包

Arduino IDE默认没有集成esp8266/esp32扩展包,因此需要单独安装。
esp8266/esp32扩展包可以通过Arduino IDE中开发板管理器安装,也可以使用离线安装包。
安装esp8266/esp32扩展包后,即可在Arduino IDE菜单>工具>开发板中选择对应的开发板。

Arduino IDE下载 需要1.8.x或以上版本
esp8266扩展 需要2.5.0版本
esp32扩展

2.安装blinker arduino支持库

Windows:将下载好的blinker库解压到 我的电脑>文档>Arduino>libraries 文件夹中
Mac OS:将下载好的blinker库解压到 文稿>Arduino>libraries 文件夹中

arduino支持库下载

3.手机安装blinker app

android版可通过blinker官网下载,IOS版本可通过app store下载

最新版blinker app通过github和QQ群(301438087)发布

添加设备

每一个设备在blinker上都有一个唯一的密钥,blinker设备会使用该密钥认证设备身份,从而使用blinker云平台上的相关服务。
进入blinker App,点击“添加设备”,进行设备添加。
选择Arduino,再选择WiFi接入,即可获取一个唯一的密钥。暂存这个密钥,此后程序中会使用到它。

载入示例

返回设备列表页,会看到已经添加的设备,点击设备图标,可进入设备控制面板。
首次进入设备控制面板,会弹出向导页。在向导页点击 载入示例,即可载入示例界面。
点击右上角编辑图标,可以进入编辑模式,对界面进行修改。

现在我们可以开始blinker设备端开发了!

点击开始我们的第一个blinker程序

ionic打开第三方应用

检测应用是否安装

https://ionicframework.com/docs/native/app-availability/
https://github.com/ohh2ahh/AppAvailability

打开应用

https://ionicframework.com/docs/native/in-app-browser/
https://github.com/apache/cordova-plugin-inappbrowser

ionic使用sliders做滑动切换tab效果

看群里发的,记录下
https://blog.csdn.net/malonely/article/details/52512827?tdsourcetag=s_pctim_aiomsg

https://my.oschina.net/u/2949632/blog/1475364?tdsourcetag=s_pctim_aiomsg

ionic编译提示error: resource android:attr/fontVariationSettings not found.

估计是gradle或者sdk版本太高造成的
解决办法:
安装插件cordova-android-support-gradle-release
https://github.com/dpa99c/cordova-android-support-gradle-release

ionic/cordova打开apk文件提示exposed beyond app through Intent.getData()

解决办法:
最简单的解决办法就是把arduino SDK版本降到23,但也可能造成其他问题

其他解决办法:

https://github.com/Smile-SA/cordova-plugin-fileopener/issues/15

https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en

https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed

ionic应用全屏/状态栏透明等操作

华为手机适配:
直接在入口文件MainActivity.java中添加:

import android.graphics.Color;
import android.view.View;
import android.view.Window;
import android.os.Build;


      if (Build.VERSION.SDK_INT >= 21) {
        final Window window = getWindow();
        window.getDecorView().setSystemUiVisibility(
          View.SYSTEM_UI_FLAG_LAYOUT_STABLE
          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        window.setStatusBarColor(Color.TRANSPARENT);
      }

关于隐藏状态栏、导航栏:
https://blog.csdn.net/QQxiaoqiang1573/article/details/79867127

留海屏适配(android 9.0之后google官方支持)
https://developer.huawei.com/consumer/cn/devservice/doc/50114

Android SDK目录及版本号区别

https://blog.csdn.net/aiynmimi/article/details/51028499