博客 页面 9

ionic4子页面隐藏tabs

在ionic3中,可以通过设置tabsHideOnSubPages: true,实现子页面隐藏tabs。
ionic4中没有提供这个配置,这里提供一个解决办法:
通过监听路由,判断当前页面层级,从而实现隐藏tabs。

tabs.page.ts

import { Component } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';


@Component({
  selector: 'app-tabs',
  templateUrl: 'tabs.page.html',
  styleUrls: ['tabs.page.scss']
})
export class TabsPage {

  isSubPage = false;

  constructor(
    private router: Router
  ) {
    this.router.events.pipe(
      filter(e => e instanceof NavigationEnd))
      .subscribe((e: any) => {
        console.log(e.url.split('/').length)
        this.isSubPage = e.url.split('/').length > 3 ? true : false;
      })
  }

}

 

tabs.scss

.hide {
    display: none;
}

tabs.page.html

<ion-tabs>
  <ion-tab-bar slot="bottom" [ngClass]="{'hide': isSubPage}">

  </ion-tab-bar>
</ion-tabs>

可以更具实际情况,修改isSubPage判断条件。
还可以有其他实现方法,但只有这样写修改能只控制在tabs页面。
如果有更优的解决办法,请通过评论告知我。

图形化编程

https://github.com/retejs/rete

关于arduino是不是玩具的讨论

之前写过一篇,说明这个问题:
关于使用Arduino做开发的二三理解-Arduino中文社区 – Powered by Discuz!

这里再做些补充,讨论这事的前置条件:

我们是在讨论arduino的软件还是硬件部分?

arduino硬件部分,只是一个最小系统,是用作评估,或者搭建原型用的,如果你把他当作是玩具,也是没问题的。几乎所有的单片机开发板,你都可以把他当作是“玩具”,因为从硬件构成上讲,和arduino开发板没有区别。通常实际量产的产品,都是要重新画pcb的,肯定是还有很多外围电路。
arduino软件部分,本质是一个C++编程框架,因为现在已经是一个事实标准,所以github已经将其列为了一门语言。讨论这部分是不是玩具,是可以的。

现在可以开始我们的讨论了,我们先看看这个观点,看是谁提出的,然后猜测一下他们为什么这样说:

1.软件工程师

如果是个软件工程师,通常他对硬件开发一知半解;初学者可能还没分清arduino和单片机的关系。再次重申,Arduino是一个C++单片机编程框架,你可以用他开发多种 系列/型号 的单片机,常见的如:AVR\STM32\MSP430\ESP8266。
由于对硬件本质的不了解,或者较少的硬件开发经验,软件工程师对框架中的近似黑箱的运作没有把握。对于这种不确定,软件工程师说,”这是个玩具”,也是情有可原。但请注意,经过10多年的发展,现在的arduino已经是一个成熟的框架,bug已经很少了,软件稳定性已经很高。相信没有人敢说,自己写了一两个月的程序,比一群人精心维护了10年的程序好。

2.硬件工程师

程序仅仅是硬件开发过程中的一部分,电子电路更为重要,或者说更为玄学。对于一个有经验的程序猿来说,在开发工具的帮助下,软件bug太好定位了。但对于电路上的bug,往往都要经过分析测试,才能确定并修正,而且其过程会消耗更多的时间。而要让一个硬件更为稳定,是需要极其丰富的软硬件开发经验的。通常做软件的人都不具备这样的想法和素质,因为对软件bug来说,就是发布一个补丁或者升级包的事,而对硬件开发来说,可能是数万甚至数百万的损失。
硬件工程师,站在鄙视链高点,俯视着使用arduino轻松实现功能的用户:“这只是个玩具”。这么想来,也是没毛病的,因为大多数用户,仅仅停留在”实现功能”,确实只是到玩具级别。但这些所谓的“玩具项目”,如果用STM32或者其他单片机厂家API开发,仍然会是个“玩具项目”,因为目标仍然是”实现功能”,开发者仍然是那个开发者。一个项目或者作品是否只是”玩具“,看的其实的是 开发者能力 和 项目目标 ,和是否用arduino本身无关。

3.杠精

杠精最喜欢的方式,就是关公战秦琼,举例说明下:
“这个汽车太垃圾啊,防弹性能肯定不如坦克”
“这个洗碗液太垃圾啦,清洁能力完全不如漂白液”
“arduino太辣鸡啦,性能完全不如树莓派”

以上回答是从arduino本身来解释“玩具”这个误解的。

这里再从其他方便补充下可能照成这种“误解”的原因。

