├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── custom.json ├── docs ├── 000-首页.md ├── 001-快速开始 │ ├── 01-esp32-WiFi接入.md │ ├── 02-esp8266-WiFi接入.md │ ├── 03-esp32-蓝牙接入.md │ ├── 04-arduino-蓝牙接入.md │ ├── 09-Linux-Windows-MacOS接入.md │ ├── 10-esp8266模块-WiFi接入.md │ ├── 11-GPRS模块接入.md │ ├── 12-NBIoT模块接入.md │ ├── 14-freeRTOS接入.md │ ├── 15-蓝牙BLE接入.md │ └── 19-其他设备接入.md ├── 002-开发入门 │ ├── 000-基础知识.md │ ├── 001-添加设备.md │ ├── 002-Arduino开发入门.md │ ├── 004-Python开发入门.md │ └── 006-Nodejs开发入门.md ├── 003-设备端开发与SDK │ ├── 01-设备端支持情况.md │ ├── 02-Arduino支持.md │ ├── 02-Arduino支持next.md │ ├── 03-freeRTOS支持.md │ ├── 04-Python支持.md │ ├── 06-ESP_AT模块支持.md │ ├── 07-Nordic_nRF52支持.md │ ├── 08-NodeJs支持.md │ └── 99-microPython支持.md ├── 005-功能 │ ├── 00-App功能.md │ ├── 01-添加设备.md │ ├── 02-自定义布局.md │ ├── 03-设备控制.md │ ├── 04-语音控制.md │ ├── 05-场景控制.md │ ├── 06-定时任务.md │ ├── 07-设备分类.md │ ├── 08-设备设置.md │ ├── 09-设备共享.md │ ├── 10-数据聚合.md │ ├── 11-智动化.md │ ├── 16-动作指令与触发器配置.md │ ├── 17-通信指令.md │ ├── 18-历史数据.md │ ├── 19-实时数据.md │ ├── 20-配网工具.md │ ├── 21-图标库.md │ ├── 80-调试工具.md │ └── 99-登录-注册-找回密码.md ├── 007-语音助手接入 │ ├── 00-接入说明.md │ ├── 01-天猫精灵.md │ ├── 02-百度小度.md │ ├── 03-小米小爱.md │ └── 99-接口说明.md ├── 009-专属设备开发 │ ├── 00-开发说明.md │ ├── 01-设备端开发.md │ ├── 03-专属设备模板.md │ ├── 06-OTA&固件管理.md │ ├── 07-配网模式.md │ ├── 08-授权与额度.md │ ├── 09-Customizer定制设备界面.md │ ├── 11-Arduino支持.md │ └── 12-freeRTOS支持.md ├── 019-管理台 │ ├── 001-管理台.md │ ├── 002-产品开发.md │ ├── 003-固件管理.md │ ├── 004-密钥管理.md │ ├── 004-消息推送.md │ ├── 005-云日志.md │ ├── 098-运营功能.md │ └── 099-管理台设置.md ├── 020-相关接口 │ ├── 001-设备上线与通信(MQTT).md │ ├── 002-设备上线与通信(HTTP).md │ ├── 003-设备管理.md │ ├── 004-气象数据接口.md │ ├── 005-通知接口.md │ ├── 006-地理信息接口.md │ ├── 009-数据接口(数值时序).md │ ├── 010-数据接口(文本时序).md │ ├── 011-数据接口(设备影子).md │ ├── 012-数据接口(地理信息).md │ └── 099-App接口.md ├── 021-白皮书 │ ├── 001-概述.md │ ├── 002-配网与设备注册.md │ ├── 003-App端.md │ ├── 004-服务器端.md │ └── 005-固件升级.md ├── 070-独立部署与使用 │ ├── 002-商业版安装部署.md │ ├── 003-独立部署SDK配置.md │ └── 004-独立部署APP配置.md ├── 098-开发常见问题 │ ├── 01-错误码.md │ ├── 02-开发注意事项.md │ ├── 03-常见问题.md │ └── 20-提问指南.md ├── 099-服务与授权 │ ├── 00-服务类型.md │ ├── 01-产品化服务.md │ ├── 02-商业授权.md │ ├── 03-教育支持.md │ ├── 04-开发者协议.md │ ├── 05-用户协议.md │ ├── 06-隐私协议.md │ └── 08-App打包上架服务.md ├── 100-其他 │ ├── 01-App下载.md │ ├── 02-SDK下载.md │ └── 09-独立app开发.md ├── config.json └── img │ ├── 000 │ ├── blinker-all.jpg │ └── frame.png │ ├── 001 │ └── import-lib.png │ ├── 002 │ ├── 03-1525839812000.png │ ├── 04-1526172838000.png │ └── 04-1526173011000.png │ ├── 003 │ └── esp_at.png │ ├── 004 │ ├── 01-1524476759000.gif │ ├── 04-1555223133000.png │ └── 05-1527436400000.png │ ├── 005 │ ├── 01-1.jpg │ ├── 02-1.jpg │ ├── 06-1534411527000.png │ ├── 08-1543240765000.png │ └── device-block.jpg │ ├── 007 │ └── ad.jpg │ ├── 008 │ └── 04-1529168292000.gif │ └── 099 │ └── dongbo.png ├── package-lock.json ├── package.json ├── process.js └── readme.md /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: CI&CD 2 | 3 | on: 4 | push: 5 | branches: 6 | - deploy 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Use Node.js 16.x 16 | uses: actions/setup-node@v1 17 | with: 18 | node-version: '16.x' 19 | 20 | - name: Dependent environment 21 | run: | 22 | npm i 23 | node process.js 24 | 25 | - name: Deploy 26 | uses: garygrossgarten/github-action-scp@v0.5.3 27 | with: 28 | local: docs 29 | remote: /home/ubuntu/www/diandeng.tech/docs 30 | host: ${{ secrets.HOST }} 31 | username: ubuntu 32 | privateKey: ${{ secrets.PRIVATEKEY }} 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/c_cpp_properties.json 2 | .vscode/arduino.json 3 | .vscode/launch.json 4 | node_modules 5 | 6 | -------------------------------------------------------------------------------- /custom.json: -------------------------------------------------------------------------------- 1 | { 2 | "首页":"home", 3 | "arduino-蓝牙接入":"getting-start-ble", 4 | "esp8266-WiFi接入":"getting-start-8266", 5 | "esp32-蓝牙接入":"getting-start-esp32-ble", 6 | "esp32-WiFi接入":"getting-start-esp32-wifi", 7 | "树莓派-蓝牙接入":"getting-start-rpi-ble", 8 | "树莓派-WiFi接入":"getting-start-rpi-wifi", 9 | "esp8266模块-WiFi接入":"getting-start-wifi-at", 10 | "GPRS模块接入":"getting-start-gprs", 11 | "NBIoT模块接入":"getting-start-nbiot", 12 | "MicroPython设备接入":"getting-start-mpy", 13 | "基础知识":"base", 14 | "添加设备":"add-device", 15 | "Arduino开发入门":"getting-start-arduino", 16 | "Arduino实例教程":"arduino-course", 17 | "Python开发入门":"getting-start-python", 18 | "Arduino支持":"arduino-support", 19 | "Python支持":"python-support", 20 | "microPython支持":"mpy-support", 21 | "ESP_AT模块支持":"at-mode-support", 22 | "通信指令":"cmd", 23 | "接入其他设备":"more-support", 24 | "开发工具":"dev-tool", 25 | "界面布局器":"layouter", 26 | "时间获取":"date", 27 | "通知功能":"notice", 28 | "气象数据获取":"weather", 29 | "云存储":"cloud-storage", 30 | "固件更新":"device-ota", 31 | "自动化":"auto", 32 | "设备共享":"share", 33 | "边缘计算":"edge-computing", 34 | "自定义布局":"layouter-2", 35 | "设备控制":"app-device", 36 | "语音控制":"app-speech", 37 | "场景控制":"app-scene", 38 | "定时任务":"app-timer", 39 | "设备分类":"app-room", 40 | "设备设置":"app-device-manager", 41 | "数据聚合":"app-data-block", 42 | "App设置":"app-settings", 43 | "登录-注册-找回密码":"auth", 44 | "小程序支持":"wechat-app", 45 | "接入说明":"voice-assistant", 46 | "天猫精灵":"tmallgenie", 47 | "小米小爱":"xiaoai", 48 | "蓝牙氛围灯":"", 49 | "远程报警装置":"", 50 | "远程环境检测仪":"", 51 | "语音控制灯":"", 52 | "开发说明":"prodevice", 53 | "设备端开发":"device-dev", 54 | "专属设备模板":"prodevice-template", 55 | "保留关键字":"keyword", 56 | "设备类型":"device-type", 57 | "独立设备":"single-device", 58 | "网关设备":"getway-device", 59 | "子设备":"sub-device", 60 | "管理台":"admin", 61 | "Q&A":"qa", 62 | "错误码":"error-code", 63 | "开发注意事项":"matters-need", 64 | "常见问题":"faq", 65 | "产品化服务":"production", 66 | "商业授权":"business", 67 | "教育支持":"edu", 68 | "语音与定时控制":"prodevice-speech-timer", 69 | "OTA&固件管理":"ota", 70 | "App下载":"app-download", 71 | "SDK下载":"sdk-download", 72 | "提问指南":"help", 73 | "freeRTOS接入":"getting-start-freertos", 74 | "其他设备接入":"getting-start-others", 75 | "freeRTOS支持":"freertos-support", 76 | "App功能":"app", 77 | "数据接口":"storage-api", 78 | "蓝牙BLE接入":"getting-start-bluetooth", 79 | "配网模式":"config-mode", 80 | "固件管理":"firmware-manager", 81 | "消息管理":"message-manager", 82 | "授权与额度":"price", 83 | "消息推送":"push", 84 | "管理台设置":"admin-settings", 85 | "动作指令与触发器配置":"actions-and-triggers", 86 | "产品开发":"product-development", 87 | "智动化":"auto", 88 | "百度小度":"dueros", 89 | "Customizer定制设备界面":"customizer", 90 | "Nordic_nRF52支持":"nordic-support", 91 | "服务类型":"service", 92 | "设备上线与通信":"device-online-communication", 93 | "开发者协议":"developer-agreement", 94 | "用户协议":"user-agreement", 95 | "隐私协议":"privacy-agreement", 96 | "气象数据接口":"weather-and-air", 97 | "图标库":"icon", 98 | "温湿度计":"temperature-and-humidity-sensor", 99 | "通知接口":"api-notice", 100 | "图像识别接口":"api-image-recognition", 101 | "地理信息接口":"api-gis", 102 | "支持多语音助手的氛围灯":"", 103 | "设备管理":"api-device-manager", 104 | "设备上线与通信(MQTT)":"api-mqtt", 105 | "设备上线与通信(HTTP)":"api-http", 106 | "数据接口(数值时序)":"api-storage-ts-num", 107 | "数据接口(文本时序)":"api-storage-ts-text", 108 | "数据接口(设备影子)":"api-storage-shadow", 109 | "数据接口(地理信息)":"api-storage-gis", 110 | "语音接口":"api-voice", 111 | "Nodejs开发入门":"getting-start-nodejs", 112 | "概述":"white-paper", 113 | "配网与设备注册":"network-config", 114 | "设备端支持情况":"device-support", 115 | "云日志":"cloud-log", 116 | "Linux-Windows-MacOS接入":"getting-start-os", 117 | "App端":"white-paper-app", 118 | "服务器端":"white-paper-server", 119 | "App打包上架服务":"app-release", 120 | "独立app开发":"app-dev", 121 | "NodeJs支持":"javascript-support", 122 | "配网工具":"config-tool", 123 | "调试工具":"debug-tool", 124 | "社区版安装部署":"deploy", 125 | "商业版安装部署":"biz-deploy", 126 | "独立部署SDK配置":"biz-sdk-config", 127 | "独立部署APP配置":"biz-app-config", 128 | "历史数据":"history", 129 | "实时数据":"realtime", 130 | "密钥管理":"secret-key", 131 | "运营功能":"dashboard-operation", 132 | "固件升级":"dashboard-ota", 133 | "Arduino支持next":"arduino-support-next" 134 | } -------------------------------------------------------------------------------- /docs/000-首页.md: -------------------------------------------------------------------------------- 1 | # 点灯开发文档 2 | 3 | 点灯是一套专业且易用物联网解决方案,提供了服务器、应用、设备端sdk支持。 4 | 基于高性能异步框架开发的服务器端可以承载大量设备连接,让设备所有者方便的进行设备管理;简单便捷的应用配合多设备支持的sdk,可以让开发者在3分钟内实现设备的接入。 5 | 点灯服务有三个版本,社区版开源且免费,让大家可以体验到点灯方案的特点和优势;云服务版提供更多增值服务与功能,且有效降低客户的项目实施成本,让客户更快的进行物联网升级;商业版可进行独立部署,可以满足客户更多样的需求; 6 | 7 | ## 技术支持 8 | [GitHub](https://github.com/blinker-iot/) 9 | [本文档Git](https://github.com/blinker-iot/blinker-doc) 10 | [点灯Arduino入门教程教程](https://arduino.me/s/2) 11 | [常见错误排除](https://arduino.me/s/2?aid=795) 12 | 13 | ## QQ群 14 | blinker用户交流1群 **(已满)** 15 | blinker用户交流2群 **(已满)** 16 | blinker用户交流3群 **1025933679** 17 | blinker技术支持群 **[购买专业版](https://www.diandeng.tech/service)后可见** 18 | 19 | ## 快速开始 20 | blinker支持多种主流通信方式,如:**蓝牙** 、 **WiFi** ,理论上只要是支持蓝牙或者WiFi的设备,都可以使用blinker连接 21 | 22 | 使用WiFi接入,当设备和手机在同一个局域网中,为局域网通信,其余情况,使用MQTT远程通信 23 | 我们提供了对主流硬件平台支持,点击您希望使用的设备和接入方式,即可查看快速接入教程 24 | 25 | - **Arduino** 26 | [arduino-蓝牙接入](/doc/getting-start-ble "arduino-蓝牙接入") 27 | - **esp8266开发板 / WiFiduino / ESPduino** 28 | [esp8266-WiFi接入](/doc/getting-start-8266 "esp8266-WiFi接入") 29 | - **esp32开发板** 30 | [esp32-蓝牙接入](/doc/getting-start-esp32-ble "esp32-蓝牙接入") 31 | [esp32-WiFi接入](/doc/getting-start-esp32-wifi "esp32-WiFi接入") 32 | - **Linux开发板 / 树莓派 / 香蕉派** 33 | [树莓派-WiFi接入(javascript)](/doc/getting-start-os "树莓派-WiFi接入") 34 | - **esp8266模块接入(AT指令)** 35 | [esp8266模块-WiFi接入](/doc/getting-start-wifi-at "esp8266模块-WiFi接入") 36 | - **freeRTOS设备接入** 37 | [freeRTOS设备接入](/doc/getting-start-freertos "freeRTOS接入") 38 | 39 | - **GPRS模块接入(AT指令)** 40 | 见blinker lib例程 41 | - **NB-IoT模块接入(AT指令)** 42 | 见blinker lib例程 43 | 44 | - **Ble Mesh接入** 45 | 支持企业版定制开发 46 | - **WiFi Mesh接入** 47 | 支持企业版定制开发 48 | 49 | ## 使用须知 50 | 1.您使用的是blinker开发者版本,我们会不定期更新支持库、App及服务器端程序,请确认您使用的是最新版本,才能正常使用blinker各功能 51 | 2.我们不对开发者版本做稳定性承诺 52 | 3.有商业使用、或独立部署需求,请购买[企业版](/doc/business) 53 | 本文档适用于最新版blinker,请确保app和设备端sdk都为最新版本 54 | 55 | ### blinker特性 56 | - 其由服务器端、app端、设备端组成,可以部署到几乎所有物联网平台 57 | - app端支持ios、android 58 | - 设备端可以使用蓝牙、WiFi、MQTT等方式接入,支持Arduino、freeRTOS、mbed OS、Linux等开发平台 59 | - 服务器端可以部署到阿里云、腾讯云、OneNET、百度云、AWS、google cloud等平台 60 | - 通过界面布局器,免费版用户可自己拖拽布局设备控制界面,自由打造您的物联网设备 61 | - 通过专属SDK,专业版用户可以使用Blinker开发自己的产品,并用于商业用途 62 | 63 | ![](./img/000/blinker-all.jpg) 64 | 65 | ### blinker应用场景 66 | - 快速开发物联网 / 智能家居 / 无线遥控项目 67 | - 手机 / 语音助手 控制设备 68 | - 蓝牙ble / 局域网WiFi / 远程MQTT 接入设备 69 | - 设备联动交互 70 | - 数据采集分析 / 数据可视化 71 | 72 | ## blinker APP和支持库 73 | blinker库封装了不同硬件平台的底层代码,提供了一套物联网设备开发api。 74 | 开发者不用再考虑网络适配、不用再烦恼硬件差异,只用更好的聚焦业务逻辑,即可进行畅快的物联网开发。 75 | 使用blinker库,无论开发者使用何种硬件、何种开发方式、何种云平台,开发起来都大同小异。 76 | 77 | ### blinker免费版 78 | blinker免费版是面向个人开发者的物联网设备开发方案,提供了最常用和最基础的开发支持,开发者可以使用它轻松快捷的开发物联网设备。 79 | 80 | ### APP下载 81 | [下载](/doc/app-download) 82 | ### SDK下载 83 | [下载](/dev) 84 | 85 | ## FAQ 86 | 1. 什么硬件可以连接blinker? 87 | [硬件支持情况](/doc/device-support "支持的设备") 88 | 89 | 2. 是否可以远程控制设备? 90 | 可以,以MQTT方式接入设备,即可进行远程控制 91 | 92 | 3. blinker商业版和免费版有什么区别? 93 | blinker是一个面向商业用户的解决方案,同时blinker免费版为开发者提供便捷的原型开发能力 94 | blinker商业版功能更多,如语音控制、云存储、数据分析与统计、批量设备配网 等 95 | [更多可见](/doc/service) 96 | -------------------------------------------------------------------------------- /docs/001-快速开始/01-esp32-WiFi接入.md: -------------------------------------------------------------------------------- 1 | # 使用esp32 & WiFi接入 2 | 3 | 使用WiFi接入,当设备和手机在同一个局域网中,为局域网通信 4 | 其余情况,使用MQTT远程通信 5 | 6 | ## 准备工作 7 | 8 | ### 硬件准备 9 | esp32开发板([查看支持的设备](https://diandeng.tech/doc/device-support)) 10 | 11 | ### 软件准备 12 | 13 | #### Arduino IDE需安装好esp32扩展 14 | [Arduino IDE](https://arduino.me/download) 1.8.7或更新版本 15 | 务必使用 **2.0.0** 或以上release版本的 ESP32 Arduino package 16 | [中国大陆安装方法(windows)](https://arduino.me/a/esp32) 17 | [常规安装方法](https://github.com/espressif/arduino-esp32) 18 | 19 | #### 下载并安装blinker APP 20 | **Android下载:** 21 | [点击下载](https://github.com/blinker-iot/app-release/releases) 或 在android应用商店搜索“blinker”下载安装 22 | **IOS下载:** 23 | [点击下载](https://itunes.apple.com/cn/app/id1357907814) 或 在app store中搜索“blinker”下载 24 | 25 | #### 下载并安装blinker Arduino库 26 | 1. [点击下载](https://diandeng.tech/dev) 27 | 2. 通过Arduino IDE **菜单>项目>加载库>添加.ZIP库** 导入到库,如图: 28 | ![](../img/001/import-lib.png) 29 | 30 | 31 | 32 | ## 在app中添加设备,获取Secret Key 33 | 34 | 1. 进入App,点击右上角的“+”号,然后选择 **添加设备** 35 | 2. 点击选择**Arduino > WiFi接入** 36 | 3. 复制申请到的**Secret Key** 37 | 38 | ## DIY界面 39 | 40 | 1. 在设备列表页,点击设备图标,进入设备控制面板 41 | 2. 首次进入设备控制面板,会弹出向导页 42 | 3. 在向导页点击 **载入示例**,即可载入示例组件 43 | 44 | 45 | 46 | ## 编译并上传示例程序 47 | 48 | 打开Arduino IDE,通过 **文件>示例>Blinker>Blinker_Hello/Hello_WiFi** 打开例程 49 | 在程序中找到保存Secret Key、WiFi名称和密码的变量,填入您要连接的WiFi名和密码,如: 50 | 51 | > 注意:esp系列芯片只能连接2.4G WiFi热点 52 | 53 | ``` cpp 54 | char auth[] = "abcdefghijkl"; //上一步中在app中获取到的Secret Key 55 | char ssid[] = "abcdefg"; //您的WiFi热点名称 56 | char pswd[] = "123456789"; //您的WiFi密码 57 | ``` 58 | 59 | **例程中宏LED_BUILTIN为开发板厂家定义的连接板载LED的引脚,如果您选择的开发板没有定义LED_BUILTIN,可以自行修改为您要使用的引脚** 60 | 编译并上传程序到esp32开发板,打开串口调试器 61 | 当看到提示“MQTT Connected!”,说明设备已经成功连接到MQTT服务器 62 | 63 | ## 恭喜!一切就绪 64 | 65 | 在APP中点击刚才您添加的设备,即可进入控制界面,点点按钮就可以控制Arduino上的LED灯开关 66 | 另一个按钮也点下试试,放心,您的手机不会爆炸~ 67 | 68 | ## 进一步使用blinker 69 | 70 | #### 想了解各接入方式的区别? 71 | 看看[添加设备](?file=002-开发入门/001-添加设备 "添加设备") 72 | 73 | #### 想深入理解以上例程? 74 | 75 | 看看[Arduino开发入门](?file=002-开发入门/002-Arduino开发入门 "Arduino开发入门") 76 | 77 | #### 更多实例? 78 | 79 | 看看[Arduino实例教程](https://arduino.me/s/blinker-arduino) 80 | 81 | #### 想制作与众不同的物联网设备? 82 | 83 | 看看[自定义界面](?file=005-App使用/02-自定义布局 "自定义布局") 和 [Arduino 支持库](https://diandeng.tech/doc/arduino-support "Arduino支持") 84 | 85 | ## 完整示例程序 86 | 87 | ``` cpp 88 | 89 | #define BLINKER_PRINT Serial 90 | #define BLINKER_WIFI 91 | 92 | #include 93 | 94 | char auth[] = "Your Device Secret Key"; 95 | char ssid[] = "Your WiFi network SSID or name"; 96 | char pswd[] = "Your WiFi network WPA password or WEP key"; 97 | 98 | // 新建组件对象 99 | BlinkerButton Button1("btn-abc"); 100 | BlinkerNumber Number1("num-abc"); 101 | 102 | int counter = 0; 103 | 104 | // 按下按键即会执行该函数 105 | void button1_callback(const String & state) { 106 | BLINKER_LOG("get button state: ", state); 107 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 108 | } 109 | 110 | // 如果未绑定的组件被触发,则会执行其中内容 111 | void dataRead(const String & data) 112 | { 113 | BLINKER_LOG("Blinker readString: ", data); 114 | counter++; 115 | Number1.print(counter); 116 | } 117 | 118 | void setup() { 119 | // 初始化串口 120 | Serial.begin(115200); 121 | 122 | #if defined(BLINKER_PRINT) 123 | BLINKER_DEBUG.stream(BLINKER_PRINT); 124 | #endif 125 | 126 | // 初始化有LED的IO 127 | pinMode(LED_BUILTIN, OUTPUT); 128 | digitalWrite(LED_BUILTIN, HIGH); 129 | // 初始化blinker 130 | Blinker.begin(auth, ssid, pswd); 131 | Blinker.attachData(dataRead); 132 | Button1.attach(button1_callback); 133 | } 134 | 135 | void loop() { 136 | Blinker.run(); 137 | } 138 | ``` 139 | 140 | ## ESP32注意事项 141 | 当前ESP32系列分四种芯片:ESP32、ESP32C3、ESP32S3、ESP32S2,乐鑫及各模块厂家又封装了多种模块。各芯片、各模块的使用方式、配置均有差异,请参考乐鑫官方文档了解。 142 | 143 | 144 | ## 为什么设备显示不在线? 145 | 146 | 0. blinker App如何判断设备是否在线? 147 | 148 | blinker App在 **App打开时、进入设备页面时、在设备页面中每隔一定时间** 会向设备发送心跳请求,内容为 **{"get":"state"}** 。 149 | 设备收到请求后,会返回 **{"state":"online"}** ,app接收到这个返回,即会显示设备在线。 150 | 151 | 1. 程序没有成功上传到开发板 152 | 153 | 解决办法:重新上传,上传后打开串口监视器,确认程序正确运行 154 | 155 | 2. 程序中没有设置正确的ssid和密码,导致没有连接上网络 156 | 157 | 解决办法:设置后再重新上传程序,上传后打开串口监视器,确认程序正确运行 158 | 159 | 3. 程序错误,导致程序运行不正确 160 | 161 | 解决办法:先使用并理解blinker例程,再自由发挥 162 | 163 | 4. 开发板供电不足 164 | 165 | 解决办法:换电源 或 换USB口 166 | 167 | ## 为什么无法切换到局域网通信? 168 | 169 | 1. 路由器开启了AP隔离功能或禁止了UDP通信,从而阻止了局域网中设备的发现和通信 170 | 171 | 解决办法:关闭路由器AP隔离功能 或 允许UDP通信;如果找不到相关设置,通常可重置路由器解决 172 | 173 | 2. mdns没有及时发现设备 174 | 175 | 解决办法:在首页下拉刷新,可以重新搜索局域网中的设备 176 | 177 | 178 | -------------------------------------------------------------------------------- /docs/001-快速开始/02-esp8266-WiFi接入.md: -------------------------------------------------------------------------------- 1 | # 使用esp8266 & WiFi接入 2 | 3 | > 友情提示:乐鑫正在用esp32C2逐步替代esp8266,不建议大家继续使用esp8266进行产品开发。 4 | > blinker lib 0.3.9开始不再对esp8266做兼容性测试。 5 | 6 | 使用WiFi接入,当设备和手机在同一个局域网中,为局域网通信 7 | 其余情况,使用MQTT远程通信 8 | 9 | ## 准备工作 10 | 11 | ### 硬件准备 12 | esp8266开发板([查看支持的设备](https://diandeng.tech/doc/device-support)) 13 | 14 | ### 软件准备 15 | 16 | #### Arduino IDE需安装好esp8266扩展 17 | [Arduino IDE](https://arduino.me/download) 1.8.7或更新版本 18 | 务必使用 **3.0.0** 或以上release版本的 ESP8266 Arduino package 19 | [中国大陆安装方法(windows)](https://arduino.me/a/esp8266) 20 | [常规安装方法](https://github.com/esp8266/Arduino) 21 | 22 | #### 下载并安装blinker APP 23 | 24 | **Android下载:** 25 | [点击下载](https://github.com/blinker-iot/app-release/releases) 或 在android应用商店搜索“blinker”下载安装 26 | **IOS下载:** 27 | [点击下载](https://itunes.apple.com/cn/app/id1357907814) 或 在app store中搜索“blinker”下载 28 | 29 | #### 下载并安装blinker Arduino库 30 | 1. [点击下载](https://diandeng.tech/dev) 31 | 2. 通过Arduino IDE **菜单>项目>加载库>添加.ZIP库** 导入到库,如图: 32 | ![](../img/001/import-lib.png) 33 | 34 | 35 | ## 在app中添加设备,获取Secret Key 36 | 37 | 1. 进入App,点击右上角的“+”号,然后选择 **添加设备** 38 | 2. 点击选择**Arduino** > **WiFi接入** 39 | 3. 复制申请到的**Secret Key** 40 | 41 | ## DIY界面 42 | 43 | 1. 在设备列表页,点击设备图标,进入设备控制面板 44 | 2. 首次进入设备控制面板,会弹出向导页 45 | 3. 在向导页点击 **载入示例**,即可载入示例组件 46 | 47 | 48 | 49 | ## 编译并上传示例程序 50 | 51 | 打开Arduino IDE,通过 **文件>示例>Blinker>Blinker_Hello/Hello_WiFi** 打开例程 52 | 在程序中找到如下变量,填入您申请到的Secret Key(auth)和要连接的WiFi热点名(ssid)、密码(pswd),如: 53 | 54 | > 注意:esp系列芯片只能连接2.4G WiFi热点 55 | 56 | ``` cpp 57 | char auth[] = "abcdefghijkl"; //上一步中在app中获取到的Secret Key 58 | char ssid[] = "abcdefg"; //您的WiFi热点名称 59 | char pswd[] = "123456789"; //您的WiFi密码 60 | ``` 61 | 62 | **例程中宏LED_BUILTIN为开发板厂家定义的连接板载LED的引脚,如果您选择的开发板没有定义LED_BUILTIN,可以自行修改为您要使用的引脚** 63 | 编译并上传程序到esp8266开发板,打开串口调试器 64 | 当看到提示“MQTT Connected!”,说明设备已经成功连接到MQTT服务器 65 | 66 | ## 恭喜!一切就绪 67 | 68 | 在APP中点击刚才您添加的设备,即可进入控制界面,点点按钮就可以控制Arduino上的LED灯开关 69 | 另一个按钮也点下试试,放心,您的手机不会爆炸~ 70 | 71 | ## 进一步使用blinker 72 | 73 | #### 想了解各接入方式的区别? 74 | 看看[添加设备](?file=002-开发入门/001-添加设备 "添加设备") 75 | 76 | #### 想深入理解以上例程? 77 | 78 | 看看[Arduino开发入门](?file=002-开发入门/002-Arduino开发入门 "Arduino开发入门") 79 | 80 | #### 更多实例? 81 | 82 | 看看[Arduino实例教程](https://arduino.me/s/blinker-arduino) 83 | 84 | #### 想制作与众不同的物联网设备? 85 | 86 | 看看[自定义界面](?file=005-App使用/02-自定义布局 "自定义布局") 和 [Arduino 支持库函数参考](https://diandeng.tech/doc/arduino-support "Arduino支持") 87 | 88 | ## 完整示例程序 89 | 90 | ``` cpp 91 | 92 | #define BLINKER_PRINT Serial 93 | #define BLINKER_WIFI 94 | 95 | #include 96 | 97 | char auth[] = "Your Device Secret Key"; 98 | char ssid[] = "Your WiFi network SSID or name"; 99 | char pswd[] = "Your WiFi network WPA password or WEP key"; 100 | 101 | // 新建组件对象 102 | BlinkerButton Button1("btn-abc"); 103 | BlinkerNumber Number1("num-abc"); 104 | 105 | int counter = 0; 106 | 107 | // 按下按键即会执行该函数 108 | void button1_callback(const String & state) { 109 | BLINKER_LOG("get button state: ", state); 110 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 111 | } 112 | 113 | // 如果未绑定的组件被触发,则会执行其中内容 114 | void dataRead(const String & data) 115 | { 116 | BLINKER_LOG("Blinker readString: ", data); 117 | counter++; 118 | Number1.print(counter); 119 | } 120 | 121 | void setup() { 122 | // 初始化串口 123 | Serial.begin(115200); 124 | 125 | #if defined(BLINKER_PRINT) 126 | BLINKER_DEBUG.stream(BLINKER_PRINT); 127 | #endif 128 | 129 | // 初始化有LED的IO 130 | pinMode(LED_BUILTIN, OUTPUT); 131 | digitalWrite(LED_BUILTIN, HIGH); 132 | // 初始化blinker 133 | Blinker.begin(auth, ssid, pswd); 134 | Blinker.attachData(dataRead); 135 | Button1.attach(button1_callback); 136 | } 137 | 138 | void loop() { 139 | Blinker.run(); 140 | } 141 | ``` 142 | 143 | 由于esp8266资源有限,通信加密会消耗大量的RAM,blinker默认使用非加密方式进行远程通信,如果您对通信安全性有要求,可以添加宏`BLINKER_WITH_SSL`启用esp8266加密通信。 144 | ```cpp 145 | #define BLINKER_WIFI 146 | #define BLINKER_WITH_SSL 147 | #include 148 | 149 | void setup() { 150 | Blinker.begin(auth, ssid, pswd); 151 | } 152 | ``` 153 | 154 | > **BLINKER_WITH_SSL**目前仅可用于ESP8266,其他设备的RAM足以进行加密通信,默认使用加密通信。 155 | 156 | 157 | ## 为什么设备显示不在线? 158 | 159 | 0. blinker App如何判断设备是否在线? 160 | 161 | blinker App在 **App打开时、进入设备页面时、在设备页面中每隔一定时间** 会向设备发送心跳请求,内容为 **{"get":"state"}** 。 162 | 设备收到请求后,会返回 **{"state":"online"}** ,app接收到这个返回,即会显示设备在线。 163 | 164 | 1. 程序没有成功上传到开发板 165 | 166 | 解决办法:重新上传,上传后打开串口监视器,确认程序正确运行 167 | 168 | 2. 程序中没有设置正确的ssid和密码,导致没有连接上网络 169 | 170 | 解决办法:设置后再重新上传程序,上传后打开串口监视器,确认程序正确运行 171 | 172 | 3. 程序错误,导致程序运行不正确 173 | 174 | 解决办法:先使用并理解blinker例程,再自由发挥 175 | 176 | 4. 开发板供电不足 177 | 178 | 解决办法:换电源 或 换USB口 179 | 180 | ## 为什么无法切换到局域网通信? 181 | 182 | 1. 路由器开启了AP隔离功能或禁止了UDP通信,从而阻止了局域网中设备的发现和通信 183 | 184 | 解决办法:关闭路由器AP隔离功能 或 允许UDP通信;如果找不到相关设置,通常可重置路由器解决 185 | 186 | 2. mdns没有及时发现设备 187 | 188 | 解决办法:在首页下拉刷新,可以重新搜索局域网中的设备 189 | 190 | ## 其他 191 | 192 | [esp8266 Arduino SDK文档](https://arduino-esp8266.readthedocs.io/en/latest/) 193 | 194 | 195 | -------------------------------------------------------------------------------- /docs/001-快速开始/03-esp32-蓝牙接入.md: -------------------------------------------------------------------------------- 1 | # 使用esp32 & 蓝牙接入 2 | esp32蓝牙接入,会将esp32作为一个BLE外围设备与手机建立连接 3 | 4 | ## 准备工作 5 | ### 硬件准备 6 | esp32开发板([查看支持的设备](https://diandeng.tech/doc/device-support)) 7 | 8 | ### 软件准备 9 | #### Arduino IDE需安装好esp32扩展 10 | [Arduino IDE](https://arduino.me/download) 1.8.7或更新版本 11 | 务必使用 **2.0.0** 或以上release版本的 ESP32 Arduino package 12 | [中国大陆安装方法(windows)](https://arduino.me/a/esp32) 13 | [常规安装方法](https://github.com/espressif/arduino-esp32) 14 | 15 | #### 下载并安装blinker APP 16 | **Android下载:** 17 | [点击下载](https://github.com/blinker-iot/app-release/releases) 或 在android应用商店搜索“blinker”下载安装 18 | **IOS下载:** 19 | [点击下载](https://itunes.apple.com/cn/app/id1357907814) 或 在app store中搜索“blinker”下载 20 | 21 | #### 下载并安装blinker Arduino库 22 | 1. [点击下载](https://diandeng.tech/dev) 23 | 2. 通过Arduino IDE **菜单>项目>加载库>添加.ZIP库** 导入到库,如图: 24 | ![](../img/001/import-lib.png) 25 | 26 | 27 | ## 编译并上传示例程序 28 | 打开Arduino IDE,通过 **文件>示例>Blinker>Blinker_Hello/Hello_BLE** 打开例程 29 | 编译并下载程序到esp32,打开串口调试器 30 | 31 | **例程中宏LED_BUILTIN为开发板厂家定义的连接板载LED的引脚,如果您选择的开发板没有定义LED_BUILTIN,可以自行修改为您要使用的引脚** 32 | 33 | **特别提醒: ESP32使用蓝牙接入时推荐使用 开发板: ESP32 Dev Module/ Partition Scheme: NO OTA(Large APP) 否则容易因BLE固件过大而编译失败** 34 | 35 | ## 在app中添加设备 36 | 1. 确保蓝牙模块已通电 37 | 2. 进入App,点击右上角的“+”号,然后选择 **添加设备** 38 | 3. 点击选择**Arduino** > **蓝牙接入** 39 | 4. 等待搜索设备 40 | 5. 点击选择要接入的设备 41 | 42 | ## 恭喜!一切就绪 43 | 在APP中点击刚才您添加的设备,即可进入控制界面,点点按钮就可以控制Arduino上的LED灯开关 44 | 另一个按钮也点下试试,放心,您的手机不会爆炸~ 45 | 46 | ## 进一步使用blinker 47 | #### 想了解各接入方式的区别? 48 | 看看[添加设备](?file=002-开发入门/001-添加设备 "添加设备") 49 | #### 想深入理解以上例程? 50 | 看看[Arduino开发入门](?file=002-开发入门/002-Arduino开发入门 "Arduino开发入门") 51 | #### 更多实例? 52 | 看看[Arduino实例教程](https://arduino.me/s/blinker-arduino) 53 | #### 想制作与众不同的物联网设备? 54 | 看看[自定义界面](?file=005-App使用/02-自定义布局 "自定义布局") 和 [Arduino 支持库](https://diandeng.tech/doc/arduino-support "Arduino支持") 55 | 56 | ## 完整示例程序 57 | ```cpp 58 | #define BLINKER_PRINT Serial 59 | #define BLINKER_BLE 60 | 61 | #include 62 | 63 | // 新建组件对象 64 | BlinkerButton Button1("btn-abc"); 65 | BlinkerNumber Number1("num-abc"); 66 | 67 | int counter = 0; 68 | 69 | // 按下按键即会执行该函数 70 | void button1_callback(const String & state) { 71 | BLINKER_LOG("get button state: ", state); 72 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 73 | } 74 | 75 | // 如果未绑定的组件被触发,则会执行其中内容 76 | void dataRead(const String & data) 77 | { 78 | BLINKER_LOG("Blinker readString: ", data); 79 | counter++; 80 | Number1.print(counter); 81 | } 82 | 83 | void setup() { 84 | // 初始化串口 85 | Serial.begin(115200); 86 | 87 | #if defined(BLINKER_PRINT) 88 | BLINKER_DEBUG.stream(BLINKER_PRINT); 89 | #endif 90 | 91 | // 初始化有LED的IO 92 | pinMode(LED_BUILTIN, OUTPUT); 93 | digitalWrite(LED_BUILTIN, HIGH); 94 | // 初始化blinker 95 | Blinker.begin(); 96 | Blinker.attachData(dataRead); 97 | Button1.attach(button1_callback); 98 | } 99 | 100 | void loop() { 101 | Blinker.run(); 102 | } 103 | ``` 104 | 105 | ## ESP32注意事项 106 | 当前ESP32系列分四种芯片:ESP32、ESP32C3、ESP32S3、ESP32S2,乐鑫及各模块厂家又封装了多种模块。各芯片、各模块的使用方式、配置均有差异,请参考乐鑫官方文档了解。 107 | 108 | ## 为什么没有搜索到设备? 109 | 0. android系统要求搜索蓝牙必须开启手机定位服务,个别系统(如华为)不会提示用户打开定位服务 110 | 解决办法:开启手机定位服务 111 | 112 | 1. 使用了蓝牙2.0设备或者其他blinker不支持的蓝牙设备 113 | 解决办法:[点击查看blinker设备端支持](https://diandeng.tech/doc/device-support) 114 | -------------------------------------------------------------------------------- /docs/001-快速开始/04-arduino-蓝牙接入.md: -------------------------------------------------------------------------------- 1 | # 使用Arduino & 蓝牙接入 2 | 所有开发板都可以通过连接蓝牙BLE模块接入到blinker,这里以Arduino开发板为例 3 | 4 | ## 准备工作 5 | ### 硬件准备 6 | Arduino + ble蓝牙串口模块 7 | 推荐以下蓝牙ble模块: 8 | openjumper ble串口模块 (默认波特率9600) 9 | HM10 / HM11 (默认波特率9600) 10 | JDY08 / JDY10 (默认波特率115200) 11 | JDY18/JDY09 (默认波特率9600) 12 | 以上均为蓝牙BLE模块 13 | [点击查看blinker设备端支持](https://diandeng.tech/doc/device-support) 14 | 15 | **特别提醒:**蓝牙2.0是已淘汰的技术,新手机已经不支持蓝牙2.0,blinker也不支持 16 | 17 | **将串口BLE模块的 TXD连接到UNO的2号引脚,RXD连接到UNO的3号引脚** 18 | 19 | ### 软件准备 20 | **下载并安装Arduino IDE** 21 | [点击去下载](https://arduino.me/download) 22 | [Arduino IDE](https://arduino.me/download) 1.8.7或更新版本 23 | #### 下载并安装blinker APP 24 | **Android下载:** 25 | [点击下载](https://github.com/blinker-iot/app-release/releases) 或 在android应用商店搜索“blinker”下载安装 26 | **IOS下载:** 27 | [点击下载](https://itunes.apple.com/cn/app/id1357907814) 或 在app store中搜索“blinker”下载 28 | 29 | #### 下载并安装blinker Arduino库 30 | 1. [点击下载](https://diandeng.tech/dev) 31 | 2. 通过Arduino IDE **菜单>项目>加载库>添加.ZIP库** 导入到库,如图: 32 | ![](../img/001/import-lib.png) 33 | 34 | ## 在app中添加设备 35 | 1. 确保蓝牙模块已通电 36 | 2. 进入App,点击右上角的“+”号,然后选择 **添加设备** 37 | 3. 点击选择**Arduino** > **蓝牙接入** 38 | 4. 等待搜索设备 39 | 5. 点击选择要接入的设备 40 | 41 | ## 编译并上传示例程序 42 | 打开Arduino IDE,通过 **文件>示例>Blinker>Blinker_Hello/Hello_BLE** 打开例程 43 | 编译并上传程序到Arduino中 44 | 45 | **注意** 如果您使用的蓝牙模块波特率不是9600(JDY08、JDY10默认波特率115200),或者您不想使用2、3引脚接蓝牙模块,可以使用如下语句初始化蓝牙模块: 46 | ```cpp 47 | // 在Arduino UNO上使用软串口通信 48 | Blinker.begin(); // 默认设置: 数字IO 2(RX) 3(TX), 波特率 9600 bps 49 | Blinker.begin(4, 5); // 设置数字IO 4(RX) 5(TX), 默认波特率 9600 bps 50 | Blinker.begin(4, 5, 115200); // 设置数字IO 4(RX) 5(TX) 及波特率 115200 bps 51 | 52 | // 在Arduino Mega/Due上使用硬串口通信 53 | Blinker.begin(15, 14, 9600); //使用Serial3 54 | Blinker.begin(17, 16, 115200); //使用Serial2 55 | Blinker.begin(19, 20, 115200); //使用Serial1 56 | ``` 57 | **例程中宏LED_BUILTIN为开发板厂家定义的连接板载LED的引脚,如果您选择的开发板没有定义LED_BUILTIN,可以自行修改为您要使用的引脚** 58 | 59 | ## 恭喜!一切就绪 60 | 在APP中点击刚才您添加的设备,即可进入控制界面,点点按钮就可以控制Arduino上的LED灯开关 61 | 另一个按钮也点下试试,放心,您的手机不会爆炸~ 62 | 63 | ## 进一步使用blinker 64 | #### 想了解各接入方式的区别? 65 | 看看[添加设备](?file=002-开发入门/001-添加设备 "添加设备") 66 | #### 想深入理解以上例程? 67 | 看看[Arduino开发入门](?file=002-开发入门/002-Arduino开发入门 "Arduino开发入门") 68 | #### 更多实例? 69 | 看看[Arduino实例教程](https://arduino.me/s/blinker-arduino) 70 | #### 想制作与众不同的物联网设备? 71 | 看看[自定义界面](?file=005-App使用/02-自定义布局 "自定义布局") 和 [Arduino 支持库](https://diandeng.tech/doc/arduino-support "Arduino支持") 72 | 73 | ## 完整示例程序 74 | ```cpp 75 | #define BLINKER_PRINT Serial 76 | #define BLINKER_BLE 77 | 78 | #include 79 | 80 | // 新建组件对象 81 | BlinkerButton Button1("btn-abc"); 82 | BlinkerNumber Number1("num-abc"); 83 | 84 | int counter = 0; 85 | 86 | // 按下按键即会执行该函数 87 | void button1_callback(const String & state) { 88 | BLINKER_LOG("get button state: ", state); 89 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 90 | } 91 | 92 | // 如果未绑定的组件被触发,则会执行其中内容 93 | void dataRead(const String & data) 94 | { 95 | BLINKER_LOG("Blinker readString: ", data); 96 | counter++; 97 | Number1.print(counter); 98 | } 99 | 100 | void setup() { 101 | // 初始化串口 102 | Serial.begin(115200); 103 | 104 | #if defined(BLINKER_PRINT) 105 | BLINKER_DEBUG.stream(BLINKER_PRINT); 106 | #endif 107 | 108 | // 初始化有LED的IO 109 | pinMode(LED_BUILTIN, OUTPUT); 110 | digitalWrite(LED_BUILTIN, HIGH); 111 | // 初始化blinker 112 | Blinker.begin(); 113 | Blinker.attachData(dataRead); 114 | Button1.attach(button1_callback); 115 | } 116 | 117 | void loop() { 118 | Blinker.run(); 119 | } 120 | ``` 121 | 122 | ## 为什么没有搜索到设备? 123 | 0. android系统要求搜索蓝牙必须开启手机定位服务,个别系统(如华为)不会提示用户打开定位服务 124 | 解决办法:开启手机定位服务 125 | 126 | 1. 使用了蓝牙2.0设备或者其他blinker不支持的蓝牙设备 127 | 解决办法:[点击查看blinker设备端支持](https://diandeng.tech/doc/device-support) 128 | 129 | ## 其他注释事项 130 | 使用Arduino MEGA时,仅以下IO可以设置为软串口RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 131 | 使用Arduino Leonardo时,仅以下IO可以设置为软串口RX: 8, 9, 10, 11, 14, 15, 16 132 | 133 | -------------------------------------------------------------------------------- /docs/001-快速开始/09-Linux-Windows-MacOS接入.md: -------------------------------------------------------------------------------- 1 | # Linux/Windows/MacOS MQTT接入 2 | **本文档亦适用于树莓派等带操作系统的嵌入式开发板** 3 | 4 | 使用WiFi接入,当设备和手机在同一个局域网中,为局域网通信 5 | 其余情况,使用MQTT远程通信 6 | 7 | ## 准备工作 8 | 开始使用前您需要做好如下准备: 9 | 10 | **下载并安装blinker APP** 11 | **Android下载:** 12 | [点击下载](https://github.com/blinker-iot/app-release/releases) 或 在android应用商店搜索“blinker”下载安装 13 | **IOS下载:** 14 | [点击下载](https://itunes.apple.com/cn/app/id1357907814) 或 在app store中搜索“blinker”下载 15 | 16 | 17 | ## 环境/依赖安装 18 | 运行blinker程序需要最新nodejs LTS版本及Ts-Node支持 19 | ``` 20 | npm i -g ts-node 21 | git clone https://github.com/blinker-iot/blinker-js.git 22 | cd blinker-js 23 | npm i 24 | ``` 25 | 26 | ## 在app中添加设备,获取Secret Key 27 | 1. 进入App,点击右上角的“+”号,然后选择 **添加设备** 28 | 2. 点击选择**Arduino > WiFi接入** 29 | 3. 复制申请到的**Secret Key** 30 | 31 | ## DIY界面 32 | 1. 在设备列表页,点击设备图标,进入设备控制面板 33 | 2. 首次进入设备控制面板,会弹出向导页 34 | 3. 在向导页点击 **载入示例**,即可载入示例组件 35 | 36 | ## 编译并上传示例程序 37 | 38 | **.\example\example_hello.ts** 为入门示例, 替换示例中的以下语句,修改参数为app中申请到的设备的Secret Key 39 | ``` 40 | let device = new BlinkerDevice('xxxxxxxxxxxx'); 41 | ``` 42 | 运行示例程序: 43 | ``` 44 | ts-node .\example\example_hello.ts 45 | ``` 46 | 47 | > blinker在局域网通信时会使用到81端口,如遇到权限报错,请使用sudo等方式提权运行 48 | 49 | ## 恭喜!一切就绪 50 | 51 | 在APP中点击刚才您添加的设备,即可进入控制界面,点点按钮就可以控制设备了 52 | 另一个按钮也点下试试,放心,您的手机不会爆炸~ 53 | 54 | ## 进一步使用blinker 55 | 56 | #### 想了解各接入方式的区别? 57 | 看看[添加设备](?file=002-开发入门/001-添加设备 "添加设备") 58 | 59 | #### 想深入理解以上例程? 60 | 61 | 看看[Nodejs开发入门](https://diandeng.tech/doc/getting-start-nodejs "Nodejs开发入门") 62 | 63 | #### 更多示例程序? 64 | 65 | 看看[Github](https://github.com/blinker-iot/blinker-js/tree/typescript/example) 66 | 67 | #### 想制作与众不同的物联网设备? 68 | 69 | 看看[自定义界面](?file=005-App使用/02-自定义布局 "自定义布局") 和 [JavaScript 支持库函数参考](https://diandeng.tech/doc/javascript-support)) 70 | 71 | #### 树莓派GPIO控制? 72 | 看看[pigpio](https://github.com/fivdi/pigpio) 73 | 74 | ## 完整示例程序 75 | 76 | 77 | ```javascript 78 | import { BlinkerDevice } from '../lib/blinker'; 79 | import { ButtonWidget, NumberWidget } from '../lib/widget'; 80 | 81 | let device = new BlinkerDevice(/*您申请到的Secret Key*/); 82 | 83 | // 注册组件 84 | let button1: ButtonWidget = device.addWidget(new ButtonWidget('btn-123')); 85 | let button2: ButtonWidget = device.addWidget(new ButtonWidget('btn-abc')); 86 | let number1: NumberWidget = device.addWidget(new NumberWidget('num-abc')); 87 | 88 | let num = 0; 89 | 90 | device.ready().then(() => { 91 | 92 | device.dataRead.subscribe(message => { 93 | console.log('otherData:', message); 94 | }) 95 | 96 | button1.listen().subscribe(message => { 97 | console.log('button1:', message.data); 98 | num++; 99 | number1.value(num).update(); 100 | }) 101 | 102 | button2.listen().subscribe(message => { 103 | console.log('button2:', message.data); 104 | // 其他控制代码 105 | }) 106 | 107 | }) 108 | ``` 109 | 110 | ## 为什么设备显示不在线? 111 | 112 | 0. blinker App如何判断设备是否在线? 113 | 114 | blinker App在 **App打开时、进入设备页面时、在设备页面中每隔一定时间** 会向设备发送心跳请求,内容为**{"get":"state"}**。 115 | 设备收到请求后,会返回 **{"state":"online"}**,app接收到这个返回,即会显示设备在线。 116 | 117 | 1. 程序没有成功上传到开发板 118 | 119 | 解决办法:重新上传,上传后打开串口监视器,确认程序正确运行 120 | 121 | 2. 程序中没有设置正确的ssid和密码,导致没有连接上网络 122 | 123 | 解决办法:设置后再重新上传程序,上传后打开串口监视器,确认程序正确运行 124 | 125 | 3. 程序错误,导致程序运行不正确 126 | 127 | 解决办法:先使用并理解blinker例程,再自由发挥 128 | 129 | 4. 开发板供电不足 130 | 131 | 解决办法:换电源 或 换USB口 132 | 133 | ## 为什么无法切换到局域网通信? 134 | 135 | 1. 路由器开启了AP隔离功能或禁止了UDP通信,从而阻止了局域网中设备的发现和通信 136 | 137 | 解决办法:关闭路由器AP隔离功能 或 允许UDP通信;如果找不到相关设置,通常可重置路由器解决 138 | 139 | 2. mdns没有及时发现设备 140 | 141 | 解决办法:在首页下拉刷新,可以重新搜索局域网中的设备 142 | -------------------------------------------------------------------------------- /docs/001-快速开始/10-esp8266模块-WiFi接入.md: -------------------------------------------------------------------------------- 1 | # 使用Arduino & WiFi模块接入 2 | 我们更推荐使用8266开发板配合Arduino SDK进行blinker开发 3 | 如果您要使用8266模块,需要先为8266模块烧写blinker ESP_AT固件 4 | 开发方式详见:[ESP_AT模块支持](https://diandeng.tech/doc/at-mode-support) 5 | 6 | ## 相关文档 7 | [ESP固件下载-官方工具](https://www.espressif.com/sites/default/files/documentation/2a-esp8266-sdk_getting_started_guide_cn.pdf) 8 | -------------------------------------------------------------------------------- /docs/001-快速开始/11-GPRS模块接入.md: -------------------------------------------------------------------------------- 1 | # GPRS支持 2 | 使用方法可见blinker库例程 3 | -------------------------------------------------------------------------------- /docs/001-快速开始/12-NBIoT模块接入.md: -------------------------------------------------------------------------------- 1 | # NB-IoT支持 2 | **目前只支持SIM7020C AT模块在NBIoT中使用MQTT方式接入** 3 | 4 | ## 准备工作 5 | 6 | ### 硬件准备 7 | arduino开发板([查看支持的设备](https://diandeng.tech/doc/device-support)) 8 | SIM7020C模块(支持NBIoT的物理网卡等) 9 | 10 | ### 软件准备 11 | 12 | #### 下载并安装blinker APP 13 | 14 | **Android下载:** 15 | [点击下载](https://github.com/blinker-iot/app-release/releases) 或 在android应用商店搜索“blinker”下载安装 16 | **IOS下载:** 17 | [点击下载](https://itunes.apple.com/cn/app/id1357907814) 或 在app store中搜索“blinker”下载 18 | 19 | 20 | #### 下载并安装blinker Arduino库 21 | 22 | [点击下载](https://github.com/blinker-iot/blinker-library/archive/master.zip) 23 | **Windows:**将下载好的blinker库解压到 **我的电脑>文档>Arduino>libraries** 文件夹中 24 | **Mac OS:**将下载好的blinker库解压到 **文稿>Arduino>libraries** 文件夹中 25 | 26 | 27 | ## 在app中添加设备,获取Secret Key 28 | 29 | 1. 进入App,点击右上角的“+”号,然后选择 **添加设备** 30 | 2. 点击选择**Arduino** > **WiFi接入** 31 | 3. 复制申请到的**Secret Key** 32 | 33 | ## DIY界面 34 | 35 | 1. 在设备列表页,点击设备图标,进入设备控制面板 36 | 2. 首次进入设备控制面板,会弹出向导页 37 | 3. 在向导页点击 **载入示例**,即可载入示例组件 38 | 39 | 40 | ## 编译并上传示例程序 41 | 42 | 打开Arduino IDE,通过 **文件>示例>Blinker>Blinker_NBIoT/NBIoT_SIM7020** 打开例程 43 | 在程序中找到如下变量,填入您申请到的Secret Key(auth) 如: 44 | 45 | ``` cpp 46 | char auth[] = "abcdefghijkl"; //上一步中在app中获取到的Secret Key 47 | ``` 48 | 设置SIM7020C模块接入串口: 49 | ```cpp 50 | Blinker.begin(auth, 4, 5, 9600); // 设置数字IO 4(RX) 5(TX) 及波特率 9600 bps 51 | ``` 52 | 53 | **例程中宏LED_BUILTIN为开发板厂家定义的连接板载LED的引脚,如果您选择的开发板没有定义LED_BUILTIN,可以自行修改为您要使用的引脚** 54 | 编译并上传程序到esp8266开发板,打开串口调试器 55 | 当看到提示“MQTT Connected!”,说明设备已经成功连接到MQTT服务器 56 | 57 | ## 恭喜!一切就绪 58 | 59 | 在APP中点击刚才您添加的设备,即可进入控制界面,点点按钮就可以控制Arduino上的LED灯开关 60 | 另一个按钮也点下试试,放心,您的手机不会爆炸~ 61 | 62 | ## 进一步使用blinker 63 | 64 | #### 想了解各接入方式的区别? 65 | 看看[添加设备](?file=002-开发入门/001-添加设备 "添加设备") 66 | 67 | #### 想深入理解以上例程? 68 | 69 | 看看[Arduino开发入门](?file=002-开发入门/002-Arduino开发入门 "Arduino开发入门") 70 | 71 | #### 更多实例? 72 | 73 | 看看[Arduino实例教程](https://arduino.me/s/blinker-arduino) 74 | 75 | #### 想制作与众不同的物联网设备? 76 | 77 | 看看[自定义界面](?file=005-App使用/02-自定义布局 "自定义布局") 和 [Arduino 支持库函数参考](https://diandeng.tech/doc/arduino-support "Arduino支持") 78 | 79 | ## 完整示例程序 80 | 81 | ``` cpp 82 | #define BLINKER_NBIOT_SIM7020 83 | 84 | #include 85 | 86 | char auth[] = "Your Device Secret Key"; 87 | 88 | // 新建组件对象 89 | BlinkerButton Button1("btn-abc"); 90 | BlinkerNumber Number1("num-abc"); 91 | 92 | int counter = 0; 93 | 94 | // 按下按键即会执行该函数 95 | void button1_callback(const String & state) { 96 | BLINKER_LOG("get button state: ", state); 97 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 98 | } 99 | 100 | // 如果未绑定的组件被触发,则会执行其中内容 101 | void dataRead(const String & data) 102 | { 103 | BLINKER_LOG("Blinker readString: ", data); 104 | counter++; 105 | Number1.print(counter); 106 | } 107 | 108 | void setup() { 109 | // 初始化串口 110 | Serial.begin(115200); 111 | BLINKER_DEBUG.stream(Serial); 112 | 113 | // 初始化有LED的IO 114 | pinMode(LED_BUILTIN, OUTPUT); 115 | digitalWrite(LED_BUILTIN, HIGH); 116 | // 初始化blinker 117 | Blinker.begin(auth, D6, D7, 9600); 118 | Blinker.attachData(dataRead); 119 | Button1.attach(button1_callback); 120 | } 121 | 122 | void loop() { 123 | Blinker.run(); 124 | } 125 | ``` 126 | 127 | ## 为什么设备显示不在线? 128 | 129 | 0. blinker App如何判断设备是否在线? 130 | 131 | blinker App在 **App打开时、进入设备页面时、在设备页面中每隔一定时间** 会向设备发送心跳请求,内容为**{"get":"state"}**。 132 | 设备收到请求后,会返回**{"state":"online"}**,app接收到这个返回,即会显示设备在线。 133 | 134 | 1. 程序没有成功上传到开发板 135 | 136 | 解决办法:重新上传,上传后打开串口监视器,确认程序正确运行 137 | 138 | 2. 程序中没有设置正确的ssid和密码,导致没有连接上网络 139 | 140 | 解决办法:设置后再重新上传程序,上传后打开串口监视器,确认程序正确运行 141 | 142 | 3. 程序错误,导致程序运行不正确 143 | 144 | 解决办法:先使用并理解blinker例程,再自由发挥 145 | 146 | 4. 开发板供电不足 147 | 148 | 解决办法:换电源 或 换USB口 149 | -------------------------------------------------------------------------------- /docs/001-快速开始/14-freeRTOS接入.md: -------------------------------------------------------------------------------- 1 | # freeRTOS接入 2 | 3 | ## 支持芯片 4 | SDK已支持esp8266、esp32,其他芯片可基于本SDK适配 5 | 6 | ## Github 7 | [GITHUB](https://github.com/blinker-iot/blinker-freertos) 8 | 9 | ## ESP-IDF环境安装 10 | [乐鑫官网](https://idf.espressif.com/zh-cn/index.html) 11 | 12 | ## 示例 13 | Hello blinker示例: 14 | ```c++ 15 | #include 16 | #include 17 | #include 18 | 19 | #include "Blinker.h" 20 | 21 | static const char *TAG = "blinker"; 22 | 23 | char auth[] = "Your Device Secret Key"; 24 | char ssid[] = "Your WiFi network SSID or name"; 25 | char pswd[] = "Your WiFi network WPA password or WEP key"; 26 | 27 | BlinkerButton button1 = {.name = "btn-abc"}; 28 | BlinkerNumber number1 = {.name = "num-abc"}; 29 | 30 | int counter = 0; 31 | 32 | void button1_callback(const char *data) 33 | { 34 | BLINKER_LOG(TAG, "get button data: %s", data); 35 | 36 | blinker_button_config_t config = { 37 | .icon = "fas fa-alicorn", 38 | .color = "0xFF", 39 | .text1 = "test", 40 | }; 41 | 42 | blinker_button_print(&button1, &config); 43 | } 44 | 45 | void data_callback(const cJSON *data) 46 | { 47 | BLINKER_LOG(TAG, "get json data"); 48 | 49 | counter++; 50 | 51 | char count[10]; 52 | sprintf(count, "%d", counter); 53 | 54 | blinker_number_config_t config = { 55 | .value = count, 56 | }; 57 | 58 | blinker_number_print(&number1, &config); 59 | } 60 | 61 | void app_main() 62 | { 63 | BLINKER_DEBUG_ALL(); 64 | blinker_config_t init_conf = { 65 | .type = BLINKER_WIFI, 66 | .wifi = BLINKER_DEFAULT_CONFIG, 67 | }; 68 | blinker_init(&init_conf); 69 | blinker_button_init(&button1, button1_callback); 70 | blinker_attach_data(data_callback); 71 | 72 | Blinker.begin(auth, ssid, pswd); 73 | } 74 | ``` 75 | 76 | ## 更多 77 | 可见[freeRTOS支持](https://diandeng.tech/doc/freertos-support) -------------------------------------------------------------------------------- /docs/001-快速开始/15-蓝牙BLE接入.md: -------------------------------------------------------------------------------- 1 | # 蓝牙BLE接入 2 | **本文档适用于直接使用蓝牙芯片作为主控制器的设备** 3 | 4 | ## 支持的芯片 5 | [Nordic nrf52系列支持](https://diandeng.tech/doc/nordic-support) 6 | 7 | ## 其他蓝牙支持 8 | 任一蓝牙4.x或5.x版本的芯片均可 9 | 如果使用arduino搭配蓝牙ble模块,请看[arduino-蓝牙接入](?file=001-快速开始/01-arduino-蓝牙接入 "arduino-蓝牙接入") 10 | 如果使用ESP32蓝牙接入,请看[esp32-蓝牙接入](?file=001-快速开始/03-esp32-蓝牙接入 "esp32-蓝牙接入") 11 | 如果使用linux设备蓝牙接入,请看[树莓派-蓝牙接入](?file=001-快速开始/07-树莓派-蓝牙接入 "树莓派-蓝牙接入") 12 | 13 | ## 相关服务 14 | 只需参考常见蓝牙串口模块进行配置即可 15 | 16 | ### 设备发现 17 | 广播服务FFE0,即可被手机搜索到 18 | 19 | ### 设备通信 20 | 通过读写服务FFE1,即可与手机通信 21 | -------------------------------------------------------------------------------- /docs/001-快速开始/19-其他设备接入.md: -------------------------------------------------------------------------------- 1 | # 接入其他设备 2 | 遵循点灯标准,几乎任何设备都可使用点灯方案,您可以自行阅读我们的文档和源码进行适配。 3 | **对于企业版用户,我们提供一对一的技术支持。** 4 | 5 | ## 接入蓝牙设备 6 | 设备应为蓝牙4.x版本(带ble) 7 | 8 | ### 设备发现 9 | 广播服务FFE0,即可被手机搜索到 10 | 11 | ### 设备通信 12 | 通过读写服务FFE1,即可与手机通信 13 | 14 | 15 | --- 16 | ## 接入WiFi设备 17 | 带局域网通信功能(WiFi、有线均可) 18 | 19 | ### 设备发现 20 | 设备通过mdns广播设备,可被手机搜索到 21 | 如Arduino设备,广播名为_DiyArduino._tcp.local. 22 | Linux设备,广播名为_DiyLinux._tcp.local. 23 | 24 | ### 设备通信 25 | 在81端口建立webSocket server,手机端进去控制面板后会自动连接到该server,即可进行通信 26 | 27 | --- 28 | -------------------------------------------------------------------------------- /docs/002-开发入门/000-基础知识.md: -------------------------------------------------------------------------------- 1 | # 开发基础 2 | 您可能不需要这些基础,也可以借助我们提供的SDK进行开发 3 | 但如果您能掌握或理解以下知识,您的开发工作将无往不利 4 | **如果您自认基础不好,强烈推荐您先学习这些基础知识,但并不用看完,也不用精通,理解即可** 5 | 6 | ## blinker方案基本介绍 7 | 基础架构: 8 | ![](../img/000/frame.png) 9 | 1. blinker是一套物联网设备开发部署方案,核心是制定了设备和设备间、设备和客户端间通信及交互标准 10 | 2. blinker服务器端只负责用户管理、设备管理、数据存储等必要功能 11 | 3. WiFi接入的设备,远程通信经由传输中介转发,而不存储数据在服务器端;本地局域网通信,通过webSocket进行 12 | 4. ble接入设备,通过与手机直接连接进行通信 13 | 5. blinker本身没有限定硬件、硬件外设、云平台、开发方式,开发者可自由扩展任何功能(前提是硬件资源足够) 14 | 15 | ## arduino+蓝牙ble接入 16 | 您需要具备基础的arduino开发能力 17 | Arduino中文社区提供了[入门教程](https://arduino.me/s/1) 18 | 《Arduino程序设计基础》提供了[常用函数参考](https://arduino-wiki.clz.me/) 19 | 看了上面两个资料,您就可以具备基本的Arduino开发能力了 20 | 但我们建议您再补充一定的 [C语言基础](http://www.runoob.com/cprogramming/c-tutorial.html) 21 | 22 | 虽然使用blinker进行开发,不需理解蓝牙ble原理,但如果您能理解一些蓝牙ble通信原理,就更好了 23 | 24 | ## esp8266、esp32使用WiFi接入 25 | 使用esp8266、esp32等开发板接入,除了需要具备esp芯片开发的相关知识外,您最好先**理解**一定的网络知识(只需理解即可) 26 | 如UDP/TCP通信、HTTP协议、webSocket协议、MQTT协议,然后阅读相关开发文档: 27 | 28 | 使用esp8266/esp32 Arduino SDK开发 29 | [esp8266 Arduino SDK文档](https://arduino-esp8266.readthedocs.io/en/latest/) 30 | [esp32 Arduino SDK文档](https://docs.espressif.com/projects/arduino-esp32/en/latest/index.html) 31 | 使用esp32/freeRTOS/IDF开发 32 | [ESP-IDF编程指南](https://idf.espressif.com/zh-cn/index.html) 33 | 34 | ## linux设备接入 35 | 首推使用linux主机/虚拟机学习开发,其次推荐使用树莓派学习 36 | 但linux开发体系庞杂,很难说清楚该怎么学 37 | 不过,要使用blinker开发设备,您基本上只需掌握基础的Python或者JavaScript开发即可 38 | [python3教程](http://www.runoob.com/python3/python3-tutorial.html) 39 | [nodejs教程](https://www.runoob.com/nodejs/nodejs-tutorial.html) 40 | 41 | ## freeRTOS 42 | 请自行百度学习相关开发方式 43 | 44 | ## microPython 45 | 不再提供mpy相关技术支持 46 | 47 | -------------------------------------------------------------------------------- /docs/002-开发入门/001-添加设备.md: -------------------------------------------------------------------------------- 1 | # 添加设备 2 | 1.在主界面点击 **添加设备** 按钮,即可进入添加设备页面 3 | 2.选择对应的设备,进入设备添加向导页 4 | 3.选择接入方式:蓝牙接入会进入设备搜索模式,WiFi接入会获取到密钥 5 | 6 | 不同设备的接入步骤请参照 **快速接入文档** 7 | 8 | ## 硬件支持情况 9 | 对于免费版用户,目前支持的硬件开发平台有 **Arduino**、**freeRTOS**、**Linux** 三种: 10 | ### Arduino 11 | 这里泛指使用Arduino SDK的开发板:官方Arduino、esp8266开发板、esp32开发板等 12 | ### freeRTOS 13 | blinker提供了ESP32 IDF支持 14 | ### Linux开发板 15 | 使用Linux操作系统的设备:Linux开发板、树莓派、香蕉派等 16 | 17 | 更多硬件支持信息可查阅[硬件支持情况](?file=003-硬件开发/01-支持的设备 "支持的设备") 18 | 19 | 20 | ## 接入方式详解 21 | 22 | ### 接入方式区别 23 | | 接入方式 | 支持设备 | 控制范围 | 收发频率 | 24 | | :-: | :-: | :-: | :-: | 25 | | 蓝牙BLE | Arduino+蓝牙模块/ESP32/Linux | 本地 | 500 bytes/秒 | 26 | | WiFi | ESP8266/ESP32/Linux | 远程/局域网 | 局域网通信无限制,远程通信500 bytes/次/秒 | 27 | 28 | ### 蓝牙BLE接入注意事项 29 | 如果应用环境没有网络支持,请选择 **蓝牙接入** 30 | 蓝牙接入,无须依赖网络,即可实现手机和蓝牙设备连接 31 | 需要注意的是,蓝牙接入需要的蓝牙版本为4.x 32 | [支持接入的蓝牙设备](?file=003-硬件开发/01-设备端支持) 33 | 34 | ### WiFi接入注意事项 35 | 如果需要远程控制设备,请选择 **WiFi接入** 36 | **自blinker App 2.1.1起,原WiFi接入和MQTT已经合并为新WiFi接入** 37 | 使用WiFi接入,当设备和手机在同一个局域网中,为局域网通信;其余情况,使用MQTT远程通信。 38 | 为了减少通信次数,可以将几条指令合并为一条发送,blinker SDK在正常正常情况下,会自动合并数据发送。 39 | 40 | 由于局域网没有频率限制,因此可以发送大量数据,但数据量过大时会造成app端和设备端阻塞,在编程时请根据需求,有节制的发送数据。 41 | blinker会通过局域网广播发现设备,如果您的局域网阻止了广播,或阻止了设备间通信,blinker app和设备将无法进行局域网通信。 -------------------------------------------------------------------------------- /docs/002-开发入门/002-Arduino开发入门.md: -------------------------------------------------------------------------------- 1 | # Arduino端程序开发入门 2 | 本文档,适用于Arduino、esp8266、esp32等使用Arduino SDK开发的硬件。 3 | 以下是对blinker入门程序的解读: 4 | 5 | 6 | ## 接入示例 7 | 这里以ESP8266/ESP32 WiFi接入为例 8 | ```cpp 9 | #define BLINKER_WIFI 10 | 11 | #include 12 | 13 | char auth[] = "Your Device Secret Key"; 14 | char ssid[] = "Your WiFi network SSID or name"; 15 | char pswd[] = "Your WiFi network WPA password or WEP key"; 16 | 17 | // 新建组件对象 18 | BlinkerButton Button1("btn-abc"); 19 | BlinkerNumber Number1("num-abc"); 20 | 21 | int counter = 0; 22 | 23 | // 按下按键即会执行该函数 24 | void button1_callback(const String & state) { 25 | BLINKER_LOG("get button state: ", state); 26 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 27 | } 28 | 29 | // 如果未绑定的组件被触发,则会执行其中内容 30 | void dataRead(const String & data) 31 | { 32 | BLINKER_LOG("Blinker readString: ", data); 33 | counter++; 34 | Number1.print(counter); 35 | } 36 | 37 | void setup() { 38 | // 初始化串口 39 | Serial.begin(115200); 40 | 41 | BLINKER_DEBUG.stream(Serial); 42 | 43 | // 初始化有LED的IO 44 | pinMode(LED_BUILTIN, OUTPUT); 45 | digitalWrite(LED_BUILTIN, HIGH); 46 | // 初始化blinker 47 | Blinker.begin(auth, ssid, pswd); 48 | Blinker.attachData(dataRead); 49 | Button1.attach(button1_callback); 50 | } 51 | 52 | void loop() { 53 | Blinker.run(); 54 | } 55 | ``` 56 | 57 | ## blinker初始化/选择连接方式 58 | ```cpp 59 | #define BLINKER_WIFI 60 | ``` 61 | 用于指定设备接入方式,您还可以使用 **BLINKER_BLE**,不同的接入方式对应的Blinker初始化函数也不同: 62 | ### 蓝牙接入 63 | ```cpp 64 | #define BLINKER_BLE 65 | #include 66 | 67 | void setup() { 68 | Blinker.begin(); 69 | } 70 | ``` 71 | ### WiFi接入 72 | ```cpp 73 | #define BLINKER_WIFI 74 | #include 75 | 76 | void setup() { 77 | Blinker.begin(auth, ssid, pswd); 78 | } 79 | ``` 80 | 81 | ## 新建组件对象/绑定组件 82 | ```cpp 83 | BlinkerButton Button1("btn-abc"); 84 | BlinkerNumber Number1("num-abc"); 85 | ``` 86 | 使用组件的键名创建对应的对象可以将设备与blinker app界面上的UI组件进行绑定。 87 | key为组件的键名,在app中切换到编辑模式可以看到; 88 | blinker库定义了多种组件类型,如 **BlinkerSlider BlinkerRGB BlinkerNumber BlinkerText** 89 | 90 | ## 注册组件回调 91 | 回调函数 92 | ```cpp 93 | void button1_callback(const String & state) { 94 | BLINKER_LOG("get button state: ", state); 95 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 96 | } 97 | ``` 98 | 注册回调函数 99 | ```cpp 100 | Button1.attach(button1_callback); 101 | ``` 102 | 当app中组件触发并发送到设备端时将触发该组件注册的回调函数 103 | 104 | **使用方法:** 105 | ```cpp 106 | BlinkerSlider Slider1("Slider_1"); //绑定滑动条 107 | BlinkerRGB RGB1("RGB_1"); //绑定取色器 108 | BlinkerNumber NUM1("NUM_1"); //绑定数字组件 109 | BlinkerText Text1("TEXTE_1"); //绑定文字组件 110 | ``` 111 | 112 | ## 开启调试信息 113 | ```cpp 114 | BLINKER_DEBUG.stream(Serial); 115 | ``` 116 | 用于指定调试信息输出的串口,设备开发时调试使用,项目或产品成型后,可以删除不用 117 | 118 | ## Blinker运行时 119 | ```cpp 120 | void loop() { 121 | Blinker.run(); 122 | } 123 | ``` 124 | Blinker.run()语句负责处理Blinker收到的数据,每次运行都会将设备收到的数据进行一次解析。 125 | 在使用WiFi接入时,该语句也负责保持网络连接 126 | 127 | 128 | ## 组件操作 129 | ``` 130 | void button1_callback(const String & state) { 131 | BLINKER_LOG("get button state: ", state); 132 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 133 | } 134 | ``` 135 | 触发该组件注册的回调函数时,可获取到该组件对应的状态值 136 | 其他组件操作可见 [Arduino支持](https://diandeng.tech/doc/arduino-support) 137 | 138 | 139 | ## 数据管理 140 | ### 读取数据的回调函数 141 | ``` 142 | void dataRead(const String & data) 143 | { 144 | BLINKER_LOG("Blinker readString: ", data); 145 | counter++; 146 | Number1.print(counter); 147 | } 148 | ``` 149 | 可以检测是否收到未解析的数据 150 | 如果app发送的数据,不是绑定过的组件数据,blinker将不会解析这些数据 151 | 此时您可以回调函数获取这些未解析的数据。 152 | ### 注册该回调函数 153 | ``` 154 | Blinker.attachData(dataRead); 155 | ``` 156 | 157 | ### 发送数据 158 | ``` 159 | Blinker.print(BlinkerTime); 160 | Blinker.print("millis", BlinkerTime); 161 | ``` 162 | 使用print可以向app发送数据,其形式有二: 163 | ``` 164 | Blinker.print(value); 165 | ``` 166 | 当只有一个参数时,发送的是一个内容为value的纯字符串 167 | ``` 168 | Blinker.print(key, value); 169 | ``` 170 | 但有两个参数时,发送的是一个json数据,如{"millis":1000} 171 | 如果数据键名对应app上的文本组件、开关组件、滑块组件,app收到数据后,会找到对应的键名的组件,并将值传递给组件,组件会以自己的方式呈现出这个数据 172 | 173 | #### 特定指令 174 | ``` 175 | Blinker.vibrate() 176 | ``` 177 | blinker app能接收一些特定指令,但设备端调用api发送特定指令后,app会执行相应操作。 178 | 如使用Blinker.vibrate()即会让手机震动。 179 | 180 | 181 | --- 182 | #### 更多实例 183 | 看看[Arduino实例教程](https://arduino.me/s/blinker-arduino) 184 | 185 | #### blinker lib Api手册 186 | 您可以通过 [Arduino支持](https://diandeng.tech/doc/arduino-support)了解更多blinker api用法 -------------------------------------------------------------------------------- /docs/002-开发入门/004-Python开发入门.md: -------------------------------------------------------------------------------- 1 | # python开发入门 2 | 本文档,适用于Linux开发板、树莓派(Raspberry Pi)、香蕉派等。 3 | 4 | 5 | ## 接入示例 6 | 这里以 WiFi接 入为例 7 | ```python 8 | #!/usr/bin/env python 9 | # -*- coding: utf-8 -*- 10 | 11 | __author__ = "stao" 12 | 13 | from blinker import Device, ButtonWidget, NumberWidget 14 | 15 | device = Device("authKey") 16 | 17 | button1 = device.addWidget(ButtonWidget('btn-123')) 18 | button2 = device.addWidget(ButtonWidget('btn-abc')) 19 | number1 = device.addWidget(NumberWidget('num-abc')) 20 | 21 | num = 0 22 | 23 | 24 | async def button1_callback(msg): 25 | global num 26 | 27 | num += 1 28 | 29 | await number1.text("num").value(num).update() 30 | 31 | 32 | async def button2_callback(msg): 33 | print("Button2: {0}".format(msg)) 34 | 35 | 36 | async def heartbeat_func(msg): 37 | print("Heartbeat func received: {0}".format(msg)) 38 | # 文本组件 39 | 40 | 41 | async def ready_func(): 42 | # 获取设备配置信息 43 | print(vars(device.config)) 44 | 45 | 46 | button1.func = button1_callback 47 | button2.func = button2_callback 48 | 49 | device.heartbeat_callable = heartbeat_func 50 | device.ready_callable = ready_func 51 | 52 | if __name__ == '__main__': 53 | device.run() 54 | 55 | ``` 56 | 57 | ## blinker初始化/选择连接方式 58 | ```python 59 | device = Device("authKey") 60 | ``` 61 | 62 | ## 新建组件对象/绑定组件 63 | ```python 64 | button1 = device.addWidget(ButtonWidget('btn-123')) 65 | button2 = device.addWidget(ButtonWidget('btn-abc')) 66 | number1 = device.addWidget(NumberWidget('num-abc')) 67 | ``` 68 | 使用组件的键名创建对应的对象可以将设备与blinker app界面上的UI组件进行绑定。 69 | key为组件的键名,在app中切换到编辑模式可以看到; 70 | blinker库定义了多种组件类型,如 **BlinkerSlider BlinkerRGB BlinkerNumber BlinkerText** 71 | 72 | ## 注册组件回调 73 | ### 回调函数 74 | ```python 75 | async def button1_callback(msg): 76 | global num 77 | num += 1 78 | await number1.text("num").value(num).update() 79 | ``` 80 | 81 | ### 注册回调函数 82 | ```python 83 | button1.func = button1_callback 84 | ``` 85 | 当app中组件触发并发送到设备端时将触发该组件注册的回调函数 86 | 87 | 88 | ## 启动设备 89 | ```python 90 | if __name__ == '__main__': 91 | device.run() 92 | ``` 93 | 94 | 更多可见 [Python支持](https://diandeng.tech/doc/python-support) -------------------------------------------------------------------------------- /docs/002-开发入门/006-Nodejs开发入门.md: -------------------------------------------------------------------------------- 1 | # Nodejs开发入门 2 | 本文档适用于Linux、Windows系统的设备 3 | 以下是对Nodejs入门程序的解读: 4 | 5 | ## 接入示例 6 | 7 | ```javascript 8 | import { BlinkerDevice } from '../lib/blinker'; 9 | import { ButtonWidget, TextWidget, RangeWidget, NumberWidget, RGBWidget, JoystickWidget, ChartWidget, ImageWidget } from '../lib/widget'; 10 | 11 | let device = new BlinkerDevice(/*您申请到的authkey*/); 12 | ``` 13 | 14 | ```javascript 15 | // 注册组件 16 | let button1: ButtonWidget = device.addWidget(new ButtonWidget('btn-crf')); 17 | let button2: ButtonWidget = device.addWidget(new ButtonWidget('btn-b9g')); 18 | let text1: TextWidget = device.addWidget(new TextWidget('tex-pnd')); 19 | let range1: RangeWidget = device.addWidget(new RangeWidget('ran-i89')); 20 | let number1: NumberWidget = device.addWidget(new NumberWidget('num-lnw')); 21 | let colorPicker1: RGBWidget = device.addWidget(new RGBWidget('col-a9t')); 22 | let joystick1: JoystickWidget = device.addWidget(new JoystickWidget('joy-d32')); 23 | let chart1: ChartWidget = device.addWidget(new JoystickWidget('cha-t12')); 24 | let image1: ImageWidget = device.addWidget(new ImageWidget('img-abc')); 25 | 26 | // 等待设备完成初始化,再执行相关程序 27 | device.ready().then(() => { 28 | 29 | device.dataRead.subscribe(message => { 30 | console.log('otherData:', message); 31 | }) 32 | 33 | device.heartbeat.subscribe(message => { 34 | console.log('heartbeat:', message); 35 | device.builtinSwitch.setState(getSwitchState()).update(); 36 | range1.value(randomNumber()).color(randomColor()).update(); 37 | number1.value(randomNumber()).unit('米').text('长度').color(randomColor()).update(); 38 | button2.color(randomColor()).update(); 39 | button1.color(randomColor()).update(); 40 | colorPicker1.color(randomColor()).brightness(randomNumber(0, 255)).update() 41 | //device.vibrate(); 42 | }) 43 | 44 | device.builtinSwitch.change.subscribe(message => { 45 | console.log('builtinSwitch:', message); 46 | device.builtinSwitch.setState(turnSwitch()).update(); 47 | }) 48 | 49 | button1.listen().subscribe(message => { 50 | console.log('button1:', message.data); 51 | device.push('NUC设备测试'); 52 | let state = turnSwitch() 53 | button1.turn(state).update(); 54 | text1.text('button1的动作').text1(message.data).update(); 55 | if (state == 'on') 56 | image1.show(1).update() 57 | else 58 | image1.show(0).update() 59 | }) 60 | 61 | button2.listen().subscribe(message => { 62 | console.log('button2:', message); 63 | text1.text('button2的动作').text1(message.data).update(); 64 | }) 65 | 66 | range1.listen().subscribe(message => { 67 | console.log('range:', message.data); 68 | }) 69 | 70 | colorPicker1.listen().subscribe(message => { 71 | console.log('color:', message.data); 72 | console.log('red:', message.data[0]); 73 | console.log('green:', message.data[1]); 74 | console.log('blue:', message.data[2]); 75 | console.log('brightness:', message.data[3]); 76 | }) 77 | 78 | joystick1.listen().subscribe(message => { 79 | console.log('joystick:', message.data); 80 | console.log('x:', message.data[0]); 81 | console.log('y:', message.data[1]); 82 | }) 83 | 84 | 85 | chart1.listen().subscribe(message => { 86 | console.log('chart:', message.data); 87 | }) 88 | 89 | // 云存储时序数据 仅限blinker broker 90 | setInterval(() => { 91 | device.saveTsData({ 92 | humi: randomNumber(), 93 | temp: randomNumber(), 94 | pm25: randomNumber(), 95 | pm10: randomNumber() 96 | }); 97 | }, 5000) 98 | 99 | // 云存储文本数据、云存储对象数据 仅限blinker broker 100 | setTimeout(() => { 101 | device.saveTextData('text'); 102 | device.saveObjectData({ 103 | config: 111, 104 | test: 'text' 105 | }); 106 | }, 60000); 107 | 108 | // 空气、天气、天气预报 获取 109 | setTimeout(async () => { 110 | console.log("获取天气数据:"); 111 | console.log(await device.getAir()); 112 | console.log(await device.getWeather()); 113 | console.log(await device.getWeatherForecast()); 114 | }, 10000); 115 | 116 | setTimeout(() => { 117 | device.wechat('设备测试', '启动', new Date().toString()) 118 | device.push('设备测试:启动') 119 | setInterval(() => { 120 | device.wechat('设备测试', '正常运行', new Date().toString()) 121 | device.push('设备测试:正常运行') 122 | }, 86400000) 123 | }, 10000); 124 | 125 | }) 126 | 127 | 128 | 129 | 130 | /* 131 | 以下为测试用函数 132 | */ 133 | // 随机数 134 | function randomNumber(min = 0, max = 100) { 135 | let random = Math.random() 136 | return Math.floor((min + (max - min) * random)) 137 | } 138 | 139 | // 随机颜色 140 | function randomColor() { 141 | var r = Math.floor(Math.random() * 256); 142 | var g = Math.floor(Math.random() * 256); 143 | var b = Math.floor(Math.random() * 256); 144 | var color = '#' + r.toString(16) + g.toString(16) + b.toString(16); 145 | return color; 146 | } 147 | 148 | // 开关切换 149 | function getSwitchState() { 150 | return switchState ? 'on' : 'off' 151 | } 152 | let switchState = false 153 | function turnSwitch() { 154 | switchState = !switchState 155 | device.log("切换设备状态为" + (switchState ? 'on' : 'off')) 156 | return switchState ? 'on' : 'off' 157 | } 158 | 159 | ``` 160 | 161 | 162 | --- 163 | #### 更多实例 164 | 见[示例程序](https://github.com/blinker-iot/blinker-js/tree/typescript/example) 165 | 166 | #### blinker lib Api手册 167 | 您可以通过 [NodeJs支持](https://diandeng.tech/doc/javascript-support)了解更多blinker api用法 -------------------------------------------------------------------------------- /docs/003-设备端开发与SDK/01-设备端支持情况.md: -------------------------------------------------------------------------------- 1 | # 设备端支持 2 | 以下为设备端支持情况,建议一般开发者使用文档确认过硬件平台进行开发工作。 3 | 4 | ## 硬件支持 5 | 6 | 即使下面没有列出的设备,blinker理论上也可以支持,在此列出的硬件为我们已经测试过的硬件。 7 | 8 | > 以下带购买链接的硬件都是淘宝随便选的卖家,blinker无法承担其售后责任 9 | > 虽然blinker并无硬件使用限制,但强烈推荐使用以下我们已经验证过的设备, 其他设备需要自己折腾,我们很难提供技术指导 10 | 11 | ### 蓝牙ble接入支持 12 | 13 | **Aduino接入** 14 | 15 | Arduino接入需要配合 **蓝牙串口模块**,推荐以下ble模块: 16 | [openjumper ble串口模块](https://item.taobao.com/item.htm?id=39931053379) (默认波特率9600) 17 | [JDY08](https://s.click.taobao.com/AQdKmxu) / [JDY10](https://s.click.taobao.com/EHiKmxu) (默认波特率115200) 18 | [JDY18](https://s.click.taobao.com/V5iKmxu) / JDY09 (默认波特率9600) 19 | HM10 / HM11 (默认波特率9600) 20 | 21 | **Linux开发板接入** 22 | 23 | [树莓派4B](https://s.click.taobao.com/vjp5nxu) / [树莓派Zero](https://s.click.taobao.com/QoYLmxu) (需配合blinker-py或blinker-js) 24 | [香蕉派M2+](https://s.click.taobao.com/RAdLmxu) / [香蕉派Zero](https://s.click.taobao.com/yMf5nxu) (需配合blinker-py或blinker-js) 25 | 26 | **其他** 27 | [ESP32开发板](https://s.click.taobao.com/HQyLmxu) (需配合blinker-arduino库) 28 | 29 | ### WiFi接入支持 30 | 31 | [WiFiduino 8266](https://s.click.taobao.com/SFJMmxu) / WiFiduino 32 32 | [ESP8266开发板](https://s.click.taobao.com/rxtLmxu) / [ESP32开发板](https://s.click.taobao.com/HQyLmxu) 33 | [树莓派4B](https://s.click.taobao.com/vjp5nxu) / [树莓派Zero](https://s.click.taobao.com/QoYLmxu) 34 | [香蕉派M2+](https://s.click.taobao.com/RAdLmxu) / [香蕉派Zero](https://s.click.taobao.com/yMf5nxu) 35 | 36 | > 强烈推荐使用esp8266/ESP32开发板 37 | > esp8266串口AT模块也可以使用,但需要具备一定电路基础后自己折腾,我们很难提供技术指导 38 | > 使用"WiFi"字样只是为了普通开发者更好理解,实际上使用有线网络也可以接入,如树莓派接网线联网后,也可以作为blinker设备 39 | 40 | ### GPRS接入支持 41 | 42 | [LUAT AIR202 GPRS模块](https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-21310221667.30.607e7118n1Izsw&id=556521401934) 43 | 44 | ### NBIoT接入支持 45 | 46 | [SIMCOM SIM7020C NBIoT模块](https://s.click.taobao.com/WTV4nxu) 47 | 48 | ### 不支持的设备 49 | 50 | BT05 / BT05-A / HC08 / HC42 以上三种蓝牙没有在广播信息中包含mac地址,导致ios有兼容问题 51 | HC05 / HC06 / BT06 /JDY30 以上为蓝牙2.0模块,blinker目前只支持蓝牙4.x模块,且没有对2.0的支持计划 52 | 53 | > 蓝牙2.0是已淘汰的技术,新手机已经不支持蓝牙2.0,也请购买时注意,不要买到2.0设备了 54 | 55 | 56 | ## 软件支持 57 | 58 | ### Arduino支持库 59 | [Arduino支持](https://diandeng.tech/doc/arduino-support) 60 | 适用于 Arduino、esp8266、esp32 61 | 62 | ### Linux设备支持库 63 | [Python支持](https://diandeng.tech/doc/python-support) 64 | [JavaScript支持](https://diandeng.tech/doc/javascript-support) 65 | 适用于树莓派等Linux设备 66 | 67 | ### freeRTOS支持库 68 | [freeRTOS支持](https://diandeng.tech/doc/freertos-support) 69 | 适用于ESP8266/ESP32 70 | 71 | ### Nordic nRF52支持库 72 | [nRF52支持](https://diandeng.tech/doc/nordic-support) 73 | 适用于Nordic nRF52系列 74 | 75 | ### microPython支持库 76 | [microPython支持](https://diandeng.tech/doc/mpy-support) 77 | 适用于ESP32 78 | 79 | ### 其他设备接入方法 80 | [接入其他设备](https://diandeng.tech/doc/more-support) 81 | -------------------------------------------------------------------------------- /docs/003-设备端开发与SDK/03-freeRTOS支持.md: -------------------------------------------------------------------------------- 1 | # blinker freeRTOS支持库 2 | 针对ESP8266/ESP32设备的blinker库,需配合ESP-IDF使用。 3 | github:https://github.com/blinker-iot/blinker-esp-idf 4 | 5 | ## 支持的硬件 6 | * 使用 [ESP8266_RTOS_SDK v3.4](https://github.com/espressif/ESP8266_RTOS_SDK/releases/tag/v3.4) 的ESP8266 7 | * 使用 [esp-idf v4.3](https://github.com/espressif/esp-idf/releases/v4.3) 的ESP32 8 | 9 | ## 注意事项 10 | * SSL 使用的 wolfssl 11 | * MQTT 使用的 esp-mqtt 12 | 13 | ## 支持的接入方式 14 | * WiFi 15 | 16 | ## 准备工作 17 | 使用前您需要做好如下准备: 18 | * 安装 [ESP8266_RTOS_SDK](https://github.com/espressif/ESP8266_RTOS_SDK) 或者 [esp-idf](https://github.com/espressif/esp-idf) 的ESP-IDF 19 | * 下载 [blinker-freertos](https://github.com/blinker-iot/blinker-esp-idf) 将 **blinker** 文件夹放入自己所需项目下的 **component** 文件夹中即可 20 | 21 | > 注:1. ESP32及ESP8266的components文件夹下分别有**blinker**及**esp_http_server**两个文件夹 22 | > 将**esp_http_server**剪切并到**sdk安装目录下的components内**并覆盖原来的esp_http_server文件 23 | > 如 C:\Espressif\frameworks\esp-idf-v4.3.4\components 24 | > 2. 新建项目后将**blinker**复制到项目的**components**目录下, 目录如下: 25 | > blinker_example 26 | > |__components 27 | > | |__blinker 28 | > |__main 29 | 30 | 按如上方法配置好使用环境后输入 31 | > idf.py menuconfig 32 | 33 | 可进入idf配置页面 在菜单主页中可以看到blinker配置选项, 选中blinker进入并配置相关参数 34 | > set BLINKER DEVICE TYPE 35 | > set BLINKER AUTH KEY 36 | > set Provisioning Type 37 | 38 | 依次设置设备类型、设备auth key、配网方式, 设置完成后保存并退出blinker配置页面 39 | 进入**components**配置页面 40 | > enable mDNS 41 | > disable Newlib 42 | > enable webSocket server support(http_server) 43 | 44 | 依次设置如上三个component, 设置完成后保存并退出即可开始编译测试 45 | 46 | 47 | 48 | ## Blinker接口函数 49 | ### 设备配置 50 | 使用 **blinker_init()** 来配置Blinker: 51 | > 主要参数配置在idf中配置 52 | 53 | WiFi: 54 | ```cpp 55 | #include 56 | 57 | void app_main() { 58 | blinker_init(); 59 | } 60 | ``` 61 | 62 | #### blinker_init() 63 | 完成设备功能初始化函数 64 | **注:设备WIFI/PRO 接入类型及语音助手等设置在IDF中设置** 65 | 66 | ### 数据管理 67 | #### blinker_data_handler() 68 | 注册回调函数,当有设备收到APP发来的数据时会调用对应的回调函数 69 | 70 | 回调函数: 71 | ```cpp 72 | static void data_callback(const char *data) 73 | { 74 | ESP_LOGI(TAG, "data: %s", data); 75 | } 76 | ``` 77 | 注册回调函数: 78 | ```cpp 79 | blinker_data_handler(data_callback); 80 | ``` 81 | 82 | ### App组件 83 | #### BlinkerButton 84 | 按键组件在App中可以设置 按键/开关/自定义 三种模式: 85 | - **按键** 模式下支持 点按/长按/释放(tap/press/pressup) 三个动作 86 | - **开关** 模式下支持 打开/关闭(on/off) 两个动作 87 | - **自定义** 模式下支持 自定义指令 发送 88 | 89 | 初始化, 创建对象 90 | ```cpp 91 | BlinkerButton button1 = {.name = "btn-abc"}; 92 | ``` 93 | 用于处理 **button** 收到数据的回调函数 94 | ```cpp 95 | void button1_callback(const char *data) 96 | { 97 | BLINKER_LOG(TAG, "get button data: %s", data); 98 | 99 | blinker_button_config_t config = { 100 | .icon = "fas fa-alicorn", 101 | .color = "0xFF", 102 | .text1 = "test", 103 | }; 104 | 105 | blinker_button_print(&button1, &config); 106 | } 107 | ``` 108 | 注册回调函数 109 | ```cpp 110 | blinker_button_init(&button1, button1_callback); 111 | ``` 112 | > 在回调函数中, **state** 的值为: 113 | > - **按键** : "tap"(点按); "press"(长按); "pressup"(释放) 114 | > - **开关** : "on"(打开); "off"(关闭) 115 | > - **自定义** : 用户设置的值 116 | 117 | **blinker_button_config_t**: 118 | - state 119 | *const char \*state* 120 | 设置按键的状态 121 | - icon 122 | *const char \*icon* 123 | 设置按键中显示的图标(icon), [图标列表及对应图标名称见](https://fontawesome.com/v5/search) 124 | - color 125 | *const char \*color* 126 | 设置按键中显示图标的颜色, [HTML颜色表](http://www.w3school.com.cn/tags/html_ref_colornames.asp) 127 | - content 128 | *const char \*content* 129 | 设置按键中显示图标的内容 130 | - text 131 | *const char \*text1* 132 | 设置按键中显示的名字或者描述 133 | *const char \*text1* 134 | 一段描述文字 135 | *const char \*text1* 136 | *const char \*text2* 137 | 两段描述文字 138 | - text_color 139 | *const char \*text_color* 140 | 设置按键中显示文字的颜色, [HTML颜色表](http://www.w3school.com.cn/tags/html_ref_colornames.asp) 141 | 142 | -------------------------------------------------------------------------------- /docs/003-设备端开发与SDK/04-Python支持.md: -------------------------------------------------------------------------------- 1 | # Python支持模块 2 | Blinker Python模块支持 3 | [Github](https://github.com/blinker-iot/blinker-py) 4 | 5 | ## 支持情况 6 | 树莓派(Raspberry Pi)、香蕉派等Linux设备、Windows、MacOS等 7 | 8 | ## 环境/依赖安装 9 | 模块暂时无法通过pip安装 10 | 使用blinker Python SDK前请先安装Python `3.7+`版本 11 | 12 | ```shell 13 | git clone https://github.com/blinker-iot/blinker-py.git 14 | cd blinker-py 15 | pip3 install --upgrade pip 16 | pip3 install --upgrade . 17 | ``` 18 | 19 | 20 | 21 | ## 示例程序 22 | 23 | [示例程序](https://github.com/blinker-iot/blinker-py/tree/dev_3.0/example) 24 | 25 | 26 | ## 设备操作 27 | 28 | ### 实例化设备 29 | 30 | ```py 31 | from blinker import Device 32 | device = Device("authKey") 33 | ``` 34 | 35 | 36 | 37 | ### 可用配置项 38 | 39 | ```python 40 | from blinker import Device 41 | device = Device(auth_key, protocol: str = "mqtt", websocket: bool = True, source_check: bool = False, 42 | version: str = "1.0", ali_type: str = None, duer_type: str = None, mi_type: str = None, 43 | heartbeat_func=None, realtime_func=None, ready_func=None, builtin_switch_func=None) 44 | ``` 45 | 46 | - `protocol` 指定设备连接协议,可选`mqtt/mqtts/ws/wss` 47 | - `websocket` 开启后,会占用`81`端口,用于局域网中设备直接通信,如有安全性要求请关闭该功能 48 | - `source_check` 开启后,会检查信息来源,设备只会处理所属用户发来的信息,如需设备间通信,请关闭该功能 49 | - `version` 指定当前设备固件版本 50 | - `ali_type` 指定在天猫精灵中模拟的设备类型 51 | - `duer_type` 指定在小度中模拟的设备类型 52 | - `mi_type` 指定在小爱中模拟的设备类型 53 | - `heartbeat_func` 指定在APP与设备心跳反馈过程中执行的相关动作 54 | - `realtime_func` 指定在收到实时数据请求时执行的相关动作 55 | - `ready_func` 指定在设别连接上broker并加载完成配置后执行的相关动作 56 | - `builtin_switch_func` 指定内置开关"switch"收到消息后执行的相关动作 57 | 58 | 59 | 60 | ### 设备初始化完成回调设置 61 | 62 | 可设置初始化完成回调函数,在设备连接broker并加载完配置后执行相关动作 63 | 64 | ```python 65 | from blinker import Device 66 | 67 | async def ready_func(): 68 | # 初始化完成后进行的操作 69 | pass 70 | 71 | # 方式一 72 | device = Device("authKey", ready_func=ready_func) 73 | 74 | # 方式二 75 | device = Device("authKey") 76 | device.ready_callback = ready_func 77 | 78 | if __name__ == "main": 79 | device.run() 80 | ``` 81 | 82 | ### 心跳反馈回调设置 83 | 84 | ```python 85 | from blinker import Device 86 | 87 | async def heartbeat_func(msg): 88 | print("Heartbeat received msg: {0}".format(msg)) 89 | 90 | device = Device("authKey", heartbeat_func=heartbeat_func) 91 | 92 | if __name__ == '__main__': 93 | device.run() 94 | 95 | ``` 96 | 97 | ### 其它数据 98 | 99 | ```python 100 | from blinker import Device 101 | 102 | async def ready_func(): 103 | print(device.data_reader.get()) 104 | 105 | device = Device("authKey", ready_func=ready_func) 106 | 107 | if __name__ == '__main__': 108 | device.run() 109 | ``` 110 | 111 | ### 震动 112 | 113 | ```python 114 | from blinker import Device 115 | 116 | async def ready_func(): 117 | device.vibrate() 118 | 119 | device = Device("authKey", ready_func=ready_func) 120 | 121 | if __name__ == '__main__': 122 | device.run() 123 | ``` 124 | 125 | ### 开关 126 | 127 | ```python 128 | from blinker import Device 129 | 130 | async def builtin_switch_func(msg): 131 | print("builtinSwitch: {0}".format(msg)) 132 | if msg["switch"] == "on": 133 | await (await device.builtinSwitch.set_state("on")).update() 134 | else: 135 | await (await device.builtinSwitch.set_state("off")).update() 136 | 137 | device = Device("authKey", builtin_switch_func=builtin_switch_func) 138 | 139 | if __name__ == '__main__': 140 | device.run() 141 | ``` 142 | 143 | 144 | 145 | ## MQTT相关 146 | 147 | ### 向指定设备发送数据 148 | 149 | ```python 150 | from blinker import Device 151 | 152 | async def ready_func(): 153 | msg = {"abc": 123} 154 | to_device = "设备名" 155 | await device.sendMessage(msg, to_device) 156 | 157 | device = Device("authKey", protocol="mqtts", ready_func=ready_func) 158 | 159 | if __name__ == '__main__': 160 | device.run() 161 | ``` 162 | 163 | 164 | 165 | ## 其他 166 | 167 | ### 短信通知 168 | 169 | > 往注册手机号发送短信通知,该功能仅限专业版用户使用 10条/天/人, 20字/条,1次/分钟, 170 | 171 | ```python 172 | from blinker import Device 173 | 174 | async def ready_func(): 175 | await device.sendSms("test") 176 | 177 | device = Device("authKey", protocol="mqtts", ready_func=ready_func) 178 | 179 | if __name__ == '__main__': 180 | device.run() 181 | ``` 182 | 183 | 184 | 185 | ### 微信通知 186 | 187 | ```python 188 | from blinker import Device 189 | 190 | async def ready_func(): 191 | await device.wechat(title="消息测试", state="异常", text="设备1出现异常") 192 | 193 | device = Device("authKey", protocol="mqtts", ready_func=ready_func) 194 | 195 | if __name__ == '__main__': 196 | device.run() 197 | ``` 198 | 199 | 200 | 201 | ## Layouter组建操作 202 | 203 | ### 组件引入并实例化 204 | 205 | ```python 206 | from blinker import ( 207 | Device, 208 | ButtonWidget, 209 | TextWidget, 210 | RangeWidget, 211 | NumberWidget, 212 | RGBWidget, 213 | JoystickWidget 214 | ) 215 | 216 | device = Deivce("authKey") 217 | 218 | button: ButtonWidget = device.addWidget(ButtonWidget('btn-xxx')) 219 | text: TextWidget = device.addWidget(TextWidget('tex-xxx')) 220 | range1: RangeWidget = device.addWidget(RangeWidget('ran-xxx')) 221 | number: NumberWidget = device.addWidget(NumberWidget('num-xxx')) 222 | color_picker: RGBWidget = device.addWidget(RGBWidget('col-xxx')) 223 | joystick: JoystickWidget = device.addWidget(JoystickWidget('joy-xxx')) 224 | image: ImageWidget = device.addWidget(ImageWidget('img-xxx')) 225 | ``` 226 | 227 | 228 | 229 | ### 文本组件 230 | 231 | ```python 232 | await text.text('要显示的文本内容').text1('要显示的文本内容').icon('fad fa-sun').color('#FFFFFF').update(); 233 | ``` 234 | 235 | ### 数字组件 236 | 237 | ```python 238 | await number.value(123).unit('单位').text('文字说明').color('#FFFFFF').update() 239 | ``` 240 | 241 | ### 按键组件 242 | 243 | #### 动作监听 244 | 245 | ```python 246 | async def button_callback(msg): 247 | print("Button received: {0}".format(msg)) 248 | 249 | button.func = button_callback 250 | ``` 251 | 252 | #### 状态改变 253 | 254 | ```python 255 | await button.turn('on/off').color('#FFFFFF').icon('fad fa-sun').text('文字说明').update() 256 | ``` 257 | 258 | ### 滑动条组件 259 | 260 | #### 动作监听 261 | 262 | ```python 263 | async range_callback(msg): 264 | print("Range received: {0}".format(msg)) 265 | 266 | range1.func = range_callback 267 | ``` 268 | 269 | #### 状态改变 270 | 271 | ```python 272 | await range1.value(123).max(300).color('#FFFFFF').text('文字说明').update(); 273 | ``` 274 | 275 | ### 颜色选择组件 276 | 277 | #### 动作监听 278 | 279 | ```python 280 | async color_picker_callback(msg): 281 | print('color: ', message.data) 282 | print('red:', message.data[0]) 283 | print('green:', message.data[1]) 284 | print('blue:', message.data[2]) 285 | print('brightness:', message.data[3]) 286 | 287 | color_picker.func = color_picker_callback 288 | ``` 289 | 290 | #### 状态改变 291 | 292 | ```python 293 | await colorPicker.color(randomColor()).brightness(randomNumber(0, 255)).update() 294 | ``` 295 | 296 | ### 摇杆组件 297 | 298 | #### 动作监听 299 | 300 | ```python 301 | async joystick_callback(msg): 302 | print('joystick:', message.data) 303 | print('x:', message.data[0]) 304 | print('y:', message.data[1]) 305 | ``` 306 | 307 | ### 图片组件 308 | 309 | #### 切换图片 310 | 311 | ```python 312 | await image.show(1).update() 313 | ``` 314 | 315 | 316 | 317 | ## 存储 318 | 319 | ### 时序数据存储 320 | 321 | ```python 322 | await device.saveTsData({ 323 | "humi": randomNumber(), 324 | "temp": randomNumber(), 325 | "pm25": randomNumber(), 326 | "pm10": randomNumber() 327 | }) 328 | ``` 329 | 330 | ### 对象存储 331 | 332 | #### 存储 333 | 334 | ```python 335 | await device.saveObjectData({"hello": "blinker"}) 336 | ``` 337 | 338 | #### 获取 339 | 340 | ```python 341 | TODO 342 | ``` 343 | 344 | ### 文本存储 345 | 346 | #### 存储 347 | 348 | ```python 349 | await device.saveTextData("Helo, blinker") 350 | ``` 351 | 352 | #### 获取 353 | 354 | ```python 355 | TODO 356 | ``` 357 | 358 | ### 日志存储 359 | 360 | #### 存储 361 | 362 | ```python 363 | await device.saveLogData("This is log test") 364 | ``` 365 | 366 | 367 | 368 | ## 气象数据 369 | 370 | 气象数据接口,默认使用IP定位返回当前位置的气象数据,也可以通过参数cityCode([国家行政区编码](http://preview.www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html))来获取指定位置的数据。 371 | 更多说明可见[气象数据接口](https://diandeng.tech/doc/weather-and-air) 372 | 373 | 通过ip定位获取: 374 | 375 | ```python 376 | air = await device.getAir() 377 | weather = await device.getWeather() 378 | weatherForecast = await device.getWeatherForecast() 379 | ``` 380 | 381 | 通过cityCode指定位置获取: 382 | 383 | ```python 384 | air = await device.getAir(510100) 385 | weather = await device.getWeather(510100) 386 | weatherForecast = await device.getWeatherForecast(510100) 387 | ``` 388 | 389 | 390 | 391 | ## 语音助手接入 392 | 393 | [接入示例](https://github.com/blinker-iot/blinker-py/blob/dev_3.0/example/voice_assistant.py) 394 | 395 | **注意事项:**开发过程中,如果改变了设备类型,需要在小度音箱App中解绑再重新绑定才能正常同步出设备。 396 | 397 | 398 | 399 | # 部署 400 | 401 | 可使用[supervisor](http://supervisord.org/installing.html)来部署 402 | 403 | -------------------------------------------------------------------------------- /docs/003-设备端开发与SDK/07-Nordic_nRF52支持.md: -------------------------------------------------------------------------------- 1 | # Blinker Nordic nRF52支持库 2 | 针对 Nordic nRF52xx 系列芯片的Blinker库,需配合 [nRF5 SDK v16.0.0](https://infocenter.nordicsemi.com/topic/struct_sdk/struct/sdk_nrf5_latest.html?cp=7_1) 和 [nRF5 SDK for Mesh v4.0.0](https://infocenter.nordicsemi.com/topic/struct_sdk/struct/sdk_mesh_latest.html?cp=7_2) 3 | 4 | ## 注意 5 | - 有较强的自学能力及文档阅读能力 6 | - nRF52xx 系列开发板 7 | 8 | ## 支持的硬件 9 | * [nRF52xx boards](https://www.nordicsemi.com/Software-and-tools/Development-Kits) 10 | 11 | ## 支持的接入方式 12 | * BLE 5.0 13 | * BLE MESH 14 | 15 | ## 支持的功能 16 | - BLE 5.0 17 | - 直接与手机端/用户端 BLE 连接通信 18 | - 上报/查询设备状态 19 | - BLE MESH 20 | - MESH 网关 21 | - 上传节点数据到云端 22 | - 下发控制数据到节点 23 | - MESH 中继节点 24 | - 中继转发数据 25 | - MESH 低功耗节点 26 | - 上报节点数据 27 | - 执行控制指令 28 | - BLE DFU 29 | - BLE Secure DFU 加密更新 30 | - BLE MESH Secure DFU 加密更新 31 | 32 | ## 支持的应用 33 | - BLE 5.0 34 | - 心跳/睡眠/运动数据 检测上报 35 | - beacon 室内/外定位 36 | - 蓝牙遥控/键盘 等控制设备 37 | - BLE MESH 38 | - 智能家居设备组网 39 | - 灯/开关/窗帘/门磁/温湿度检测 40 | - 工业设备组网 41 | - 工业设备定位/设备运行状态上传/设备控制下发 42 | - 农业设备组网 43 | - 农产品溯源/养殖环境数据上报 44 | - 室内外定位 45 | - 停车场寻车/运动定位及轨迹上报 46 | - BLE DFU 47 | - 基于BLE 5.0加密DFU,可直接手机直连DFU更新 48 | - 基于BLE MESH加密DFU,可直接全部设备或按设备类型等进行分类DFU更新 49 | 50 | ## 准备工作 51 | 使用前您需要做好如下准备: 52 | * 基于官方开发套件 [SES开发环境配置](https://infocenter.nordicsemi.com/pdf/getting_started_ses.pdf) 53 | * [SEGGER Embedded Studio](https://www.segger.com/downloads/embedded-studio/) 54 | * [nRF Command Line Tools](https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Command-Line-Tools/Download#infotabs) 55 | * [micro_ecc](https://infocenter.nordicsemi.com/topic/sdk_nrf5_v16.0.0/lib_crypto_backend_micro_ecc.html#lib_crypto_backend_micro_ecc_install) 56 | * [nrfutil](https://infocenter.nordicsemi.com/topic/ug_nrfutil/UG/nrfutil/nrfutil_installing.html) 57 | 58 | -------------------------------------------------------------------------------- /docs/003-设备端开发与SDK/08-NodeJs支持.md: -------------------------------------------------------------------------------- 1 | # JavaScript支持模块 2 | blinker JavaScript/TypeScript模块支持 3 | [Github](https://github.com/blinker-iot/blinker-js) 4 | 5 | ## 支持情况 6 | 树莓派(Raspberry Pi)、香蕉派等Linux设备、Windows、MacOS等 7 | 8 | ## 环境/依赖安装 9 | 模块暂时无法通过npm安装 10 | 使用blinker Nodejs SDK前请先安装最新的nodejs LTS版本及TypeScript 11 | 12 | ```shell 13 | npm i -g ts-node 14 | git clone https://github.com/blinker-iot/blinker-js.git 15 | cd blinker-js 16 | npm i 17 | ``` 18 | 19 | ## 示例程序 20 | 21 | [基础示例程序](https://github.com/blinker-iot/blinker-js/blob/typescript/example/example.ts) 22 | 23 | ```shell 24 | ts-node .\example\example.ts 25 | ``` 26 | 27 | ## 设备操作 28 | 29 | ### 实例化设备 30 | 31 | ```js 32 | import { BlinkerDevice } from './blinker'; 33 | let device = new BlinkerDevice(authkey); 34 | ``` 35 | 36 | ## 可用配置项 37 | 38 | ```js 39 | let device = new BlinkerDevice('authkey',{ 40 | protocol: 'mqtts', // 可选协议mqtt/mqtts/ws/wss 41 | webSocket: true, // 是否开启本地webSocket,默认开启 42 | sourceCheck: true, // 是否开启来源检查,默认开启 43 | }); 44 | ``` 45 | protocol: 指定设备连接协议,可选mqtt/mqtts/ws/wss。默认为mqtts。 46 | webSocket:开启后,会占用设备81端口,用于局域网中设备直接通信。如有安全性要求请关闭该功能。 47 | sourceCheck:开启后,会检查消息来源,设备只会处理所属用户发来的消息。如需设备间通信,请关闭该功能。 48 | 49 | 50 | 51 | 52 | ### 等待设备初始化完成 53 | 设备在连接到broker并加载完配置后,将进入ready状态,建议设备相关操作都在ready后进行。 54 | ```js 55 | device.ready().then(() => { 56 | //初始化完成后进行的操作 57 | }) 58 | ``` 59 | 60 | ### 心跳 反馈 61 | 62 | ```js 63 | device.heartbeat.subscribe(message => { 64 | console.log('heartbeat:', message); 65 | }) 66 | ``` 67 | 68 | ### 其他数据 69 | 70 | ```javascript 71 | device.dataRead.subscribe(message => { 72 | console.log('otherData:', message); 73 | }) 74 | ``` 75 | 76 | ### 震动 77 | 78 | ```js 79 | device.vibrate(); 80 | ``` 81 | 82 | ### 开关 83 | 84 | ```js 85 | device.builtinSwitch.change.subscribe(message => { 86 | console.log('builtinSwitch:', message); 87 | device.builtinSwitch.setState("on/off").update(); 88 | }) 89 | ``` 90 | 91 | 92 | 93 | ## MQTT相关 94 | 95 | 用户可通过 BlinkerDevice.mqttClient 直接操作mqtt客户端,相关API见[mqtt.js Github](https://github.com/mqttjs/MQTT.js) 96 | 97 | ```javascript 98 | let mqttClient = device.mqttClient 99 | ``` 100 | 101 | ### 发送消息 102 | 103 | 向指定设备发送数据 104 | 105 | ```javascript 106 | let message = {"abc" : 123} 107 | let toDevice = 'ABCDEFGHIJ' // 设备识别码 108 | device.sendMessage(message, toDevice) 109 | ``` 110 | 111 | 112 | 113 | ## 其他 114 | 115 | ### 短信通知 116 | **该功能仅限专业版用户使用 10条/天/人, 20字/条,1次/分钟,只能向注册手机号发送短信通知** 117 | 118 | ```js 119 | device.sendSms('text') 120 | ``` 121 | 122 | ### 微信通知 123 | 124 | ```js 125 | device.wechat('text') 126 | ``` 127 | 128 | ### App通知 129 | 130 | ```js 131 | device.push('text') 132 | ``` 133 | 134 | ## Layouter组件操作 135 | 136 | 使用前请先引入相关组件 137 | 138 | ```js 139 | import { 140 | ButtonWidget, 141 | TextWidget, 142 | RangeWidget, 143 | NumberWidget, 144 | RGBWidget, 145 | JoystickWidget 146 | } from './widget'; 147 | ``` 148 | 149 | 实例化并注册组件,构造函数参数为App中设置的key,如: 150 | 151 | ```js 152 | let button: ButtonWidget = device.addWidget(new ButtonWidget('btn-xxx')); 153 | let text: TextWidget = device.addWidget(new TextWidget('tex-xxx')); 154 | let range: RangeWidget = device.addWidget(new RangeWidget('ran-xxx')); 155 | let number: NumberWidget = device.addWidget(new NumberWidget('num-xxx')); 156 | let colorPicker: RGBWidget = device.addWidget(new RGBWidget('col-xxx')); 157 | let joystick: JoystickWidget = device.addWidget(new JoystickWidget('joy-xxx')); 158 | let image: ImageWidget = device.addWidget(new ImageWidget('img-xxx')); 159 | ``` 160 | 161 | ### 文本组件 162 | 163 | ```js 164 | text.text('要显示的文本内容').text1('要显示的文本内容').icon('fad fa-sun').color('#FFFFFF').update(); 165 | ``` 166 | 167 | ### 数字组件 168 | 169 | ```js 170 | number.value(123).unit('单位').text('文字说明').color('#FFFFFF').update(); 171 | ``` 172 | 173 | ### 按键组件 174 | 175 | 动作监听 176 | 177 | ```js 178 | button.listen().subscribe(message => { 179 | console.log('button1:', message.data); 180 | }) 181 | ``` 182 | 183 | 状态改变 184 | 185 | ```js 186 | button.turn('on/off').color('#FFFFFF').icon('fad fa-sun').text('文字说明').update(); 187 | ``` 188 | 189 | ### 滑动条组件 190 | 191 | 动作监听 192 | 193 | ```js 194 | range.listen().subscribe(message => { 195 | console.log('range:', message.data); 196 | }) 197 | ``` 198 | 199 | 状态改变 200 | 201 | ```js 202 | range1.value(123).max(300).color('#FFFFFF').text('文字说明').update(); 203 | ``` 204 | 205 | ### 颜色选择组件 206 | 207 | 动作监听 208 | 209 | ```js 210 | colorPicker.listen().subscribe(message => { 211 | console.log('color:', message.data); 212 | console.log('red:', message.data[0]); 213 | console.log('green:', message.data[1]); 214 | console.log('blue:', message.data[2]); 215 | console.log('brightness:', message.data[3]); 216 | }) 217 | ``` 218 | 219 | 状态改变 220 | 221 | ```js 222 | colorPicker.color(randomColor()).brightness(randomNumber(0, 255)).update() 223 | ``` 224 | 225 | ### 摇杆组件 226 | 227 | 动作监听 228 | 229 | ```js 230 | joystick1.listen().subscribe(message => { 231 | console.log('joystick:', message.data); 232 | console.log('x:', message.data[0]); 233 | console.log('y:', message.data[1]); 234 | }) 235 | ``` 236 | 237 | ### 图片组件 238 | 239 | 切换图片 240 | 241 | ```js 242 | image.show(1).update() 243 | ``` 244 | 245 | ## 数据存储 246 | 247 | ### 时序数据存储 248 | 249 | ```js 250 | device.saveTsData({ 251 | humi: randomNumber(), 252 | temp: randomNumber(), 253 | pm25: randomNumber(), 254 | pm10: randomNumber() 255 | }); 256 | ``` 257 | 258 | 时序数据存储有如下限制: 259 | 1.采集频率最高为5秒1次,上传最高频率为1分钟1次 260 | 2.每次上传数据不得超过5kb 261 | 达到以上限制,则会存储失败,并被broker自动断开 262 | 263 | #### 时序数据获取 264 | 265 | 待提供 266 | 267 | ### 对象存储 268 | 269 | ```js 270 | device.saveObjectData({ 271 | key1: 123, 272 | key2: 'abc' 273 | }); 274 | ``` 275 | 276 | 免费版、专业版对象数据存储有如下限制: 277 | 1.上传最高频率为1分钟1次 278 | 2.每次上传数据不得超过5kb 279 | 达到以上限制,则会存储失败,并被broker自动断开 280 | 281 | #### 对象数据获取 282 | 283 | ```js 284 | device.loadObjectData('key'); 285 | ``` 286 | 287 | ### 文本存储 288 | 289 | ```js 290 | device.saveTextData('text'); 291 | ``` 292 | 293 | 对象数据存储有如下限制: 294 | 1.上传最高频率为1分钟1次 295 | 2.每次上传数据不得超过1kb 296 | 达到以上限制,则会存储失败,并被broker自动断开 297 | 298 | #### 文本数据获取 299 | 300 | ```js 301 | device.loadTextData(); 302 | ``` 303 | 304 | ## 气象数据 305 | 306 | 气象数据接口,默认使用IP定位返回当前位置的气象数据,也可以通过参数cityCode([国家行政区编码](http://preview.www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html))来获取指定位置的数据。 307 | 更多说明可见[气象数据接口](https://diandeng.tech/doc/weather-and-air) 308 | 309 | 通过ip定位获取: 310 | 311 | ```js 312 | let air = await device.getAir() 313 | let weather = await device.getWeather() 314 | let weatherForecast = await device.getWeatherForecast() 315 | ``` 316 | 317 | 通过cityCode指定位置获取: 318 | 319 | ```js 320 | let air = await device.getAir() 321 | let weather = await device.getWeather() 322 | let weatherForecast = await device.getWeatherForecast() 323 | ``` 324 | 325 | ## 语音助手接入 326 | 327 | [小度示例](https://github.com/blinker-iot/blinker-js/tree/typescript/example/dueros) 328 | [天猫精灵示例](https://github.com/blinker-iot/blinker-js/tree/typescript/example/aligenie) 329 | [小爱示例](https://github.com/blinker-iot/blinker-js/tree/typescript/example/miot) 330 | 331 | **注意事项:**开发过程中,如果改变了设备类型,需要在小度音箱App中解绑再重新绑定才能正常同步出设备。 332 | 333 | # 部署 334 | blinker的nodejs程序和常见nodejs程序无异,推荐使用pm2部署。 335 | 336 | # 企业版 337 | 服务独立部署后,可通过修改 /lib/server.config.ts 修改服务器地址 338 | 339 | # 支持情况 340 | ButtonWidget 341 | TextWidget 342 | NumberWidget 343 | RangeWidget 344 | RGBWidget 345 | JoystickWidget 346 | 347 | ## 已支持 348 | 基本MQTT通信 349 | Layouter组件 350 | 时序数据存储(仅限blinker broker) 351 | 文本数据存储(仅限blinker broker) 352 | 对象数据存储(仅限blinker broker) 353 | 倒计时 354 | 定时 355 | 短信通知 356 | 微信通知 357 | App推送 358 | 局域网ws通信 359 | 设备分享 360 | 天气/天气预报/空气 数据获取 361 | 语音助手(小度/天猫精灵/小爱) 362 | 363 | ## 即将支持 364 | APCONFIG(AP配网) 365 | QRCONFIG(扫码配置) 366 | 专属设备 367 | 更多组件支持 -------------------------------------------------------------------------------- /docs/005-功能/00-App功能.md: -------------------------------------------------------------------------------- 1 | # App功能列表 2 | 功能列表如下: 3 | 4 | ## 用户相关 5 | ### 登录/注册/找回密码 6 | ### 修改密码/头像/个人资料 7 | 8 | ## 设备相关 9 | ### 设备列表 10 | ### 设备管理 11 | ### 添加设备 12 | ### 解绑设备 13 | ### 定时任务 14 | ### 地理设置 15 | 16 | ## 扩展功能 17 | ## 设备共享 18 | ## 场景管理/快捷控制 19 | ## 区域管理/设备分组 20 | ## 消息盒子/消息推送 21 | ## 自动化管理 22 | ## 使用帮助 23 | ## 联系客服 24 | 25 | ## 开发相关 26 | ### 数据管理 27 | ### 专属设备管理 28 | ### 开发工具 29 | 30 | ## 应用设置 31 | 32 | -------------------------------------------------------------------------------- /docs/005-功能/01-添加设备.md: -------------------------------------------------------------------------------- 1 | # 添加设备 2 | 通过添加设备页面,您可以添加设备到您的账号。 3 | 在**我的设备**页面点击右上角的“+”图标,即可进入**添加设备**页面,页面如下: 4 | ![](../img/005/01-1.jpg) 5 | 6 | ## 独立设备 7 | 对于DIY用户,目前支持的硬件设备有: 8 | ### Arduino 9 | 使用Arduino SDK的开发板:官方Arduino、esp8266开发板、esp32开发板等 10 | 11 | ### Linux开发板 12 | 使用Linux操作系统的设备:树莓派、香蕉派等 13 | 14 | ## 专属设备 15 | 专属设备是开发者开发后,可用于生产销售的设备; 16 | 设备可通过blinker app配网,自动派发唯一密钥; 17 | 设备可通过自定义按键重置配网状态; 18 | 更多可见 [专属设备开发说明](https://diandeng.tech/doc/prodevice) 19 | 20 | ## 通信中介设定 21 | blinker支持多种iot云服务,也提供了自有的broker解决方案。 22 | 23 | 更多硬件支持信息可查阅[硬件支持情况](https://diandeng.tech/doc/device-support) -------------------------------------------------------------------------------- /docs/005-功能/02-自定义布局.md: -------------------------------------------------------------------------------- 1 | # 自定界面功能 2 | 部分设备支持自定义设备控制面板,如Arduino、树莓派等。 3 | 利用自定义设备控制面板的功能,用户可以将自己开发的设备接入到本软件中,实现个性化的控制。 4 | 5 | ## 组件通信 6 | 组件用于和设备交互。一些组件可以向设备发送数据,一些组件可以接收设备发来的数据并显示出来。 7 | 大部分组件都有一个键值(key),设备端开发时,对应程序中需要设定组件的键值。 8 | 关于组件指令内容,可见[通信指令](https://diandeng.tech/doc/cmd) 9 | 10 | ## 使用方法 11 | ### 开启界面编辑 12 | 进入设备控制面板,点击页面右上方的编辑按钮,可以进入界面编辑状态。 13 | 14 | ### 添加组件 15 | 在界面编辑状态下,点击下方组件图标,可以选择要添加的组件。 16 | 17 | ### 改变组件位置 18 | 在界面编辑状态下,拖拽组件可以改变组件位置。 19 | 20 | ### 编辑组件 21 | 点击组件,可以设置这个组件的显示风格,或改变其参数. 22 | 23 | 在编辑界面上方,是预览区域,可以看到组件设置改变后的外观,点击切换不同风格,可以改变组件的外观 24 | 25 | 中间为参数设置区域,用户可以修改其中内容,显示文本用于设置组件在app中显示的文字内容 26 | 27 | 左上不保存退出编辑模式,右上保存退出,页面底部为删除组件按钮。 28 | 29 | **按键组件**、**开关组件**可绑定语音指令,设置方法见[语音控制](https://diandeng.tech/doc/app-speech) 30 | 31 | ### 保存界面 32 | 编辑好界面后,可以通过点击界面右上角的上传按钮,即可保存界面。 33 | 34 | 35 | # blinker Layouter2 36 | blinker Layouter2是当前blinker App提供的拖拽式界面布局器。 37 | 38 | ## 组件介绍 39 | 40 | ### 文字 41 | 用于文字显示 42 | [示例程序](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_Widgets/Blinker_TEXT) 43 | 44 | ### 按键 45 | 提供用户交互的按键 46 | [示例程序](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_Widgets/Blinker_Button) 47 | 48 | ### 数据 49 | 用于数据显示 50 | [示例程序](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_Widgets/Blinker_Number) 51 | 52 | ### 滑块 53 | 提供用户交互的滑动条 54 | [示例程序](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_Widgets/Blinker_Slider) 55 | 56 | ### 颜色 57 | 提供用户交互的颜色亮度选择器 58 | [示例程序](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_Widgets/Blinker_RGB) 59 | 60 | ### 摇杆 61 | 因为摇杆控制,会发送较多消息,直接提高了我们服务运行成本,因此我们目前只面向付费用户提供该组件。 62 | 关于摇杆组件使用说明如下: 63 | 1. 在mqtt通信状态下,触摸停顿即会发送摇杆数据; 64 | 2. 如需提高摇杆组件通信频率,你可以使用局域网通信(wifi接入后,让设备和app在同一局域网中运行,即会切换到局域网通信) 或 使用蓝牙接入设备; 65 | 3. 你可以添加一个调试组件,方便查看摇杆组件发送了什么数据; 66 | 4. 设备请不要频繁向app反馈信息,可能会照成通信锁死,或app卡顿; 67 | [示例程序](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_Widgets/Blinker_Joystick) 68 | 69 | ### 调试 70 | 用于设备调试 71 | 通过调试组件,用户可以看到APP端收到和发送的信息 72 | 73 | ### 图表 74 | **该功能目前仅支持wifi接入的设备** 75 | 用于显示历史数据的组件 76 | [使用说明](https://diandeng.tech/doc/cloud-storage) 77 | [示例程序](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_Cloud/Blinker_CLOUDDATA/CLOUDDATA_WiFi/CLOUDDATA_WiFi.ino) 78 | 79 | ### 地图 80 | **该组件处于测试阶段** 81 | 用于显示设备位置的组件,可通过设备设置>地理位置,手动设置设备位置,设置之后地图组件上即可显示设备位置。 82 | 83 | ### 视频 84 | 允许用户接入HLS、MJPG视频流 85 | 编辑组件时填入对应资源地址,即可加载视频 86 | [视频接入方法](https://arduino.me/s/2?aid=756) 87 | 88 | ### 输入框 89 | 用户可通过输入框,向设备发送信息。 90 | [示例程序](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_Hello) 91 | 92 | ### 图片 93 | 用户在App中,可预设数张图片url地址,通过设备端可切换显示指定的图片。 94 | [示例程序](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_Widgets/Blinker_Image/Image_WiFi/Image_WiFi.ino) 95 | 96 | ## blinker Layouter3 97 | coming soon 98 | 99 | ## 配置导入导出 100 | 配置导入导出功能可方便开发者复制设备配置 101 | layouter配置使用[zipson](https://github.com/jgranstrom/zipson)压缩 102 | -------------------------------------------------------------------------------- /docs/005-功能/03-设备控制.md: -------------------------------------------------------------------------------- 1 | # 设备控制 2 | 在**设备列表**页面,可以查看到账户下已有的设备 3 | 每个设备块如下图: 4 | ![](../img/005/device-block.jpg) 5 | 点击 设备块 可以进入控制设备页面,进行设备控制 6 | 7 | 右上角为设备状态显示。若设备是MQTT设备,会显示其在线状态;若设备是蓝牙设备,会显示蓝牙是否可连接。 8 | 支持了快捷开关的设备,右下角会有电源开关,点击可控制设备开关 9 | 10 | ## 快捷开关 11 | 快捷开关是一个系统内置组件,当设备返回了开关状态时,即会在设备块中显示。 12 | 返回及控制消息如下: 13 | ```json 14 | {"switch":"on/off"} 15 | ``` 16 | [Arduino示例](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_Widgets/Blinker_Heartbeat/Heartbeat_WiFi/Heartbeat_WiFi.ino) 17 | [Typescript示例](https://github.com/blinker-iot/blinker-js/blob/typescript/example.ts) 18 | 19 | -------------------------------------------------------------------------------- /docs/005-功能/04-语音控制.md: -------------------------------------------------------------------------------- 1 | # App内置语音控制 2 | 在APP语音控制界面,说出对应的指令,即可控制相关设备。 3 | **账号为专业版 或 账号中有专属设备,方可使用该功能** 4 | > 智能音响的语音助手和本文档无关,详见[智能音箱接入](https://diandeng.tech/doc/voice-assistant) 5 | 6 | ## 配置方法 7 | 使用该功能,**需要先设置动作指令**,设置方法见[动作指令设置](https://diandeng.tech/doc/actions-and-triggers) 8 | 9 | ### 使用方法 10 | 点击**我的设备**页面右下角的麦克风图标,即可进入语音控制界面,然后说出指令即可 11 | > 注意事项:如果多个设备拥有相同的语音指令,将只能控制系统首先发现的设备,因此请自行确认指令没有重复 12 | 13 | ### 查询语音指令 14 | 在语音控制界面,点击左下的"?"图标,可以列出当前可用的语音指令。 15 | 指令较多时,可以上下拖拽滚动查看 16 | -------------------------------------------------------------------------------- /docs/005-功能/05-场景控制.md: -------------------------------------------------------------------------------- 1 | # 场景控制 2 | 场景控制功能,可在app首页提供快捷按键,一键可控制多个设备。 3 | 4 | ## 注意事项 5 | 1. 使用该功能,需要先设置动作指令,设置方法见[动作指令设置](https://diandeng.tech/doc/actions-and-triggers) 6 | 7 | ## 使用方法 8 | ### 添加场景按键 9 | 主界面右上角点击+符号,选择 **添加场景** 即可添加场景按键。 10 | **修改图标** 可以设置按键上显示的图标 11 | **修改名称** 可以设置按键下方显示的名称 12 | 13 | ### 添加设备动作 14 | 点击 **添加设备动作** 即可添加设备动作 15 | 对于 **独立设备** ,设备动作是与 **按键组件** 相绑定的,添加动作前,您需要在设备控制界面中,先生成对应的 **按键组件** 16 | 当您点击这个场景按键时,即可让设备执行这些动作 17 | 18 | ### 使用场景控制按键 19 | 添加完成后,点击右上角保存设置,然后在 **设备列表** 页面点击按键,即可控制多个设备 20 | 21 | ### 再编辑场景按键 & 删除场景按键 22 | 在 **用户中心>场景设置** 中可以编辑之前添加的按键,或删除之前添加的按键 23 | -------------------------------------------------------------------------------- /docs/005-功能/06-定时任务.md: -------------------------------------------------------------------------------- 1 | # 定时任务 2 | blinker设备端SDK已经集成了定时控制功能。定时操作基本和手机闹钟、倒计时功能一样。 3 | 4 | ## 注意事项 5 | 1. 该功能仅限WiFi接入的设备使用 6 | 2. 使用该功能,需要先设置动作指令,设置方法见[动作指令设置](https://diandeng.tech/doc/actions-and-triggers) 7 | 3. esp8266/esp32开发者请注意,定时功能使用了虚拟EEPROM地址1536-2432的存储空间,如需使用EEPROM库,请避开这段空间 8 | 9 | ## 使用方法 10 | 设备设置定时任务后,到指定时间即会自动执行指定动作 11 | 12 | 1. 在设备设置页面,点击**定时任务**即可进入定时任务界面 13 | 2. 点击底部的“+”图标,即可设置任务 14 | 3. 点击右上角保存,即可完成定时任务设置 -------------------------------------------------------------------------------- /docs/005-功能/07-设备分类.md: -------------------------------------------------------------------------------- 1 | # 设备分类/房间管理 2 | 3 | APP上可新建**房间/分类**,并将设备分配到这个**房间/分类**下 4 | 5 | -------------------------------------------------------------------------------- /docs/005-功能/08-设备设置.md: -------------------------------------------------------------------------------- 1 | # 设备设置 2 | 3 | ## 自定义设备名 4 | 可以修改设备在app中显示的名称 5 | 6 | ## 自定义显示图标 7 | 可以修改设备在app中显示的图片 8 | 9 | ## 载入示例界面 10 | 载入初始示例界面 11 | 12 | ## 单设备启动/设备快捷方式 13 | **该功能仅支持blinker android app** 14 | 15 | 可以通过 **设备页面>设置>添加设备到桌面** 可以添加设备快捷图标到android桌面 16 | 之后可以通过该快捷方式,启动这个设备 17 | ![](../img/005/08-1543240765000.png) 18 | 19 | ## 定时任务 20 | 见[定时任务](https://diandeng.tech/doc/app-timer) 21 | 22 | ## 固件更新 23 | 仅限专属设备使用,详见[OTA&固件管理](?file=009-专属设备开发/06-OTA&固件管理 "OTA&固件管理") -------------------------------------------------------------------------------- /docs/005-功能/09-设备共享.md: -------------------------------------------------------------------------------- 1 | # 设备共享 2 | 该功能允许blinker用户将自己的设备共享给其他用户使用。 3 | blinker设备端SDK集成了用户鉴权功能,搭配blinker APP提供设备共享功能,可以实现多个用户对同一设备的控制。 4 | 5 | ### 主用户 共享设备 6 | 1. 在 **设备设置页>设备共享** 或 **用户中心>设备共享>对应设备** 可进入 **设备共享页** 7 | 2. 点击 **+添加共享**,输入要共享的用户的手机号(用户需已经注册blinker) 8 | 3. 等待用户接受共享 9 | 10 | ### 子用户 接受/拒绝 共享 11 | 在**用户中心>设备共享>接受** 点击对应设备后的**同意/拒绝** 12 | 13 | ### 主用户 取消共享 14 | 1. 在 **设备设置页>设备共享** 或 **用户中心>设备共享>对应设备** 可进入 **设备共享页** 15 | 2. 点击对应用户的后的**取消共享** 16 | 17 | ### 子用户 取消共享 18 | 在**用户中心>设备共享>接受** 点击对应设备后的**取消共享** 19 | 20 | ### 其他说明 21 | 1. 接受的设备不能修改设备相关配置 22 | 2. 一个设备最多可共享给9位用户使用 -------------------------------------------------------------------------------- /docs/005-功能/10-数据聚合.md: -------------------------------------------------------------------------------- 1 | # 数据聚合 2 | **内测阶段** 3 | 数据聚合可以将多个设备的数据和按键显示到一个页面 4 | 5 | 6 | ## 编辑模式 7 | 点击右上角按钮,可以进入/退出编辑模式,在编辑模式下,可以进行以下操作: 8 | 9 | ### 添加模块 10 | 点击 **+** 添加模块 11 | ### 删除模块 12 | 点击模块左上方 **x** 可删除模块 13 | ### 模块更名 14 | 点击模块,可对模块更名 15 | ### 拖拽排序 16 | 按住模块右上方 **三** 符号,可对模块进行拖拽排序 17 | 18 | ## 更新数据 19 | 点击对应模块,可重新获取数据。 20 | 需要反馈的数据,需放置在心跳包中反馈,开发方法见: 21 | [Arduino支持](https://diandeng.tech/doc/arduino-support "Arduino支持") -------------------------------------------------------------------------------- /docs/005-功能/11-智动化.md: -------------------------------------------------------------------------------- 1 | # 智动化/自动化 2 | **本功能处于测试阶段,暂不提供** 3 | 4 | 通过**app菜单>智动化**即可设置设备间的联动,使用方法如下: 5 | 6 | 1. 在blinker群共享中下载最新版的app ( blinker-2.3.0-beta2或以上版本 ) 7 | 8 | 2. 使用blinker lib dev3.0分支 9 | [参考例程](https://github.com/blinker-iot/blinker-library/tree/dev_3.0/examples/Blinker_AUTO) 10 | 11 | 3. 设置触发器 12 | 独立设备可在设备设置中编辑触发器; 13 | 专属设备需要通过管理台添加。[设置方法](https://diandeng.tech/doc/actions-and-triggers) 14 | 15 | 4. 在 app菜单>智动化 中添加自动化规则 16 | 17 | # 设备端接口函数 18 | ## Arduino SDK 19 | ### Blinker.autoInput() 20 | 设备端自动化数据输入接口 21 | ```cpp 22 | Blinker.autoInput(key, data); 23 | ``` 24 | - **key** 自动化触发条件对应的组件的 key, 数据类型为string 25 | - **data** 自动化触发条件对应组件当前的值, 数据类型为float 26 | 27 | 提供的条件有:大于 小于 等于 打开 关闭 28 | 29 | 注:开关状态中开为1.0 关为0.0 30 | 31 | ### Blinker.autoRun() 32 | 设备端自动化运行, 当自动化数据触发将上报服务器 33 | ```cpp 34 | void main() 35 | { 36 | Blinker.run(); 37 | Blinker.autoRun(); 38 | } 39 | ``` -------------------------------------------------------------------------------- /docs/005-功能/16-动作指令与触发器配置.md: -------------------------------------------------------------------------------- 1 | # 动作指令与触发器配置 2 | 3 | 对于专属设备,您可以通过**管理台>产品开发**配置动作指令和触发器。 4 | 对于独立设备,您可以通过**App>设备>设备管理**配置动作指令和触发器。 5 | 6 | ## 动作指令 7 | 定时功能、场景按键、App内语音、自动化等功能都会使用到动作指令 8 | ### 指令设置 9 | 指令以json格式设置,其中**cmd**为指令信息,当触发该指令时则会向设备发送其中的指令信息,**text**为用于app上显示的动作文本内容。 10 | ```javascript 11 | [ 12 | { 13 | "cmd":{"btn-abc":"tap"}, 14 | "text":"按一下按键" 15 | }, 16 | { 17 | "cmd":{"btn-abc":"press"}, 18 | "text":"天王盖地虎" 19 | }, 20 | { 21 | "cmd":{"btn-abc":"pressup"}, 22 | "text":"宝塔镇河妖" 23 | }, 24 | { 25 | "cmd":{"btn-abc":"on"}, 26 | "text":"打开?name" 27 | }, 28 | { 29 | "cmd":{"btn-abc":"off"}, 30 | "text":"关闭?name" 31 | } 32 | ] 33 | ``` 34 | 35 | ### 变量支持 36 | 变量以“?”开头,当前支持的变量如下 37 | ``` 38 | ?name 设备名 39 | ``` 40 | 如一个名为**插座**的设备,且动作指令设置为 **打开?name**,则该指令将被解析为 **打开插座** 41 | 42 | 如果您的设备通过区域管理功能设置了区域,则在语音动作指令解析时,会多解析出一条带区域信息的语音指令,如**打开办公室的插座** 43 | 44 | 45 | > 智能音响的语音助手和本文档无关,详见[智能音箱接入](https://diandeng.tech/doc/voice-assistant) 46 | 47 | 48 | ## 触发器/条件 49 | App内语音、自动化等功能会使用到触发器。 50 | ### 触发器设置 51 | **注意,配置务必要符合JSON格式,否则会保存失败或配置失效** 52 | ```javascript 53 | [ 54 | { 55 | "source":"switch", 56 | "source_zh":"开关状态", 57 | "state":["on","off"], 58 | "state_zh":["开启","关闭"] 59 | }, 60 | ... 61 | ] 62 | ``` 63 | 64 | **示例1** 65 | 开关/插座 触发器配置 66 | ```javascript 67 | [ 68 | { 69 | "source":"switch", 70 | "source_zh":"开关状态", 71 | "state":["on","off"], 72 | "state_zh":["开启","关闭"] 73 | } 74 | ] 75 | ``` 76 | 77 | **示例2** 78 | 温湿度计 触发器配置 79 | ```javascript 80 | [ 81 | { 82 | "source":"temp", 83 | "source_zh":"温度", 84 | "range":[-20,50], 85 | "unit":"℃" 86 | }, 87 | { 88 | "source":"humi", 89 | "source_zh":"湿度", 90 | "range":[0,100], 91 | "unit":"%" 92 | } 93 | ] 94 | ``` 95 | 96 | **示例3** 97 | 设备模式改变 触发器配置 98 | ```javascript 99 | [ 100 | { 101 | "source":"mode", 102 | "source_zh":"模式", 103 | "state":["doing","done","sleep"], 104 | "state_zh":["正在运行","任务完成","休眠模式"] 105 | } 106 | ] 107 | ``` -------------------------------------------------------------------------------- /docs/005-功能/17-通信指令.md: -------------------------------------------------------------------------------- 1 | # 通信指令 2 | 3 | 4 | 在您不了解这些指令的情况下,也可以使用blinker库进行设备开发。 5 | 这个文档主要用于开发那些blinker还不支持的设备,您也可以通过本文档深入了解blinker。 6 | 7 | blinker提供了 **UI组件** 和 **内置组件** 两种类型的组件。 8 | app与设备间的通信指令都采用 **json格式** ,所有指令都以 **\\n** (换行符)结尾。 9 | 10 | ## UI组件 11 | 12 | **UI组件** 即是APP上呈现给用户组件,用户可以通过这些组件和设备端交互。 13 | 每一个组件都有一个key,key可以在app和设备端上设置。 14 |
15 | 为缩短通信数据长度,所有key都有做精简,用到的key如下: 16 | 17 | | 数据 | 精简key | 说明 | 18 | | ------------ | ------- | ---------------------------------------- | 19 | | 文本(text) | tex | 文本数据 | 20 | | 数值(value) | val | 数值数据 | 21 | | 单位(unit) | uni | 数据单位 | 22 | | 图标(icon) | ico | 图标(可用图标见https://fontawesome.com/v5/search) | 23 | | 颜色(color) | col | 16进制颜色,如:"FFFFFF" | 24 | | 开关(switch) | swi | 开关状态, 可用值"on"和"off" | 25 | 26 | ### 文字组件 27 | 28 | 文字组件有两个作用: 29 | 30 | 1. 显示用户自定义文本 31 | 32 | 做文本显示时,只需要app上设置即可 33 | 34 | 2. 显示设备发送到app的文字内容 35 | 36 | 当app接收上以上数据时,会将key为"tex-abc"的文字组件内容刷新。 37 | 用于显示文字的模块 38 | 39 | #### 反馈指令示例: 40 | 41 | ``` json 42 | { 43 | "tex-abc": 44 | { 45 | "tex":"文字1", 46 | "tex1":"文字2", 47 | } 48 | } 49 | ``` 50 | 51 |
52 | 53 | ### 数据组件 54 | 55 | 数字组件是用于呈现单一数字型数据的组件 56 | 57 | #### 反馈指令示例: 58 | 59 | ``` json 60 | { 61 | "num-abc":{ 62 | "val":30, 63 | "ico":"far icon", 64 | "col":"#FFFFFF", 65 | "tex":"CESHI", 66 | "uni":"%", 67 | } 68 | } 69 | ``` 70 | 71 |
72 | 73 | ### 按键组件 74 | 75 | #### 主动指令示例 76 | 77 | **当按键为普通模式时:** 78 | 轻触按键: 79 | 80 | ``` json 81 | {"btn-abc":"tap"} 82 | ``` 83 | 84 | 说明key为"btn-abc"的按键被触发。 85 | 86 | 按下未放开 87 | 88 | ``` json 89 | {"btn-abc":"press"} 90 | ``` 91 | 92 | 释放按键 93 | 94 | ``` json 95 | {"btn-abc":"pressup"} 96 | ``` 97 | 98 | **当按键为开关模式:** 99 | 100 | ``` json 101 | {"btn-abc":"on"} 102 | ``` 103 | 104 | 或 105 | 106 | ``` json 107 | {"btn-abc":"off"} 108 | ``` 109 | 110 | #### 反馈指令示例: 111 | 112 | ``` json 113 | { 114 | "btn-abc": 115 | { 116 | "swi":"on", 117 | "tex":"文字1", 118 | "ico":"fal fa-power-off", 119 | "col":"#FFFFFF" 120 | } 121 | } 122 | ``` 123 | 124 |
125 | 126 | ### 滑块组件 127 | 128 | #### 主动指令示例 129 | 130 | 拖动滑动条,手机将向设备发送: 131 | 132 | ``` json 133 | {"ran-abc":101} 134 | ``` 135 | 136 | "ran-abc"为滑动条的key,用户可自定义,101为具体数值。 137 | 设备可以向app发送同样的指令,改变app上滑动条的显示状态,如: 138 | 139 | ``` json 140 | {"ran-abc":255} 141 | ``` 142 | 143 | app会将key为"tog-abc"的滑动条组件的滑块调整到255位置。 144 | 滑动条数值范围为0~255。 145 | 146 | #### 反馈指令示例: 147 | 148 | ``` json 149 | { 150 | "btn-abc": 151 | { 152 | "val":100, 153 | "col":"#FFFFFF", 154 | "tex":"文字1" 155 | } 156 | } 157 | ``` 158 | 159 |
160 | 161 | ### 颜色组件 162 | 163 | 拖动颜色选择滑动条,手机将向设备发送: 164 | 165 | ``` json 166 | {"col-abc":[255,0,0,255]} 167 | ``` 168 | 169 | 其值为一个数据,数组中的数据分别是红绿蓝(RGB)三色的值 170 | 171 | #### 反馈指令示例: 172 | 173 | ``` json 174 | {"col-abc":[255,255,255,255]} 175 | ``` 176 | 177 |
178 | 179 | ### 摇杆组件 180 | 181 | 拖动摇杆,app将向设备发送: 182 | 183 | ``` json 184 | {"joy-abc":[208, 255]} 185 | 186 | ``` 187 | 188 | 摇杆拉到左下角发送的数据为: 189 | 190 | ``` json 191 | {"joy-abc":[0,0]} 192 | 193 | ``` 194 | 195 | 摇杆拉到右上角发送的数据为: 196 | 197 | ``` json 198 | {"joy-abc":[255, 255]} 199 | 200 | ``` 201 | 202 | 释放摇杆,摇杆会回归到中心位置,发送的数据为: 203 | 204 | ``` json 205 | {"joy-abc":[128,128]} 206 | 207 | ``` 208 | 209 | 摇杆组件不支持反馈指令 210 |
211 | 212 | ### 调试组件 213 | 214 | 设备向app发送的数据将被显示到调试组件中。 215 | 216 | ### 图片组件 217 | 218 | 用户可预设数张图片,通过设备端可切换显示指定的图片。 219 | 设备发送如下指令即可显示第一张图片: 220 | 221 | ``` json 222 | { 223 | "img-abc": 224 | { 225 | "img": "0" 226 | } 227 | } 228 | ``` 229 | 230 | 图片组件也支持点击操作,点击后会发送当前的图片编号: 231 | 232 | ``` json 233 | {"img-abc":"3"} 234 | ``` 235 | 236 | 237 | ### 图表组件 238 | 图表组件数据来源有二: 239 | 1. [云端存储的历史数据](https://arduino.me/s/2?aid=727) 240 | 2. [实时数据](https://arduino.me/s/2?aid=898) 241 | 242 | 243 | ### 定时组件 244 | 245 | 定时组件有三种定时方式:1. 定时 2. 倒计时 3. 循环定时 246 | 定时数据结构如下: 247 | 248 | ``` json 249 | [ 250 | { 251 | "task":0, 252 | "ena": 1, 253 | "tim": 1000, 254 | "act": [{"btn":"tap"}, {"btn":"ttt"}], 255 | "day": [1, 1, 1, 1, 1, 1, 1] 256 | } 257 | ] 258 | ``` 259 | 260 | 倒计时数据结构如下: 261 | 262 | ``` json 263 | { 264 | "run": 1, 265 | "ttim": 1000, 266 | "rtim": 200, 267 | "act": [{"btn":"tap"}, {"btn":"ttt"}], 268 | } 269 | ``` 270 | 271 | 循环定时数据结构如下: 272 | 273 | ``` json 274 | { 275 | "tim": 99, 276 | "run": 1, 277 | "dur1": 1000, 278 | "act1": [{"btn":"tap"}, {"btn":"ttt"}], 279 | "dur2": 3333, 280 | "act2": [{"btn":"tap"}, {"btn":"ttt"}], 281 | } 282 | ``` 283 | 284 | 设置定时数据: 285 | 286 | ``` json 287 | { 288 | "set":{ 289 | "timing":{ 290 | "task":0, 291 | "ena": 1, 292 | "tim": 1000, 293 | "act": [{"btn":"tap"}, {"btn":"ttt"}], 294 | "day": [1, 1, 1, 1, 1, 1, 1] 295 | } 296 | } 297 | } 298 | ``` 299 | 300 | 删除定时数据: 301 | 302 | ``` json 303 | { 304 | "set": { 305 | "timing": [{ 306 | "dlt": "0" 307 | }] 308 | } 309 | } 310 | ``` 311 | 312 | 获取定时数据: 313 | 314 | ``` json 315 | {"get":"timing"} 316 | ``` 317 | 318 | --- 319 | 320 | ## 内置功能 321 | 322 | ### 状态获取 323 | 324 | #### 状态查询 325 | 326 | APP可以向设备端发送状态查询指令 327 | 328 | ``` json 329 | {"get":"state"} 330 | ``` 331 | 332 | #### 设备反馈 333 | 334 | 当设备为本地设备(蓝牙等)时 335 | 已连接 336 | 337 | ``` json 338 | {"state":"connected"} 339 | ``` 340 | 341 | 当设备为MQTT设备时 342 | 在线 343 | 344 | ``` json 345 | {"state":"online"} 346 | ``` 347 | 348 | 当MQTT设备通过局域网webSocket建立连接后 349 | 350 | ``` json 351 | {"state":"connected"} 352 | ``` 353 | 354 | ### 手机震动 355 | 356 | 设备向app发送: 357 | 358 | 震动一秒 359 | 360 | ```json 361 | {"vibrate":1000} 362 | 363 | ``` 364 | 365 | 值为时间,单位毫秒 366 |
367 | 368 | ### 状态查询(心跳查询) 369 | 370 | app在查询设备状态时会发送: 371 | 372 | ``` json 373 | {"get":"state"} 374 | ``` 375 | 376 | 默认状态下,设备会返回: 377 | 378 | ``` json 379 | // WiFi设备 380 | {"state":"online"} 381 | // BLE设备 382 | {"state":"connected"} 383 | ``` 384 | 385 | 可通过设备端API,在返回信息中添加其他数据,用于和app进行数据同步。 386 | 387 |
388 | 389 | ### 消息通知 390 | 391 | 设备向app发送: 392 | 393 | ``` json 394 | {"notice":"notice content"} 395 | ``` 396 | 397 | app将会推送一条内容为"notice content"的通知给用户 398 | 399 | ### 手机姿态 即将废弃 400 | 401 | 设备向app发送: 402 | 403 | 开启ahrs输出 404 | 405 | ``` json 406 | {"ahrs":"on"} 407 | ``` 408 | 409 | 关闭ahrs输出 410 | 411 | ``` json 412 | {"ahrs":"off"} 413 | ``` 414 | 415 | app向设备发送: 416 | 开启ahrs输出功能后,手机会输出ahrs数据 417 | 418 | ``` json 419 | {"ahrs":[332,16,-77]} 420 | ``` 421 | 422 |
423 | 424 | ### 位置获取 即将废弃 425 | 426 | 设备向手机发送: 427 | 428 | ``` json 429 | {"get":"gps"} 430 | ``` 431 | 432 | 手机将会返回当前手机所在位置的经纬度信息,格式如下: 433 | 434 | ``` json 435 | {"gps":[103.907156,30.573667]} 436 | ``` 437 | 438 |
439 | 440 | 441 | ## 保留关键字 442 | 保留关键字是Blinker通信过程中已经使用了的键名(Key),如无特殊需求,用户应避免使用这些关键字 443 | 444 | ### 设备状态 445 | - key 446 | **state** 447 | - data 448 | ```json 449 | {"state":"online"} 450 | {"state":"offline"} 451 | ``` 452 | 453 | ### 设备开关 454 | - key 455 | **switch** 456 | - data 457 | ```json 458 | {"switch":"on"} 459 | {"switch":"off"} 460 | ``` 461 | 462 | ### 状态请求 463 | - get 464 | ```json 465 | {"get":"state"} 466 | ``` 467 | 468 | ### 状态设置 469 | - set 470 | ```json 471 | {"set":{"abc":"on"}} 472 | ``` -------------------------------------------------------------------------------- /docs/005-功能/18-历史数据.md: -------------------------------------------------------------------------------- 1 | # 历史数据 2 | 3 | ## 数据存储 4 | blinker提供有时序数据存储功能,通过调用[时序数据存储接口](https://diandeng.tech/doc/api-storage-ts-num),可将时序数据存储在云端,相关示例程序如下: 5 | 6 | [Arduino示例](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_Cloud/Blinker_CLOUDDATA/CLOUDDATA_WiFi/CLOUDDATA_WiFi.ino) 7 | [Nodejs示例](https://github.com/blinker-iot/blinker-js/blob/typescript/example/example_server.ts) 8 | [Python示例](https://github.com/blinker-iot/blinker-py/blob/dev_3.0/example/storage_ts.py) 9 | 10 | 11 | 12 | ## 数据获取 13 | 14 | ### 接口获取 15 | 通过调用[时序数据获取接口](https://diandeng.tech/doc/api-storage-ts-num),可以获得云端存储的数据。 16 | 17 | ### 组件显示 18 | 对于使用blinker App Layouter功能的用户,可以在设备界面添加 **图表组件** ,并将**存储键名**设置为对应的key,即可查看数据。 -------------------------------------------------------------------------------- /docs/005-功能/19-实时数据.md: -------------------------------------------------------------------------------- 1 | # 实时数据传输 2 | **为降低公共服务器资源消耗,请务必遵照本文档进行实时数据传输。** 3 | 4 | ## 通信指令 5 | 1. 开启实时数据后,app每9秒发起一次实时数据获取 6 | ```json 7 | {"rt":["humi","temp"]} 8 | ``` 9 | 10 | 2. 设备每秒反馈一次数据,连续反馈10次 11 | ```json 12 | { 13 | "humi":{ 14 | "val":100, 15 | "date":1605373409, 16 | }, 17 | "temp":{ 18 | "val":100, 19 | "date":1605373409, 20 | } 21 | } 22 | ``` 23 | > date单位为秒 24 | 25 | ## 组件显示 26 | **数据组件** 在组件编辑页面中,勾选`启用实时数据`,即会实时更新数据。 27 | **图表组件** 切换到实时模式,组件在收到指令数据后,如key和存储key相同,即会绘制出相应的数据的实时曲线。 28 | 29 | 30 | ## 示例程序 31 | [Arduino示例](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_RT_DATA/Blinker_RT_DATA.ino) 32 | [Nodejs示例](https://github.com/blinker-iot/blinker-js/blob/typescript/example/example_realtime.ts) -------------------------------------------------------------------------------- /docs/005-功能/20-配网工具.md: -------------------------------------------------------------------------------- 1 | # 配网工具 2 | 可以通过**App菜单>开发者>开发工具**进入到工具列表,然后选择对应的配网工具。 3 | 4 | ## EspTouch 5 | EspTouch,又名SmartConfig,是 esp8266 / esp32 芯片的快捷配网方式 6 | 您可以通过 **开发者>开发工具>EspTouch** 进行配网 7 | 在进行配网前,您需要确保 设备端已经烧写了带有EspTouch功能的程序,设备端示例程序如下: 8 | [esp8266/esp32示例](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_WiFi_Config/Blinker_ESPTOUCH/ESPTOUCH_WiFi) 9 | 10 | ## ApConfig 11 | 设备在未配网状态以AP形式存在,APP扫描到设备,会连接上并给予目标ssid和密码,设备收到后,即会去连接目标ssid 12 | 您可以通过 **开发者>开发工具>ApConfig** 进行配网 13 | 在进行配网前,您需要确保 设备端已经烧写了带有ApConfig功能的程序,设备端示例程序如下: 14 | [esp8266/esp32示例](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_WiFi_Config/Blinker_APCONFIG/APCONFIG_WiFi) 15 | 16 | ## 触发机制 17 | ESPTOUCH 或 APCONFIG 配网功能开启后,设备启动时将读取存储中的配网信息进行WiFi连接,若不存在配网信息,则会进入指定配网状态。 18 | 19 | ## 擦除配网信息 20 | 若需擦除存储中的配网信息,有如下几种方式: 21 | 1. 调用Blinker.reset(); 22 | 2. 使用常规WiFi接入方式,在程序中填入空ssid即可; 23 | 3. 对于esp8266,可通过选择 **IDE菜单>工具>Erase Flash>All Flash Contents** 再上传程序,即可擦除。 24 | 25 | ## 专属设备配网 26 | 详见[专属设备配网模式](https://diandeng.tech/doc/config-mode) 27 | 28 | ## 其他 29 | [esptouch无法配网解决办法](https://arduino.me/a/281) -------------------------------------------------------------------------------- /docs/005-功能/21-图标库.md: -------------------------------------------------------------------------------- 1 | # 图标库 2 | blinker App内置[Font Awesome Pro](https://fontawesome.com/v5/search),9000余个图标供您选择 3 | 4 | ## 通过APP选择图标 5 | 在APP部分页面中,可以直接选择图标。或者输入图标关键字搜索可用图标。 6 | 7 | ## 通过设备程序改变图标 8 | 在图标库 (https://fontawesome.com/v5/search) 中找到要使用的图标,点击进入该图标页面,可以看到其html调用形式,如 9 | ```html 10 | 11 | ``` 12 | 其中class内容即是我们设备端程序需要的参数。 13 | arduino程序中调用方法如下: 14 | ```cpp 15 | Button1.icon("far fa-lightbulb"); 16 | ``` 17 | 这里以Arduino程序为例,其他SDK同理 18 | 19 | **示例:开关LED(开关按键),并改变APP UI** 20 | ```cpp 21 | #define BLINKER_WIFI 22 | 23 | #include 24 | 25 | char auth[] = "Your Device Secret Key"; 26 | char ssid[] = "Your WiFi network SSID or name"; 27 | char pswd[] = "Your WiFi network WPA password or WEP key"; 28 | 29 | // 新建组件对象 30 | BlinkerButton Button1("btn-abc"); 31 | 32 | int counter = 0; 33 | 34 | // 按下按键即会执行该函数 35 | void button1_callback(const String & state) 36 | { 37 | BLINKER_LOG("get button state: ", state); 38 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 39 | 40 | if (state == BLINKER_CMD_BUTTON_TAP) { 41 | BLINKER_LOG("Button tap!"); 42 | 43 | // Button1.icon("icon_1"); 44 | Button1.color("#FF0000"); 45 | Button1.text("Your button name or describe"); 46 | Button1.print(); 47 | } 48 | else if (state == BLINKER_CMD_BUTTON_PRESSED) { 49 | BLINKER_LOG("Button pressed!"); 50 | 51 | // Button1.icon("icon_1"); 52 | Button1.color("#FFFF00"); 53 | Button1.text("Your button name or describe"); 54 | Button1.print(); 55 | } 56 | else if (state == BLINKER_CMD_BUTTON_RELEASED) { 57 | BLINKER_LOG("Button released!"); 58 | 59 | // Button1.icon("icon_1"); 60 | Button1.color("#FFFFFF"); 61 | Button1.text("Your button name or describe"); 62 | // Button1.text("Your button name", "describe"); 63 | Button1.print(); 64 | } 65 | else if (state == BLINKER_CMD_ON) { 66 | BLINKER_LOG("Toggle on!"); 67 | 68 | // Button1.icon("icon_1"); 69 | Button1.color("#0000FF"); 70 | Button1.text("Your button name or describe"); 71 | // Button1.text("Your button name", "describe"); 72 | Button1.print("on"); 73 | } 74 | else if (state == BLINKER_CMD_OFF) { 75 | BLINKER_LOG("Toggle off!"); 76 | 77 | // Button1.icon("icon_1"); 78 | Button1.color("#00FFFF"); 79 | Button1.text("Your button name or describe"); 80 | // Button1.text("Your button name", "describe"); 81 | Button1.print("off"); 82 | } 83 | else { 84 | BLINKER_LOG("Get user setting: ", state); 85 | 86 | // Button1.icon("icon_1"); 87 | Button1.color("#FFFFFF"); 88 | Button1.text("Your button name or describe"); 89 | // Button1.text("Your button name", "describe"); 90 | Button1.print(); 91 | } 92 | } 93 | 94 | void setup() 95 | { 96 | // 初始化串口 97 | Serial.begin(115200); 98 | BLINKER_DEBUG.stream(Serial); 99 | 100 | // 初始化有LED的IO 101 | pinMode(LED_BUILTIN, OUTPUT); 102 | digitalWrite(LED_BUILTIN, HIGH); 103 | // 初始化blinker 104 | Blinker.begin(auth, ssid, pswd); 105 | 106 | Button1.attach(button1_callback); 107 | } 108 | 109 | void loop() { 110 | Blinker.run(); 111 | } 112 | ``` -------------------------------------------------------------------------------- /docs/005-功能/80-调试工具.md: -------------------------------------------------------------------------------- 1 | # 调试工具 2 | ### 设备端调试信息输出 3 | 如使用blinker lib,可在setup中添加如下语句: 4 | ```c++ 5 | BLINKER_DEBUG.stream(Serial); 6 | BLINKER_DEBUG.debugAll(); 7 | ``` 8 | ### App端调试信息输出 9 | 方法1:对于Layouter编辑器,添加调试组件,可以让您看到设备发来的数据和App发出的数据 10 | 方法2:在设备页面,点击顶部设备名称5次,可呼出调试器 -------------------------------------------------------------------------------- /docs/005-功能/99-登录-注册-找回密码.md: -------------------------------------------------------------------------------- 1 | ## 登录 2 | 在**登录**页面输入正确的 用户名、密码,再点击**登录**按钮即可进入**我的设备**页面。 3 | 4 | ## 注册 5 | 在**注册**页面,输入手机号,并点击获取验证码,可以收到手机短信验证码,输入验证码和密码后,点击 立即注册 按钮,即可注册账号,注册成功后会进入**我的设备**页面。 6 | 7 | ## 找回密码 8 | 在**找回密码**页面,输入手机号,并点击**获取验证码**,可以收到手机短信验证码,输入验证码和新密码后,点击**重设密码**按钮,即可重新设置密码,密码设置成功后,会返回**登录**页面。 -------------------------------------------------------------------------------- /docs/007-语音助手接入/00-接入说明.md: -------------------------------------------------------------------------------- 1 | # 智能音响/语音助手接入 2 | ![](../img/007/ad.jpg) 3 | [示例开发教程](https://arduino.me/s/2?aid=713) 4 | 5 | ## 支持的语音助手 6 | ### 免费版支持: 7 | - [天猫精灵](?file=007-语音助手接入/01-天猫精灵 "天猫精灵") 8 | - [百度小度](?file=007-语音助手接入/02-百度小度 "百度音响") 9 | - [小米小爱](?file=007-语音助手接入/03-小米小爱 "小米小爱") 10 | 11 | ### 商业版可选支持模块: 12 | 京东叮咚/亚马逊Alexa/谷歌Home/微软小娜/三星bixby/苹果HomeKit 13 | 14 | ## 支持的设备类型 15 | 16 | ### 免费版支持类型 17 | 对于独立设备(个人开发者),blinker提供五种设备类型供用户选择: 18 | 19 | | 品类 | 支持功能 | 20 | | :- | :- | 21 | | 传感器 | 可以查询传感器获取到的数据 | 22 | | 灯 | 开关灯、设置颜色、亮度、色温、模式 | 23 | | 插座 | 开关设备 | 24 | | 风扇 | 开关设备、风速、风向、模式 | 25 | | 空调 | 开关设备、风速、风向、模式、温度控制 | 26 | 27 | 28 | ### 商业版支持类型 29 | 方案示例: 30 | - [氛围灯](https://github.com/blinker-iot/Blinker_PRO_SMART_LAMP/tree/master/SMART_LAMP_DIY) 31 | 32 | 对于专属设备(企业用户),blinker提供了40余种设备类型: 33 | 34 | **AliGenie所支持的设备品类** 35 | 36 | | 品类 | 参数(type) | 37 | | :-: | :-: | 38 | |电视|television| 39 | |灯|light| 40 | |空调|aircondition| 41 | |空气净化器|airpurifier| 42 | |插座|outlet| 43 | |开关|switch| 44 | |扫地机器人|roboticvacuum| 45 | |窗帘|curtain| 46 | |加湿器|humidifier| 47 | |风扇|fan| 48 | |暖奶器|bottlewarmer| 49 | |豆浆机|soymilkmaker| 50 | |电热水壶|kettle| 51 | |饮水机|waterdispenser| 52 | |摄像头|camera| 53 | |路由器|router| 54 | |电饭煲|cooker| 55 | |热水器|waterheater| 56 | |烤箱|oven| 57 | |净水器|waterpurifier| 58 | |冰箱|fridge| 59 | |机顶盒|STB| 60 | |传感器|sensor| 61 | |洗衣机|washmachine| 62 | |智能床|smartbed| 63 | |香薰机|aromamachine| 64 | |窗|window| 65 | |抽油烟机|kitchenventilator| 66 | |指纹锁|fingerprintlock| 67 | |万能遥控器|telecontroller| 68 | |洗碗机|dishwasher| 69 | |除湿机|dehumidifier| 70 | |干衣机|dryer| 71 | |壁挂炉|wall-hung-boiler| 72 | |微波炉|microwaveoven| 73 | |取暖器|heater| 74 | |驱蚊器|mosquito-dispeller| 75 | |跑步机|treadmill| 76 | |智能门控(门锁)|smart-gating| 77 | |智能手环|smart-band| 78 | 79 | **DuerOS所支持的设备品类:** 80 | 81 | | 品类 | 参数(type) | 82 | | :-: | :-: | 83 | |电灯类设备|LIGHT| 84 | |开关类设备|SWITCH| 85 | |插座类设备|SOCKET| 86 | |窗帘类设备|CURTAIN| 87 | |空调类设备|AIR_CONDITION| 88 | |电视机|TV_SET| 89 | |机顶盒|SET_TOP_BOX| 90 | |空气监测器类设备|AIR_MONITOR| 91 | |空气净化器|AIR_PURIFIER| 92 | |净水器|WATER_PURIFIER| 93 | |加湿器|HUMIDIFIER| 94 | |电风扇|FAN| 95 | |热水器类设备|WATER_HEATER| 96 | |电暖器类设备|HEATER| 97 | |洗衣机类设备|WASHING_MACHINE| 98 | |晾衣架|CLOTHES_RACK| 99 | |燃气灶类设备|GAS_STOVE| 100 | |油烟机类设备|RANGE_HOOD| 101 | |烤箱设备|OVEN| 102 | |微波炉|MICROWAVE_OVEN| 103 | |压力锅|PRESSURE_COOKER| 104 | |电饭煲|RICE_COOKER| 105 | |电磁炉|INDUCTION_COOKER| 106 | |破壁机|HIGH_SPEED_BLENDER| 107 | |扫地机器人|SWEEPING_ROBOT| 108 | |冰箱|FRIDGE| 109 | |打印机|PRINTER| 110 | |新风机|AIR_FRESHER| 111 | |热水壶|KETTLE| 112 | |摄像头|WEBCAM| 113 | |机器人|ROBOT| 114 | |开窗器|WINDOW_OPENER| 115 | -------------------------------------------------------------------------------- /docs/007-语音助手接入/03-小米小爱.md: -------------------------------------------------------------------------------- 1 | # 小米小爱接入 2 | 3 | ## Blinker小爱同学接入流程 4 | ### 设备端开发 5 | 1.设置接入的设备类型 6 | 2.编译上传代码到设备 7 | 3.上线设备 8 | 9 | ### 绑定小爱同学 10 | 1.打开米家App。通过 **我的>其他平台设备>点击添加>点灯科技>绑定账号** ,绑定blinker账号 11 | 2.绑定成功后,支持小爱控制的blinker设备会出现在 **我的>其他平台设备>点灯科技** 设备列表中 12 | 3.现在可以使用小爱控制该设备了 13 | 14 | ## 其他说明 15 | 1.如果绑定blinker账号后,点灯科技列表中没有设备,可能是您设备中没有烧写小爱支持程序,或者设备没有成功上线。 16 | 2.绑定blinker账号后,通过手机上的小爱同学也可以控制设备 17 | 3.blinker App中对设备进行修改或新增后,可在米家App中,通过 **我的>其他平台设备>点灯科技>同步设备** 更新设备信息 18 | 19 | ## 示例程序 20 | Arduino(esp8266/esp32): 21 | [GITHUB](https://github.com/blinker-iot/blinker-library/tree/master/examples/Blinker_Voice_Assistant/Blinker_MIOT) 22 | 23 | NodeJs/TypeScript: 24 | [GITHUB](https://github.com/blinker-iot/blinker-js/tree/typescript/example/miot) 25 | 26 | 27 | ## Blinker小爱同学接口函数 28 | ### 小爱设备配置 29 | 根据您定义的设备品类选择不同的参数用于配置Blinker 30 | 31 | #### 灯(light) 32 | ```cpp 33 | #define BLINKER_WIFI 34 | #define BLINKER_MIOT_LIGHT 35 | 36 | #include 37 | ``` 38 | 39 | #### 插座(outlet) 40 | ```cpp 41 | #define BLINKER_WIFI 42 | #define BLINKER_MIOT_OUTLET 43 | 44 | #include 45 | ``` 46 | 47 | #### 排插(multi_outlet) 48 | 同步设备后可显示一个插座和四个插孔(名为插孔的插座设备) 49 | ```cpp 50 | #define BLINKER_WIFI 51 | #define BLINKER_MIOT_MULTI_OUTLET 52 | 53 | #include 54 | ``` 55 | 56 | #### 传感器(sensor) 57 | ```cpp 58 | #define BLINKER_WIFI 59 | #define BLINKER_MIOT_SENSOR 60 | 61 | #include 62 | ``` 63 | 64 | #### 风扇(fan) 65 | ```cpp 66 | #define BLINKER_WIFI 67 | #define BLINKER_MIOT_FAN 68 | 69 | #include 70 | ``` 71 | 72 | #### 空调(aircondition) 73 | ```cpp 74 | #define BLINKER_WIFI 75 | #define BLINKER_MIOT_AIR_CONDITION 76 | 77 | #include 78 | ``` 79 | 80 | 设备设置后即可使用 **小爱同学** **BlinkerMIOT** 81 | 82 | ### 小爱数据管理 83 | 智能音箱接口, 反馈数据到小爱同学 84 | ==任何控制务必即时反馈== 85 | ==超时2s以上再反馈,小爱同学就默认设备不在线,小爱同学会反馈“智能家居控制出了点问题”== 86 | 87 | **函数** : 88 | - powerState() 89 | *BlinkerMIOT.powerState()* 90 | 反馈电源状态 91 | - mode() 92 | *BlinkerMIOT.mode()* 93 | 反馈运行模式 94 | - color() 95 | *BlinkerMIOT.color()* 96 | 反馈颜色属性 97 | - colorTemp() 98 | *BlinkerMIOT.colorTemp()* 99 | 反馈色温属性 100 | - brightness() 101 | *BlinkerMIOT.brightness()* 102 | 反馈亮度属性 103 | - temp() 104 | *BlinkerMIOT.temp()* 105 | 反馈温度属性 106 | - humi() 107 | *BlinkerMIOT.humi()* 108 | 反馈湿度属性 109 | - pm25() 110 | *BlinkerMIOT.pm25()* 111 | 反馈PM2.5属性 112 | - level() 113 | *BlinkerMIOT.level()* 114 | 反馈风速/挡位属性 115 | - hswing() 116 | *BlinkerMIOT.hswing()* 117 | 反馈左右摆风状态 118 | - vswing() 119 | *BlinkerMIOT.vswing()* 120 | 反馈上下摆风状态 121 | - eco() 122 | *BlinkerMIOT.eco()* 123 | 反馈ECO节能模式状态 124 | - anion() 125 | *BlinkerMIOT.anion()* 126 | 反馈负离子模式状态 127 | - heater() 128 | *BlinkerMIOT.heater()* 129 | 反馈辅热功能状态 130 | - dryer() 131 | *BlinkerMIOT.dryer()* 132 | 反馈干燥功能状态 133 | - sleep() 134 | *BlinkerMIOT.sleep()* 135 | 反馈睡眠模式状态 136 | - soft() 137 | *BlinkerMIOT.soft()* 138 | 反馈柔风功能状态 139 | - uv() 140 | *BlinkerMIOT.uv()* 141 | 反馈UV杀菌功能状态 142 | - unStraightBlow() 143 | *BlinkerMIOT.unStraightBlow()* 144 | 反馈防直吹功能状态 145 | - print() 146 | *BlinkerMIOT.print()* 147 | 将以上属性发送出去, 务必最后调用该函数 148 | 149 | 150 | ### 小爱设备支持的控制类型 151 | - 设备控制 152 | - 电源类的操作 153 | - 设备打开 154 | - 设备关闭 155 | - 颜色的设置 156 | - 模式的设置 157 | - 亮度的控制 158 | - 亮度设置指定值 159 | - 亮度调成最值(最大、最小) 160 | - 步长设置亮度(调亮、调暗) 161 | - 色温的控制 162 | - 色温设置指定值 163 | - 步长设置色温(调冷、调暖) 164 | - 温度的控制 165 | - 温度设置指定值 166 | - 步长设置温度 167 | - 摆风的控制 168 | - 上下/左右摆风 169 | - 设备查询 170 | - 单个属性的查询 171 | 172 | ### 小爱电源类的操作接口 173 | 当小爱同学向设备发起控制, 设备端需要有对应控制处理函数 174 | 175 | **BlinkerMIOT.attachPowerState()** 176 | 用户自定义电源类操作的回调函数: 177 | ```cpp 178 | void miotPowerState(const String & state) 179 | { 180 | BLINKER_LOG("need set power state: ", state); 181 | 182 | if (state == BLINKER_CMD_ON) { 183 | digitalWrite(LED_BUILTIN, HIGH); 184 | 185 | BlinkerMIOT.powerState("on"); 186 | BlinkerMIOT.print(); 187 | } 188 | else if (state == BLINKER_CMD_OFF) { 189 | digitalWrite(LED_BUILTIN, LOW); 190 | 191 | BlinkerMIOT.powerState("off"); 192 | BlinkerMIOT.print(); 193 | } 194 | } 195 | ``` 196 | > 务必在回调函数中反馈该控制状态 197 | 198 | 注册回调函数: 199 | ```cpp 200 | BlinkerMIOT.attachPowerState(miotPowerState); 201 | ``` 202 | 203 | ### 小爱颜色的设置接口 204 | 当小爱同学向设备发起控制, 设备端需要有对应控制处理函数 205 | 206 | **BlinkerMIOT.attachColor()** 207 | 用户自定义颜色设置的回调函数: 208 | ```cpp 209 | void miotColor(int32_t color) 210 | { 211 | BLINKER_LOG("need set color: ", color); 212 | 213 | colorR = color >> 16 & 0xFF; 214 | colorG = color >> 8 & 0xFF; 215 | colorB = color & 0xFF; 216 | 217 | BLINKER_LOG("colorR: ", colorR, ", colorG: ", colorG, ", colorB: ", colorB); 218 | 219 | pixelShow(); 220 | 221 | BlinkerMIOT.color(color); 222 | BlinkerMIOT.print(); 223 | } 224 | ``` 225 | 226 | 229 | 230 | 注册回调函数: 231 | ```cpp 232 | BlinkerMIOT.attachColor(miotColor); 233 | ``` 234 | 235 | ### 小爱模式的设置接口 236 | 当小爱同学向设备发起控制, 设备端需要有对应控制处理函数 237 | 238 | **BlinkerMIOT.attachMode()** 239 | 用户自定义模式设置的回调函数: 240 | ```cpp 241 | void miotMode(uint8_t mode) 242 | { 243 | BLINKER_LOG("need set mode: ", mode); 244 | 245 | if (mode == BLINKER_CMD_MIOT_DAY) { 246 | // Your mode function 247 | } 248 | else if (mode == BLINKER_CMD_MIOT_NIGHT) { 249 | // Your mode function 250 | } 251 | else if (mode == BLINKER_CMD_MIOT_COLOR) { 252 | // Your mode function 253 | } 254 | else if (mode == BLINKER_CMD_MIOT_WARMTH) { 255 | // Your mode function 256 | } 257 | else if (mode == BLINKER_CMD_MIOT_TV) { 258 | // Your mode function 259 | } 260 | else if (mode == BLINKER_CMD_MIOT_READING) { 261 | // Your mode function 262 | } 263 | else if (mode == BLINKER_CMD_MIOT_COMPUTER) { 264 | // Your mode function 265 | } 266 | 267 | wsMode = mode; 268 | 269 | BlinkerMIOT.mode(mode); 270 | BlinkerMIOT.print(); 271 | } 272 | ``` 273 | > 务必在回调函数中反馈该控制状态 274 | > 详见文档末尾[小爱支持控制的模式表](#小爱支持控制的模式表 "小爱支持控制的模式表") 275 | 276 | 注册回调函数: 277 | ```cpp 278 | BlinkerMIOT.attachMode(miotMode); 279 | ``` 280 | 281 | ### 小爱亮度的控制接口 282 | 当小爱同学向设备发起控制, 设备端需要有对应控制处理函数 283 | 284 | **BlinkerMIOT.attachBrightness()** 285 | 用户自定义亮度控制的回调函数: 286 | ```cpp 287 | void miotBright(const String & bright) 288 | { 289 | BLINKER_LOG("need set brightness: ", bright); 290 | 291 | colorW = bright.toInt(); 292 | 293 | BLINKER_LOG("now set brightness: ", colorW); 294 | 295 | BlinkerMIOT.brightness(colorW); 296 | BlinkerMIOT.print(); 297 | } 298 | ``` 299 | > 务必在回调函数中反馈该控制状态 300 | > 亮度范围为1-100 301 | 302 | 注册回调函数: 303 | ```cpp 304 | BlinkerMIOT.attachBrightness(miotBright); 305 | ``` 306 | 307 | ### 小爱色温的控制接口 308 | 当小爱同学向设备发起控制, 设备端需要有对应控制处理函数 309 | 310 | **BlinkerMIOT.attachColorTemperature()** 311 | 用户自定义色温控制的回调函数: 312 | ```cpp 313 | void miotColoTemp(int32_t colorTemp) 314 | { 315 | BLINKER_LOG("need set colorTemperature: ", colorTemp); 316 | 317 | colorT = colorTemp; 318 | 319 | BlinkerMIOT.colorTemp(colorTemp); 320 | BlinkerMIOT.print(); 321 | } 322 | ``` 323 | > 务必在回调函数中反馈该控制状态 324 | > 色温范围为1000-10000 325 | 326 | 注册回调函数: 327 | ```cpp 328 | BlinkerMIOT.attachColorTemperature(miotColoTemp); 329 | ``` 330 | 331 | ### 小爱设备查询接口 332 | 当小爱同学向设备发起控制, 设备端需要有对应控制处理函数 333 | 334 | **BlinkerMIOT.attachQuery()** 335 | 用户自定义设备查询的回调函数: 336 | ```cpp 337 | void miotQuery(int32_t queryCode) 338 | { 339 | BLINKER_LOG("MIOT Query codes: ", queryCode); 340 | 341 | switch (queryCode) 342 | { 343 | case BLINKER_CMD_QUERY_PM25_NUMBER : 344 | BLINKER_LOG("MIOT Query PM25"); 345 | BlinkerMIOT.pm25(20); 346 | BlinkerMIOT.print(); 347 | break; 348 | case BLINKER_CMD_QUERY_HUMI_NUMBER : 349 | BLINKER_LOG("MIOT Query HUMI"); 350 | BlinkerMIOT.humi(20); 351 | BlinkerMIOT.print(); 352 | break; 353 | case BLINKER_CMD_QUERY_TEMP_NUMBER : 354 | BLINKER_LOG("MIOT Query TEMP"); 355 | BlinkerMIOT.temp(20); 356 | BlinkerMIOT.print(); 357 | break; 358 | case BLINKER_CMD_QUERY_TIME_NUMBER : 359 | BLINKER_LOG("MIOT Query Time"); 360 | BlinkerMIOT.time(millis()); 361 | BlinkerMIOT.print(); 362 | break; 363 | default : 364 | BlinkerMIOT.temp(20); 365 | BlinkerMIOT.humi(20); 366 | BlinkerMIOT.pm25(20); 367 | BlinkerMIOT.co2(20); 368 | BlinkerMIOT.print(); 369 | break; 370 | } 371 | } 372 | ``` 373 | 支持查询的状态码: 374 | - 查询电源状态 **BLINKER_CMD_QUERY_POWERSTATE_NUMBER** 375 | - 查询PM2.5属性 **BLINKER_CMD_QUERY_PM25_NUMBER** 376 | - 查询CO2属性 **BLINKER_CMD_QUERY_CO2_NUMBER** 377 | - 查询温度属性 **BLINKER_CMD_QUERY_TEMP_NUMBER** 378 | - 查询湿度属性 **BLINKER_CMD_QUERY_HUMI_NUMBER** 379 | 380 | > 务必在回调函数中反馈该控制状态 381 | 382 | 注册回调函数: 383 | ```cpp 384 | BlinkerMIOT.attachQuery(miotQuery); 385 | ``` 386 | 387 | ## 小爱支持的语音指令 388 | 389 | * 灯 390 | - 打开/关闭{门口}的{灯} 391 | - 把{卧室}的{灯}调为{红色} 392 | 颜色范围为0-16777215(0xFFFFFF) 393 | - 把{卧室}的{灯}的{亮度调高一点} 394 | 亮度范围为1-100 395 | - 把{门口}的{灯}的{色温}调到{1400} 396 | 色温范围为1000-10000 397 | - 把{卧室}的{灯}调为{月光模式} 398 | - 查询{卧室}的{灯}的状态 399 | * 插座 400 | - 打开/关闭{厨房}的{插座} 401 | - {客厅}的{插座}是否打开 402 | * 传感器 403 | - {设备名}室内{温度}/{湿度}/{PM2.5}/{空气质量}/{二氧化碳含量} 404 | * 风扇 405 | - 打开/关闭{客厅}的{风扇} 406 | - 打开{客厅}{风扇}的{上下扫风} 407 | - 把{客厅}的{风扇}调到{一档} 408 | * 空调 409 | - 打开/关闭{客厅}的{空调} 410 | - 打开{客厅}{空调}的{上下扫风} 411 | - 把{客厅}的{风扇}调到{一档} 412 | - 把{客厅}的{空调}调为{自动模式} 413 | - 把{客厅}的{空调}调到{25摄氏度} 414 | - 把{客厅}的{空调}温度调{高一点} 415 | - 查询{客厅}的{空调}的{温度}/{湿度} 416 | 417 | ## 小爱支持控制的模式表 418 | 419 | |模式|中文描述| 420 | | :-: | :-: | 421 | |DAY|日光| 422 | |NIGHT|月光| 423 | |COLOR|彩光| 424 | |WARMTH|温馨| 425 | |TV|电视模式| 426 | |READING|阅读模式| 427 | |COMPUTER|电脑模式| 428 | -------------------------------------------------------------------------------- /docs/007-语音助手接入/99-接口说明.md: -------------------------------------------------------------------------------- 1 | # 语音助手接口说明 2 | 3 | ## 基本通信格式 4 | 5 | 6 | ## 状态查询 7 | 8 | | 操作 | 命令 | 适用类别 | 备注 | 9 | | ------------ | -------------------- | -------------------- | ---------------------------------------------- | 10 | | 开关状态获取 | `{'get': 'pState'}` | 天猫精灵、小度 | | 11 | | 所有属性获取 | `{"get": "state"}` | 天猫精灵、小爱、小度 | 小爱的所有查询均是此命令;天猫精灵用此查风速; | 12 | | 灯颜色查询 | `{"get": "col"}` | 天猫精灵、小度 | | 13 | | 色温查询 | `{"get": "colTemp"}` | 天猫精灵、小度 | | 14 | | 亮度查询 | `{"get": "bright"}` | 天猫精灵、小度 | | 15 | | 温度查询 | `{"get": "temp"}` | 天猫精灵、小度 | | 16 | | 湿度查询 | `{"get": "humi"}` | 天猫精灵、小度 | | 17 | | pm2.5查询 | `{"get": "pm25"}` | 天猫精灵、小度 | | 18 | | 模式查询 | `{"get": "mode"}` | 天猫精灵、小度 | | 19 | | pm10查询 | `{"get": "pm10"}` | 小度 | | 20 | | 二氧化碳 | `{"get": "co2"}` | 小度 | | 21 | | 空气质量 | `{"get": "aqi"}` | 小度 | | 22 | | 设备运行时间 | `{"get": "time"}` | 小度 | | 23 | 24 | 25 | 26 | ## 电源类操作 27 | 28 | | 操作 | 命令 | 适用类别 | 29 | | -------- | ---------------------------- | -------------------- | 30 | | 设备打开 | `{"set": {"pState": "on"}}` | 天猫精灵、小爱、小度 | 31 | | 设备关闭 | `{"set": {"pState": "off"}}` | 天猫精灵、小爱、小度 | 32 | 33 | 34 | 35 | ## 设备控制 36 | 37 | ### 灯 38 | 39 | | 操作 | 命令 | 适用类别 | 40 | | -------------- | ------------------------------ | -------------------- | 41 | | 灯的亮度设置 | `{"set": {"bright": ''}}` | 天猫精灵、小爱、小度 | 42 | | 灯的模式设置 | `{"set": {"mode": ""}}` | 天猫精灵、小爱、小度 | 43 | | 颜色设置 | `{"set": {"col": ''}}` | 天猫精灵、小爱、小度 | 44 | | 色温设置 | `{"set": {"colTemp": ''}}` | 天猫精灵、小爱、小度 | 45 | | 亮度调高一点 | `{"set": {"upBright": ''}}` | 天猫精灵、小度 | 46 | | 把亮度调低一点 | `{"set": {"downBright": ''}}` | 天猫精灵、小度 | 47 | | 颜色设置 | `{"set": {"col": ''}}` | 天猫精灵 | 48 | | 色温设置 | `{"set": {"colTemp": ''}}` | 天猫精灵 | 49 | | 色温调高一点 | `{"set": {"upColTemp": ''}}` | 天猫精灵、小度 | 50 | | 色温调低一点 | `{"set": {"downColTemp": ''}}` | 天猫精灵、小度 | 51 | | 取消模式 | `{"set": {"cMode": ""}}` | 天猫精灵、小度 | 52 | 53 | 54 | 55 | ### 风扇 56 | 57 | | 操作 | 命令 | 适用类别 | 58 | | -------------- | ---------------------------- | -------------------- | 59 | | 风速设置 | `{"set": {"level": ""}}` | 天猫精灵、小爱、小度 | 60 | | 左右摆风 | `{"set": {"hsState": ""}}` | 天猫精灵、小爱 | 61 | | 上下摆风 | `{"set": {"vsState": ""}}` | 天猫精灵、小爱 | 62 | | 开启摆风 | `{"set": {"swing": ""}}` | 天猫精灵、小爱 | 63 | | 左右摆风角度 | `{'set': {'hAngle': ""}}` | 小爱 | 64 | | 上下摆风角度 | `{'set': {'vAngle': value}}` | 小爱 | 65 | | 把风速调高一点 | `{"set": {"upLevel": ""}}` | 天猫精灵、小度 | 66 | | 把风速调低一点 | `{"set": {"downLevel": ""}}` | 天猫精灵、小度 | 67 | 68 | 69 | 70 | ### 空调 71 | 72 | | 操作 | 命令 | 适用类别 | 73 | | ------------ | --------------------------- | -------------------- | 74 | | 温度设置 | `{"set": {"temp": ''}}` | 天猫精灵、小爱、小度 | 75 | | 温度调高一点 | `{"set": {"upTemp": ''}}` | 天猫精灵、小度 | 76 | | 温度调低一点 | `{"set": {"downTemp": ''}}` | 天猫精灵、小度 | 77 | | 湿度设置 | `{'set': {'humi': ""}}` | 小爱 | 78 | | ECO节能模式 | `{'set': {'eco': ''}}` | 小爱 | 79 | | 负离子 | `{'set': {'anion': ""}}` | 小爱 | 80 | | 辅热功能 | `{'set': {'heater': ""}}` | 小爱 | 81 | | 干燥功能 | `{'set': {'dryer': ""}}` | 小爱 | 82 | 83 | 84 | 85 | ### 空调风机 86 | 87 | | 操作 | 命令 | 适用类别 | 88 | | ------------ | -------------------------- | -------------- | 89 | | 风速设置 | `{"set": {"level": ""}}` | 天猫精灵、小爱 | 90 | | 左右摆风 | `{"set": {"hsState": ""}}` | 天猫精灵、小爱 | 91 | | 上下摆风 | `{"set": {"vsState": ""}}` | 天猫精灵、小爱 | 92 | | 左右摆风角度 | `{'set': {'hAngle': ""}}` | 小爱 | 93 | | 上下摆风角度 | `{'set': {'vAngle': ""}}` | 小爱 | 94 | 95 | -------------------------------------------------------------------------------- /docs/009-专属设备开发/00-开发说明.md: -------------------------------------------------------------------------------- 1 | # 专属设备开发(已下线) 2 | **本功能自2024年1月1日起下线** 3 | 4 | ## 专属设备与独立设备 5 | **独立设备**是点灯提供的基础设备开发模式,开发者需先创建一个单一设备,每个设备创建后都会得到唯一的密钥。在程序中使用该密钥,可获取到设备连接信息,进而连接到点灯broker进行通信。 6 | **专属设备**是针对批量设备提供的开发模式,开发者需要先创建一个设备类型,每类设备有一组typeKey和authKey。在程序中使用这组密钥,通过blinker app添加设备(进行配网),设备会自动获取到设备对应的唯一密钥,再通过密钥获取到连接信息,进而连接到点灯broker进行通信。 7 | 8 | 我们的建议: 9 | 如果您的设备数量不多、各不相同,且只是供您或您的组织自身使用,您通常应该使用**独立设备**进行开发,每个设备您可以赋予不同的程序及设备操作界面; 10 | 如果您的设备是标准产品、需要量产,且需要分发给其他用户使用,通常应该使用**专属设备**进行开发,每一个专属设备类型对应了一类产品,您可批量的将一个固件烧录到多个设备中,并将设备进行分发或销售。 11 | 12 | ## 开发流程 13 | #### 1.创建专属设备类型 14 | a.开发者通过**app>开发者>专属设备>创建专属设备**,创建专属设备; 15 | b.创建专属设备成功后,可获取到设备的typeKey、authKey,将这两个数据写入到程序中; 16 | c.上传程序到设备,并通过**app>添加设备>对应设备**,为设备完成配网和注册,该设备即可测试; 17 | 18 | #### 2.对专属设备进行开发 19 | - 设定设备相关信息 20 | 可以通过 **app>开发者>专属设备>设置>编辑信息** 设定相关信息: 21 | 1.初次使用,您可以设备页组件选择**Layouter2**,配网方式选择**SmartConfig**; 22 | 2.设备介绍和接入引导是显示在添加设备页面的信息,支持**markdown**格式; 23 | 24 | - 布局设备界面 25 | 专属设备界面提供3种选择方式: 26 | 1.Layouter2界面编辑器拖拽生成界面,当设备页组件为Layouter2时,可以在这里拖拽生成设备界面; 27 | 2.使用Blinker提供的模板界面; 28 | 3.使用[Blinker Customizer](https://diandeng.tech/doc/customizer)开发独立的设备界面; 29 | 4.企业开发者可定制独立的界面。 30 | 31 | - 设备开发 32 | 见[设备端开发](#设备端开发 "设备端开发") 33 | 34 | - 添加设备并测试 35 | 当信息和布局器都设定好以后,即可在**添加设备**页面看到这个设备,点击即可进行添加; 36 | 预先为设备烧写好程序,然后在添加设备页面点击对应设备,即可进行配置注册; 37 | 38 | #### 3.申请正式上线设备 39 | 设备开发测试完成后,可以申请发布该设备 40 | 41 | #### 4.最终用户使用 42 | 设备正式上线后,其他用户可以在**app>添加设备**,找这个设备,点击该设备,即可进行添加操作 43 | 44 | ## 设备端开发 45 | 目前专属设备仅支持ESP8266/ESP32,配合Arduino SDK或freeRTOS SDK开发,详情可见: 46 | [Arduino支持](?file=009-专属设备开发/11-Arduino支持) 47 | [freeRTOS支持](?file=009-专属设备开发/12-freeRTOS支持) 48 | 示例中type、auth即是在开发中心和管理台中查看到的设备类型和密钥。 49 | 50 | ## 设备发布 51 | **仅已认证用户可发布** 52 | 在确保设备运行正常后,开发者可申请设备正式发布。正式发布后,所有blinker用户都可以在App中添加设备页面查看到该设备,并可进行添加设备操作。 53 | 54 | App端发布操作流程如下: 55 | a.开发者通过**app>开发者>专属设备>对应专属设备**,点击**申请设备正式上线** 56 | b.填写必要信息,并同意blinker专属设备开发协议 57 | c.等待审核通过 58 | 59 | ### 设备发布 60 | 申请正式发布设备,需要达到以下要求: 61 | 1.您的设备已经开发完成,能正常使用; 62 | 2.您的设备是一个完整的产品,非个人DIY项目; 63 | 64 | 如果满足以上两点要求,您还需要进行以下操作: 65 | 0.通过管理台或App进行账号实名制认证 66 | 1.通过管理台或App提交发布申请 67 | 2.联系管理员(奈何col)寄送设备样品,如设备单价较高,我们会在测试后寄回设备;如设备不便寄送,可提供视频演示,(视频演示中应出现blinker app和设备画面) 68 | 3.提供设备使用说明文档,设备实物照片(多角度,至少3张) 69 | 70 | ### 上线测试 71 | 您可以联系管理员申请临时上线测试,效果和正式发布无异,只是通常我们会在30天后下线该设备。 72 | 73 | ### 设备下线 74 | 您可以联系管理员将已上线设备进行下线处理; 75 | 点灯团队也有权将不合格的设备进行下线处理。 76 | 77 | -------------------------------------------------------------------------------- /docs/009-专属设备开发/01-设备端开发.md: -------------------------------------------------------------------------------- 1 | # 设备端开发 2 | **本功能自2024年1月1日起下线** 3 | 4 | 目前专属设备仅支持 **WiFi(MQTT)** 接入, **BLE** / **NBIOT**接入支持待后续更新 5 | 6 | ## ESP8266/ESP32通过MQTT接入 7 | [Arduino示例](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_PRO/Blinker_PRO_ESP/Blinker_PRO_ESP.ino) [了解更多](https://diandeng.tech/doc/arduino-support-1) 8 | [FreeRTOS示例](https://github.com/blinker-iot/blinker-esp-idf/tree/master/ESP8266/examples/Blinker_PRO_ESP/Hello_WiFi) [了解更多](https://diandeng.tech/doc/freertos-support-1) 9 | ### 使用方法 10 | 在示例中填入设备type和auth信息,烧写至设备,通过**App>添加设备>选择对应设备>智能配网**即可将设备添加到App中。 11 | ### 配网模式 12 | 示例默认使用ESPTOUCH进行设备配网,阅读[配网模式](https://diandeng.tech/doc/config-mode)了解其他配网方式。 13 | 14 | ## Linux设备通过MQTT接入 15 | Blinker提供了Linux设备扫码配置接入 16 | 17 | ### 使用方法 18 | #### 命令行启动 19 | 20 | #### 单按键启动 21 | 22 | ### 扫码配网 23 | 24 | ## NBIot设备接入 25 | Blinker提供了Linux设备扫码配置接入 26 | ### 使用方法 27 | 28 | ### 扫码配网 29 | 30 | ## NRF52通过BLE接入 31 | 待写 32 | -------------------------------------------------------------------------------- /docs/009-专属设备开发/03-专属设备模板.md: -------------------------------------------------------------------------------- 1 | # 专属设备模板 2 | **本功能自2024年1月1日起下线** 3 | **专业版功能** 4 | 为了让开发者更好体验专属设备开发,我们提供了一些常用的设备模板 5 | 6 | ## 使用方法 7 | 在专属设备信息编辑中,将页面组件选为自定义,并输入我们提供的示例组件名即可,如 **OwnPlugDashboard** 8 | 9 | ## 组件名及示例程序 10 | | 设备类型 |组件名 |示例 | 说明 | 11 | | ------------ | --------------- |-------------------------- | -------------------------- | 12 | | 单插座 | OwnPlugDashboard | [Blinker_PRO_Plug](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_PRO_Device/Blinker_PRO_Plug/Blinker_PRO_Plug.ino) | 13 | | 灯-全彩版 |OwnLightDashboard |Blinker_PRO_Light |每个灯珠可独立调颜色和亮度 | 14 | | 灯-双色温 |OwnLight1Dashboard |Blinker_PRO_Light1 |可调色温和亮度 | 15 | 16 | 17 | ## 计划提供app界面的设备模板 18 | | 支持设备 | deviceType | | 19 | | ------------- | ------------ | ------------------------- | 20 | | 灯-开关版2路 | OwnLight2 | | 21 | | 灯-开关版3路 | OwnLight3 | | 22 | | 灯-开关版4路 | OwnLight4 | | 23 | | 传感器 | OwnSensor | | 24 | | 传感器-温湿度 | OwnSensorTH | | 25 | | 传感器-AQI | OwnSensorAQI | | 26 | | 插座-2路 | OwnPlug2 | | 27 | | 插座-3路 | OwnPlug3 | | 28 | | 插座-4路 | OwnPlug4 | | -------------------------------------------------------------------------------- /docs/009-专属设备开发/06-OTA&固件管理.md: -------------------------------------------------------------------------------- 1 | # OTA&固件管理 2 | **本功能自2024年1月1日起下线** 3 | **专业版功能** 4 | **该功能仅支持esp8266、esp32** 5 | 设备开发者可通过管理台测试并发布新固件,用以更新对应设备 6 | 7 | ## 固件编译 8 | 9 | ### 设备版本号 10 | **请务必遵循[版本号命名规则](https://semver.org/lang/zh-CN/)** 11 | 固件默认版本号为 0.1.0,如要编译新版本的固件,需要设置更高的版本号,如0.1.1。 12 | 版本号设置方法如下: 13 | ```c++ 14 | #define BLINKER_WIFI 15 | #define BLINKER_OTA_VERSION_CODE "0.1.1" 16 | 17 | #include 18 | ``` 19 | 20 | ### OTA状态获取 21 | **BlinkerUpdater.onProgress()** 22 | 获取 OTA 更新进度, 在更新下载固件过程中会不定时调用通过该函数注册的回调函数。 23 | 如下代码可实现固件更新过程中闪烁LED: 24 | ```cpp 25 | uint32_t os_time = 0; 26 | 27 | void setup() { 28 | BlinkerUpdater.onProgress(otaStatus); 29 | } 30 | 31 | void otaStatus(uint32_t load_size, uint32_t total_size) { 32 | if (millis() - os_time >= BLINKER_OTA_BLINK_TIME) { 33 | os_time = millis(); 34 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); 35 | } 36 | } 37 | ``` 38 | > 回调函数中不能有耗时操作!耗时操作将导致OTA失败!** 39 | 40 | 41 | ### 设备配置 42 | 以最新package版本为例 43 | **ESP8266推荐配置:** 44 | ``` 45 | 开发板:"WiFiduino" 46 | Flash Size:"4M (FS:2MB OTA:~1019KB)" 47 | Debug port:"Disabled" 48 | Debug Level:"无" 49 | lwIp Variant:"v2 Lower Memory" 50 | VTables:"Flash" 51 | CPU Frequency:"80 MHz" 52 | Upload Speed:"921600" 53 | Erase Flash:"Only Sketch" 54 | ``` 55 | > 注: 建议 Flash Size 设置为 OTA:~1019KB的选项, 以免OTA空间不够 56 | 57 | **ESP32推荐配置:** 58 | ``` 59 | 开发板:"WiFiduino32" 60 | Partition Scheme:"Minimal SPIFFS(Large APPS with OTA)" 61 | FLASH Frequency:"80 MHz" 62 | ``` 63 | 64 | ### 固件获取 65 | 通过 **Arduino IDE菜单 > 项目 > 导出已编译的二进制文件** 即可导出固件,导出的固件在当前项目的项目文件夹中。 66 | 67 | ## 固件上传 68 | 1. 进入**管理台固件管理页面**,点击“固件列表”右侧的下拉框,选择要上传的固件的产品; 69 | 2. 右上方点击**上传固件**按键,在弹出框中输入 版本号、说明信息,并选择固件文件,最后点击**上传固件**完成上传。 70 | 71 | > 固件版本号应为程序中设定的版本号,且大于当前设备中的版本,方可正常更新 72 | > 73 | 74 | ## 固件测试 75 | 固件测试功能,用于在固件正式发布前对部分设备进行测试。 76 | 1. 在管理台选中要测试的固件,点击**测试固件**; 77 | 2. 在弹出框中,指定测试设备的ID,并点击**测试**; 78 | 2. 重启blinker App,进入设备固件更新页面,就可以看到固件更新信息了; 79 | 4. 点击**立即更新**,设备即会开始固件更新; 80 | 81 | > 程序中的固件版本需要和上传时填入的版本一致;只有云端版本大于当前设备版本时,app才会提示更新设备。 82 | > 83 | 84 | ## 固件发布 85 | 固件测试通过后,可以点击**发布固件**,进行发布。固件发布后,该产品下的所有设备,都可以收到新的固件。 86 | -------------------------------------------------------------------------------- /docs/009-专属设备开发/07-配网模式.md: -------------------------------------------------------------------------------- 1 | # 专属设备配网模式 2 | **本功能自2024年1月1日起下线** 3 | **专业版功能,该功能目前仅支持WiFi接入的专属设备使用** 4 | 专属设备目前提供了两种配网模式:**EspTouch**和**ApConfig**,您可根据实际需求选择其一,或选用两种都带的复合模式 5 | 通过**开发者>专属设备>专属设备设置>编辑信息**可以设定设备的配网模式 6 | 7 | 8 | ## ApConfig 9 | ApConfig时,设备会以其类型名为ssid名建立一个AP热点,APP可连接到该热点,并传递环境ssid和密码给设备,设备收到后,即会去连接目标热点。 10 | 只需要添加专属设备宏,即会默认启用ApConfig配网。 11 | ```cpp 12 | #define BLINKER_PRO_ESP 13 | ``` 14 | 15 | ## EspTouch/SmartConfig 16 | EspTouch,又名SmartConfig,是 esp8266 / esp32 芯片的快捷配网方式,其可以通过wifi广播的形式发送配网信息给设备。 17 | 专属设备默认使用ApConfig配网,如需切换到espTouch模式,可调用如下语句: 18 | ```cpp 19 | Blinker.esptouchInit(); 20 | ``` 21 | [Arduino sdk配网方式切换例程](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_PRO/Blinker_PRO_Wlan_Config/Blinker_PRO_Wlan_Config.ino) 22 | 23 | ## 设备重置/擦除配网信息 24 | 当设备需要重新配网时,调用`Blinker.reset()`擦除现有配置信息,即可重新进入配网模式。 25 | 推荐的方式: 26 | 方式1:设备上提供一个物理按键,长按该按键,即触发`Blinker.reset()`,擦除配网信息。 27 | ```c++ 28 | #define BLINKER_BUTTON 29 | #define BLINKER_BUTTON_PIN 4 30 | 31 | ICACHE_RAM_ATTR void buttonTick() { 32 | Blinker.tick(); 33 | } 34 | 35 | void longPressStart() { 36 | Blinker.reset(); 37 | } 38 | 39 | void setup() { 40 | Blinker.attachLongPressStart(longPressStart); 41 | attachInterrupt(BLINKER_BUTTON_PIN, buttonTick, CHANGE); 42 | } 43 | ``` 44 | 方式2:对于一些无法直接接触的设备,如吸顶灯,可通过物理开关,5秒内连续开关设备3次,然后触发`Blinker.reset()`,擦除配网信息。 45 | ```c++ 46 | #define BLINKER_NO_BUTTON 47 | void noButtonReset() { 48 | Blinker.reset(); 49 | } 50 | 51 | void setup() { 52 | Blinker.attachNoButtonReset(noButtonReset); 53 | } 54 | ``` 55 | 56 | 57 | ## 其他说明 58 | Esptouch用户体验较佳,但在wifi信号复杂的环境下,可能无法正常配网,解决办法见[esptouch无法配网解决办法](https://arduino.me/a/281) 59 | ApConfig通常能保证配网的成功,但在IOS中,需要用户手动连接设备热点,再返回App,且连接设备热点时手机会短暂断网,综合体验较差。 60 | 但为保证配网能够成功,点灯更推荐使用 ApConfig 61 | 62 | ## QrcodeConfig/扫码配网(企业版可定制) 63 | 对于已经有网络连接的NBiot、Linux设备,blinker提供了扫码配置方式。 64 | 使用blinker App扫码后,设备会注册到用户blinker账户中。 65 | 66 | ## BleConfig(企业版可定制) 67 | 计划支持**BleCpnfig**,可以通过蓝牙ble传输配置数据 68 | 69 | ## 付费添加设备(企业版可定制) 70 | 可付费添加设备 71 | -------------------------------------------------------------------------------- /docs/009-专属设备开发/08-授权与额度.md: -------------------------------------------------------------------------------- 1 | # 专属设备授权与额度 2 | **本功能自2024年1月1日起下线** 3 | 点灯专业版采用按设备授权方式进行收费 4 | 5 | ## 授权激活/额度 6 | 1.专属设备一旦设备联网,就会用去一个额度,用户解绑设备不会返还额度,同一设备重新绑定不会使用新的额度; 7 | 2.只有在开发中心中删除该专属设备,才会返还额度; 8 | 3.专属设备删除后,该专属设备下的所有设备,都将不能再使用,且无法还原。 9 | 10 | ## 授权费用 11 | 点灯科技将根据设备激活数量向您收取授权费用。 12 | 授权费用采用一次性阶梯收费: 13 | 专业版开发者,免费拥有5个设备授权; 14 | 500个以内,每个设备收费10元; 15 | 501~1000个设备每个设备收费8元; 16 | 如接入设备数量较多,可咨询点灯商务经理,单独报价。 17 | 18 | 19 | ## FAQ 20 | ### 专属设备是否可用于商业用途? 21 | 企业版,和专业版,开发的专属设备,可以销售给他人使用;教育版没有带商业授权,因此不能用于商业使用。 22 | ### 专属设备相关权责如何划分? 23 | blinker仅提供通信和app使用服务,不对设备质量、安全、可靠性等负责。一切权责由设备生产商或提供者承担。 -------------------------------------------------------------------------------- /docs/009-专属设备开发/09-Customizer定制设备界面.md: -------------------------------------------------------------------------------- 1 | # blinker-Customizer定制设备界面 2 | **本功能自2024年1月1日起下线** 3 | **专业版功能** 4 | ## 原理 5 | 6 | blinker-Customizer借鉴了微前端的思想,允许开发者使用iframe方式嵌入自定义的HTML页面/web app到blinker app中。 7 | 8 | ## 快速体验 9 | 10 | 通过 **管理台>产品开发** 选择一个设备,点击其**UI组件**,将内容设为如下: 11 | 12 | ``` 13 | Customizer?https://diandeng.tech/customizer/hello/hello.html 14 | ``` 15 | 16 | 现在设备UI界面已经切换为该html定义的界面。 17 | 18 | ## 界面开发 19 | 20 | 您可以通过[Github blinker-Customizer](https://github.com/blinker-iot/blinker-customizer)下载我们提供示例 21 | 22 | ### 简易开发 23 | 24 | 如果是使用html示例进行开发,您可以在vscode中安装 Live Server插件,实现一个简单的web服务器。 25 | 然后通过 **管理台>产品开发** 选择一个设备,点击其UI组件,将其设为该页面在局域网中的地址,如: 26 | ``` 27 | Customizer?https://192.168.0.100:5500/hello.html 28 | ``` 29 | 30 | ### 使用前端框架进行开发 31 | 开发者可以使用原生js或任意前端开发框架(angular、react、vue等)进行设备页面定制开发。这里不做详述,建议查看我们的例程。 32 | 33 | ## 示例详解 34 | 35 | ``` html 36 | 37 | 38 | 39 | 40 | 41 | 42 | blinker Customizer 43 | 44 | 45 | 46 | 47 | 48 | 49 |
50 | 52 |
53 | 54 |
55 |
56 | 57 | 58 |
59 |
60 | 100 | 101 | 102 | 103 | ``` 104 | 105 | ## 通信指令 106 | ### 初始化完成 107 | 当设备页载入成功,设备页将向app发送一个空对象,说明设备页面已经成功加载 108 | ```json 109 | {} 110 | ``` 111 | 112 | ### 获取历史数据 113 | 设备存储到云端的数据,可以通过以下指令获取 114 | ```json 115 | {"get":"history","quickDate":"1h","queryType":"avg"} 116 | ``` 117 | 关于quickDate和queryType,见[数据接口](https://diandeng.tech/doc/storage-api) 118 | 119 | ### 获取设备数据 120 | 在app运行期间,设备数据会暂存在app中,可以通过以下方式获取到数据,如 121 | ```json 122 | {"get":"data","prop": ["aaa","bbb"]} 123 | ``` 124 | 将返回设备数据 data.aaa.bbb 125 | 126 | ## 使用PWA测试你开发的界面 127 | PWA是(Progressive Web App)是google提出的web app技术。微信小程序,可以看做是微信版PWA,PWA最大优势是,不用安装,即开即用。为了方便大家体验blinker最新功能,和开发测试,我们也推出了blinker PWA版本。 128 | 129 | ### 使用方法: 130 | 1.使用手机浏览器访问 https://pwa.blinker.app 131 | 2.并添加到桌面(一定要添加到桌面!才是PWA模式) 132 | 133 | 已知的支持PWA的浏览器: 134 | Chrome、Safari、三星、小米、oppo等现代浏览器 135 | 136 | 存在的问题: 137 | 1.PWA只为让大家更快体验blinker新功能,我还没有时间对PWA版本进行优化。 138 | 2.因PWA本身限制,blinker App中的部分功能无法在PWA上使用。 139 | -------------------------------------------------------------------------------- /docs/009-专属设备开发/11-Arduino支持.md: -------------------------------------------------------------------------------- 1 | # blinker PRO Arduino支持库 2 | **本功能自2024年1月1日起下线** 3 | **专业版功能** 4 | 针对嵌入式设备的blinker库,需配合arduino sdk使用。 5 | 6 | ## 支持的硬件 7 | * 使用 [esp8266/arduino](https://github.com/esp8266/arduino) 的ESP8266 8 | * 使用 [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) 的ESP32 9 | 10 | ## 支持的接入方式 11 | * WiFi 12 | 13 | ## 准备工作 14 | 使用前您需要做好如下准备: 15 | * [Arduino IDE](https://arduino.me/download) 1.6.12或更新版本 16 | * 使用 Arduino IDE 的开发板管理器安装 [esp8266/arduino](https://github.com/esp8266/arduino) 17 | * 按照 [安装说明](https://github.com/espressif/arduino-esp32#installation-instructions) 安装 [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) 18 | 19 | ## Blinker PRO 接口函数 20 | [Blinker PRO 专属设备常用接口函数](https://diandeng.tech/doc/arduino-support "Arduino支持")在此不做累述, 此文档针对 **Blinker PRO** 专属设备特有函数进行讲解。 21 | ### 配置服务器信息 22 | 当使用其他服务器部署时可使用如下代码切换服务器配置信息: 23 | ```cpp 24 | #define BLINKER_SERVER_HTTPS "https://iot.diandeng.tech" 25 | 26 | #define BLINKER_SERVER_HOST "iot.diandeng.tech" 27 | 28 | #include 29 | 30 | void setup() {} 31 | 32 | void loop() {} 33 | ``` 34 | ### 设备配置 35 | #### Blinker.begin() 36 | 使用 **Blinker.begin()** 来配置 Blinker: 37 | ```cpp 38 | #define BLINKER_PRO 39 | #define BLINKER_BUTTON 40 | #define BLINKER_BUTTON_PIN 7 41 | 42 | #include 43 | 44 | char type[] = "Your Device Type"; 45 | char auth[] = "Your Device Secret Key"; 46 | 47 | void setup() { 48 | Blinker.begin(auth, type); 49 | } 50 | ``` 51 | > 务必保证有一个实体按键, 下文将讲解其作用 52 | > 目前支持的硬件: WiFiduino, WiFiduino32, ESP8266, ESP32 53 | 54 | **begin()** 主要完成以下配置: 55 | 1.初始化硬件设置; 56 | 2.等待设备配网; 57 | 3.获取设备登陆信息; 58 | 4.设备配置成功后存储配置信息到EEPROM; 59 | 60 | ### Blinker.smartconfigInit() 61 | 设置设备为 ESPTOUCH 配网模式 62 | 63 | ### Blinker.apConfigInit() 64 | 设置设备为 APCONFIG 配网模式 65 | 66 | ### Blinker.configType() 67 | 获取设备配网模式 68 | ``` 69 | enum b_config_t { 70 | BLINKER_SMART_CONFIG, 71 | BLINKER_AP_CONFIG 72 | }; 73 | ``` 74 | ``` 75 | b_config_t type = Blinker.configType(); 76 | ``` 77 | 78 | ### Blinker.status() 79 | 获取设备当前状态, 可获取状态如下: 80 | ``` 81 | enum BlinkerStatus_t 82 | { 83 | PRO_WLAN_CONNECTING, // 设备网络连接中 84 | PRO_WLAN_CONNECTED, // 设备已连接网络 85 | PRO_WLAN_SMARTCONFIG_BEGIN,// 设备开启ESPTOUCH配网模式,等待配网 86 | PRO_WLAN_SMARTCONFIG_DONE, // 设备ESPTOUCH配网完成 87 | PRO_WLAN_APCONFIG_BEGIN, // 设备开启AP配网模式,等待配网 88 | PRO_WLAN_APCONFIG_DONE, // 设备AP配网完成 89 | PRO_DEV_AUTHCHECK_FAIL, // 设备注册用户校验失败 90 | PRO_DEV_AUTHCHECK_SUCCESS, // 设备注册用户校验成功 91 | PRO_DEV_REGISTER_FAIL, // 设备注册上线失败 92 | PRO_DEV_REGISTER_SUCCESS, // 设备注册上线成功 93 | PRO_DEV_INIT_SUCCESS, // 设备初始化完成 94 | PRO_DEV_CONNECTING, // 设备MQTT BROKER连接中 95 | PRO_DEV_CONNECTED, // 设备MQTT BROKER连接成功 96 | PRO_DEV_DISCONNECTED // 设备MQTT BROKER连接断开 97 | }; 98 | ``` 99 | ``` 100 | BlinkerStatus_t status = Blinker.status(); 101 | ``` 102 | 103 | ### BLINKER_BUTTON 104 | 专属设备内置按键, 按键具有以下功能: 105 | - 单击 106 | - 双击 107 | - 长按开始 108 | - 长按中 109 | - 长按结束 110 | - 长按关机/重置(10s以上) 111 | 112 | > 设备配置成功后数据存入EEPROM中, 默认开启 **BLINKER_BUTTON** 后长按即可清除EEPROM中存储的配置信息。 113 | 114 | 使能 **BLINKER_BUTTON** 并制定其端口(IO) 115 | ``` 116 | #define BLINKER_BUTTON 117 | #define BLINKER_BUTTON_PIN 7 118 | ``` 119 | > *默认检测IO内部上拉, 低电平触发 120 | > 需检测IO外部下拉, 高电平触发时: 121 | > ``` 122 | > #define BLINKER_BUTTON 123 | > #define BLINKER_BUTTON_PULLDOWN 124 | > #define BLINKER_BUTTON_PIN 7 125 | > ``` 126 | 127 | #### Blinker.attachClick() 128 | 按键单次点击时的回调函数 129 | ```cpp 130 | /* 131 | * Add your code in this function 132 | * 133 | * When button clicked, device will call this function 134 | */ 135 | void singleClick() 136 | { 137 | BLINKER_LOG("Button clicked!"); 138 | } 139 | ``` 140 | 注册按键单次按下时的回调函数, 当设备检测到按键单击时将调用该函数 141 | ```cpp 142 | Blinker.attachClick(singleClick); 143 | ``` 144 | 145 | #### Blinker.attachDoubleClick() 146 | 按键双击时的回调函数 147 | ```cpp 148 | /* 149 | * Add your code in this function 150 | * 151 | * When button double clicked, device will call this function 152 | */ 153 | void doubleClick() 154 | { 155 | BLINKER_LOG("Button double clicked!"); 156 | } 157 | ``` 158 | 注册按键双击时的回调函数, 当设备检测到按键双击时将调用该函数 159 | ```cpp 160 | Blinker.attachDoubleClick(singleClick); 161 | ``` 162 | 163 | #### Blinker.attachLongPressStart() 164 | 按键长按开始时的回调函数 165 | ```cpp 166 | /* 167 | * Add your code in this function 168 | * 169 | * When long press start, device will call this function 170 | */ 171 | void longPressStart() 172 | { 173 | BLINKER_LOG("Button long press start!"); 174 | } 175 | ``` 176 | 注册按键长按开始时的回调函数, 当设备检测到按键长按开始时将调用该函数 177 | ```cpp 178 | Blinker.attachLongPressStart(longPressStart); 179 | ``` 180 | 181 | #### Blinker.attachDuringLongPress() 182 | 按键长按过程中的回调函数 183 | ```cpp 184 | /* 185 | * Add your code in this function 186 | * 187 | * When during long press, device will call this function 188 | */ 189 | void duringLongPress() 190 | { 191 | BLINKER_LOG("During button long press!"); 192 | } 193 | ``` 194 | 注册按键长按过程中的回调函数, 当设备检测到按键长按执行中时将调用该函数 195 | ```cpp 196 | Blinker.attachDuringLongPress(duringLongPress); 197 | ``` 198 | 199 | #### Blinker.attachLongPressStop() 200 | 按键长按释放时的回调函数 201 | ```cpp 202 | /* 203 | * Add your code in this function 204 | * 205 | * When long press stop, device will call this function 206 | */ 207 | void longPressStop() 208 | { 209 | BLINKER_LOG("Button long press stop!"); 210 | } 211 | ``` 212 | 注册按键长按释放时的回调函数, 当设备检测到按键长按结束时将调用该函数 213 | ```cpp 214 | Blinker.attachLongPressStop(longPressStop); 215 | ``` 216 | > 注: 默认长按释放后将清除设备配置信息, 重置设备 217 | > 设备端还提供: 218 | > - 设备长按2s后(10s内)释放, 执行关机不重置设备 219 | > Blinker.attachLongPressPowerdown 220 | > - 长按10s后释放重置设备的功能 221 | > Blinker.attachLongPressReset 222 | 223 | #### BLINKER_BUTTON_LONGPRESS_POWERDOWN 224 | 启用长按关机/重置功能 225 | ```cpp 226 | #define BLINKER_BUTTON 227 | #define BLINKER_BUTTON_PULLDOWN 228 | #define BLINKER_BUTTON_LONGPRESS_POWERDOWN 229 | #define BLINKER_BUTTON_PIN 7 230 | ``` 231 | > 注:此时可以不用注册 **Blinker.attachLongPressStop** 232 | 233 | **Blinker.attachLongPressPowerdown()** 234 | 按键长按释放时关机的回调函数 235 | ```cpp 236 | /* 237 | * Add your code in this function 238 | * 239 | * When long press stop and trigged POWERDOWN, device will call this function 240 | */ 241 | void longPressPowerdown() 242 | { 243 | BLINKER_LOG("Button long press powerdown!"); 244 | 245 | digitalWrite(BLINKER_POWER_3V3_PIN, LOW); 246 | } 247 | ``` 248 | 注册按键长按释放时关机的回调函数, 当设备检测到按键长按结束并触发关机动作时将调用该函数 249 | ```cpp 250 | Blinker.attachLongPressReset(longPressPowerdown); 251 | ``` 252 | **Blinker.attachLongPressReset()** 253 | 按键长按释放时重置的回调函数 254 | ```cpp 255 | /* 256 | * Add your code in this function 257 | * 258 | * When long press stop and trigged RESET, device will call this function 259 | */ 260 | void longPressReset() 261 | { 262 | BLINKER_LOG("Button long press reset!"); 263 | } 264 | ``` 265 | 注册按键长按释放时重置的回调函数, 当设备检测到按键长按结束并触发重置动作时将调用该函数 266 | ```cpp 267 | Blinker.attachLongPressReset(longPressReset); 268 | ``` 269 | **Blinker.pressedTime()** 270 | 在长按执行过程中可以返回长按已持续时间, 单位ms, 最大值为10000 ms 271 | ```cpp 272 | uint16_t pressed_time = Blinker.pressedTime(); 273 | ``` 274 | 275 | #### Blinker.tick() 276 | 检测按键状态, 用户一般情况下可以不调用。 277 | 如果用户对按键实时性要求较高, 可以使用外部中断: 278 | ```cpp 279 | /* 280 | * Blinker provide a button parse function for user if you defined BLINKER_BUTTON 281 | * 282 | * Blinker button can detect single click/ double click/ long press 283 | * 284 | * Blinker.tick() will run by default, use interrupt will be better 285 | */ 286 | void buttonTick() 287 | { 288 | Blinker.tick(); 289 | } 290 | ``` 291 | 使用跳变沿中断: 292 | ```cpp 293 | attachInterrupt(BLINKER_BUTTON_PIN, buttonTick, CHANGE); 294 | ``` 295 | 296 | ### BLINKER_NO_BUTTON 297 | 专属设备无按键(通断电源计次)功能 298 | > 注: 启用该功能后上电5s内断电(连续三次以上)将调用对应的回调 299 | > ``` 300 | > #define BLINKER_NO_BUTTON 301 | > ``` 302 | 303 | #### Blinker.attachNoButtonReset() 304 | 无按键重置回调函数 305 | ```cpp 306 | void noButtonReset() 307 | { 308 | BLINKER_LOG("no button reset trigged!"); 309 | } 310 | ``` 311 | 注册按键无按键回调函数, 当设备检测到无按键重置时将调用该函数 312 | ```cpp 313 | Blinker.attachNoButtonReset(noButtonReset); 314 | ``` 315 | 316 | #### Blinker.reset() 317 | 设备重置API, 调用该接口后设备将立即重置。 318 | 319 | ### 数据解析 320 | 设备在收到数据时将调用数据解析的回调函数。 321 | 数据解析的回调函数: 322 | ```cpp 323 | /* 324 | * Add your command parse code in this function 325 | * 326 | * When get a command and device not parsed this command, 327 | * device will call this function with a JsonObject data. 328 | */ 329 | bool dataParse(const JsonObject & data) 330 | { 331 | String getData; 332 | data.printTo(getData); 333 | BLINKER_LOG("Get user command: ", getData); 334 | 335 | bool isParsed = false; 336 | 337 | if (isParsed) { 338 | return true; 339 | } 340 | else { 341 | return false; 342 | } 343 | } 344 | ``` 345 | 注册数据解析的回调函数: 346 | ```cpp 347 | Blinker.attachParse(dataParse); 348 | ``` 349 | 350 | ## 感谢 351 | [WebSockets](https://github.com/Links2004/arduinoWebSockets) - Blinker 用这个库建立了一个 websocket 服务器 352 | [Adafruit_MQTT_Library](https://github.com/adafruit/Adafruit_MQTT_Library) - Blinker 用这个库建立了一个 MQTT 客户端 353 | [ArduinoJson](https://github.com/bblanchon/ArduinoJson) - Blinker 用这个库解析Json数据 -------------------------------------------------------------------------------- /docs/009-专属设备开发/12-freeRTOS支持.md: -------------------------------------------------------------------------------- 1 | # blinker PRO freeRTOS支持库 2 | **本功能自2024年1月1日起下线** 3 | **专业版功能** 4 | 针对嵌入式设备的blinker库,需配合freeRTOS使用。 5 | 6 | [使用示例](https://github.com/blinker-iot/blinker-freertos/tree/master/example/Blinker_PRO_ESP/Hello_WiFi) -------------------------------------------------------------------------------- /docs/019-管理台/001-管理台.md: -------------------------------------------------------------------------------- 1 | # 管理台 2 | **部分功能仅企业版独立部署可用** 3 | 管理台是点灯提供给开发者和运营人员使用的管理后台。 4 | 5 | 用户管理:查看系统中注册的用户信息 6 | 7 | 设备管理:查看系统中注册的设备信息 8 | 9 | 数据管理:查看系统中存储的数据信息 10 | 11 | 产品开发:新建产品,修改产品配置 12 | 13 | 固件管理:用于测试和推送设备固件 14 | 15 | 实名审核:用于审核开发者信息 16 | 17 | 用户反馈:查看用户通过App提交的反馈信息 18 | 19 | 消息推送:向App推送信息 -------------------------------------------------------------------------------- /docs/019-管理台/002-产品开发.md: -------------------------------------------------------------------------------- 1 | # 产品开发 2 | ## 设备创建 3 | 开发者可通过本页面创建设备,设备创建后,会得到设备的typeKey和authKey 4 | 5 | ## 查看设备 6 | 该功能仅限管理员使用 7 | 可查看该产品下的所有设备 8 | 9 | ## 发布产品 10 | 可见[开发说明](?file=009-专属设备开发/00-开发说明 "开发说明") 11 | 12 | ## 获取密钥 13 | 查看该产品的typeKey和authKey 14 | 15 | ## 删除产品 16 | 删除该产品。删除后该产品下属的所有设备将不可用 -------------------------------------------------------------------------------- /docs/019-管理台/003-固件管理.md: -------------------------------------------------------------------------------- 1 | # 固件管理 2 | 见[OTA&固件管理](https://diandeng.tech/doc/ota) -------------------------------------------------------------------------------- /docs/019-管理台/004-密钥管理.md: -------------------------------------------------------------------------------- 1 | # 密钥管理 2 | 在该板块可生成密钥,用于第三方系统或其他客户端获取存储在云端的数据。 3 | 4 | 使用方法见[数据接口(数值时序)](https://diandeng.tech/doc/api-storage-ts-num) -------------------------------------------------------------------------------- /docs/019-管理台/004-消息推送.md: -------------------------------------------------------------------------------- 1 | # 消息推送 2 | **该功能目前仅限管理员使用** 3 | 4 | ## 推广消息 5 | 推广消息可向系统下所有用户推送消息,并附带一个url连接,用户在APP中点击该消息,即可跳转到url对应的地址 6 | 7 | ## 系统消息 8 | 系统消息可向所有用户推送一条消息 9 | 10 | ## 用户消息 11 | 用于向指定用户推送消息 12 | 推送时需要输入一个或多个用户手机号 13 | 14 | -------------------------------------------------------------------------------- /docs/019-管理台/005-云日志.md: -------------------------------------------------------------------------------- 1 | # 云日志beta 2 | 3 | 云日志本质是一套云端文本时序存储方案。 4 | 开发者可在设备端调用相关函数,将文本数据和对应时序信息存储到云端。 5 | 6 | 7 | ```c++ 8 | blinker.log(''); 9 | ``` 10 | 11 | ```js 12 | device.log(''); 13 | ``` -------------------------------------------------------------------------------- /docs/019-管理台/098-运营功能.md: -------------------------------------------------------------------------------- 1 | # 运营相关功能 2 | 3 | ## 实名审核 4 | 用于平台运营方审核开发者资质 5 | 6 | ## 产品审核 7 | 用于平台运营方审核产品发布情况。开发申请发布即会立即发布,运营方可以将已发布设备下线 8 | 9 | ## 用户反馈 10 | 查看app端用户提交的反馈信息 11 | 12 | ## 消息推送 13 | 允许向指定用户发送推送消息 -------------------------------------------------------------------------------- /docs/019-管理台/099-管理台设置.md: -------------------------------------------------------------------------------- 1 | # 管理台设置 2 | 3 | ## 配置编辑 4 | 允许对相关配置进行编辑,目前可编辑项有: 5 | icon.json 图标配置。用于添加App自定义图标 6 | 7 | update.json 升级配置。用于App获取新版本及版本说明 8 | 9 | notice.json 通知告示。可用于在客户端、管理台显示 10 | 11 | develop.md 开发者协议 12 | 13 | user.md 用户协议 14 | 15 | privacy.md 隐私协议 16 | 17 | 18 | ## 管理员 19 | 通过该板块,可以添加删除管理员账号 -------------------------------------------------------------------------------- /docs/020-相关接口/001-设备上线与通信(MQTT).md: -------------------------------------------------------------------------------- 1 | # 设备上线与通信 2 | 本文档适用于使用点灯自有Broker 3 | ## 设备上线 4 | 5 | ### 获取连接信息 6 | 7 | **接口(独立设备)** 8 | 9 | ``` 10 | GET https://iot.diandeng.tech/api/v1/user/device/diy/auth?authKey={authKey} 11 | ``` 12 | 13 | **Response** 14 | 15 | ``` js 16 | { 17 | message: 1000 18 | detail: { 19 | broker: 'blinker', 20 | deviceName: 'BDB1C0D8PS3Rxxxxxxxxxxxx', 21 | host:'mqtt://broker.diandeng.tech', 22 | port:'1883' 23 | iotId: 'xxxxxxxxJLSBnI13000xxx', 24 | iotToken: 'xxxxxxxxxx468856x4f15936243c64fd', 25 | uuid: '9140dxx9843bxxd6bc439exxxxxxxxxx' 26 | } 27 | } 28 | ``` 29 | 30 | ### 指定连接协议 31 | ``` 32 | GET https://iot.diandeng.tech/api/v1/user/device/diy/auth?authKey=&protocol= 33 | ``` 34 | 添加参数protocol可指定连接协议,目前支持的协议有:mqtt、mqtts、ws、wss 35 | 36 | 37 | ## 连接&&鉴权 38 | 使用以上连接信息,即可连接MQTT Broker 39 | 40 | ``` js 41 | mqtt.connect('mqtts://broker.diandeng.tech:1883', { 42 | clientId: deviceName, 43 | username: iotId, 44 | password: iotToken 45 | }); 46 | ``` 47 | 48 | ## 发布&&订阅 49 | **发布** 50 | 设备向Topic发布信息后,broker会获取其中的toDevice信息,并将该信息转发到指定设备 51 | ``` 52 | TOPIC /device/{deviceName}/s 53 | ``` 54 | 55 | ``` json 56 | {"toDevice":"xxxxxxxx","data":"abcdefg"} 57 | ``` 58 | toDevice:目标设备 59 | data:承载数据 60 | 61 | **订阅** 62 | broker转发来的数据,会以fromDevice注明消息的来源设备 63 | ``` 64 | TOPIC /device/{deviceName}/r 65 | ``` 66 | 67 | ``` json 68 | {"fromDevice":"xxxxxxxx","data":"abcdefg"} 69 | ``` 70 | 71 | fromDevice:来源设备 72 | data:承载数据 73 | 74 | ### 组 75 | blinker Broker以组(Group)进行权限鉴别,在同一组内的设备可以相互通信 76 | 例如:两个设备都是同一用户创建的,这两个设备将都在同一用户组中,因此可以相互通信。 77 | **向组发送数据** 78 | TOPIC /group/groupName/s 79 | ```json 80 | {"toGroup":"xxx","data":{"get":"state"}} 81 | ``` 82 | 83 | toDevice:目标设备 84 | data:承载数据 85 | 86 | **接收组发来的数据** 87 | TOPIC /group/groupName/r 88 | ```json 89 | {"fromGroup":"xxx","data":{"get":"state"}} 90 | ``` 91 | 92 | fromDevice:来源设备 93 | data:承载数据 94 | 95 | ## 限制机制 96 | 1. 一个authkey只能一个设备使用,每次获取连接信息,都将重置iotToken 97 | 2. 设备只能发布和订阅属于自身的topic,如果操作其他topic将被broker断开连接 98 | 3. 设备消息发布频率最高每秒1次,否则将被broker断开连接 99 | 4. 每条消息长度不能大于1024,否则将被broker断开连接 100 | 5. 设备只能和所在组(Group)的其他设备通信 101 | 102 | ## MQTT SDK 103 | 我们建议项目中使用以下推荐SDK: 104 | 105 | | C(Linux/windows/MacOS使用) | [Paho C SDK](https://github.com/eclipse/paho.mqtt.c) | 106 | | ---------------------------- | ------------------------------------------------------------ | 107 | | C(MCU使用) | [Paho embedded-C SDK](https://github.com/eclipse/paho.mqtt.embedded-c) | 108 | | Python | [Paho Python SDK](https://github.com/eclipse/paho.mqtt.python) | 109 | | JavaScript | [mqtt.js](https://github.com/mqttjs/MQTT.js) | 110 | | Java | [Paho Java SDK](https://github.com/eclipse/paho.mqtt.java) | 111 | | Golang | [Paho Golang SDK](https://github.com/eclipse/paho.mqtt.golang) | 112 | 113 | -------------------------------------------------------------------------------- /docs/020-相关接口/002-设备上线与通信(HTTP).md: -------------------------------------------------------------------------------- 1 | # 设备上线与通信 2 | **仅企业版可用** 3 | 4 | 本文档适用于使用点灯自有Broker 5 | ## 设备上线 6 | 7 | ### 获取连接信息 8 | 9 | **接口(独立设备)** 10 | 11 | ``` 12 | GET https://iot.diandeng.tech/api/v1/user/device/diy/auth?authKey=&protocol=https 13 | ``` 14 | protocol参数也可以设为`http` 15 | 16 | **Response** 17 | 18 | ``` js 19 | { 20 | message: 1000 21 | detail: { 22 | broker: 'blinker', 23 | deviceName: 'BDB1C0D8PS3Rxxxxxxxxxxxx', 24 | host:'https://broker.diandeng.tech', 25 | port:'1887' 26 | iotId: 'xxxxxxxxJLSBnI13000xxx', 27 | iotToken: 'xxxxxxxxxx468856x4f15936243c64fd', 28 | uuid: '9140dxx9843bxxd6bc439exxxxxxxxxx' 29 | } 30 | } 31 | ``` 32 | 33 | ## 发布 34 | 35 | 设备向Topic发布信息后,broker会获取其中的toDevice信息,并将该信息转发到指定设备 36 | ``` 37 | POST https://broker.diandeng.tech:1887/device/{deviceName} 38 | ``` 39 | 数据样式: 40 | ``` json 41 | {"toDevice":"xxxxxxxx","data":"abcdefg"} 42 | ``` 43 | toDevice:目标设备 44 | data:承载数据 45 | 46 | ## 获取 47 | broker转发来的数据,会以fromDevice注明消息的来源设备 48 | ``` 49 | GET https://broker.diandeng.tech:1887/device/{deviceName} 50 | ``` 51 | 数据样式: 52 | ``` json 53 | {"fromDevice":"xxxxxxxx","data":"abcdefg"} 54 | ``` 55 | 56 | fromDevice:来源设备 57 | data:承载数据 58 | 59 | ### 组 60 | blinker Broker以组(Group)进行权限鉴别,在同一组内的设备可以相互通信 61 | **向组发送数据** 62 | ``` 63 | POST https://broker.diandeng.tech:1887/device/{deviceName} 64 | ``` 65 | 数据样式: 66 | ```json 67 | {"toGroup":"xxx","data":{"get":"state"}} 68 | ``` 69 | 70 | toDevice:目标设备 71 | data:承载数据 72 | 73 | **接收组发来的数据** 74 | ``` 75 | GET https://broker.diandeng.tech:1887/device/{deviceName} 76 | ``` 77 | 数据样式: 78 | ```json 79 | {"fromGroup":"xxx","data":{"get":"state"}} 80 | ``` 81 | 82 | fromGroup:来源组 83 | data:承载数据 84 | -------------------------------------------------------------------------------- /docs/020-相关接口/003-设备管理.md: -------------------------------------------------------------------------------- 1 | # 设备管理 2 | **仅企业版可用** 3 | 4 | ## 获取设备列表 5 | ``` 6 | GET /api/v1/public/deviceList 7 | ``` 8 | **Response** 9 | ```js 10 | [ 11 | { 12 | 13 | } 14 | ] 15 | ``` 16 | 17 | 18 | ## 获取mqtt客户端连接信息 19 | ``` 20 | GET /api/v1/public/client/auth?authKey={authKey} 21 | ``` 22 | **Response** 23 | ```js 24 | [ 25 | { 26 | 27 | } 28 | ] 29 | ``` 30 | 31 | ## 使用示例 -------------------------------------------------------------------------------- /docs/020-相关接口/004-气象数据接口.md: -------------------------------------------------------------------------------- 1 | # 气象数据接口 2 | 3 | **该功能不可用于商业用途** 4 | **该接口暂停使用** 5 | 该功能仅支持可联网设备,允许用户获取当地的天气、未来三日天气预报、空气质量等信息 6 | 相关接口返回信息为Json格式,对于Arduino开发者可使用[ArduinoJson库](https://github.com/bblanchon/ArduinoJson)或其他json解析方式解析该Json字符串 7 | 8 | ## 接口限制 9 | 10 | 1. 以下接口仅供爱好者测试,不可用于商业产品使用,如需商业使用,请联系点灯团购购买。 11 | 2. 以下接口,每个设备每天可请求30次,超出请求次数,当日将不再返回数据,次日恢复服务。 12 | 3. 更新频率:天气数据、空气数据每2小时更新一次,天气预报每天更新3次(9:15、12:15、19:15左右更新) 13 | 4. 空气数据部分主要城市可用,详见本文档**空气数据城市列表**。 14 | 15 | ## 接口参数说明 16 | `cityCode`为[国家行政区编码](http://preview.www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html),当没有提交该参数时,接口将使用IP定位返回相应的地区数据。 17 | `deviceName`、`iotToken`获取方式见[设备上线与通信文档](https://diandeng.tech/doc/api-mqtt) 18 | 19 | ## 天气数据 20 | 21 | **接口:** 22 | ``` 23 | https://iot.diandeng.tech/api/v3/weather?code={cityCode}&device={deviceName}&key={iotToken} 24 | ``` 25 | **响应:** 26 | ```json 27 | { 28 | 29 | "city": "成都市", 30 | "province": "四川", 31 | "weather": "阴", 32 | "temp": "28", 33 | "humi": "45", 34 | "wind": "东南", 35 | "power": "≤3", 36 | "updateTime": "2020-05-16 20:27:42" 37 | 38 | } 39 | ``` 40 | **数据说明:** 41 | 42 | | key | 说明 | 43 | | :-----: | :------: | 44 | | weather | 天气现象 | 45 | | temp | 温度 | 46 | | humi | 湿度 | 47 | | wind | 风向 | 48 | | power | 风力 | 49 | ### 示例程序 50 | [Arduino示例](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_Weathers/Blinker_Weather/Weather_WiFi/Weather_WiFi.ino) 51 | 52 | ## 空气数据 53 | 54 | **接口:** 55 | ``` 56 | https://iot.diandeng.tech/api/v3/air?code={cityCode}&device={deviceName}&key={iotToken} 57 | ``` 58 | **响应:** 59 | ```json 60 | { 61 | 62 | "city": "成都市", 63 | "aqi": "123", 64 | "level": "轻度污染", 65 | "pm25": "76", 66 | "pm10": "110", 67 | "SO2": "4", 68 | "NO2": "27", 69 | "CO": "1", 70 | "O3": "246", 71 | "updateTime": "2020-05-16 20:27:42", 72 | } 73 | ``` 74 | 75 | **数据说明:** 76 | 77 | | key | 说明 | 78 | | :---: | :------------------: | 79 | | pm25 | pm2.5,单位 μg/m³ | 80 | | pm10 | pm10,单位 μg/m³ | 81 | | SO2 | 二氧化硫,单位 μg/m³ | 82 | | NO2 | 二氧化氮,单位 μg/m³ | 83 | | CO | 一氧化碳,单位 mg/m³ | 84 | | O3 | 臭氧,单位 μg/m³ | 85 | 86 | ### 示例程序 87 | [arduino](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_Weathers/Blinker_Air/Air_WiFi/Air_WiFi.ino) 88 | 89 | ## 天气预报 90 | 包含当天天气与未来三天的预报 91 | **接口:** 92 | ``` 93 | https://iot.diandeng.tech/api/v3/forecast?code={cityCode}&device={deviceName}&key={iotToken} 94 | ``` 95 | **响应:** 96 | ```json 97 | { 98 | 99 | "city": "成都市", 100 | "forecasts": [ 101 | { 102 | "date": "2020-05-18", 103 | "week": "1", 104 | "dayweather": "多云", 105 | "nightweather": "多云", 106 | "daytemp": "34", 107 | "nighttemp": "20", 108 | "daywind": "无风向", 109 | "nightwind": "无风向", 110 | "daypower": "≤3", 111 | "nightpower": "≤3" 112 | }, 113 | { 114 | "date": "2020-05-19", 115 | "week": "2", 116 | "dayweather": "多云", 117 | "nightweather": "中雨", 118 | "daytemp": "31", 119 | "nighttemp": "19", 120 | "daywind": "无风向", 121 | "nightwind": "无风向", 122 | "daypower": "≤3", 123 | "nightpower": "≤3" 124 | }, 125 | { 126 | "date": "2020-05-20", 127 | "week": "3", 128 | "dayweather": "小雨", 129 | "nightweather": "小雨", 130 | "daytemp": "28", 131 | "nighttemp": "20", 132 | "daywind": "无风向", 133 | "nightwind": "无风向", 134 | "daypower": "≤3", 135 | "nightpower": "≤3" 136 | }, 137 | { 138 | "date": "2020-05-21", 139 | "week": "4", 140 | "dayweather": "小雨", 141 | "nightweather": "小雨", 142 | "daytemp": "26", 143 | "nighttemp": "21", 144 | "daywind": "无风向", 145 | "nightwind": "无风向", 146 | "daypower": "≤3", 147 | "nightpower": "≤3" 148 | } 149 | ], 150 | "updateTime": "2020-05-18 11:58:12", 151 | } 152 | ``` 153 | **数据说明:** 154 | 155 | | key | 说明 | 156 | | :----------: | :----------: | 157 | | week | 星期 | 158 | | dayweather | 白天天气现象 | 159 | | nightweather | 晚上天气现象 | 160 | | daytemp | 白天温度 | 161 | | nighttemp | 晚上温度 | 162 | | daywind | 白天风向 | 163 | | nightwind | 晚上风向 | 164 | | daypower | 白天风力 | 165 | | nightpower | 晚上风力 | 166 | 167 | ### 示例程序 168 | [Arduino示例](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_Weathers/Blinker_Weather/Weather_WiFi/Weather_WiFi.ino) 169 | 170 | 171 | ## 空气数据城市列表 172 | 北京市 110000 173 | 天津市 120000 174 | 石家庄市 130100 175 | 唐山市 130200 176 | 秦皇岛市 130300 177 | 邯郸市 130400 178 | 邢台市 130500 179 | 保定市 130600 180 | 张家口市 130700 181 | 承德市 130800 182 | 沧州市 130900 183 | 廊坊市 131000 184 | 衡水市 131100 185 | 太原市 140100 186 | 大同市 140200 187 | 阳泉市 140300 188 | 长治市 140400 189 | 晋城市 140500 190 | 朔州市 140600 191 | 晋中市 140700 192 | 运城市 140800 193 | 忻州市 140900 194 | 临汾市 141000 195 | 吕梁市 141100 196 | 呼和浩特市 150100 197 | 包头市 150200 198 | 乌海市 150300 199 | 赤峰市 150400 200 | 通辽市 150500 201 | 鄂尔多斯市 150600 202 | 呼伦贝尔市 150700 203 | 巴彦淖尔市 150800 204 | 乌兰察布市 150900 205 | 兴安盟 152200 206 | 锡林郭勒盟 152500 207 | 阿拉善盟 152900 208 | 沈阳市 210100 209 | 大连市 210200 210 | 鞍山市 210300 211 | 抚顺市 210400 212 | 本溪市 210500 213 | 丹东市 210600 214 | 锦州市 210700 215 | 营口市 210800 216 | 阜新市 210900 217 | 辽阳市 211000 218 | 盘锦市 211100 219 | 铁岭市 211200 220 | 朝阳市 211300 221 | 葫芦岛市 211400 222 | 长春市 220100 223 | 吉林市 220200 224 | 四平市 220300 225 | 辽源市 220400 226 | 通化市 220500 227 | 白山市 220600 228 | 松原市 220700 229 | 白城市 220800 230 | 延边朝鲜族自治州 222400 231 | 哈尔滨市 230100 232 | 齐齐哈尔市 230200 233 | 鸡西市 230300 234 | 鹤岗市 230400 235 | 双鸭山市 230500 236 | 大庆市 230600 237 | 伊春市 230700 238 | 佳木斯市 230800 239 | 七台河市 230900 240 | 牡丹江市 231000 241 | 黑河市 231100 242 | 绥化市 231200 243 | 上海市 310000 244 | 南京市 320100 245 | 无锡市 320200 246 | 徐州市 320300 247 | 常州市 320400 248 | 苏州市 320500 249 | 南通市 320600 250 | 连云港市 320700 251 | 淮安市 320800 252 | 盐城市 320900 253 | 扬州市 321000 254 | 镇江市 321100 255 | 泰州市 321200 256 | 宿迁市 321300 257 | 杭州市 330100 258 | 宁波市 330200 259 | 温州市 330300 260 | 嘉兴市 330400 261 | 湖州市 330500 262 | 绍兴市 330600 263 | 金华市 330700 264 | 衢州市 330800 265 | 舟山市 330900 266 | 台州市 331000 267 | 丽水市 331100 268 | 合肥市 340100 269 | 芜湖市 340200 270 | 蚌埠市 340300 271 | 淮南市 340400 272 | 马鞍山市 340500 273 | 淮北市 340600 274 | 铜陵市 340700 275 | 安庆市 340800 276 | 黄山市 341000 277 | 滁州市 341100 278 | 阜阳市 341200 279 | 宿州市 341300 280 | 六安市 341500 281 | 亳州市 341600 282 | 池州市 341700 283 | 宣城市 341800 284 | 福州市 350100 285 | 厦门市 350200 286 | 莆田市 350300 287 | 三明市 350400 288 | 泉州市 350500 289 | 漳州市 350600 290 | 南平市 350700 291 | 龙岩市 350800 292 | 宁德市 350900 293 | 南昌市 360100 294 | 景德镇市 360200 295 | 萍乡市 360300 296 | 九江市 360400 297 | 新余市 360500 298 | 鹰潭市 360600 299 | 赣州市 360700 300 | 吉安市 360800 301 | 宜春市 360900 302 | 抚州市 361000 303 | 上饶市 361100 304 | 济南市 370100 305 | 青岛市 370200 306 | 淄博市 370300 307 | 枣庄市 370400 308 | 东营市 370500 309 | 烟台市 370600 310 | 潍坊市 370700 311 | 济宁市 370800 312 | 泰安市 370900 313 | 威海市 371000 314 | 日照市 371100 315 | 临沂市 371300 316 | 德州市 371400 317 | 聊城市 371500 318 | 滨州市 371600 319 | 菏泽市 371700 320 | 郑州市 410100 321 | 开封市 410200 322 | 洛阳市 410300 323 | 平顶山市 410400 324 | 安阳市 410500 325 | 鹤壁市 410600 326 | 新乡市 410700 327 | 焦作市 410800 328 | 濮阳市 410900 329 | 许昌市 411000 330 | 漯河市 411100 331 | 三门峡市 411200 332 | 南阳市 411300 333 | 商丘市 411400 334 | 信阳市 411500 335 | 周口市 411600 336 | 驻马店市 411700 337 | 济源市 419001 338 | 武汉市 420100 339 | 黄石市 420200 340 | 十堰市 420300 341 | 宜昌市 420500 342 | 襄阳市 420600 343 | 鄂州市 420700 344 | 荆门市 420800 345 | 孝感市 420900 346 | 荆州市 421000 347 | 黄冈市 421100 348 | 咸宁市 421200 349 | 随州市 421300 350 | 恩施土家族苗族自治州 422800 351 | 仙桃市 429004 352 | 潜江市 429005 353 | 天门市 429006 354 | 长沙市 430100 355 | 株洲市 430200 356 | 湘潭市 430300 357 | 衡阳市 430400 358 | 邵阳市 430500 359 | 岳阳市 430600 360 | 常德市 430700 361 | 张家界市 430800 362 | 益阳市 430900 363 | 郴州市 431000 364 | 永州市 431100 365 | 怀化市 431200 366 | 娄底市 431300 367 | 湘西土家族苗族自治州 433100 368 | 广州市 440100 369 | 韶关市 440200 370 | 深圳市 440300 371 | 珠海市 440400 372 | 汕头市 440500 373 | 佛山市 440600 374 | 江门市 440700 375 | 湛江市 440800 376 | 茂名市 440900 377 | 肇庆市 441200 378 | 惠州市 441300 379 | 梅州市 441400 380 | 汕尾市 441500 381 | 河源市 441600 382 | 阳江市 441700 383 | 清远市 441800 384 | 东莞市 441900 385 | 中山市 442000 386 | 潮州市 445100 387 | 揭阳市 445200 388 | 云浮市 445300 389 | 南宁市 450100 390 | 柳州市 450200 391 | 桂林市 450300 392 | 梧州市 450400 393 | 北海市 450500 394 | 防城港市 450600 395 | 钦州市 450700 396 | 贵港市 450800 397 | 玉林市 450900 398 | 百色市 451000 399 | 贺州市 451100 400 | 河池市 451200 401 | 来宾市 451300 402 | 崇左市 451400 403 | 海口市 460100 404 | 三亚市 460200 405 | 三沙市 460300 406 | 儋州市 460400 407 | 五指山市 469001 408 | 琼海市 469002 409 | 文昌市 469005 410 | 万宁市 469006 411 | 东方市 469007 412 | 重庆市 500000 413 | 成都市 510100 414 | 自贡市 510300 415 | 攀枝花市 510400 416 | 泸州市 510500 417 | 德阳市 510600 418 | 绵阳市 510700 419 | 广元市 510800 420 | 遂宁市 510900 421 | 内江市 511000 422 | 乐山市 511100 423 | 南充市 511300 424 | 眉山市 511400 425 | 宜宾市 511500 426 | 广安市 511600 427 | 达州市 511700 428 | 雅安市 511800 429 | 巴中市 511900 430 | 资阳市 512000 431 | 阿坝藏族羌族自治州 513200 432 | 甘孜藏族自治州 513300 433 | 凉山彝族自治州 513400 434 | 贵阳市 520100 435 | 六盘水市 520200 436 | 遵义市 520300 437 | 安顺市 520400 438 | 毕节市 520500 439 | 铜仁市 520600 440 | 黔西南布依族苗族自治州 522300 441 | 黔东南苗族侗族自治州 522600 442 | 黔南布依族苗族自治州 522700 443 | 昆明市 530100 444 | 曲靖市 530300 445 | 玉溪市 530400 446 | 保山市 530500 447 | 昭通市 530600 448 | 丽江市 530700 449 | 普洱市 530800 450 | 临沧市 530900 451 | 楚雄彝族自治州 532300 452 | 红河哈尼族彝族自治州 532500 453 | 文山壮族苗族自治州 532600 454 | 西双版纳傣族自治州 532800 455 | 大理白族自治州 532900 456 | 德宏傣族景颇族自治州 533100 457 | 怒江傈僳族自治州 533300 458 | 迪庆藏族自治州 533400 459 | 拉萨市 540100 460 | 日喀则市 540200 461 | 昌都市 540300 462 | 林芝市 540400 463 | 山南市 540500 464 | 那曲市 540600 465 | 阿里地区 542500 466 | 西安市 610100 467 | 铜川市 610200 468 | 宝鸡市 610300 469 | 咸阳市 610400 470 | 渭南市 610500 471 | 延安市 610600 472 | 汉中市 610700 473 | 榆林市 610800 474 | 安康市 610900 475 | 商洛市 611000 476 | 兰州市 620100 477 | 嘉峪关市 620200 478 | 金昌市 620300 479 | 白银市 620400 480 | 天水市 620500 481 | 武威市 620600 482 | 张掖市 620700 483 | 平凉市 620800 484 | 酒泉市 620900 485 | 庆阳市 621000 486 | 定西市 621100 487 | 陇南市 621200 488 | 临夏回族自治州 622900 489 | 甘南藏族自治州 623000 490 | 西宁市 630100 491 | 海东市 630200 492 | 海北藏族自治州 632200 493 | 黄南藏族自治州 632300 494 | 海南藏族自治州 632500 495 | 果洛藏族自治州 632600 496 | 玉树藏族自治州 632700 497 | 海西蒙古族藏族自治州 632800 498 | 银川市 640100 499 | 石嘴山市 640200 500 | 吴忠市 640300 501 | 固原市 640400 502 | 中卫市 640500 503 | 乌鲁木齐市 650100 504 | 克拉玛依市 650200 505 | 吐鲁番市 650400 506 | 哈密市 650500 507 | 昌吉回族自治州 652300 508 | 博尔塔拉蒙古自治州 652700 509 | 巴音郭楞蒙古自治州 652800 510 | 阿克苏地区 652900 511 | 克孜勒苏柯尔克孜自治州 653000 512 | 喀什地区 653100 513 | 和田地区 653200 514 | 伊犁哈萨克自治州 654000 515 | 塔城地区 654200 516 | 阿勒泰地区 654300 517 | 石河子市 659001 518 | 五家渠市 659004 519 | 北屯市 659005 520 | 铁门关市 659006 521 | 双河市 659007 522 | 可克达拉市 659008 523 | 香港特别行政区 810000 524 | 澳门特别行政区 820000 -------------------------------------------------------------------------------- /docs/020-相关接口/005-通知接口.md: -------------------------------------------------------------------------------- 1 | # 通知接口 2 | 3 | ## App推送 4 | ``` 5 | POST https://iot.diandeng.tech/api/v1/user/device/push 6 | { 7 | 'deviceName': , 8 | 'key': , 9 | 'msg': 10 | } 11 | ``` 12 | 13 | 14 | ## 微信通知 15 | ``` 16 | POST https://iot.diandeng.tech/api/v1/user/device/wxMsg 17 | { 18 | 'deviceName': , 19 | 'key': , 20 | 'title': , 21 | 'state': <state>, 22 | 'msg': <text> 23 | } 24 | ``` 25 | 26 | ## 短信通知 27 | ``` 28 | POST https://iot.diandeng.tech//api/v1/user/device/sms 29 | { 30 | 'deviceName': <deviceName>, 31 | 'key': <authKey>, 32 | 'msg': <text> 33 | } 34 | ``` 35 | 36 | -------------------------------------------------------------------------------- /docs/020-相关接口/006-地理信息接口.md: -------------------------------------------------------------------------------- 1 | # 地理信息接口 2 | **仅企业版可用** 3 | ## IP定位 4 | 通过当前请求IP,获取设备位置(经纬度、城市等信息) 5 | 6 | ## 地址查询 7 | 通过经纬度信息,查询设备所在城市、街道等信息 8 | 9 | ## 轨迹服务 10 | 设备上传经纬度时序信息到云端 -------------------------------------------------------------------------------- /docs/020-相关接口/009-数据接口(数值时序).md: -------------------------------------------------------------------------------- 1 | # 数值时序数据接口beta 2 | 3 | ## 数据存储接口 4 | > 数值时序数据存储提供了两种存储方式:HTTP方式与MQTT方式,其中MQTT方式 **仅支持点灯Broker** 5 | > 6 | > 存储频率限制为1分钟/次 7 | 8 | ### 数据体data的结构 9 | 10 | ```json 11 | { 12 | "dataKey": [ 13 | [timestamp, data], // [时间戳, 数值] 14 | [timestamp, data], 15 | ... 16 | ], ... 17 | } 18 | ``` 19 | 20 | 例如: 21 | 22 | ```json 23 | { 24 | "humi": [ 25 | [1618934717, 99], 26 | [1618934777, 63], 27 | [1618934837, 23], 28 | [1618934897, 28], 29 | ], 30 | "temp": [ 31 | [1618934717, 20], 32 | [1618934777, 86], 33 | [1618934837, 81], 34 | [1618934897, 10], 35 | ], 36 | "pm25": [ 37 | [1618934717, 43], 38 | [1618934777, 57], 39 | [1618934837, 45], 40 | [1618934897, 54], 41 | ], 42 | "pm10": [ 43 | [1618934717, 25], 44 | [1618934777, 62], 45 | [1618934837, 19], 46 | [1618934897, 95], 47 | ] 48 | } 49 | ``` 50 | 51 | 52 | 53 | ### HTTP接口 54 | 55 | #### 接入方式 56 | 57 | - 请求方式:`post https://iot.diandeng.tech/api/v1/device/storage/ts` 58 | 59 | - 请求数据: 60 | ```json 61 | { 62 | "device": "", // 设备名 63 | "token": "", // 设备token (设备上线返回值中的iotToken) 64 | "data": { 65 | "dataKey": [ 66 | [timestamp1, data1], 67 | [timestamp1, data1], 68 | ... 69 | ], ... 70 | } 71 | } 72 | ``` 73 | 74 | - 返回结果: 75 | 76 | ```json 77 | { 78 | "message": 1000 79 | } 80 | ``` 81 | 82 | 83 | 84 | #### 示例程序 85 | 86 | [Python](https://github.com/blinker-iot/api-example/blob/master/python/storage_ts_by_http.py) 87 | 88 | 89 | 90 | ### MQTT接口 91 | 92 | > **仅支持点灯broker** 93 | 94 | 95 | 96 | #### 接入方式 97 | 98 | Topic: 99 | 100 | ```json 101 | /device/<deviceName>/s 102 | ``` 103 | 数据格式: 104 | ```json 105 | {"fromDevice":<deviceId>,"toStorage":"ts","data":<data>} 106 | ``` 107 | 其中`<data>`为具体的时序数据,参考 <b>数据体data的结构</b> 108 | 109 | 110 | 111 | #### 示例程序 112 | 113 | [Python](https://github.com/blinker-iot/api-example/blob/master/python/storage_ts_by_mqtt.py) 114 | 115 | 116 | 117 | ## 数据获取接口 118 | **该功能仅限专业版使用** 119 | 本功能提供了设备数据获取接口,您可以在其他客户端中获取设备存储在云端的数据。 120 | 121 | ### 示例程序 122 | [NodeJs](https://github.com/blinker-iot/api-example/blob/master/nodejs/api_ts.js) 123 | [Python](https://github.com/blinker-iot/api-example/blob/master/python/api_ts.py) 124 | 125 | ### 获取token 126 | 127 | 每次获取不同的数据前,您都需要获取一次token 128 | 129 | 0. 通过 **开发者管理台>密钥管理** 创建一组密钥 130 | 131 | 1. 根据需要获取的数据,构造url(url参数说明见 **获取数据**),如: 132 | 133 | ``` js 134 | url = "https://storage.diandeng.tech/api/v1/ts?e=1596510236&device=XXXXXXXXXXXX&keyword=data1&quickDate=1h&queryType=avg" 135 | ``` 136 | > e为过期时间戳,单位秒; 137 | 138 | 2. 使用hmac_sha1算法进行签名,并做Base64安全编码,最后生成token 139 | 140 | ``` js 141 | // 其中Your SecretKey、Your AccessKey替换为在开发者管理台中获得的密钥 142 | sign = urlsafe_base64_encode( hmac_sha1(url , 'Your SecretKey') ) 143 | token = "Your AccessKey" + ":" + sign 144 | ``` 145 | 146 | > Base64安全编码即base64转码后的字符串中的+替换为 -,/替换为 _ 147 | 148 | ### 获取数据 149 | 150 | 时序数据获取提供了两种查询方式: 151 | 152 | 1. 通过快速查询码,查询最近的时间段对应的数据 153 | 2. 指定具体的时间段,查询该时间段对应的数据 154 | 155 | **计算码queryType** 156 | 由于数据量可能很巨大,因此返回的数据是经过数据库计算后精简数据。 157 | 例如,每5秒存储一次数据,返回最近一小时的平均值数据时,会计算每分钟内的12个数据的平均值,作为该时间的数据返回。 158 | 可以指定的计算方法有: 159 | 160 | | 快速计算查询码 | 说明 | 计算方式 | 161 | | -------------- | -------------- | ------------------------------ | 162 | | avg | 平均值(缺省值) | 计算指定频率内的平均值,并返回 | 163 | | max | 最大值 | 计算指定频率内的最大值,并返回 | 164 | | min | 最小值 | 计算指定频率内的最小值,并返回 | 165 | 166 | #### 快速查询 167 | 168 | **接口url** 169 | 170 | ``` 171 | https://storage.diandeng.tech/api/v1/ts 172 | ``` 173 | 174 | **方法** 175 | GET 176 | 177 | **参数** 178 | 179 | ``` js 180 | { 181 | "e": "", // 过期时间,unix时间戳(秒) 182 | "device": "", // 设备名 183 | "keyword": "key1", // 存储key 184 | "quickDate": "1h/1d/1w/1m/1y", // 快速查询码:1小时、1天、1周、1月、1年 185 | "queryType": "avg/max/min", // 查询类型:平均、最大、最小 186 | "token": "" // 计算出的token 187 | } 188 | ``` 189 | 190 | **响应** 191 | 192 | ``` js 193 | { 194 | "data": [ 195 | { 196 | "date": 1596845288, // 时间戳(秒) 197 | "key1": 100 // 对应的数据 198 | }, 199 | ... 200 | ] 201 | } 202 | ``` 203 | 204 | **查询码** 205 | 使用快速查询码,按指定频率返回最近一段时间的数据 206 | 可用查询码如下: 207 | 208 | | 快速时间查询码 | 时间段 | 数据返回的频率 | 209 | | -------------- | --------- | ---------------------- | 210 | | 1h | 最近1小时 | 按每分钟一个数据返回 | 211 | | 1d | 最近1天 | 按每10分钟一个数据返回 | 212 | | 1w | 最近1周 | 按每1小时一个数据返回 | 213 | | 1m | 最近1月 | 按每6小时一个数据返回 | 214 | | 1y | 最近1年 | 按每1天一个数据返回 | 215 | 216 | #### 按时段查询 217 | 218 | **接口url** 219 | 220 | ``` 221 | https://storage.diandeng.tech/api/v1/ts 222 | ``` 223 | 224 | **方法** 225 | GET 226 | 227 | **参数** 228 | 229 | ``` js 230 | { 231 | "e": "", // 过期时间,unix时间戳(秒) 232 | "device": "", // 设备名 233 | "keyword": "key1", // 存储key 234 | "queryDate": "['startDate', 'endDate']", // 日期格式:"YYYY-mm-dd HH:MM", 如"2020-08-05 10:20" 235 | "queryType": "avg/max/min", // 查询类型:平均、最大、最小 236 | "token": "" // 计算出的token 237 | } 238 | ``` 239 | 240 | **响应** 241 | 242 | ``` js 243 | { 244 | "data": [ 245 | { 246 | "date": 1596845288, // 时间戳(秒) 247 | "key1": 100 // 对应的数据 248 | }, 249 | ... 250 | ] 251 | } 252 | ``` 253 | 254 | 255 | ## 全量导出数据服务 256 | 全量数据体积较大,不适合接口导出。 257 | 对于一般开发者,点灯提供付费的数据导出服务,如需导出全量数据,请可在技术支持群联系 奈何col 协助导出。 258 | 收费方式: 259 | 存储一次,即为一个数据点,每设备每百万个数据点收费10元,单次导出服务费至少10元。 260 | 数据可选提供方式:json 或 XML -------------------------------------------------------------------------------- /docs/020-相关接口/010-数据接口(文本时序).md: -------------------------------------------------------------------------------- 1 | # 文本时序数据接口beta 2 | 3 | > 文本时序数据相当于日志记录,**该功能仅限专业版使用** 4 | 5 | 6 | 7 | ## 存储接口 8 | 9 | ### 存储方式 10 | 11 | - 请求方式:`POST /api/v1/device/storage/logs` 12 | 13 | - 请求参数: 14 | 15 | ```json 16 | { 17 | "device": "", // 设备名 18 | "token": "", // 设备token (设备上线返回值中的iotToken) 19 | "data": [["timestamp", "log1"]] 20 | } 21 | ``` 22 | 23 | - 返回参数: 24 | 25 | ```json 26 | { 27 | "message": 1000, 28 | "detail": "" 29 | } 30 | ``` 31 | 32 | 33 | 34 | #### 示例程序 35 | [Arduino](https://github.com/blinker-iot/blinker-library/blob/master/examples/Blinker_Cloud/Blinker_LOG/LOG_WiFi/LOG_WiFi.ino) 36 | [Python](https://github.com/blinker-iot/api-example/blob/master/python/storage_log.py) 37 | [JavaScript](https://github.com/blinker-iot/blinker-js/blob/typescript/example/example.ts) 38 | 39 | #### 变量 40 | **实验性功能,后期可能变更** 41 | 返回的文本中可包含变量`${userId:XXXXXXXX}`,`XXXXXXXX`为用户uuid ,云端会将变量解析为对应用户的用户名。 42 | 43 | ## 查看 44 | 45 | 暂提供在 **[点灯管理台](https://admin.diandeng.tech)** 中查看,具体在 **设备管理——查看日志** 46 | 47 | -------------------------------------------------------------------------------- /docs/020-相关接口/011-数据接口(设备影子).md: -------------------------------------------------------------------------------- 1 | # 影子数据接口beta 2 | **该功能仅限专业版使用** 3 | 4 | ## 存储接口 5 | 6 | ### HTTP接口 7 | 8 | #### 接入方式 9 | 10 | - 请求方式:`POST https://iot.diandeng.tech/api/v1/device/storage/object` 11 | 12 | - 请求参数: 13 | 14 | ```json 15 | { 16 | "device": "", // 设备名 17 | "token": "", // 设备token (设备上线返回值中的iotToken) 18 | "data": {} // 为字典形式: {"key1": data1, "key2": {"k1": "data2", "k2": "data3"}} 19 | } 20 | ``` 21 | 22 | 23 | 24 | - 返回参数: 25 | 26 | ```json 27 | { 28 | "message": 1000, 29 | "detail": "" 30 | } 31 | ``` 32 | 33 | 34 | 35 | #### 示例程序 36 | 37 | [Python](https://github.com/blinker-iot/api-example/blob/master/python/storage_obj_by_http.py) 38 | 39 | 40 | 41 | ### MQTT接口 42 | 43 | #### 接入方式 44 | 45 | Topic: 46 | 47 | ```json 48 | /device/<deviceName>/s 49 | ``` 50 | 51 | 数据格式: 52 | 53 | ```json 54 | {"fromDevice":<deviceId>,"toStorage":"ot","data":<data>} // 为字典形式: {"key1": data1, "key2": {"k1": "data2", "k2": "data3"}} 55 | ``` 56 | 57 | 58 | 59 | #### 示例程序 60 | 61 | [Python](https://github.com/blinker-iot/api-example/blob/master/python/storage_obj_by_mqtt.py) 62 | 63 | 64 | 65 | ## 查看 66 | 67 | 可在 **[点灯管理台](https://admin.diandeng.tech) ** 中查看,具体在 **设备管理——设备影子** 68 | 69 | -------------------------------------------------------------------------------- /docs/020-相关接口/012-数据接口(地理信息).md: -------------------------------------------------------------------------------- 1 | # 地理信息存储接口beta 2 | #### 存储 3 | 4 | - 请求方式: `POST /api/v1/device/storage/position` 5 | 6 | - 请求参数: 7 | 8 | ```json 9 | { 10 | "device": "", // 设备名 11 | "token": "", // 设备auth token 12 | "data": [["timestamp1", [x, y]], ...] // 也可以为空[],为空则服务器根据请求的ip来获取位置信息(经纬度) 13 | } 14 | ``` 15 | 16 | - 返回参数: 17 | 18 | ```json 19 | { 20 | "message": 1000, 21 | "detail": "" 22 | } 23 | ``` 24 | 25 | 26 | 27 | ### 示例程序 28 | 29 | [python](https://github.com/blinker-iot/api-example/blob/master/python/storage_position.py) 30 | -------------------------------------------------------------------------------- /docs/020-相关接口/099-App接口.md: -------------------------------------------------------------------------------- 1 | # App接口说明 2 | **仅向企业版用户提供,其他用户请参考App源码** 3 | -------------------------------------------------------------------------------- /docs/021-白皮书/001-概述.md: -------------------------------------------------------------------------------- 1 | # 点灯技术白皮书 2 | 白皮书中将详细描述相关技术细节,用以开发者学习和修改。 -------------------------------------------------------------------------------- /docs/021-白皮书/002-配网与设备注册.md: -------------------------------------------------------------------------------- 1 | # 网络配置与设备注册 2 | 3 | ## 配网方式 4 | 新的设备要接入当前网络,需要进行配网操作。 5 | 常见的配网方式是,用户在设备端操作界面,输入网络连接信息,设备使用该信息,进行网络连接。如,我们使用手机连接WiFi操作。 6 | 对于物联网设备,设备端可能没有操作界面和输入设备,因此不能直接操作设备进行配网,为了解决这种情况,点灯提供了以下几种配网支持。 7 | 8 | 9 | ## SmartConfig/EspTouch 10 | SmartConfig™是TI开发的一种WiFi配置技术,用于将新的WiFi设备连接到现有WiFi网络。 11 | 其不需要和设备建立连接,通过App WiFi广播的形式,将网络配置信息发送到设备。 12 | EspTouch是乐鑫的SmartConfig实现,其技术细节可见[乐鑫EspTouch文档](https://www.espressif.com/sites/default/files/documentation/esp-touch_user_guide_en.pdf) 13 | 14 | blinker直接使用标准的esptouch进行配网,配网成功后由设备向App反馈回IP和MAC信息。 15 | 16 | ## ApConfig 17 | ApConfig是目前市面上大多物联网设备支持的网络配置方式。 18 | ApConfig设备在未配网状态下,以AP形式存在,APP可连接到该设备AP,再向该设备发送网络配置信息,设备收到后,即会去连接目标网络。 19 | blinker ApConfig配网流程如下: 20 | 1. app连接设备AP(android自动连接,ios需要手动连接); 21 | 2. app和设备建立websocket通信,将目标网络连接信息发送给设备; 22 | 3. 设备连接上目标网络,并开始mDNS广播; 23 | 4. app收到mDNS广播,并显示成功提示信息。 24 | 25 | ## 设备注册 26 | 对于独立设备,连接上目标网络后,设备即会向blinker服务器获取连接信息,进行broker连接。 27 | 对于专属设备,在完成配网后,blinker还将进行如下操作: 28 | 1. app使用websocket连接到设备,检查设备类型是否正确; 29 | 2. app向服务器注册设备信息; 30 | 3. 设备连接服务器注册,并获取连接信息; 31 | 4. app确认设备注册成功,并显示成功提示信息了。 -------------------------------------------------------------------------------- /docs/021-白皮书/003-App端.md: -------------------------------------------------------------------------------- 1 | # App开发 2 | 点灯App使用 **Ionic + cordova + Angular** 开发,源码可见[Github](https://github.com/blinker-iot/blinker-app) 3 | 4 | **Angular框架优势** 5 | Angular是Google推出的前端开发框架,适用于跨平台软件开发,程序可以运行到web端、手机端和各类桌面操作系统。 6 | Angular程序视图可以通过Web Worker和服务端渲染,可以达到极快的渲染速度。同时,Angular有极高的可伸缩性,基于RxJS、Immutable.js和其它推送模型,能适应海量数据需求。 7 | 8 | **Cordova方案优势** 9 | Cordova是由Adobe提供,Apache基金会维护的混合开发方案,其提供了一套可连接原生代码的web开发方案,借由该方案,开发者可以将使用web技术开发的App封装成多种平台的应用包,从而实现跨平台应用开发。 10 | 11 | 12 | 还可以通过以下网站了解相关技术: 13 | [Ionic](https://ionicframework.com/) 14 | [Cordova](https://cordova.apache.org/) 15 | [Angular](https://angular.io/) 16 | 17 | 18 | ## 设备页开发 19 | blinker App提供了4种设备页面定制方式: 20 | 1. 免费版可使用[Layouter2界面编辑器](https://diandeng.tech/doc/layouter-2)拖拽生成界面,当设备页组件为Layouter2时,可以在这里拖拽生成设备界面; 21 | 2. 专业版可使用Blinker提供的模板界面; 22 | 3. 专业版可使用[Blinker Customizer](https://diandeng.tech/doc/customizer)开发独立的设备界面; 23 | 4. 通过修改源码自由定制独立的界面。 24 | 25 | > blinker-Layouter2 26 | > blinker提供的第二代低代码设备界面创建器。[了解更多](https://diandeng.tech/doc/layouter-2) 27 | 28 | > blinker-Customizer 29 | > 以嵌入web app的方式,开发独立的blinker设备页面。[了解更多](https://diandeng.tech/doc/customizer) 30 | 31 | # 小程序支持 32 | 目前仅对商业用户提供微信/支付宝小程序定制开发服务。 -------------------------------------------------------------------------------- /docs/021-白皮书/004-服务器端.md: -------------------------------------------------------------------------------- 1 | # 服务器端技术概览 2 | 3 | ## 技术栈 4 | 5 | | 名称 | 说明 | 备注(在项目中的应用) | 6 | | ------------- | ------------------------------------------------------ | ------------------------------------------------------ | 7 | | Python | 主要的后端语言 | 版本3.8+ | 8 | | flask-restful | 遵从RESTful架构, 每一个URI代表一种资源 | 主程序的接口风格 | 9 | | FastAPI | 一个高性能Web框架,拥有非常高的性能,与NodeJS和Go相当 | 现在主要用于设备存储等并发量较高的服务 | 10 | | gRPC | 一个高性能、开源和通用的RPC框架,支持多种开发语言 | 用于服务之间的调用 | 11 | | Redis | 开源的内存数据存储系统,用作数据库、缓存和消息中间件等 | 用于缓存数据和作为消息中间件 | 12 | | RabbitMQ | 消息中间件,提高并发量,降低服务之间的耦合度等 | 用于服务之间的通信,如数据统计,用户数据监控等场景 | 13 | | Celery | 分布式任务调度模块 | 将部分耗时任务异步执行,提高响应速度,如发送消息等场景 | 14 | 15 | 16 | 17 | ## 数据库 18 | 19 | | 名称 | 说明 | 备注(在项目中的应用) | 20 | | ---------- | ------------------------------------------------------------ | ---------------------- | 21 | | MongoDB | 文档数据库,核心三大优势是灵活文档模型、高可靠复制集、高可扩展分片集群 | 主数据库 | 22 | | PostgreSQL | 关系型数据库,同时添加了对JSON数据库的支持、全文检索功能以及其它扩展,关键还是开源的 | 子服务数据库 | 23 | | TDEngine | 拥有高效的存储、查询、分析时序大数据的功能,专为物联网、车联网、工业互联网、运维检测等优化而设计的 | 时序数据库 | -------------------------------------------------------------------------------- /docs/021-白皮书/005-固件升级.md: -------------------------------------------------------------------------------- 1 | # 固件升级(OTA) 2 | 3 | ## 使用ESP8266/ESP32的固件更新 4 | 5 | ### OTA状态 6 | 设备有如下OTA状态,状态由设备端上报,App会根据状态改变固件更新页显示的内容。 7 | 0: 等待升级 8 | 1: 固件下载中 9 | 99: 固件更新中 10 | 100: 固件更新完成 11 | -1: 固件更新失败 12 | -2: 固件下载失败 13 | 14 | ### OTA流程实现 15 | 1. App比对当前设备固件版本和云端固件版本,如云端版本号更高,则提示有更新可用 16 | 2. 用户在App上点击“立即更新”,App会向设备发送`{"set":{"upgrade":true}}` 17 | 3. 设备收到后,即会启动固件更新功能,向服务器上报OTA状态1,并从云端下载最新版本固件 18 | 4. 下载完成后,设备向服务器上报OTA状态99,并开始更新固件到应用Flash区 19 | 5. 更新完成后,设备重启并向服务器上报OTA状态100 20 | 21 | ## Linux设备的应用更新 22 | 待写 -------------------------------------------------------------------------------- /docs/070-独立部署与使用/002-商业版安装部署.md: -------------------------------------------------------------------------------- 1 | # 商业版 2 | 点灯商业版提供多种增值服务,提供商业授权,可部署到自有服务器上。 3 | 4 | ## 管理台访问 5 | Web管理台推荐使用最新的Chrome或Firefox访问,不可使用IE浏览器或者IE模式的浏览器访问。 6 | 7 | ## App系统需求 8 | Android App通常需要android 7.0或更高版本的手机 9 | Ios版本需要IOS 12或更高版本的手机 10 | 11 | ## 设备开发方法 12 | 首次使用您需要进行以下流程: 13 | 1.通过管理台新建账号,或通过App注册一个新账号 14 | 2.使用管理员账号登录管理台,将刚注册的账号设置为开发者账号 15 | 3.按照开发文档进行设备开发 -------------------------------------------------------------------------------- /docs/070-独立部署与使用/003-独立部署SDK配置.md: -------------------------------------------------------------------------------- 1 | # 独立部署SDK的使用 2 | 独立部署用户需使用如下方式切换目标服务器 3 | 4 | ## Arduino SDK 5 | 在程序开头添加以下宏: 6 | ``` 7 | #define BLINKER_SERVER_HTTPS "https://iot.xxx.com" 8 | #define BLINKER_STORAGE_HTTPS "https://storage.xxx.com" 9 | #define BLINKER_SERVER_HOST "iot.xxx.com" 10 | 11 | #include <Blinker.h> 12 | void setup() {} 13 | void loop() {} 14 | ``` 15 | 16 | ## freeRTOS/IDF SDK 17 | 在IDF菜单中: 18 | 将BLINKER_SERVER_HTTPS 修改为 `https://iot.xxx.com` 19 | 将BLINKER_STORAGE_HTTPS 修改为 `https://storage.xxx.com` 20 | 将BLINKER_SERVER_HOST 修改为 `iot.xxx.com` -------------------------------------------------------------------------------- /docs/070-独立部署与使用/004-独立部署APP配置.md: -------------------------------------------------------------------------------- 1 | # APP配置 2 | 3 | ## \src\app\configs\app.config.ts 4 | ```js 5 | export const CONFIG = { 6 | NAME: "点灯·blinker", // App名称 7 | LOGIN_LOGO: "assets/img/login-logo.png", // 登录页logo 8 | WEBSITE: "https://diandeng.tech", // 企业网址 9 | USER_AGREEMENT: "https://diandeng.tech/agreements/user.md", // 用户协议地址 10 | PRIVACY_POLICY: "https://diandeng.tech/agreements/privacy.md", // 隐私协议地址 11 | DEV_AGREEMENT: "https://diandeng.tech/agreements/develop.md", // 开发者协议地址 12 | UPDATE_FILE: "https://iot.diandeng.tech/config/update.json", // app更新文件地址 13 | ICON_FILE: "https://iot.diandeng.tech/config/icon.json", // app附加图标文件地址 14 | ABOUT_US: "blinker是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、服务器端支持,使用公有云服务进行数据传输存储。可用于多种物联网应用场合,可以帮助用户更好更快地搭建项目。",// 企业介绍 15 | TELEPHONE: "88888888", // 联系方式 16 | BUILTIN_DEVICES: { 17 | ENABLE: true // 是否使用app自带的设备类型 18 | }, 19 | I18N: { 20 | ENABLE: true, // 是否开启多语言支持 21 | DEFAULT: '简体中文' // 默认App语言 22 | } 23 | } 24 | ``` -------------------------------------------------------------------------------- /docs/098-开发常见问题/01-错误码.md: -------------------------------------------------------------------------------- 1 | # blinker SDK 错误码 2 | 使用 blinker SDK 开发设备,开发常见问题 3 | 4 | ## 常见错误信息 5 | ### 1000 6 | 报错内容: 7 | **Please make sure you have register this device!** 8 | 9 | 报错原因: 10 | - 未注册的专属设备类型 11 | 12 | ### 1001 13 | 报错内容: 14 | **Maybe you have put in the wrong AuthKey!** 15 | **Or maybe your request is too frequently!** 16 | **Or maybe your network is disconnected!** 17 | 18 | 报错原因: 19 | - 输入错误的 AuthKey 20 | - 请求过于频繁(设备登陆信息请求限制为 1次/s) 21 | - 网络问题,设备不能正常访问外网 22 | 23 | ### 1002 24 | 报错内容: 25 | **MQTT Disconnected** 26 | 27 | 报错原因: 28 | - 网络问题,设备不能正常访问外网(等待重连即可) 29 | - 设备登陆信息过期(自获取后72小时后过期) 30 | - MQTT broker出现问题 31 | 32 | ### 1003 33 | 报错内容: 34 | **MQTT NOT ALIVE OR MSG LIMIT** 35 | 36 | 报错原因: 37 | - 设备不在线 38 | - 超过发送频率限制,[详见](https://diandeng.tech/doc/faq) 39 | > 设备不在线,这里指的是APP设备不在线。硬件设备在启动时默认APP设备不在线,只有当硬件设备收到APP设备发来的消息后才认为APP设备在线。当打开APP对应设备界面时APP会向硬件设备发送心跳包告知设备上线。 40 | 41 | ### 1004 42 | 报错内容: 43 | **WEBSOCKETS CLIENT NOT ALIVE OR MSG LIMIT** 44 | 45 | 报错原因: 46 | - 设备未连接 47 | - 超过发送频率限制,[详见](https://diandeng.tech/doc/faq) 48 | 49 | ### 1005 50 | 报错内容: 51 | **DEVICE NOT CONNECT OR MSG LIMIT** 52 | 53 | 报错原因: 54 | - 设备未连接 55 | - 超过发送频率限制,[详见](https://diandeng.tech/doc/faq) 56 | 57 | ### 1006 58 | 报错内容: 59 | **SEND DATA BYTES MAX THAN LIMIT!** 60 | 61 | 报错原因: 62 | - 超过发送数据长度限制,[详见](https://diandeng.tech/doc/faq) 63 | 64 | ### 1007 65 | 报错内容: 66 | **FORMAT DATA SIZE IS MAX THAN LIMIT** 67 | 68 | 报错原因: 69 | - 格式化数据超过发送数据长度限制,[详见](https://diandeng.tech/doc/faq) 70 | 71 | ### 1008 72 | 报错内容: 73 | **data is not a JSON!** 74 | 75 | 报错内容: 76 | - 发送数据格式不是Json格式 77 | 78 | ### 1009 79 | 报错内容: 80 | **widgets name > name < has been registered, please register another name!** 81 | 82 | 报错原因: 83 | - 该组件名已注册,请使用别的名字进行注册 84 | 85 | ### 1010 86 | 报错内容: 87 | **TIMER ACTION TOO LONG** 88 | 89 | 报错原因: 90 | - 定时器操作内容超过限制,[详见](https://diandeng.tech/doc/faq) 91 | 92 | ### 1011 93 | 报错内容: 94 | **timing timer task is full** 95 | 96 | 报错原因: 97 | - 定时任务数量已满,不能继续添加定时任务,[详见](https://diandeng.tech/doc/faq) 98 | 99 | ### 1012 100 | 报错内容: 101 | **none data storaged!** 102 | 103 | 报错原因: 104 | - 没有数据可以上传到云端 105 | 106 | ### 1013 107 | 报错内容: 108 | **MAX THAN DATA STORAGE SIZE** 109 | 110 | 报错原因: 111 | - 上传到云端的数据长度超过限制,[详见](https://diandeng.tech/doc/faq) 112 | 113 | ### 1014 114 | **Invalid bootstrapping state, reset ESP8266 before updating!** 115 | 116 | 报错原因: 117 | - ESP8266串口下载程序后没有手动重启, 寄存器状态有错, 设备不能自动重启 118 | 119 | 解决办法: 120 | - 手动复位ESP8266 121 | 122 | ### 1015 123 | 报错内容: 124 | **max device data key size limit** 125 | 126 | 报错原因: 127 | - 上传到云端的数字键值已超过限制,[详见](https://diandeng.tech/doc/faq) -------------------------------------------------------------------------------- /docs/098-开发常见问题/02-开发注意事项.md: -------------------------------------------------------------------------------- 1 | # blinker SDK 开发注意事项 2 | 使用 blinker SDK 开发注意事项 3 | 4 | 5 | ## Arduino支持 6 | ### 回调函数 7 | 使用回调函数是为了更方便梳理程序逻辑,但回调函数中若有阻塞类型的代码(如: while delay 或 Serial读写等)将可能影响设备的正常通信及工作。 8 | **用户在开发过程中务必避免在回调中执行阻塞类型的代码, 请使用标志位等方法在回调外对标志位进行查询检测执行控制。** 9 | 10 | ### ESP8266&ESP32 11 | #### EEPROM 12 | ESP-Arduino SDK 中 EEPROM 是使用 Flash 模拟的, 以下EEPROM地址在 blinker 库中已占用, 用户开发时务必避开以下地址。 13 | 14 | | 地址 | 用途 | 15 | | :-: | :-: | 16 | | 0-1279 | 自动化控制数据 | 17 | | 1280-1535 | 专属设备数据 | 18 | | 1536-2431 | 定时器配置数据 | 19 | | 2432-2435 | ESP AT模块串口配置数据 | 20 | | 2436-2447 | OTA配置数据 | 21 | 22 | > 注: Erase Flash 选择为 All flash contents 将删除 Flash上的所有信息, 包括 EEPROM 中的信息 23 | 24 | #### SPIFFS 25 | blinker 库暂未使用 SPIFFS, 但 ESP Arduino sdk 中 **EEPROM** 设置在 **SPIFFS** 分区后。 26 | 为保证 EEPROM 的正常使用, 编译固件前务必将 **Flash Size** 选择为有 SPIFFS 分区的模式。 27 | 28 | #### Ticker 29 | ESP-Arduino SDK 中官方提供了硬件定时器的库Ticker。 30 | 用户开发时若需要使用到Ticker, 务必避免在Ticker中断回调中执行IO阻塞性代码。 31 | 请使用标志位等方法在回调外对标志位进行查询检测执行控制, 以避免看门狗复位。 32 | 33 | [官方文档提醒](https://github.com/esp8266/Arduino/blob/master/doc/libraries.rst#ticker) : ==It is currently not recommended to do blocking IO operations (network, serial, file) from Ticker callback functions. Instead, set a flag inside the ticker callback and check for that flag inside the loop function.== 34 | 35 | #### WiFiClientSecure 36 | **blinker 库中使用了:** 37 | - **ESP8266** 的 **BearSSL::WiFiClientSecure** 和 **WiFiClient** 38 | - **ESP32** 的 **WiFiClientSecure** 和 **WiFiClient** 39 | 40 | > 注: ESP8266 package 已使用 BearSSL::WiFiClientSecure。 41 | > 原有的 axTSL 的 WiFiClientSecure 将废弃且不能和 BearSSL 同时使用, 可能导致连接失败及堆栈溢出。 42 | 43 | 对应的对象名为 44 | > BearSSL::WiFiClientSecure client_mqtt;// ESP8266 45 | > WiFiClientSecure client_s;// ESP32 46 | > WiFiClient client;// ESP32 & ESP8266 47 | 48 | 用户使用中若要使用到以上 库/类 时, 建议 extern 对应对象并 stop 49 | 如需要使用到 ESP8266 的 WiFiClientSecure: 50 | ```cpp 51 | void secureConnect() 52 | { 53 | extern BearSSL::WiFiClientSecure client_mqtt; 54 | BearSSL::WiFiClientSecure client; 55 | 56 | client_mqtt.stop(); 57 | client.connect(host, httpsPort); 58 | } 59 | ``` 60 | 如需要使用到 ESP8266 的 HTTPS: 61 | ```cpp 62 | void secureConnect() 63 | { 64 | extern BearSSL::WiFiClientSecure client_mqtt; 65 | client_mqtt.stop(); 66 | 67 | std::unique_ptr<BearSSL::WiFiClientSecure>client_s(new BearSSL::WiFiClientSecure); 68 | 69 | // client_s->setFingerprint(fingerprint); 70 | client_s->setInsecure(); 71 | 72 | HTTPClient https; 73 | 74 | https.begin(*client_s, url); 75 | 76 | https.addHeader(conType, application); 77 | uint8_t httpCode = https.POST(msg); 78 | String payload = https.getString(); 79 | 80 | https.end(); 81 | } 82 | ``` -------------------------------------------------------------------------------- /docs/098-开发常见问题/03-常见问题.md: -------------------------------------------------------------------------------- 1 | # 常见问题 2 | 3 | ## 下载失败 4 | 5 | **ESP8266** 为例, 报错如下: 6 | 7 | ``` 8 | warning: espcomm_sync failed 9 | error: espcomm_open failed 10 | error: espcomm_upload_mem failed 11 | error: espcomm_upload_mem failed 12 | ``` 13 | 14 | 请确保 **开发板** 及 **端口** 选择正确, 若正确可尝试再次下载(或将下载波特率调整为115200)。 15 | 若不能确定 **开发板** 型号, 可选择 **WiFiduino** 或 **NodeMCU 1.0**。 16 | **若不清楚其他下载设置作用, 请不要尝试对其进行修改** 17 | 18 | **ESP32** , 不能确定 **开发板** 型号, 可选择 **NodeMCU-32s**。 19 | 20 | > ESP32_BLE 21 | > 特别提醒: ESP32使用蓝牙接入时推荐使用 开发板: ESP32 Dev Module/ Partition Scheme: NO OTA(Large APP) 否则容易因BLE固件过大而编译失败 22 | 23 | ## 反复重启 24 | 25 | **ESP8266/ESP32** 烧写 **WIFI** 接入代码后无故反复重启 26 | 可以尝试的解决方法: 27 | 28 | * ESP8266 下载设置中的 **Erease Flash** 设置为 **All flash contents** 29 | * 代码setup 中加入 **Blinker.deleteTimer()** 30 | * 使用足够的电流的 USB 口 31 | 32 | 若以上方法均不能解决, 请开启 debug 并设置为 debugAll, 将调试信息发给开发人员。 33 | 34 | ## App显示设备离线 35 | 36 | [为什么esp8266/esp32 wifi接入app显示设备离线](https://arduino.me/s/2?aid=795) 37 | 38 | ## 例程编译报错 39 | 40 | 请更新最新的库并更新package, 若仍然无法编译请联系开发人员。 41 | 42 | ## ESP8266 & ESP32 开发包安装 43 | 44 | Arduino ESP8266 45 | [国内用户可通过社区安装包安装(windows)](https://arduino.me/a/esp8266) 46 | 47 | Arduino ESP32 48 | [国内用户可通过社区安装包安装(windows)](https://arduino.me/a/esp32) 49 | 50 | ## 服务器请求限制 51 | 52 | | 请求类型 | 频率限制(次/分钟) | 53 | | :-: | :-: | 54 | | MQTT登陆信息 | 1 | 55 | | 配置信息上传/查询 | 1 | 56 | | 数据上传 | 1(次/小时) | 57 | | 数据查询 | 1 | 58 | | 短信发送 | 1 | 59 | | 天气查询 | 1 | 60 | | AQI查询 | 1 | 61 | 62 | ## 通讯限制 63 | 64 | | 接入/通信类型 | 频率限制(次/秒) | 数据长度限制(bytes/次) | 65 | | :-: | :-: | :-: | 66 | | BLE | 20 | 128 | 67 | | WiFi | 20 | 512 | 68 | | MQTT | 1 | 512 | 69 | | Bridge | 1 | 512 | 70 | | 心跳包 | 20 | 512 | 71 | 72 | ## 云端储存限制 73 | 74 | | 储存类型 | 频率限制 | 数据长度限制(bytes/次) | 75 | | :-: | :-: | :-: | 76 | | 配置 | 1(次/分钟) | 256 | 77 | | 数据 | 1(次/小时) | 256 | 78 | 79 | | 版本类型 | 键值数量限制(个) | 数据储存时间(天) | 80 | | :-: | :-: | :-: | 81 | | 免费版 | 5 | 7 | 82 | | 专业版 | 15 | 30 | 83 | 84 | ## 定时器限制 85 | 86 | | 定时器类型 | 任务数量 | 任务内动作数量 | 每组动作长度限制(bytes/组) | 87 | | :-: | :-: | :-: | :-: | 88 | | 定时 | 10 | 2 | 30 | 89 | | 循环 | 1 | 2 | 30 | 90 | | 倒计时 | 1 | 2 | 30 | 91 | 92 | ## 短信限制 93 | 94 | | 用户类型 | 接收用户 | 条数(条/天) | 字数限制(字/条) | 95 | | :-: | :-: | :-: | :-: | 96 | | 免费版 | - | - | - | 97 | | 专业版 | - | 10 | 20 | 98 | 99 | ## 组件限制 100 | 101 | | 组件类型 | 组件数量 ESP | AVR | 组件 | 102 | | :-: | :-: | :-: | :-: | 103 | | BlinkerWidgets_string | 32 | 12 | BlinkerButton | 104 | | BlinkerWidgets_rgb | 8 | 3 | BlinkerRGB | 105 | | BlinkerWidgets_int32 | 32 | 12 | BlinkerSlider | 106 | | BlinkerWidgets_table | 32 | 12 | BlinkerTab | 107 | -------------------------------------------------------------------------------- /docs/098-开发常见问题/20-提问指南.md: -------------------------------------------------------------------------------- 1 | ``` 2 | ----------------------------- 删除下面的内容 ----------------------------- 3 | 提问指南 4 | ============= 5 | 请按如下说明描述您的问题,以便您的问题能够得到解决。 6 | 7 | 1. 对照下方的 基本信息 表,在[]中填入x。 8 | 2. 对照下发的 设备信息 表,在[]中填入您的设备信息。 9 | 3. 检查是否使用最新的库及APP,因为这个问题可能在最新的版本中已修复。 10 | 4. 描述您的问题。 11 | 5. 如果有设备端串口LOG信息,请提供LOG信息(建议DEBUG ALL下查看LOG信息)。 12 | 6. 一个能正常运行的描述您问题的最小示例代码。不要提供您的整个项目代码。 13 | 7. 如果编译报错,请提供完整的报错信息。 14 | 8. 如果使用串口蓝牙模块或者blinker AT固件, 请提供接线电路示意。 15 | 9. 提交您的问题前请将该提问指南删除。 16 | 17 | ----------------------------- 删除上面的内容 ----------------------------- 18 | ``` 19 | 20 | ## 基本信息 21 | 22 | * [] 这个问题满足提问指南 23 | * [] 我阅读了开发文档 24 | * [] 我使用了最新的库及APP进行测试,但是问题仍然存在 25 | * [] 我搜索过类似问题的解决方法但是仍然无法解决 26 | * [] 有设备端的LOG信息 27 | * [] 有编译报错信息 28 | * [] 我已填写基本信息 29 | 30 | ## 设备信息 31 | 32 | * 硬件: [ESP-12|wifiduino|Arduino UNO] 33 | * 接入方式: [BLE|WIFI] 34 | * package版本: [esp8266-arduino-2.5.0dev|esp32-1.0.1-rc3] 35 | * blinker库版本: [arduino 0.3.0|py 0.2.0] 36 | * 开发环境: [Arduino|linux] 37 | * 操作系统: [Windows|Ubuntu|MacOS] 38 | 39 | ## IDE 中的设置 40 | 41 | * Module: [Generic ESP8266 Module|Wemos D1 mini r2|Nodemcu|other] 42 | * Flash Mode: [qio|dio|other] 43 | * Flash Size: [4MB/1MB] 44 | * lwip Variant: [v1.4|v2 Lower Memory|Higher Bandwidth] 45 | * Reset Method: [ck|nodemcu] 46 | * Flash Frequency: [40Mhz] 47 | * CPU Frequency: [80Mhz|160MHz] 48 | * Upload Using: [OTA|SERIAL] 49 | * Upload Speed: [115200|other] (serial upload only) 50 | 51 | ## 问题描述 52 | 53 | 在这里填写您的问题 54 | 55 | ## 代码 56 | 57 | 在这里填写您出现问题的最小示例代码 58 | 59 | ## LOG信息 60 | 61 | 在这里填写您设备串口输出的LOG信息 62 | 63 | ## 编译信息 64 | 65 | 在这里填写您IDE编译报错信息 66 | -------------------------------------------------------------------------------- /docs/099-服务与授权/00-服务类型.md: -------------------------------------------------------------------------------- 1 | # 服务介绍 2 | 3 | 我们向您提供了3种标准服务: 4 | 5 | | | 免费版 | 专业版 | 企业版 | 6 | | -------------- | :------------------------------------------------------------------: | :--------------------------------------------------------------------: | :-----------------------------: | 7 | | blinker SDK | ✔ | ✔ | ✔ | 8 | | blinker App | ✔ | ✔ | 支持定制 | 9 | | 设备接入 | ✔ | ✔ | ✔ | 10 | | 设备开发 | ✔ | ✔ | ✔ | 11 | | 更多组件 | - | ✔ | ✔ | 12 | | APP内置语音控制 | - | ✔ | ✔ | 13 | | 语音助手控制 | 天猫精灵、百度小度、小米小爱 | 天猫精灵、百度小度、小米小爱 | 支持定制 | 14 | | 消息推送 | ✔ | ✔ | ✔ | 15 | | 微信通知 | ✔ | ✔ | ✔ | 16 | | 短信通知 | - | ✔ | ✔ | 17 | | 数据存储 | 5个Key | 50个Key | ✔ | 18 | | 数据管理 | - | - | ✔ | 19 | | OTA与固件管理 | - | - | ✔ | 20 | | 开发运营管理台 | - | - | ✔ | 21 | | 技术支持 | 社区/QQ群 支持 | 社区/QQ群 支持 | 3个月专人支持<br>社区/QQ群 支持 | 22 | | 服务方式 | SaaS | SaaS | 独立部署 | 23 | | 设备额度 | 1个 独立设备<br>超出设备 独立5元/个 | 5个 独立设备<br>超出设备 独立5元/个 | 不限 | 24 | | 价格 | 免费 | 99元/年 | 9万元 起 | 25 | | 商业授权 | - | ✔ | ✔ | 26 | 27 | ## 购买方法 28 | 29 | **专业版** [前往购买](https://diandeng.tech/service) 30 | **企业版** 购买请联系点灯销售经理 31 | 32 | ## 免费版 33 | 不带商业授权,适合学生、爱好者、初学者 34 | 35 | ## 专业版 36 | 不带商业授权,适合有更多需求的开发者使用 37 | 使用专业版功能,需要每年缴纳99元费用; 38 | 39 | 专业版开发者,免费拥有5个设备授权,如要增加设备额度采用一次性阶梯收费: 40 | 41 | 点灯向开发者提供3年服务可用承诺。 42 | 43 | ## 企业版 44 | 45 | 带商业授权,且可以独立部署到指定服务器; 46 | 47 | 定制化,可定制有企业logo和信息的App,可定制独有的设备界面,可定制语音助手接入; 48 | 49 | 微信通知功能,需要企业有自己的微信服务号; 50 | 51 | 用户注册及短信通知功能,需要用户购买阿里云短信包; 52 | 53 | 独立部署需要用户购买阿里云或腾讯云云服务器及broker服务。 54 | 55 | ## FAQ 56 | 57 | ### 专属设备与独立设备的区别? 58 | 59 | 见[专属设备开发说明](https://diandeng.tech/doc/prodevice) 60 | 61 | ### 专属设备是否可用于商业用途? 62 | 63 | 企业用户,和专业版用户,开发的专属设备,可以销售给他人使用;教育版用户没有带商业授权,因此不能用于商业使用。 64 | 65 | ### 专属设备相关权责如何划分? 66 | 67 | blinker仅提供通信和app使用服务,不对设备质量、安全、可靠性等负责。一切权责由设备生产商或提供者承担。 68 | 69 | ### 如何开发票? 70 | 71 | 订单累计300元后,可开发票。开票信息请发至Email: fapiao@diandeng.tech 72 | 73 | ### 可用性承诺 74 | 任何产品都有退市的一天,三年可用承诺,意味着从您购买之日起,三年时间,我们都能保证提供服务,三年后如果产品仍然在生命周期内,我们会继续提供服务。 75 | -------------------------------------------------------------------------------- /docs/099-服务与授权/01-产品化服务.md: -------------------------------------------------------------------------------- 1 | # 产品化 2 | blinker提供了一套完整的物联网设备产品化方案,提供DIY功能,是为了让开发者更好更快的开发原型产品。 3 | 当您试用blinker完成原型开发后,如需进行产品化改造,请联系我们。 4 | -------------------------------------------------------------------------------- /docs/099-服务与授权/02-商业授权.md: -------------------------------------------------------------------------------- 1 | # 商业授权与服务 2 | blinker物联网解决方式可用于多种领域,企业版本可以独立部署。 3 | 4 | 企业用户如需进行独立部署,请联系我们。 5 | -------------------------------------------------------------------------------- /docs/099-服务与授权/03-教育支持.md: -------------------------------------------------------------------------------- 1 | # 用于高校教学和实践 2 | blinker是一套物联网项目解决方案,企业用户可以购买授权,然后独立部署。 3 | 针对 个人开发者/教育用户,blinker免费提供了可以用于原型开发的DIY方案。 4 | 5 | # blinker DIY 6 | 通常物联网项目开发,需要进行 设备端、客户端、服务器端开发,每一部分开发,都需要投入人力财力。对个人开发者,通常不可能一人完成这三部分的开发。 7 | Blinker DIY提供了多种设备端SDK支持,让开发者更好的聚焦于设备端。配合由blinker团队运维的客户端(blinker APP)、服务器端,可以快速打造出自己的物联网设备。 8 | 9 | ## blinker具备哪些优势 10 | **1. 支持多种连接方式** 11 | blinker提供了最流行的连接方式支持,如蓝牙、WiFi、NBiot/GPRS(即将支持),可以应对大多数物联网场景需求。 12 | **2. 支持多种开发平台** 13 | blinker提供Arduino、freeRTOS(即将支持)支持库,可以使用AVR / ARM / ESP8266 / ESP32等芯片进行开发。 14 | 对于linux设备,可以使用blinker python模块进行开发。 15 | 同时我们也提供了esp8266支持固件,您的设备只需要连接一个烧写了blinker固件的WiFi模块,即可接入。 16 | **2. 提供丰富的附加功能** 17 | 通信是blinker方案的核心,此外我们也提供了多种附加功能,如: 18 | 定时控制、自动化控制、场景控制、云存储、固件更新、设备分享、微信通知、消息推送、短信报警、语音控制、智能音响接入等。 19 | 20 | ## 如何将blinker方案运用到高等学校教育 21 | 进行物联网开发需要掌握繁多的专业知识,学习blinker开发,虽然并不能替代专业课程,但却可以让学生更快更好的进行开发实践。 22 | 从blinker开发入门,可逐渐深入了解物联网开发的各个环节,让学生更轻松的获得项目制作的成就感,长久保持对学习和实践兴趣。 23 | -------------------------------------------------------------------------------- /docs/099-服务与授权/05-用户协议.md: -------------------------------------------------------------------------------- 1 | # 用户协议 2 | 3 | 点灯科技(成都)有限责任公司(如下简称“点灯”)在此特别提醒用户认真阅读、充分理解本本协议。用户应认真阅读、充分理解本协议中各条款,特别涉及免除或者限制点灯责任、争议解决和法律适用的条款。请您审慎阅读并选择接受或不接受本协议(未成年人应在法定监护人陪同下阅读)。 4 | 您的下载、安装、使用本软件以及账号获取和登录等行为将视为对本协议的接受,并同意接受本协议各项条款的约束。点灯有权修订本协议,更新后的协议条款将公布于官网或软件,自公布之日起生效。用户可重新下载安装本软件或网站查阅最新版协议条款。在点灯修改本协议条款后,如果用户不接受修改后的条款,请立即停止使用点灯提供的软件和服务,用户继续使用点灯提供的软件和服务将被视为已接受了修改后的协议。 5 | 6 | ## 一、总则 7 | 1.1. 本协议是您(如下也称“用户”)与点灯及其运营合作单位(如下简称“合作单位”)之间关于用户下载、安装、使用点灯“点灯”软件(下称“本软件”)以及使用点灯相关服务所订立的协议。 8 | 1.2. 本软件及服务是点灯提供的安装在包括但不限于移动智能终端设备上的软件和服务,为使用该智能终端的用户提供官方的驱动程序以及点灯的服务等。 9 | 1.3. 本软件及服务的所有权和运营权均归点灯所有。 10 | 11 | ## 二、软件授权范围 12 | 2.1. 点灯就本软件给予用户一项个人的、不可转让、不可转授权以及非独占性的许可。 13 | 2.2. 用户可以为非商业目的在单一台移动终端设备上安装、使用、显示、运行本软件。但用户不得为商业运营目的安装、使用、运行本软件,不可以对本软件或者本软件运行过程中释放到任何终端设备内存中的数据及本软件运行过程中客户端与服务器端的交互数据进行复制、更改、修改、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经授权的第三方工具/服务接入本软件和相关系统。如果需要进行商业性的销售、复制和散发,例如软件预装和捆绑,必须获得点灯的书面授权和许可。 14 | 2.3. 用户不得未经点灯许可,将本软件安装在未经点灯明示许可的其他终端设备上,包括但不限于机顶盒、游戏机、电视机、DVD机等。 15 | 2.4. 用户可以为使用本软件及服务的目的复制本软件的一个副本,仅用作备份。备份副本必须包含原软件中含有的所有著作权信息。 16 | 2.5. 除本《协议》明示授权外,点灯未授权给用户其他权利,若用户使用其他权利时须另外取得点灯的书面同意。 17 | 18 | ## 三、软件的获取、安装、升级 19 | 3.1. 用户应当按照点灯的指定网站或指定方式下载安装本软件产品。谨防在非指定网站下载本软件,以免移动终端设备感染能破坏用户数据和获取用户隐私信息的恶意程序。如果用户从未经点灯授权的第三方获取本软件或与本软件名称相同的安装程序,点灯无法保证该软件能够正常使用,并对因此给您造成的损失不予负责。 20 | 3.2. 用户必须选择与所安装终端设备相匹配的本软件版本,否则,由于软件与设备型号不相匹配所导致的任何软件问题、设备问题或损害,均由用户自行承担。 21 | 3.3. 为了改善用户体验、完善服务内容,点灯有权不时地为您提供本软件替换、修改、升级版本,也有权为替换、修改或升级收取费用,但将收费提前征得您的同意。 本软件为用户默认开通“升级提示”功能,视用户使用的软件版本差异,点灯提供给用户自行选择是否需要开通此功能。软件新版本发布后,点灯不保证旧版本软件的继续可用。 22 | 23 | ## 四、使用规范 24 | 4.1. 用户在遵守法律及本《协议》的前提下可依本《协议》使用本软件及服务,用户不得实施如下行为: 25 | 4.1.1. 删除本软件及其他副本上一切关于版权的信息,以及修改、删除或避开本软件为保护知识产权而设置的技术措施; 26 | 4.1.2. 对本软件进行反向工程,如反汇编、反编译或者其他试图获得本软件的源代码; 27 | 4.1.3. 通过修改或伪造软件运行中的指令、数据,增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论这些行为是否为商业目的; 28 | 4.1.4. 使用本软件进行任何危害网络安全的行为,包括但不限于:使用未经许可的数据或进入未经许可的服务器/账户;未经允许进入公众网络或者他人操作系统并删除、 修改、增加存储信息;未经许可企图探查、扫描、测试本软件的系统或网络的弱点或其它实施破坏网络安全的行为; 企图干涉、 破坏本软件系统或网站的正常运行,故意传播恶意程序或病毒以及其他破坏干扰正常网络信息服务的行为;伪造TCP/IP数据包名称或部分名称; 29 | 4.1.5. 用户通过非点灯公司开发、授权或认可的第三方兼容软件、系统登录或使用本软件及服务,或制作、发布、传播上述工具; 30 | 4.1.6. 未经点灯书面同意,用户对软件及其中的信息擅自实施包括但不限于下列行为:使用、出租、出借、复制、修改、链接、转载、汇编、发表、出版,建立镜像站点、 擅自借助本软件发展与之有关的衍生产品、作品、服务、插件、外挂、兼容、互联等; 31 | 4.1.7. 利用本软件发表、传送、传播、储存违反国家法律、危害国家安全、祖国统一、社会稳定、公序良俗的内容,或任何不当的、侮辱诽谤的、淫秽的、暴力的及任何违反国家法律法规政策的内容; 32 | 4.1.8. 利用本软件发表、传送、传播、储存侵害他人知识产权、商业秘密等合法权利的内容; 33 | 4.1.9. 利用本软件批量发表、传送、传播广告信息及垃圾信息; 34 | 4.1.10. 其他以任何不合法的方式、为任何不合法的目的、或以任何与本协议许可使用不一致的方式使用本软件和点灯提供的其他服务; 35 | 4.2. 信息发布规范 36 | 4.2.1.您可使用本软件发表属于您原创或您有权发表的观点看法、数据、文字、信息、用户名、图片、照片、个人信息、音频、视频文件、链接等信 息内容。您必须保证,您拥有您所上传信息内容的知识产权或已获得合法授权,您使用本软件及服务的任何行为未侵犯任何第三方之合法权益。 37 | 4.2.2.您在使用本软件时需遵守法律法规、社会主义制度、国家利益、公民合法权益、社会公共秩序、道德风尚及信息真实性等“七条底线”要求。 38 | 4.2.3.您在使用本软件时不得利用本本软件从事以下行为,包括但不限于: 39 | 4.2.3.1.制作、复制、发布、传播、储存违反国家法律法规的内容: 40 | (1)反对宪法所确定的基本原则的; 41 | (2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的; 42 | (3)损害国家荣誉和利益的; 43 | (4)煽动民族仇恨、民族歧视,破坏民族团结的; 44 | (5)破坏国家宗教政策,宣扬邪教和封建迷信的; 45 | (6)散布谣言,扰乱社会秩序,破坏社会稳定的; 46 | (7)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的; 47 | (8)侮辱或者诽谤他人,侵害他人合法权益的; 48 | (9)煽动非法集会、结社、游行、示威、聚众扰乱社会秩序; 49 | (10)以非法民间组织名义活动的; 50 | (11)含有法律、行政法规禁止的其他内容的。 51 | 4.2.3.2.发布、传送、传播、储存侵害他人名誉权、肖像权、知识产权、商业秘密等合法权利的内容; 52 | 4.2.3.3.虚构事实、隐瞒真相以误导、欺骗他人; 53 | 4.2.3.4.发表、传送、传播广告信息及垃圾信息; 54 | 4.2.3.5.从事其他违反法律法规、政策及公序良俗、社会公德等的行为。 55 | 4.2.4. 未经点灯许可,您不得在本软件中进行任何诸如发布广告、销售商品的商业行为。 56 | 4.3您理解并同意: 57 | 4.3.1. 点灯会对用户是否涉嫌违反上述使用规范做出认定,并根据认定结果中止、终止对您的使用许可或采取其他依本约定可采取的限制措施; 58 | 4.3.2. 对于用户使用许可软件时发布的涉嫌违法或涉嫌侵犯他人合法权利或违反本协议的信息,点灯会直接删除; 59 | 4.3.3. 对于用户违反上述使用规范的行为对第三方造成损害的,您需要以自己的名义独立承担法律责任,并应确保点灯免于因此产生损失或增加费用; 60 | 4.3.4.若用户违反有关法律规定或协议约定,使点灯遭受损失,或受到第三方的索赔,或受到行政管理机关的处罚,用户应当赔偿点灯因此造成的损失和(或)发生的费用,包括合理的律师费、调查取证费用等。 61 | 62 | ## 五、隐私政策与个人信息保护 63 | 5.1. 保护您的个人信息对点灯很重要。为了提供软件的功能并改善用户体验,点灯将收集如下类型的数据: 64 | 5.1.1.您提供给我们或上传的信息:我们可能收集您提供给我们的任一或所有个人信息,例如姓名、手机号、电子邮箱地址 (例如您的安全相关的信息、姓名、生日、性别)、您接入到点灯平台的设备同步的资料或数据,及在点灯平台创建的账户和相关设置信息、您添加的设备或发送的消息、反馈以及您提供给我们的任何其他信息。 65 | 5.1.2.手持终端或SIM卡相关信息:运行点灯的手持终端相关的信息。例如IMEI编号、IMSI编号、系统版本、设备制造商信息、型号名称和网络运营商。 66 | 5.1.3.设备信息:与您账号绑定的相关设备信息。例如MAC地址、DID、及相应设备传感器收集的信息(例如温度、湿度、PM2.5、AQI、TDS、tVOC、CO2、 环境光线、烟雾浓度、天然气浓度、耗电量、运行轨迹、信号强弱、侦测动作/画面、体温、体重、开/关状态)以及设备耗材的运行情况(例如滤芯、滤网使用寿命等)。 67 | 5.1.4.我们指定的与您相关的信息:我们可能收集并使用诸如点灯帐号等信息。 68 | 5.1.5位置信息(仅适用于特定服务/功能):与您的位置相关的各类信息。例如国家代码、城市代码、移动网络代码、小区标识、经纬度信息和语言设置。 69 | 5.1.6.登录信息:与您使用某些功能、设备相关的信息。例如cookie和其他匿名标识符技术、IP地址、临时消息历史和标准系统日志等。 70 | 5.1.7.其他信息:设备绑定的账号(邮箱及手机号)、连接的Wi-Fi账号及密码、地理位置信息等。 我们还可能收集其他各类与个人没有关联的匿名信息。例如,在使用特定服务时,可能收集用户的接入点灯的设备的设备型号和固件版本号。 收集此类信息的目的在于改善我们向您提供的服务。所收集信息的类别和数量取决于您如何使用、加入或参与我们产品和/或服务。 71 | 5.2. 点灯会按照点灯隐私政策对您的数据进行收集、使用与保护。您可以在点灯APP中查看点灯隐私政策的相关信息。 72 | 73 | ## 六、服务风险及免责声明 74 | 6.1. 用户必须自行配备移动终端设备上网和使用电信增值业务所需的设备,自行负担个人移动终端设备上网或第三方(包括但不限于电信或移动通信提供商)收取的通讯费、 信息费等有关费用。如涉及电信增值服务的,我们建议您与您的电信增值服务提供商确认相关的费用问题。 75 | 6.2. 用户因第三方如通讯线路故障、技术问题、网络、移动终端设备故障、系统不稳定性及其他各种不可抗力原因而遭受的一切损失,点灯及合作单位不承担责任。 76 | 6.3. 本软件同大多数互联网软件一样,受包括但不限于用户原因、网络服务质量、社会环境等因素的差异影响,可能受到各种安全问题的侵扰,如他人利用用户的资料, 造成现实生活中的骚扰;用户下载安装的其它软件或访问的其他网站中含有“特洛伊木马”等病毒,威胁到用户的终端设备信息和数据的安全,继而影响本软件的正常使用等等。 用户应加强信息安全及使用者资料的保护意识,要注意加强密码保护,以免遭致损失和骚扰。 77 | 6.4. 因用户使用本软件或要求点灯提供特定服务时,本软件可能会调用第三方系统或第三方软件支持用户的使用或访问,使用或访问的结果由该第三方提供,点灯不保证通过第三方系统或第三方软件支持实现的结果的安全性、准确性、有效性及其他不确定的风险,由此若引发的任何争议及损害,点灯不承担任何责任。 78 | 6.5. 点灯特别提请用户注意,点灯为了保障公司业务发展和调整的自主权,点灯公司拥有随时修改或中断服务而不需通知用户的权利,点灯行使修改或中断服务的权利不需对用户或任何第三方负责。 79 | 6.6. 除法律法规有明确规定外,我们将尽最大努力确保软件及其所涉及的技术及信息安全、有效、准确、可靠,但受限于现有技术,用户理解点灯不能对此进行担保。 80 | 6.7. 由于用户因下述任一情况所引起或与此有关的人身伤害或附带的、间接的经济损害赔偿,包括但不限于利润损失、资料损失、业务中断的损害赔偿或其他商业损害赔偿或损失,需由用户自行承担: (1)使用或未能使用许可软件;(2)第三方未经许可的使用软件或更改用户的数据;(3)用户使用软件进行的行为产生的费用及损失;(4)用户对软件的误解;(5)非因点灯的原因引起的与软件有关的其他损失。 81 | 6.8. 用户与其他使用软件的用户之间通过软件进行的行为,因您受误导或欺骗而导致或可能导致的任何人身或经济上的伤害或损失,均由过错方依法承担所有责任。 82 | 83 | ## 七、知识产权声明 84 | 7.1. 点灯是本软件的知识产权权利人。本软件的一切著作权、商标权、专利权、商业秘密等知识产权,以及与本软件相关的所有信息内容 (包括但不限于文字、图片、音 频、视频、图表、界面设计、版面框架、有关数据或电子文档等)均受中华人民共和国法律法规和相应的国际条约保护,,点灯享有上述知识产权。 85 | 9.2 未经点灯书面同意,用户不得为任何商业或非商业目的自行或许可任何第三方实施、利用、转让上述知识产权,点灯保留追究上述行为法律责任的权利。 86 | 87 | ## 八、协议变更 88 | 8.1. 点灯有权在必要时修改本协议条款,协议条款一旦发生变动,将会在相关页面上公布修改后的协议条款。如果不同意所改动的内容,用户应主动取消此项服务。如果用户继续使用服务,则视为接受协议条款的变动。 89 | 8.2. 点灯和合作公司有权按需要修改或变更所提供的收费服务、收费标准、收费方式、服务费及服务条款。点灯在提供服务时,可能现在或日后对部分服务的用户开始收取一定的费用如用户拒绝支付该等费用, 则不能在收费开始后继续使用相关的服务。点灯和合作公司将尽最大努力通过电邮或其他方式通知用户有关的修改或变更。 90 | 91 | ## 九、适用法律及争议解决 92 | 9.1. 本协议条款之效力和解释均适用中华人民共和国大陆地区的法律。如无相关法律规定的,则参照使用国际商业惯例和/或商业惯例。 93 | 9.2. 本协议的签订地是成都市武侯区。 94 | 9.3.用户和点灯一致同意凡因本服务所产生的纠纷双方应协商解决,协商不成任何一方可提交本协议签订地有管辖权的法院诉讼解决。 95 | 96 | ## 十、其他 97 | 10.1. 用户在使用本软件某一特定服务时,该服务可能会另有单独的协议、相关业务规则等(以下统称为“单独协议”),您在使用该项服务前请阅读并同意相关的单独协议。 98 | 10.2. 本协议生效时间为2018年3月9日。 99 | 10.3. 本协议所有条款的标题仅为阅读方便,本身并无实际涵义,不能作为本协议涵义解释的依据。 100 | 10.4. 本协议条款无论因何种原因部分无效或不可执行,其余条款仍有效,对双方具有约束力。 -------------------------------------------------------------------------------- /docs/099-服务与授权/06-隐私协议.md: -------------------------------------------------------------------------------- 1 | # 隐私政策 2 | 3 | 我们的隐私政策已于2022年1月15日更新。我们对隐私政策进行了修订,从该日期开始,这一隐私政策能够提供有关我们如何管理您在使用所有点灯产品和服务时透露的个人信息的隐私详情,除了特定的点灯产品或服务提供独立的隐私政策以外。 4 | 5 | 6 | ## 我们向您承诺 7 | 8 | 本隐私政策规定了点灯科技(成都)有限责任公司及关联公司(下文简称“点灯”或“我们”)如何收集、使用、披露、处理和保护您在使用我们的产品和服务时通过点灯APP提供给我们的信息。若我们要求您提供某些信息,以便在使用点灯产品和服务时验证您的身份,我们将谨严格遵守本隐私政策和/或我们的用户条款与条件来使用这些信息。 9 | 本隐私政策在制定时充分考虑到您的需求;您全面了解我们的个人资料收集和使用惯例而且确信自己最终能控制提供给点灯的个人信息,这一点至关重要。 10 | 在这项隐私政策中,“个人信息”指信息本身或与点灯能够访问的个人的其他信息联系后能够识别特定个人的数据。此类个人信息包括您的姓名、地址、电话号码和电子邮箱地址。 11 | 通过使用点灯产品和服务,即表示您已阅读、认可并接受本隐私政策中所述之所有条款,包括我们随时作出的任何变更。我们承诺遵照适用法律(包括您所在地的数据保护法律)来保护您的个人信息的隐私、机密和安全。同时我们承诺我们的全体员工和代理商履行这些义务。 12 | 最后,我们所希望的就是为我们的用户带来最好的体验。如果您对这一隐私政策中概括的数据处理惯例有任何疑问,请通过邮件联系我们,以便我们处理您的特殊需求。我们很高兴能直接处理您的问题。联系邮箱:dongbo@diandeng.tech 13 | 14 | ## 收集哪些信息以及如何使用信息? 15 | 16 | 收集的信息类别 17 | 为了向您提供我们的服务,我们会要求您提供向您提供服务所必需的个人信息。如果您不提供个人信息,我们可能无法向您提供我们的产品或服务。 18 | 我们收集以下各类信息(无论其是否为个人信息): 19 | • 您提供给我们或上传的信息:我们可能收集您提供给我们的任一或所有个人信息,例如姓名、手机号、电子邮箱地址、点灯账号信息(例如您的安全相关的信息、姓名、生日、性别)、您接入到点灯平台的设备同步的资料或数据,及在点灯平台创建的账户和相关设置信息、您添加的设备或发送的消息、反馈以及您提供给我们的任何其他信息。 20 | • 手持终端或SIM卡相关信息:运行点灯的手持终端相关的信息。例如IMEI编号、IMSI编号、系统版本、设备制造商信息、型号名称和网络运营商。 21 | • 设备信息:与您账号绑定的相关设备信息。例如MAC地址、DID、及相应设备传感器收集的信息(例如温度、湿度、PM2.5、AQI、TDS、tVOC、CO2、环境光线、烟雾浓度、天然气浓度、耗电量、运行轨迹、信号强弱、侦测动作/画面、体温、体重、开/关状态)以及设备耗材的运行情况(例如滤芯、滤网使用寿命等)。 22 | • 我们指定的与您相关的信息:我们可能收集并使用诸如点灯帐号等信息。 23 | • 位置信息(仅适用于特定服务/功能):与您的位置相关的各类信息。例如国家代码、城市代码、移动网络代码、小区标识、经纬度信息和语言设置。 24 | • 登录信息:与您使用某些功能、设备相关的信息。例如cookie和其他匿名标识符技术、IP地址、临时消息历史和标准系统日志等。 25 | • 其他信息:环境特征值 (ECV)(设备绑定的账号(邮箱及手机号)、连接的Wi-Fi账号及密码、地理位置信息等) 26 | 我们还可能收集其他各类与个人没有关联的匿名信息。例如,在使用特定服务时,可能收集用户的接入点灯的设备的设备型号和固件版本号。收集此类信息的目的在于改善我们向您提供的服务。所收集信息的类别和数量取决于您如何使用、加入或参与我们产品和/或服务。 27 | 28 | ### 特别说明 29 | 30 | 由于操作系统权限要求,点灯App在使用手机蓝牙及WiFi功能时,会请求位置权限,此权限请求,仅为正常使用手机相应功能,此时点灯不会记录用户位置信息。 31 | 32 | ## 这些个人信息将会被如何使用 33 | 34 | 收集个人信息的目的在于向您提供产品和/或服务,并且保证我们遵守适用法律。您特此同意我们出于本隐私政策规定的目的处理个人信息,并向我们的关联公司(其涉及通信、社交媒体、技术和云业务)、第三方服务供应商(定义如下)披露个人信息。 35 | 我们可能会将您的个人信息用于下列目的: 36 | • 提供、处理、维护、改善、开发我们的商品和/或提供给您的服务,以及通过设备或点灯提供的服务。 37 | • 与您就您的设备、服务或任何普通查询(例如更新、设备固件/软件升级、客户咨询支持、相关信息、通知)等进行交流。 38 | • 分析和开发与我们产品及服务的使用相关的统计信息,以更好地改进我们的产品和服务。 39 | • 储存并维护与您相关的信息,用于我们运营业务或履行法律义务。 40 | 关于我们如何使用您的信息(其中可能包含个人信息),下面提供了更多详细信息: 41 | • 创建您的账号。在通过移动设备创建账号时收集的个人信息用于建立用户的个人账户和资料页。 42 | • 提供基于位置的服务。在使用点灯App及点灯相关设备时,我们可能会使用位置信息为您提供尽可能好的用户体验,例如分析并提供所在位置的周边天气信息、空气质量、饮水水质,以及根据您的选择为您提前开启相应设备等体验。您可以随时进入设备设置或停止使用这一应用程序来关闭这一功能。 43 | • 设备接入。设备接入点灯,需要连接网络。因此在点灯APP中添加设备时,需要您录入相应的Wi-Fi名称及密码,该信息仅用于设备配网使用。您填写的Wi-Fi及密码数据,我们会加密存储在您移动终端中,不会上传服务器,您可以随时进入设备删除该信息。 44 | • 设备状态显示。您设备上报的状态信息(例如温度、湿度、PM2.5、AQI、TDS、tVOC、CO2、环境光线、烟雾浓度、天然气浓度、耗电量、运行轨迹、信号强弱、侦测动作/画面、体温、体重、开/关状态)以及设备耗材的运行情况(例如滤芯、滤网使用寿命等),可以允许您远程查看设备状态,以便您时刻查看家中设备运行情况。 45 | • 设置自动化任务。您设备上报的事件信息(例如温度、湿度、PM2.5、AQI、TDS、tVOC、CO2、环境光线、烟雾浓度、天然气浓度、耗电量、运行轨迹、信号强弱、侦测动作/画面),可以用于创建属于您个人的自动化任务,例如接入点灯的温度传感器在温度高于30℃时,控制接入点灯的智能空调开启制冷。 46 | • 提供推送服务。账号和 IMEI 号码也将用于提供点灯推送服务,为用户发送设备通知。您可以随时通过更改“消息设置”项下的偏好选项来关闭这一功能。 47 | • 收集用户反馈。您选择提供的反馈对帮助点灯改进我们的服务而言极为珍贵。为了跟踪您选择提供的反馈,点灯可能会使用您所提供的个人信息与您联系,并保留记录。 48 | • 发送通知。我们可能会不时使用您的个人信息来发送重要通知,例如有关设备异常运行状态的通知、您定制的设备推送通知(例如:移动侦测报警、清扫情况等)、我们的条款、条件和政策变更。 49 | 50 | 51 | ## 我们与谁共享您的信息? 52 | 53 | 我们不会将任何个人信息出售给第三方。 54 | 我们有时可能会向第三方(定义见下文)披露您的个人信息,以便提供您要求的产品或服务。 55 | 我们可能会向本部分下文列出的第三方服务供应商和关联公司作出披露。在本部分所述的各种情况下,您可以放心,点灯仅会根据您的授权共享您的个人信息。您应当了解,在下文描述的任何情况下,当点灯与第三方服务供应商共享您的个人信息时,点灯会通过合同规定第三方的实践和义务,遵守适用的地方数据保护法。点灯会通过合同保证第三方服务供应商遵守您所属司法管辖区中适用于他们的隐私权标准。 56 | 57 | ### 与我们和第三方服务供应商共享信息 58 | 59 | 为了顺利地从事商业经营,以向您提供产品和服务的全部功能,我们可能不时向其他的点灯关联公司(其涉及通讯、社交媒体、技术或云业务)或我们的第三方服务供应商(我们的邮寄商店、送货服务供应商、电信公司、数据中心、数据存储设施、客户服务供应商、广告和推广服务供应商、代表点灯的代理)[关联公司和/或其他第三方](统称为“第三方服务供应商”)披露您的个人信息。此类第三方服务供应商可能代表点灯或出于上述的一项或多项目的处理您的个人信息。在我们的设备上使用某些移动应用程序时,我们可能会和第三方共享您的 IP 地址,以便为您提供您要求的某些服务。如果您不再希望允许我们共享这些信息,请发送电子邮件到 邮件 联系我们。 60 | 与其他人共享信息 61 | 在适用法律要求时,点灯可能会不经过进一步同意而披露您的个人信息。 62 | 63 | ### 不需要同意的信息 64 | 65 | • 我们可能以汇总的形式与第三方(例如我们网站上的广告商)共享匿名信息,用于商业目的;我们可能与其共享我们服务的一般使用趋势,例如在购买某些产品或从事某些交易的特定人群中的客户数量。 66 | • 为免存疑,点灯可能在地方数据保护法明确允许的情况下和范围内(例如为了遵循传票)不经您的同意而收集、使用或披露您的个人信息,并且当我们可能会出于诚意相信为了保护我们的权利、保护您的安全或他人安全、为调查欺诈行为或对政府要求作出回应而必需披露时,不经您的同意而披露您的信息。 67 | 68 | ## 安全保障 69 | 70 | ### 点灯的安全措施 71 | 72 | 我们承诺保证您的个人信息安全。为了防止未经授权的访问、披露或其他类似风险,我们落实了合理的物理、电子和管理措施流程,保护我们从您的移动设备上收集的信息。我们将采取所有合理的措施保护您的个人信息。 73 | 例如,当您从点灯设备向我们的服务器发送或收取信息时,我们确保使用安全套接层 (SSL) 和其他算法对其进行加密。 74 | 您的个人信息全都被储存在安全的服务器上,并在受控设施中受到保护。我们依据重要性和敏感性对您的数据进行分类,并且保证您的个人信息具有最高的安全等级。我们保证通过访问这些信息来帮助向您提供产品和服务的员工和第三方服务供应商具有严格的合同保密义务,如果未能履行这些义务,其将会受到纪律处分或被终止合作。同样,我们对以云为基础的数据存储设有专门的访问控制措施。总而言之,我们定期审查信息收集、储存和处理实践,包括物理安全措施,以防止任何未经授权的访问和使用。 75 | 我们将采取所有可行的措施保护您的个人信息。但是,您应当意识到互联网的使用并不总是安全的,因此,我们不能保证在通过互联网双向传输时任何个人信息的安全性或完整性。 76 | 您能做什么! 77 | • 您可以通过不向任何人(除非此人经您正式授权)披露您的登录密码或账户信息,为保护您个人信息的安全发挥作用。无论您何时作为用户登录点灯,尤其是在他人的计算机或公共互联网终端上登录时,在会话结束时您总应注销登出。 78 | • 点灯不对因您未能保持个人信息的私密性而导致第三方访问您的个人信息进而造成的安全疏漏承担责任。尽管有上述规定,如果发生互联网其他任何用户未经授权使用您账户的情况或其他任何安全漏洞,您必须立即通知我们。 79 | • 您的协助将有助于我们保护您个人信息的私密性。 80 | 81 | ## 保留政策 82 | 83 | 如有必要实现收集信息的目的,或者遵守适用法律要求或允许,我们将一直保留个人信息。只要能够合理推断保留个人信息不能实现收集个人信息的目的,并且出于法律、解决纠纷、强制实施我们的协议或其他商业目的不再需要保留信息时,我们将不再保留个人信息,或者会消除将个人信息和特定个人关联起来的途径。 84 | 85 | ### 访问您的设备上的其他功能 86 | 87 | 我们的应用程序可能会访问您设备上的某些功能,例如启用电子邮件使用联系人、短信存储和 Wi-Fi 网络状态,蓝牙状态,以及其他功能。这些信息用于允许这些应用程序在您的设备上运行,并且允许您与其互动。在任何时候,您可以通过在设备水平上关闭应用程序或者通过 邮件 联系我们来撤销许可。 88 | 89 | 90 | ## 控制设置 91 | 92 | 点灯承认每个人对隐私权的关注各不相同。因此,我们提供了一些示例,说明点灯提供的各种方式,供您选择,以限制收集、使用、披露或处理您的个人信息,并控制您的隐私权设置: 93 | • 打开或者关闭用户体验计划和位置访问功能; 94 | • 登入或登出点灯账户; 95 | 如果您之前因为上述目的同意我们使用您的个人信息,您可以随时通过书面或者向 邮件 发送邮件的方式联系我们来改变您的决定。 96 | • 您有权要求访问和/或更正我们持有的与您有关的任何个人信息。当您更新个人信息时,在我们处理您的请求前,会要求验证您的身份。一旦我们获得充分信息,可处理您的请求以访问或更正您的个人信息时,我们将在适用数据保护法规定的时间内对您的请求做出回应。 97 | • 我们通常免费提供这些服务,但是保留对您的数据访问请求收取合理费用的权利。 98 | • 如果您希望请求访问我们持有的个人数据或者如果您认为我们持有的关于您的任何信息是不正确或不完整的,请尽快联系我们告知您的需求。 99 | • 与您点灯账户中的个人信息相关的更多详细信息,您可以通过您的设备登入账户来访问和更改。 100 | 101 | ### 撤销同意 102 | 103 | • 您可以通过向 邮件 发送邮件的方式联系我们提交请求,撤销同意收集、使用和/或披露我们掌握或控制的您的个人信息。我们将会在您做出请求后的合理时间内处理您的请求,并且会根据您的请求,在此后不再收集、使用和/或披露您的个人信息。 104 | • 请注意,您撤销同意会导致某些法律后果。根据您撤销同意让我们处理您的个人信息的范围,这可能表示您不能享受点灯的产品和服务。 105 | 106 | ### 将个人信息转移到您所属的司法管辖区之外 107 | 108 | 如果我们需要将个人信息转移到您所属的司法管辖区之外,无论是转移给我们的关联公司(其涉及通信、社交媒体、技术和云业务)或第三方服务供应商时,我们将按照适用法律进行。特别是,我们通过落实合适的安全保障措施,保证所有这类转移满足适用的地方数据保护法的要求。 109 | 110 | ### 其他规定 111 | 112 | 关于未成年人 113 | • 我们认为监督孩子使用我们的产品和服务是父母的责任。但是,我们的政策不要求获得未成年人的个人信息,或者向这类人群发送任何促销资料。 114 | • 点灯不会寻求或试图寻求接收来自未成年人的任何个人信息。如果家长或监护人有理由相信未成年人未经他们事先同意而向点灯提交了个人信息,请联系我们以确保删除此类个人信息,并保证未成年人取消订阅任何适用的点灯服务。 115 | 116 | ### 优先顺序 117 | 118 | 如果您同意了适用的用户协议,并且此类用户协议和本隐私政策之间存在不一致,将以此类用户协议为准。 119 | 120 | ### 适用法律 121 | 122 | 本隐私政策的管辖法为中华人民共和国法律。 123 | 124 | 我们并未表示或者保证本隐私政策符合任何司法管辖区的隐私权法律,因此,您不应当按照该等法律来解释隐私政策。 125 | 126 | ### 隐私政策的更新 127 | 128 | 我们会对隐私政策进行定期审核,为反映我们信息惯例的变更,我们可能会更新本隐私政策。如果我们对本隐私政策进行重大变更,我们将通过(向您账户指定的邮箱地址发送)电子邮件或在点灯APP公布或通过移动设备通知您,这样您可以了解我们收集的信息以及我们如何使用这些信息。此类隐私政策变化将从通知或网站规定的生效日期开始适用。我们建议您定期查阅本网页获取我们隐私权实践的最新信息。您继续使用产品和网站、手机和/或其他任何设备上的服务,将被视为接受更新的隐私政策。在我们向您收集更多的个人信息或我们希望因为新的目的使用或披露您的个人信息时,我们会再次征得您的同意。 129 | 130 | ## 我是否必须同意任何第三方条款与条件? 131 | 132 | 我们的隐私政策不适用于第三方提供的产品和服务。点灯产品和服务可能包括第三方的产品和服务,以及第三方网站的链接。当您使用这些产品或服务时,也可能收集您的信息。因此,我们强烈建议您花时间阅读该第三方的隐私政策,就像阅读我们的政策一样。我们不对第三方如何使用他们向您收集的个人信息负责,也不能控制其使用。我们的隐私政策不适用通过我们的服务链接的其他网站。 -------------------------------------------------------------------------------- /docs/099-服务与授权/08-App打包上架服务.md: -------------------------------------------------------------------------------- 1 | # App打包上架服务 2 | 3 | ## 免费打包服务 4 | 仅面向专属设备可用数量1000个以上的开发者提供android Apk打包服务,每个开发者账号每月限1次。 5 | 6 | APP打包需要提供的资料: 7 | 应用名:该App名称(中文或英文) 8 | 包名:\<xxx\>.diandeng.tech 9 | 桌面图标:<512 x 512 PNG格式> 10 | 启动页图片:<2048 x 2048 PNG格式>(请图片中包含应用或企业名称) 11 | 登录页logo:<不超过700 x 200 PNG格式>(务必背景透明) 12 | 13 | 打包后的apk文件未签名,用户自行签名后,可发布到应用商店。 14 | 15 | ### android App签名方法 16 | 1.安装jdk 17 | 2.在jdk\bin下,运行如下命令生成密钥: 18 | ```bash 19 | keytool -genkey -alias <name> -keyalg RSA -validity 10000 -keystore <name>.keystore 20 | ``` 21 | <name>为自定义的名称 22 | 3.使用如下命令进行签名: 23 | ```bash 24 | jarsigner -verbose -keystore <name>.keystore -signedjar <apkfilename>_signed.apk <apkfilename>.apk <name>.keystore 25 | ``` 26 | 27 | 如用户不想自行签名发布,可使用我们提供的发布服务: 28 | 29 | ## Android打包签名上架服务 30 | 收费标准:15000元/年(包含一年时间内对App的维护和更新) 31 | 默认上架市场:腾讯应用宝 32 | 上架其他市场收费:500元/次/个 33 | 其他说明: 34 | 1. 上架应用需要提供软件著作权证书,所产生费用由开发者承担; 35 | 2. 资料齐备后,首次上架通常3~7个工作日,具体时间由应用商店方面决定。 36 | 37 | ## IOS打包上架服务 38 | 需要提供的资料同android 39 | 收费标准:15000元/年(包含一年时间内对App的维护和更新,不包含注册开发者账号产生的相关费用) 40 | 其他说明: 41 | 1. 上架应用需要苹果开发者账号,所产生费用由开发者承担; 42 | 2. 由于IOS版本发布审核上线流程严格,手续繁琐,所以版本发布通常会有滞后,具体时间由苹果公司方面决定。 -------------------------------------------------------------------------------- /docs/100-其他/01-App下载.md: -------------------------------------------------------------------------------- 1 | # App下载 2 | 3 | ## Android 4 | [官网下载](https://diandeng.tech/dev) 5 | 6 | ### 开发中/历史版本 7 | 这里通常有比上面更新的版本,不建议非开发者使用 8 | [Github](https://github.com/blinker-iot/app-release/releases) 9 | 10 | > **版本说明** 11 | > alpha:内部测试版本,在大变更或添加新功能后发布的测试版本,可用于开发者体验新功能和参与测试; 12 | > beta:公开测试版本,经过初步测试或小幅调整的测试版本,可用于开发者正常使用; 13 | > release:可交付最终用户使用的版本。 14 | 15 | ## IOS 16 | [点击下载](https://apps.apple.com/cn/app/id1498805902) 17 | 18 | ## 系统支持与测试 19 | release app发布默认只测试最近的3个大版本,当前为: 20 | android 11 10 9 21 | 理论支持的最低android版本 android 6 22 | ios 13 12 11 23 | 理论支持的最低ios版本 ios 11 24 | 25 | ### 测试环境 26 | 对于release版本,我们目前会在如下手机上进行测试: 27 | 三星S9、三星S6 edge、华为mate30 Pro、锤子坚果Pro、锤子坚果Pro 2s、iphone 6、iphone X 28 | 以上型号以外的手机,我们无法保证功能一切正常,如有发现问题,可通过Github向我们提交错误报告。 29 | 30 | ### 更低版本系统解决办法 31 | 低版本android用户如遇使用不正常,更新webview即可解决(国产手机系统可能更新不了) 32 | 低版本ios用户,推荐将更新到ios12及以上版本,可以获得更好的使用体验 33 | 34 | ### 源代码 35 | [Github](https://github.com/blinker-iot/blinker-app) 36 | -------------------------------------------------------------------------------- /docs/100-其他/02-SDK下载.md: -------------------------------------------------------------------------------- 1 | # SDK下载 2 | 3 | ## Arduino(C++) SDK 4 | [下载](https://github.com/blinker-iot/blinker-library/archive/master.zip) 5 | [Github](https://github.com/blinker-iot/blinker-library) 6 | [开发中版本](https://github.com/blinker-iot/blinker-library/tree/dev_3.0) 7 | 8 | [Gitee备用下载地址](https://gitee.com/mirrors/blinker-library/) 如果Github无法访问,可通过此下载,但需要注册登录 9 | 10 | ## NodeJs(JavaScript/TypeScript) SDK 11 | [下载](https://github.com/blinker-iot/blinker-js/archive/master.zip) 12 | [Github](https://github.com/blinker-iot/blinker-js) 13 | 14 | ## Python SDK 15 | [下载](https://github.com/blinker-iot/blinker-py/archive/master.zip) 16 | [Github](https://github.com/blinker-iot/blinker-py) 17 | 18 | ## microPython SDK 19 | [下载](https://github.com/blinker-iot/blinker-mpy/archive/master.zip) 20 | [Github](https://github.com/blinker-iot/blinker-mpy) 21 | 22 | ## IDF(freeRTOS) SDK 23 | [下载](https://github.com/blinker-iot/blinker-esp-idf/archive/master.zip) 24 | [Github](https://github.com/blinker-iot/blinker-esp-idf) 25 | 26 | ## 各SDK支持情况 27 | | | Arduino(C++) | Python | NodeJs(JavaScript) | freeRTOS(C) | MicroPython | nRF52(C) | 28 | | - | - | - | - | - | - | - | 29 | |阿里broker接入|✔|✔|✔|✔|✔|❌| 30 | |点灯broker接入|✔|✔|✔|❌|❌|❌| 31 | |蓝牙ble接入|✔|❌|❌|❌|❌|✔| 32 | |Layouter2界面编辑器|✔|✔|✔|✔|✔|✔| 33 | |独立设备开发|✔|✔|✔|✔|✔|✔| 34 | |专属设备开发|✔|❌|❌|✔|❌|❌| 35 | |小爱接入|✔|✔|✔|❌|❌|❌| 36 | |小度接入|✔|✔|✔|❌|❌|❌| 37 | |天猫精灵接入|✔|✔|✔|❌|❌|❌| 38 | |消息推送|✔|✔|✔|✔|✔|❌| 39 | |微信通知|✔|✔|✔|✔|✔|❌| 40 | |短信通知|✔|✔|✔|✔|✔|❌| 41 | |时序存储|✔|✔|✔|✔|✔|❌| 42 | |文本存储|✔|❌|✔|❌|❌|❌| 43 | |对象存储|✔|❌|✔|❌|❌|❌| 44 | |气象数据获取|✔|✔|✔|✔|✔|✔| 45 | |OTA|✔|❌|❌|❌|❌|❌| 46 | -------------------------------------------------------------------------------- /docs/100-其他/09-独立app开发.md: -------------------------------------------------------------------------------- 1 | # app开发(beta) 2 | 3 | ## App打包上架服务 4 | 5 | ### 免费打包服务 6 | 仅面向专属设备可用数量1000个以上的开发者提供android Apk打包服务,每个开发者账号每月限1次。 7 | 8 | APP打包需要提供的资料: 9 | 应用名:该App名称(中文或英文) 10 | 包名:\<xxx\>.diandeng.tech 11 | App图标:<1024 x 1024 PNG格式> 12 | 启动页图片:<2700 x 2700 PNG格式>(请图片中包含应用或企业名称) 13 | 登录页logo:<不超过700 x 200 PNG格式>(务必背景透明) 14 | 15 | 打包后的apk文件未签名,用户自行签名后,可发布到应用商店。 16 | 17 | #### android App签名方法 18 | 1.安装jdk 19 | 2.在jdk\bin下,运行如下命令生成密钥: 20 | ```bash 21 | keytool -genkey -alias <name> -keyalg RSA -validity 10000 -keystore <name>.keystore 22 | ``` 23 | <name>为自定义的名称 24 | 3.使用如下命令进行签名: 25 | ```bash 26 | jarsigner -verbose -keystore <name>.keystore -signedjar <apkfilename>_signed.apk <apkfilename>.apk <name>.keystore 27 | ``` 28 | 29 | 如用户不想自行签名发布,可使用我们提供的发布服务: 30 | 31 | ### Android打包签名上架服务 32 | 收费标准:15000元/年(包含一年时间内对App的维护和更新) 33 | 默认上架市场:腾讯应用宝 34 | 上架其他市场收费:500元/次/个 35 | 其他说明: 36 | 1. 上架应用需要提供软件著作权证书,所产生费用由开发者承担; 37 | 2. 资料齐备后,首次上架通常3~7个工作日,具体时间由应用商店方面决定。 38 | 39 | ### IOS打包上架服务 40 | 需要提供的资料同android 41 | 收费标准:15000元/年(包含一年时间内对App的维护和更新,不包含注册开发者账号产生的相关费用) 42 | 其他说明: 43 | 1. 上架应用需要苹果开发者账号,所产生费用由开发者承担; 44 | 2. 由于IOS版本发布审核上线流程严格,手续繁琐,所以版本发布通常会有滞后,具体时间由苹果公司方面决定。 45 | 46 | ## 企业版 47 | 企业版可使用现blinker app的所有功能,可定制,亦可二次开发。 48 | 企业用户可联系: 49 | 50 | ## 开源版本 51 | [历史版本](https://github.com/blinker-iot/blinker-app) 52 | 项目基于cordova8、ionic5、angular8开发,可自行了解相关技术。 53 | 54 | ## blinker-Customizer 55 | 以嵌入web app的方式,开发独立的blinker设备页面。[了解更多](https://diandeng.tech/docs/009-专属设备开发/09-Customizer定制设备界面.md) 56 | -------------------------------------------------------------------------------- /docs/img/000/blinker-all.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/000/blinker-all.jpg -------------------------------------------------------------------------------- /docs/img/000/frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/000/frame.png -------------------------------------------------------------------------------- /docs/img/001/import-lib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/001/import-lib.png -------------------------------------------------------------------------------- /docs/img/002/03-1525839812000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/002/03-1525839812000.png -------------------------------------------------------------------------------- /docs/img/002/04-1526172838000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/002/04-1526172838000.png -------------------------------------------------------------------------------- /docs/img/002/04-1526173011000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/002/04-1526173011000.png -------------------------------------------------------------------------------- /docs/img/003/esp_at.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/003/esp_at.png -------------------------------------------------------------------------------- /docs/img/004/01-1524476759000.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/004/01-1524476759000.gif -------------------------------------------------------------------------------- /docs/img/004/04-1555223133000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/004/04-1555223133000.png -------------------------------------------------------------------------------- /docs/img/004/05-1527436400000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/004/05-1527436400000.png -------------------------------------------------------------------------------- /docs/img/005/01-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/005/01-1.jpg -------------------------------------------------------------------------------- /docs/img/005/02-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/005/02-1.jpg -------------------------------------------------------------------------------- /docs/img/005/06-1534411527000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/005/06-1534411527000.png -------------------------------------------------------------------------------- /docs/img/005/08-1543240765000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/005/08-1543240765000.png -------------------------------------------------------------------------------- /docs/img/005/device-block.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/005/device-block.jpg -------------------------------------------------------------------------------- /docs/img/007/ad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/007/ad.jpg -------------------------------------------------------------------------------- /docs/img/008/04-1529168292000.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/008/04-1529168292000.gif -------------------------------------------------------------------------------- /docs/img/099/dongbo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-doc/8c54e1eed2fb3e2774bfe727996b3a91e55e6e10/docs/img/099/dongbo.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blinker-doc", 3 | "version": "1.0.0", 4 | "description": "![](https://github.com/blinker-iot/blinker-doc/blob/master/img/blinker-led-logo-60.png?raw=true)", 5 | "main": "process.js", 6 | "directories": { 7 | "doc": "doc" 8 | }, 9 | "scripts": { 10 | "test": "echo \"Error: no test specified\" && exit 1" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/blinker-iot/blinker-doc.git" 15 | }, 16 | "author": "", 17 | "license": "ISC", 18 | "bugs": { 19 | "url": "https://github.com/blinker-iot/blinker-doc/issues" 20 | }, 21 | "homepage": "https://github.com/blinker-iot/blinker-doc#readme", 22 | "devDependencies": { 23 | "transliteration": "^2.2.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /process.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs"); 2 | var path = require('path'); 3 | var transliterate = require('transliteration') 4 | 5 | // 配置脚本 6 | const SITE_URL = "https://diandeng.tech/"; 7 | const DOC_PATH = "docs/"; 8 | const CONFIG_OUTPUT_PATH = "docs/config.json"; 9 | const CUSTOM_PATH = "custom.json"; 10 | 11 | 12 | var CustomUrl = {} 13 | var MenuList = [] 14 | var ShortUrl = {} 15 | var shouldMD = (process.argv.indexOf('--md') > -1) || (process.argv.indexOf('-md') > -1) 16 | 17 | function loadMenu(filePath = '') { 18 | let submenu = [] 19 | let files = fs.readdirSync(DOC_PATH + filePath) 20 | files.forEach(file => { 21 | if (file == 'img') return 22 | if (file == 'config.json' || file == 'custom.json') return; 23 | let item = loadFile(filePath, file) 24 | submenu.push(item) 25 | }) 26 | return submenu 27 | } 28 | 29 | function loadFile(filePath, file) { 30 | let item = {}; 31 | // console.log(filePath); 32 | // console.log(file); 33 | let title = getFilename(file) 34 | item['title'] = title 35 | 36 | let newFilePath = ((filePath == '' ? '' : filePath + '/') + file) 37 | if (path.extname(file) == '.md') { 38 | item['page'] = shouldMD ? newFilePath : addShortUrl(title, SITE_URL + DOC_PATH + newFilePath) 39 | } else { 40 | item['submenu'] = loadMenu(newFilePath) 41 | } 42 | return item 43 | } 44 | 45 | function getFilename(file) { 46 | // return file.split(/\d+-/)[1].split(/.md/)[0] 47 | return file.substring(file.indexOf('-') + 1, file.lastIndexOf('.md') == -1 ? file.length : file.lastIndexOf('.md')) 48 | } 49 | 50 | function addShortUrl(filename, file, index = 0) { 51 | let url = getShortName(filename) + (index == 0 ? '' : `-${index}`) 52 | if (typeof ShortUrl[url] != 'undefined') 53 | return addShortUrl(filename, file, index + 1) 54 | ShortUrl[url] = file; 55 | return url 56 | } 57 | 58 | function getShortName(filename) { 59 | if (typeof CustomUrl[filename] == 'undefined' || CustomUrl[filename] == '') { 60 | CustomUrl[filename] = "" 61 | return transliterate.slugify(filename) 62 | } else return CustomUrl[filename] 63 | } 64 | 65 | function rename(params) { 66 | if (fs.existsSync(DOC_PATH + 'home-首页.md')) 67 | fs.renameSync(DOC_PATH + 'home-首页.md', DOC_PATH + '000-首页.md') 68 | } 69 | 70 | function delUseless(params) { 71 | if (fs.existsSync(DOC_PATH + '$navigation.md')) 72 | fs.unlinkSync(DOC_PATH + '$navigation.md') 73 | } 74 | 75 | rename(); 76 | delUseless(); 77 | 78 | CustomUrl = JSON.parse(fs.readFileSync(CUSTOM_PATH, 'utf8')) 79 | 80 | MenuList = loadMenu() 81 | 82 | 83 | setTimeout(() => { 84 | let config = { 85 | menu: MenuList, 86 | short: ShortUrl 87 | } 88 | fs.writeFile( 89 | CONFIG_OUTPUT_PATH, 90 | JSON.stringify(config), 91 | (err) => { } 92 | ) 93 | fs.writeFile( 94 | CUSTOM_PATH, 95 | JSON.stringify(CustomUrl).replace(/",/g, '",\n').replace('{', '{\n').replace('}', '\n}'), 96 | (err) => { } 97 | ) 98 | }, 1000) -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ![](https://github.com/blinker-iot/blinker-doc/blob/master/img/blinker-led-logo-60.png?raw=true) 2 | 3 | # 官方网站: 4 | **https://diandeng.tech** 5 | 6 | # blinker中文文档: 7 | **https://diandeng.tech/doc** 8 | 9 | 点灯官网版本文档使用[mdSDS](https://github.com/coloz/mdSDS)构建 --------------------------------------------------------------------------------