1.arduino的发展

arduino设计之初是给非专业人士使用的,国外国内都是如此,2007年时,国内最早使用arduino的一批人,是艺术院校师生。大家都是自学编程,毫无章法,目的就是实现需求,程序上肯定是没有专业程序猿写的流畅。这批使用者可能造成了错误的既有印象。

2.硬件行业的发展

arduino,或者说各种嵌入式开发框架,在某种程度上,是硬件性能过剩的产物。诚然使用arduino会消耗更多的ram和flash,但对于大部分项目需求,单片机的性能都是有盈余的。对于非大批量生产的设备,节约开发成本和时间比节省几毛钱的硬件更重要。

有时候,我也不明白,9012了,咋还有人想不通呢?

Arduino物联网开发实例教程

blinker具备哪些优势

1. 支持多种连接方式
blinker提供当前最流行的连接方式支持,如蓝牙、WiFi、NBiot/GPRS,可以应对大多数物联网场景需求。
2. 支持多种开发平台
blinker提供Arduino、freeRTOS支持库,可以使用AVR / ARM / ESP8266 / ESP32等芯片进行开发。
对于linux设备,可以使用blinker python模块进行开发。
同时也提供了esp8266支持固件,设备只需要连接一个烧写了blinker固件的WiFi模块,即可接入。
2. 提供丰富的附加功能
通信是blinker方案的核心,此外blinker也提供了多种附加功能,如:
定时控制、自动化控制、场景控制、云存储、固件更新、设备分享、微信通知、消息推送、短信报警、语音控制、智能音响接入等。这些功能都是物联网设备常见功能,现在不需要复杂的代码,你就可以轻松使用这些功能。

blinker DIY

blinker DIY是blinker团队针对diy爱好者、个人开发者推出的项目原型快速开发方案。
通常物联网项目开发,需要进行 设备端、客户端、服务器端开发,每一部分开发,都需要投入人力财力。对个人开发者,通常不可能一人完成这三部分的开发。blinker提供了手机APP到设备端的控制方案,有多种设备端SDK支持,让开发者更好的聚焦于设备端。配合由blinker团队运维的客户端(blinker APP)、服务器端,可以快速打造出自己的物联网设备。

实例教程

ESP8266/ESP32教程

本章将使用blinker DIY结合ESP8266开发板,实现手机对Arduino的控制。
0.开发准备
1.基本控制
2.数据反馈
3.语音控制与定时
4.智能音响控制
5.云端历史数据存储与查看

Angular Universal学习

https://angular.cn/guide/universal

docker学习

https://www.itcodemonkey.com/article/12797.html

https://www.itcodemonkey.com/article/12798.html

https://www.bilibili.com/video/av27122140?from=search&seid=10836775311846153819

https://study.163.com/course/introduction/1002892012.htm?from=study

cordova app将webview切换为腾讯X5浏览器内核

参考项目:
https://github.com/jeremyup/cordova-plugin-x5-webview

更换为最新的X5 sdk:
https://github.com/coloz/cordova-plugin-x5-webview2

检测是否切换成功:

console.log(navigator.userAgent);

[Arduino物联网开发实战4]天猫精灵控制1

上一篇:blinker开发实战3-语音、定时与设备共享

blinker支持多种智能音响控制,如天猫精灵、百度小度、小米小爱、京东叮咚等。
这里以天猫精灵控制为例,blinker DIY支持将设备模拟成三种类型的智能家居:插座、灯、传感器。
Blinker支持多种语音助手控制,如天猫精灵、百度小度,本节以天猫精灵控制为例。

天猫精灵基本接入方法

通常语音助手都是对特定的设备类型进行支持,确定设备类型后,才能响应对应的语音指令。使用blinker方案开发设备,也需要先设定设备类型,支持的设备类型如下:

设备类型支持功能blinker宏
传感器可以查询传感器获取到的数据BLINKER_ALIGENIE_SENSOR
开关灯、设置颜色、亮度、色温、模式BLINKER_ALIGENIE_LIGHT
插座开关设备BLINKER_ALIGENIE_OUTLET

如,将设备设定为传感器类型:

#define BLINKER_WIFI#define BLINKER_ALIGENIE_SENSOR

定义类型后,即可使用对象BlinkerAliGenie,进行相关操作。

例如传感器类型的设备,支持状态查询操作,和对UI组件的操作类似,也需要编写并注册回调函数。可使用

BlinkerAliGenie.attachQuery(aligenieQuery)

语句注册一个数据查询回调函数。完成注册操作后,每次天猫精灵收到对应语音指令,即会触发aligenieQuery回调函数。

状态查询回调函数如下:

void aligenieQuery(int32_t queryCode)
{
    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("AliGenie Query All");
            BlinkerAliGenie.temp(temp_read);
            BlinkerAliGenie.humi(humi_read);
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_TEMP_NUMBER :
            BlinkerAliGenie.temp(temp_read);
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_HUMI_NUMBER :
            BlinkerAliGenie.humi(humi_read);
            BlinkerAliGenie.print();
            break;
        default :
            BlinkerAliGenie.temp(20);
            BlinkerAliGenie.humi(20);
            BlinkerAliGenie.print();
            break;
    }
}

每次天猫精灵收到查询指令后,都会转发到设备上,例如当说“查询温度”、“温度多少”,设备对应收到的queryCode为BLINKER_CMD_QUERY_TEMP_NUMBER,可以自定义该指令对应的设备动作。

本示例中,使用

BlinkerAliGenie.temp(temp_read);BlinkerAliGenie.print();

返回当前温度状态。

完整示例如下:

#define BLINKER_WIFI
#define BLINKER_ALIGENIE_SENSOR
 
#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 aligenieQuery(int32_t queryCode)
{
    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("AliGenie Query All");
            BlinkerAliGenie.temp(temp_read);
            BlinkerAliGenie.humi(humi_read);
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_TEMP_NUMBER :
            BlinkerAliGenie.temp(temp_read);
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_HUMI_NUMBER :
            BlinkerAliGenie.humi(humi_read);
            BlinkerAliGenie.print();
            break;
        default :
            BlinkerAliGenie.temp(20);
            BlinkerAliGenie.humi(20);
            BlinkerAliGenie.print();
            break;
    }
}
 
void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
 
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
 
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);
    BlinkerAliGenie.attachQuery(aligenieQuery);
    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);
}

天猫精灵端配置

设备上线后,还需要在天猫精灵App中绑定blinker账号,方法如下:

1.打开天猫精灵App,在下方导航栏,点 我的 > 添加智能设备

2.搜索blinker,并点击要添加的设备类型

3.点击绑定账号

4.使用blinker账号密码登录,并完成绑定

现在,可以对天猫精灵说,“天猫精灵读出传感器数据”或者“天猫精灵,传感器数据是多少”、“天猫精灵查询温湿度数据”等,都可以让天猫精灵播报当前传感器数据。

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

点灯物联网方案

宣传文案:
1.点灯物联方案助力家电产业升级
2.点灯物联方案助力开发者快速开发部署项目
3.

分享一次被老外指责违反 MIT 协议的经历

我的项目:
https://github.com/blinker-iot/blinker-library/

经过如下:
https://github.com/blinker-iot/blinker-library/issues/287

简单说下经过

我们开发了一个名为 blinker 的物联网解决方案,现有的功能类似米家、阿里智能、home assistant。
我们并没有使用这个哥们儿的项目代码。
我们确实借鉴了其使用 C++模板类的方式,去构建了通信类,这在 issues 中一开始也说了。
但我们并不认为这个做法违法了 MIT 协议,项目更不是该项目的衍生版本,哥们一开始就说我们盗窃知识产权,这让我很不爽。

我的处理方式

由于我和同事脾气都不太好,加上这哥们儿居然连 logo 和配置文件也觉得是一样,开始的时候回答简单粗暴了点。
结果,这哥们儿貌似开始在 FB 上声讨我,因为不是英语国家的人,说的可能是俄语啥的,翻译出来也看不太懂。
最后,我们换了一种写法,并添加了感谢信息,自认为算是结束了这个讨论。

总结下经验

  1. 虽然我自以为已经很注意相关协议,在文档和 readme 中都注明了使用到的项目,但还是没料到这种事,国人在国际上名声不太好,老外一开始就会主观的认为你不守规矩,所以大家做开源软件,真是要一开始就把 readme 写得滴水不漏,避免老外指责。

  2. 除了要写 readme,还要及时更新,很多人和我们一样把 github 当仓库用,但缺忽略了 github 也是个公告板,如果用了漏写了什么,可能会遭人诟病。

  3. 之前经常鼓励别人多看开源项目,学习别人好的写法,但现在我认为,如果觉得别人写法好,也不要学习,反而应该竟可能规避。

  4. 学好英语,避免和老外交流出现错误的表达,如果英语不好,直接用中文回复,让老外自己翻译,用了错误的表达,会刺激到老外。

  5. 遵纪守规,尽力维护中国程序猿形象