Giter Site home page Giter Site logo

ios-rn-sdk's Introduction

注,为了更好的阅读体验,本项目文档部分正合并迁移至小米IoT开发者平台,敬请关注。

目录

概要

此项目为方便智能硬件接入小米米家 App( iOS 版本)。基于此方案,智能硬件厂商需要开发自己的米家扩展程序,用户使用米家 App 连接硬件之后,会自动下载、使用扩展程序,获得与设备交互的能力与 UI。米家 iOS 客户端的扩展程序基于 React Native 框架实现,可以实时动态更新,同时最大限度保留了原生 App 的体验。

React Native 引擎版本:0.25.1

当前 API Level :143

兼容性:iOS 9 +

注:从米家 App 4.4.0 版本起,放弃支持 iOS 8。

功能模块索引

示例代码

MiHomePluginSDK 目录中包含一系列示例代码,开发者可作为参考:

  • wifi 设备开发板示例程序,SDK 目录中 com.xiaomi.demoios
  • 支持小米协议的蓝牙设备开发示例程序,SDK 目录中 com.xiaomi.bledemo.ios 目录
  • 一个完整的真实 wifi 设备程序,SDK目录中 com.xiaomi.powerstripdemo.ios 目录
  • 一个支持横竖屏切换展示的示例程序,SDK目录中 com.xiaomi.orientationdemo.ios 目录
  • 一个应用SVG组件的示例程序,SDK目录中 com.xiaomi.svgdemo.ios 目录
  • 一个有关React Native ART动画的示例程序,SDK目录中 com.xiaomi.artanimdemo.ios 目录,更多 ART 的 API 请参考此处
  • 一个粒子系统的示例程序,SDK目录中 com.xiaomi.particledemo.ios 目录
  • 支持米家安全芯片的蓝牙设备开发示例程序,SDK目录中 com.xiaomi.corebledemo.ios 目录

常见问题

我们收集了诸多开发者关心的问题,整理后放在了 WiKi。更多问题请大家给本项目直接提 issues

开发环境

  1. React Native(以下简称RN): RN 的安装过程参见该项目主页。注意 目前米家 iOS 客户端中内置的 RN 引擎版本为 0.25.1。MiHomePluginSDK 中已经携带,开发机上安装的 RN 版本并不影响扩展程序的开发,0.25.1以后版本RN的新功能不能使用。

  2. MiHomePluginSDK: SDK可以通过 Github项目主页 下载。

  3. openSSL: 为了保证扩展程序包在网络传输中的安全,防止伪造,扩展程序包需要经过开发者签名,签名过程需要 keyTool (OS X 自带) 以及 openSSL 工具。可以通过 Homebrew 进行安装:

    brew install openssl
    
  4. iPhone真机: 由于要使用 Appstore 版本的米家APP进行调试(如果想获得调试便利,需要一个debug版本的米家ipa,RN 的调试选项在 release 模式下禁用了),所以不能使用模拟器开发,必须使用一部 iOS 9.0 以上系统的 iPhone 真机。

扩展程序申请与创建

  1. 小米 IoT 开发者平台 上注册一个开发者账号(智能设备硬件、iOS 扩展程序、Android 扩展程序使用同一个开发者账号)并等待审核通过。
  2. 按引导创建新硬件,审核完成后,按引导完成硬件的基础配置,注意配网方式一定要保证正确。
  3. 创建该智能硬件的扩展程序。创建程序的过程中需要填写一个程序包名,命名规则一般为:若开发者标识为 aaa,设备 model 为aaa.bbb.v1,则 iOS 拓展程序包名一般为 com.aaa.bbb.ios 。例如,xiaomi 公司开发了一款火箭筒,设备 modelxiaomi.rocketlauncher.v1,则该火箭筒在米家iOS客户端中的扩展程序包名为 com.xiaomi.rocketlauncher.ios

开始写扩展程序代码

  1. 进入 MiHomePluginSDK 所在目录

  2. 运行 createPlugin 脚本创建一个新的本地扩展程序包:

    ./createPlugin plugin_name
    

    其中 plugin_name 即为之前申请创建的扩展程序包名 com.aaa.bbb.ios

  3. 本地扩展程序包创建成功后,会在 SDK 所在目录下生成一个 plugin_name 目录,其目录结构以及各文件的含义见相关章节。

  4. plugin_name 目录下有个名为 packageInfo.json 的扩展程序包信息文件(注意 不要与 npm 的 package.json 混淆)。这个文件关系到程序包的打包和上传,创建本地程序包成功后,请用文本编辑器打开这个文件并编辑其中的内容:

    {
     "package_name":"com.aaa.bbb.ios", // 包名,不用修改
     "developer_id":"123456789", // 开发者账号小米ID
     "models":"aaa.bbb.v1|your_device_model2", // 扩展程序支持的设备model,一个程序包可以支持多个model,用|分割
     "min_api_level":"11", // 扩展程序包代码中用到的最高Level的API的API_Level,详见"扩展程序包min_api_level的确定"章节
     "version":"1", // 包的版本,每个上传的程序包都要不同且递增,每次上传新的程序包之前都需要修改
     "platform":"iphone" // 程序包支持的平台,目前只支持iphone,不用修改
    }

    注意:每次打包上传扩展程序包时,都要检查 version 字段是否递增。

min_api_level

  1. 米家 iOS 客户端的功能随着版本的变化也在发生变化,开放给扩展程序的 API 也在逐渐增加(极少数情况下也会废弃),每一个版本的客户端都有一个 API Level,代表了客户端支持的 API 集合,随 API 的变动而递增。
  2. 每个模块或 API 的文档中标明了其引入时米家 iOS 客户端的 API Level,例如 AL[7,] 表示这个模块或 API 只有在运行的客户端 API Level >= 7 的情况下才可以使用,若运行在旧版本的米家客户端,则有可能造成 crash。( API 未标明 Level 的默认与该 API 所在模块的 Level 一致)。
  3. 扩展程序包的 min_api_level 为整个扩展程序中所使用的所有 API 中 API Level 最高的一个,API Level 低于 min_api_level 的米家APP将无法获取到此扩展程序,默认情况下 min_api_level 为当前 SDK 的 SDK_API_Level(该 SDK 中所有 API 里 API Level 最高的一个)。
  4. 综上所述:开发者需要注意,在 packageInfo.json 文件中,填入你当前扩展程序中所有使用了的 API 的 API Level 的最大值。假设你只使用了两个 API,分别为 api_a [100,]api_b [101,] ,则 packageInfo.json 文件中的 min_api_level 值应为 101 ,则不会出现兼容性问题。

扩展程序目录结构及文件含义

本地扩展程序包目录下包含以下文件和目录:

  1. packageInfo.json: 扩展程序包信息文件。
  2. config.plist: 扩展程序配置文件。该文件包含了一些扩展程序可以配置的配置项,包括扩展程序设备状态轮询时间间隔等,具体参见“config.plist配置项含义”章节。
  3. Main目录:扩展程序的页面,其中 index.ios.js 为入口,用 Navigator 导航,可包含多个页面,具体界面开发参见RN文档。设备功能开发参见”与设备和米家云端的交互“章节。注意 相对于1.x版本的旧结构,2.x版本SDK创建的新扩展程序的所有页面都在js侧完成,设置页、自定义场景页和主页面合并为同一个 bundle。导航栏也可以自由控制和隐藏,app 侧不再做强制还原。详见“扩展程序页面和组件代码说明”文档。
  4. Resources目录:扩展程序包资源目录。所有扩展程序包用到的资源,例如图片、文本、声音等文件都要存储在这个目录下。注意,通过 require 方式加载的资源图片,不要放在这个目录下,否则会 copy 两份到打包的扩展程序包中,require 方式加载的资源图片放在 Assets 目录中。
  5. Assets目录:存放通过 require 方式加载的资源。
  6. JSPatch目录:所有扩展程序用到的JSPatch脚本文件存储在这个目录下。

智能设备的发现与连接

  1. 米家 iOS 使用 appstore 版本的客户端(或者debug版本的ipa)进行智能设备扩展程序的开发与调试,在开发与调试之前,需要将设备连接到米家 iOS 客户端中。目前支持使用以下几种设备进行 iOS 扩展程序的开发和调试:

    1. 已经接入米家android的智能设备
    2. 正在开发的米家设备开发板
    3. 小米智能设备Demo开发板
    4. 任意已经接入米家iOS的设备
    5. 虚拟设备

    其中,3、4和5由于不具备待开发设备的相应功能,只能用来开发UI界面。

  2. 使用 1 和 2 进行 iOS 扩展程序开发时,需要确定已经在 IoT 平台完成该产品 model 的基础配置,不然无法在客户端的快连菜单和设备列表里看到设备。

  3. 使用米家开发者账号登陆 iOS 客户端。

  4. 点击客户端右上角的添加按钮,如果菜单中并未出现要连接的设备型号,请按如下步骤操作:

    1. 确认已按前述步骤2联系米家工作人员设置产品状态。
    2. 退出登录开发者账号、杀死客户端进程并重新使用开发者账号登陆。
  5. 在菜单中选择要连接的设备型号,按客户端提示进行连接。

  6. 如果连接失败。请按照指示灯的状态选择对应的模式再试一次,注意 部分设备不支持工作在 5G wifi 下。

  7. 当设备出现在设备列表以后,即可进行扩展程序的开发和调试工作。

  8. 虚拟设备的创建流程见下节。

调试本地扩展程序

  1. 使用米家开发者账号登陆米家 iOS APP ,并确保智能设备(或虚拟设备)已经出现在设备列表中,若有疑问,参见“智能设备的发现与连接”章节。

  2. 进入 MiHomePluginSDK 所在目录。

  3. 启动 node 服务器:

        ```
        npm start --reset-cache
        ```
           
        **注意** 如果出现错误,请检查 node 与 npm 是否已经正确安装。
    
  4. 查看本机 IP 地址:

        ​```
        ifconfig en0
        ​```
           
        **注意** 请确保电脑与手机处在同一局域网内,不然无法调试。
    
  5. 客户端切换到个人信息页卡,检查是否出现“开发者选项”。如果并没有出现,请按如下步骤重试:

    1. 参考 扩展程序的打包和签名 章节,在小米 IoT 开发者平台,填入米家扩展程序公钥。
    2. 如果已填入公钥,重启 App,登出再登入账号。
  6. 开启“开发者选项”,在弹出的对话框中按要求输入调试扩展程序的信息:

    image

    1. 设备 model :调试设备的 model,符合该 model 的设备将加载本地扩展程序,可以是任意设备。
    2. 调试服务器 IP :前述步骤4中记下的电脑 IP 地址。
    3. 扩展程序包名:欲调试的扩展程序包名 plugin_name。
    4. 自定义场景id(可选):如果要开发自定义场景,这里填写对应的sc_id(条件)或sa_id(动作)。一次只支持一个条件/动作的调试。
    5. 触发条件/动作:开发的自定义场景是条件还是动作,如果选中,代表调试的是条件,4中为sc_id;如果未选中,代表调试的是动作,4中为sa_id。
    6. 创建一个对应的虚拟设备:如果没有实体智能设备进行调试,也可以勾选此项,会在设备列表里加入一个虚拟的设备,此设备 model 与选项1中设置的设备 model 相同。但并不具备实际功能,无法接收RPC指令并做出响应。并且,该 model 必须是一个已上线或在白名单中的model,不然不会出现在设备列表中。
  7. 点击“确定”按钮完成设置。

  8. 在设备列表中单击对应设备,弹出 Alert 提示"当前设备model与开发者模式设置的model匹配,将与IP为xxx的调试服务器通信获取扩展程序进行调试"。表示匹配成功,APP 将会访问电脑上的扩展程序包进行展示。

  9. 如果需要查看本地调试扩展程序输出的 console.log 信息,可以用 XCode 连接 iPhone,Command+Shift+2 打开 Devices 菜单并选择该 iPhone,之后可以在右侧区域看到 React 通过应用 MiHome 输出的的调试信息,以[REACT]开头。

  10. 扩展程序代码错误不会导致APP崩溃,而是会弹出一个页面提示错误原因,并可以勾选将错误日志上报。当扩展程序正式上线后,可以在米家开放平台看到用户上报的扩展程序崩溃日志。

开发自定义自动化

MiHomePluginSDK 支持自定义自动化的开发(支持自定义场景条件或动作页面),具体步骤如下:

  1. 在扩展程序包的 config.plist 里,用 customSceneTriggerIds 或 customSceneActionIds 的 key 指明该扩展程序包支持哪些自定义智能场景条件或动作的 sc_id / sa_id 字符串。sc_id 和 sa_id 的值请在 iot 开发平台 -> 开发 -> 自动化设置中查询。在表格中均显示为 id,类别 if 为 sc_id,类别 then 为 sa_id

  2. 在扩展程序主目录下的 Main目录下进行自定义智能场景页面的开发(SceneMain.js文件),该页面会在用户点击“个人中心” --> “自动化” --> “添加” --> “步骤一:添加触发条件”或“步骤二:添加执行任务”并选中相应设备和动作后进入。

  3. 该页面的目的是引导用户完成对该自定义自动化条件/动作的额外设置。(比如展示一个调色板并让用户选择符合场景触发条件时将灯泡设置成的目标颜色,或展示一个温度选择列表并让用户选择特定温度作为温度传感器的触发条件等)

  4. 如果是新建一个自动化动作,extraInfo.payload.did为空字符串;如果是编辑一个自动化动作,extraInfo.payload.did不为空。以此区分新建和修改。

    let extraInfo = MHPluginSDK.extraInfo;
    // 判断是编辑还是新建
    let value = extraInfo.payload.did ? extraInfo.payload.value : "";
  5. 完成设置后,需要调用API将设置好的trigger或action字典传回:

    // 如果是开发自定义触发条件
    MHPluginSDK.finishCustomSceneSetupWithTrigger(trigger);
    // 如果是开发自定义动作
    MHPluginSDK.finishCustomSceneSetupWithAction(action);

调试本地扩展程序自动化

  1. 参见“调试本地扩展程序”章节,完成电脑和手机上的设置,并在开发者选项中设置自定义自动化sc_id(开发条件)或sa_id(开发动作)以及相应 checkbox。
  2. 点击个人中心页中的自动化,添加场景,选择步骤一:触发条件或二:添加任务。
  3. 单击对应设备的对应动作,如果 sc_id 或 sa_id 匹配,则会读取电脑上的扩展程序进行调试。

扩展程序的打包和签名

准备扩展程序签名文件
  1. 使用 keytool 工具生成属于米家开发者账号的 keystore 证书文件。 注意 此文件 iOS 与 android 通用并且需要保持一致,如果已经开发过 android 扩展程序,请使用当时生成的 keystore 文件,并跳过步骤1和2。

    keytool -genkey -dname CN=YourName,OU=YourCompany,O=YourCompany,L=Beijing,ST=Beijing,C=86 -alias yourKeyAlias -keypass 123456 -storepass 123456 -keystore ./your.keystore -validity 18000 -keyalg RSA -keysize 2048
  2. 小米 IoT 开发者平台,个人开发者选项中,填入公钥。即 keystore 文件的证书 MD5 指纹:

    keytool -list -v -keystore your.keystore

    取出其中的 MD5 指纹并去掉冒号;

  3. 使用 keystore 文件按照下述流程提取出 iOS 能够识别的公钥和私钥文件;

  4. 导出公钥文件 public.cer :

    keytool -export -keystore your.keystore -alias yourKeyAlias -file public.cer

    其中 yourKeyAlias 与生成 keystore时的同名参数保持一致。如果是安卓生成的,可以通过下面的命令来查看设置的别名。

    keytool -list -keystore your.keystore
  5. 导出私钥 pem 文件 private.pem:

    //1
    keytool -importkeystore -srckeystore your.keystore -destkeystore private.pkcs -srcstoretype JKS -deststoretype PKCS12 -alias yourKeyAlias
    
    //2
    openssl pkcs12 -in private.pkcs -out private.pem
  6. 保留好生成的 public.cer 以及 private.pem,扩展程序包签名时将用到这两个文件。

打包并给扩展程序签名
  1. 修改本地扩展程序包的 packageInfo.json 一般是将上一次成功上传的 version + 1,并确定 min_api_level 等其他信息是否填写正确;

  2. 进入 MiHomePluginSDK 目录;

  3. 运行 packagePluginAndSign 脚本进行打包:

    python packagePluginAndSign plugin_name /path/to/private.pem /path/to/public.cer yourDeveloperId

    其中 plugin_name 是扩展程序包的目录名,private.pem 和 public.cer 分别是准备好的私钥和公钥文件,yourDeveloperId 是开发此扩展程序的米家开发者账号(数字小米ID)

  4. 签名过程中会要求输入私钥文件的密码;

  5. 打包成功后会在当前目录下生成 plugin_name.signed.zip 的已签名扩展程序包;

  6. 用开发者账号登录 小米 IoT 开发者平台,在扩展程序管理里选择相应的 iOS 扩展程序,点击“上传扩展程序包”进行上传;

  7. 成功后点击该扩展程序包的“白名单测试”,即可用 AppStore 版本的客户端下载在白名单范围内下载到此扩展程序进行测试。

扩展程序的测试和发布

  1. 扩展程序开发者应在开发环境下进行充分的代码测试;
  2. 上传扩展程序,在对应版本后点击 “白名单测试” 按钮, 则白名单内的用户能下载和测试扩展程序。注意云端一般会有几分钟的缓存刷新时间,可能无法立即生效。尤其用户第一次被添加入白名单时,最好重新登录账号并重启 App。厂商需要利用白名单测试做好上线前测试;
  3. 厂商测试完毕,在对应版本后点击“申请上线”按钮,提交测试报告,等待审核;
  4. 审核通过,正式上线。

ios-rn-sdk's People

Contributors

0xabadc0fe avatar chundong avatar copypeng avatar kyou avatar liumengzhou avatar marteswang avatar mizyanlu avatar pencilcool avatar santcool avatar tls6a avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ios-rn-sdk's Issues

MHBluetooth.writeHexDataWithCallback使用问题

对于writeHexDataWithCallback(hexString, characteristicUUID, serviceUUID, type, callback) AL-[113,)方法,文档里没有说明传入hexString的长度限制,目前测试发现:

1、长度较短时,有callback,返回isSuccess=true,虽然文档没说,但是其实就是调用API成功,而并不是write成功;
2、长度过长时,没有callback,感觉应该是API健壮性需要改进;
3、长度为奇数时,字符串前面补‘0’,虽然文档没说,但是也可以理解;

问题:
1、能否提供一个接口,返回最大发送长度,这样开发者在发送较长数据时可以有效分包,多次调用writeHexDataWithCallback 方法,高效利用蓝牙。类似iOS 9开始提供的:maximumWriteValueLengthForType方法。
2、如果暂时不能提供接口,那么是否可以给出一个具体的数值?因为最大发送长度和手机、蓝牙模块有关,这里提供了产品正在使用的小米蓝牙模块Model: MHCB03P,芯片:EFR32。

怎样连接米家调试程序

您好,我这边按照文档,创建扩展程序,想连接手机创建相应的虚拟设备,在手机端配置好但是设备列表并不显示。请问如何才能看到界面程序

characteristic uuid 安卓和设备交互是可以的,iOS这边却提示没有。

iOS这边一个新的报错问题。
下面这个characteristic uuid 安卓和设备交互是可以的,iOS这边却提示没有。

报错:"not found device with characteristic uuid 524F534E-4553-5F47-5F45-49585F4E5558 on service uuid FEFE5245-5652-4553-5F45-49585F4E5558 on peripheral with identifier B2CBF943-5309-4D39-A6FA-E2C6B211683B "

YellowBox.js:56 Unable to load source map: Source code is not available

在用MHXiaomiBLE.registerXiaoMiBLE()接口时,回调返回 error。{"message":"register failed.","code":3},屏幕上显示:YellowBox.js:56 Unable to load source map: Source code is not available。

请问会不会影响后面的操作。如果影响,是app错误?还是硬件设备没有实现什么协议?我们应该怎么做?

不能断掉蓝牙连接

插件退出的时候不能断掉蓝牙连接

Component 将要卸载时调用,可以在此处做一些清理工作。**此处有一处特殊情况需要注意,**即调用MHPluginSDK.closeCurrentPage()退出插件时,插件组件会被强制卸载,该方法中的操作可能来不及执行。该种情形通常出现在插件的首页(第一页),用户点击返回按钮时,调用 closeCurrentPage(),首页中该方法中的操作未全部执行。故,监听插件的退出,清理工作需要在 closeCurrentPage()之前进行,不要写在该方法中。

怎样做到

故,监听插件的退出,清理工作需要在 closeCurrentPage()之前进行,不要写在该方法中。

关于packagePluginAndSign打包脚本问题

packagePluginAndSign这个脚本中有对插件源码进行对称加密生成codeSign这样一个文件。不知道这个codeSign是否有必要呢?因为已经对mainbundle.js所在目录进行哈希加密了,这样已经可以达到代码验证的目的了,为什么还需要codeSign呢?

MHPluginSDK.basePath 的包路径 和我实际上传的包路径不一致,导致我一个包适配多个mode,有的model路径不对,获取不到图片

问题描述
1.我打包了一个 包名为 com.chuangmi.remoteversion2.ios 插件,适配了多个model
2.实际上只有在 本地调试这个插件的时候获取图片路径是ok的;
3.在把RN的js 上传到服务端后,下载路径变了,例如(com.chuangmi.remoteversion2.ios_143_41/Resoucres),然后图片就没有,加载不到数据

有关device token问题

请问后期是否可以提供获取标识设备生命周期内(从设备快连到删除)的device token的接口?现在安卓端是可以获取到。

自定义 OTA 流程

Team,

目前,插件里的OTA 升级功能都是调用,MHPluginSDK.openDeviceUpgradePage();,但是这个方法对应的页面,没有找到。现在有自定义OTA流程的需求,该怎么做?

MHPluginSDK.basePath 的包路径 和我实际上传的包路径不一致,导致我一个包适配多个mode,有的model路径不对,获取不到图片

问题描述

  • 我打包了一个包名为 com.chuangmi.remoteversion2.ios 插件,适配了多个model;

  • 实际上只有在 本地调试这个插件的时候获取图片路径是ok的;

  • 在把RN的js 上传到服务端后,下载路径变了;

  • 例如(com.chuangmi.remoteversion2.ios_143_41/Resoucres),然后图片就没有,加载不到数据

ios真机调试

您好,ios连接真机调试的时候在米家Bate中打开插件调试,插件无法正常进入,关闭就可正常进入,导致无法在浏览器上面调试代码,急急急!请帮忙解答一下!

wyze.light.smartbulb01 下载时,Wi-Fi情况下下载失败,4g网络时有时候下载也会出现失败

log:2018-09-03 10:54:30.766427+0800 MiHome[1155:486935] get plugin info of wyze.light.smartbulb01 succeeded: <MHPlugin: 0x1c40f2380>!
2018-09-03 10:55:12.650592+0800 MiHome[1155:486935] start download plugin
2018-09-03 10:55:14.925463+0800 MiHome[1155:486935] bonjour:lumi.gateway.v3
2018-09-03 10:55:14.925543+0800 MiHome[1155:487953] TIC Read Status [11:0x1d01663c0]: 1:57
2018-09-03 10:55:14.938021+0800 MiHome[1155:486935] Datalist refresh request sent.
2018-09-03 10:55:14:938 MiHome[1155:487507] [sendRequest] start:https://wyze-us.api.io.mi.com/app/home/device_list
2018-09-03 10:55:14.949829+0800 MiHome[1155:486935] Status bar could not find cached time string image. Rendering in-process.
2018-09-03 10:55:14.983405+0800 MiHome[1155:488195] TIC TCP Conn Failed [26:0x1c4167bc0]: 1:61 Err(61)
2018-09-03 10:55:14.983709+0800 MiHome[1155:488195] Task <15FC4B45-7D04-4E01-B136-D460ACC37A8E>.<1> HTTP load failed (error code: -1004 [1:61])
2018-09-03 10:55:14.984064+0800 MiHome[1155:487952] Task <15FC4B45-7D04-4E01-B136-D460ACC37A8E>.<1> finished with error - code: -1004
2018-09-03 10:55:15.360726+0800 MiHome[1155:487012] 其它
2018-09-03 10:55:15.361065+0800 MiHome[1155:487012] 其它
2018-09-03 10:55:16.555461+0800 MiHome[1155:487952] TIC TCP Conn Failed [27:0x1c8161d40]: 1:61 Err(61)
2018-09-03 10:55:16.555925+0800 MiHome[1155:487952] Task <533727EA-65A9-4D5D-87A6-9174E30DE07C>.<1> HTTP load failed (error code: -1004 [1:61])
2018-09-03 10:55:16.556267+0800 MiHome[1155:488195] Task <533727EA-65A9-4D5D-87A6-9174E30DE07C>.<1> finished with error - code: -1004
2018-09-03 10:55:17.122894+0800 MiHome[1155:486935] bonjour:lumi.gateway.v3
2018-09-03 10:55:17.711658+0800 MiHome[1155:486935] statGetMyDeviceListTime : 2773
2018-09-03 10:55:17.712386+0800 MiHome[1155:488195] {"value":{"type":"get_my_device_list","value":2773,"extra":1},"uid":"1244770791","type":"time","time":1535943317}
2018-09-03 10:55:17.714961+0800 MiHome[1155:487952] bonjour:lumi.gateway.v3
2018-09-03 10:55:17.715523+0800 MiHome[1155:487952] 其它
2018-09-03 10:55:17.715817+0800 MiHome[1155:487952] 其它
2018-09-03 10:55:17.716618+0800 MiHome[1155:487952] Wyze Bulb
2018-09-03 10:55:17.716785+0800 MiHome[1155:487952] Wyze Bulb
2018-09-03 10:55:17.716915+0800 MiHome[1155:487952] bonjour:lumi.gateway.v3
2018-09-03 10:55:17.717362+0800 MiHome[1155:487952] -[MHDeviceListManager notifyUI:updateType:extraInfo:]
2018-09-03 10:55:17.717694+0800 MiHome[1155:486935] -[MHPushManager checkAndhandleCachedPush] push msg:(null)
2018-09-03 10:55:17.726738+0800 MiHome[1155:486935] [WC] WCSession is not paired
2018-09-03 10:55:17.726821+0800 MiHome[1155:486935] [WC] -[WCSession updateApplicationContext:error:]_block_invoke failed due to WCErrorCodeDeviceNotPaired
2018-09-03 10:55:31.458057+0800 MiHome[1155:488320] TIC TCP Conn Failed [28:0x1c8164800]: 1:61 Err(61)
2018-09-03 10:55:31.458422+0800 MiHome[1155:488320] Task .<1> HTTP load failed (error code: -1004 [1:61])
2018-09-03 10:55:31.459405+0800 MiHome[1155:487671] Task .<1> finished with error - code: -1004
2018-09-03 10:55:46.464156+0800 MiHome[1155:487954] TIC TCP Conn Failed [29:0x1c0167740]: 1:61 Err(61)
2018-09-03 10:55:46.464499+0800 MiHome[1155:487954] Task <99BC1598-7D52-4016-A546-D59AC9498922>.<1> HTTP load failed (error code: -1004 [1:61])
2018-09-03 10:55:46.464884+0800 MiHome[1155:488195] Task <99BC1598-7D52-4016-A546-D59AC9498922>.<1> finished with error - code: -1004
2018-09-03 10:55:48.831801+0800 MiHome[1155:487954] TIC TCP Conn Failed [24:0x1c4167740]: 3:-9802 Err(-9802)
2018-09-03 10:56:00.007567+0800 MiHome[1155:486935] Status bar could not find cached time string image. Rendering in-process.
2018-09-03 10:56:01.453155+0800 MiHome[1155:487671] TIC TCP Conn Failed [31:0x1c8164680]: 1:61 Err(61)
2018-09-03 10:56:01.453577+0800 MiHome[1155:487671] Task .<1> HTTP load failed (error code: -1004 [1:61])
2018-09-03 10:56:01.453979+0800 MiHome[1155:488195] Task .<1> finished with error - code: -1004
2018-09-03 10:56:15.062813+0800 MiHome[1155:487671] NSURLConnection finished with error - code -1001
(lldb) po error
Error Domain=NSURLErrorDomain Code=-1001 "请求超时。" UserInfo={NSUnderlyingError=0x1c8249750 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "请求超时。" UserInfo={NSErrorFailingURLStringKey=https://awsusor0-cdn.fds-ssl.api.xiaomi.com/default/com.wyze.light.smartbulb01.iosr_2018083014573676639.zip?GalaxyAccessKeyId=5721718224520&Expires=3079662536000&Signature=e4Oua+zg0sWboFXztF4aZMQ5W6s=, NSErrorFailingURLKey=https://awsusor0-cdn.fds-ssl.api.xiaomi.com/default/com.wyze.light.smartbulb01.iosr_2018083014573676639.zip?GalaxyAccessKeyId=5721718224520&Expires=3079662536000&Signature=e4Oua+zg0sWboFXztF4aZMQ5W6s=, _kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4, NSLocalizedDescription=请求超时。}}, NSErrorFailingURLStringKey=https://awsusor0-cdn.fds-ssl.api.xiaomi.com/default/com.wyze.light.smartbulb01.iosr_2018083014573676639.zip?GalaxyAccessKeyId=5721718224520&Expires=3079662536000&Signature=e4Oua+zg0sWboFXztF4aZMQ5W6s=, NSErrorFailingURLKey=https://awsusor0-cdn.fds-ssl.api.xiaomi.com/default/com.wyze.light.smartbulb01.iosr_2018083014573676639.zip?GalaxyAccessKeyId=5721718224520&Expires=3079662536000&Signature=e4Oua+zg0sWboFXztF4aZMQ5W6s=, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=请求超时。}

但是在浏览器中
输入
https://awsusor0-cdn.fds-ssl.api.xiaomi.com/default/com.wyze.light.smartbulb01.iosr_2018083014573676639.zip?GalaxyAccessKeyId=5721718224520&Expires=3079662536000&Signature=e4Oua+zg0sWboFXztF4aZMQ5W6s=
是可以正常下载插件内容

使用MHPluginFS类的过程中存储再读取出来的内容为BASE64字符串,参考其他Base64解码后数据不一致了

使用MHPluginFS类的过程中,遇到了如下问题,
1 MHPluginFS.downloadFile
2 MHPluginFS.readFileToBase64(result.filename, (success, base64Content) => {}
这样存储再读取出来的内容为BASE64字符串, 打印如下
cFGq/6TrAAAVG/p3MS4xLjBfMDAwMwD//////9Rc/FkA/////////////////////////////////////////2gA/Qe9BfwHxQX8

3 参考https://www.cnblogs.com/ryans/p/6512631.html,
进行了BASE64解码,最后还原成Byte数组,再转16进制字符串打印如下:
7051eabfa4eb8080151beab7b12e312e305f3030303300efbfbfefbf945cec9980efbfbfefbfbfefbfbfefbfbfefbfbfefbfbfefbfbfefbfbfefbfbfefbfbfefa880ed87bd05ec878505ec8080

问题是这样解码出来的数据和原数据有不一致,真实数据的16进制字符串内容如下:
7051aaffe8e6000075b7fa86312e312e305f3030303700ffffffffffb08d1b5b00ffffffffffffffffffffffffffffffffff

麻烦问下是否是我参考的BASE64解码有问题?

急急急

peripheral_didUpdateValueForCharacteristic_error监听收到蓝牙设备的通知,返回notification中带的value是什么类型数据,文档上面没有说明

关于API 的困惑,还望帮忙解答一下。

关于API 的困惑,还望帮忙解答一下。
1.

目前,我们用下图的两个API:get_user_device_data 和 set_user_device_data,git 地址 https://github.com/MiEcosystem/ios-rn-sdk/blob/master/MiHomePluginSDK/docs/callSmartHomeAPI.md

set_user_device_data api 中uid 这个字段对于我们的历史数据来说有可能会有两个,一个是下载历史数据时的user ,一个是真正上传的时候的user,请问用哪个?

为什么会存在两个user?
自己只能上报自己的数据,也只能取自己的数据。
倘若用户自己有多个同样设备的情况下,uid依旧只有一个,用did来判断不同的设备。

A拿了一部分甲醛仪的历史数据,B拿了一部分,插件把历史数据存在本地,此时就是两个user,我是不是哪儿理解错了?

蓝牙设备(智能锁)米家客户端打开并登录设备 失败

在插件的主页面,登陆并连接设备,无法登陆
如代码所示:

componentDidMount() {
    //获取当前的设备信息
    MHXiaomiBLE.getDefaultDevice((error, device) => {
      if (!error) {
        MHPluginSDK.showLoadingTips('连接设备中');
        MHXiaomiBLE.loginXiaoMiBLE(device.did, device.mac, 10, (error, result) => {
          MHPluginSDK.dismissTips();
          if (!error) {
            this.state.device = result.device;
            this._initDevice();
          }
          else {
            MHPluginSDK.showFailTips("连接设备失败,XiaomiBLE无法登录");
            this.props.navigator.pop();
          }
        });
      }
      else {
        MHPluginSDK.showFailTips("连接设备失败,XiaomiBLE无法获取设备");
        this.props.navigator.pop();
      }
    });
}

报错信息
19:27:15.849934 +0800 MiHome [REACT][-]-: loginXiaoMiBLE-----device.did:1010008820

19:27:15.850134 +0800 MiHome [REACT][-]-: loginXiaoMiBLE-----device.mac:D5:25:50:9F:00:36

19:27:31.024586 +0800 MiHome [REACT][-]-: loginXiaoMiBLE--error--{"message":"login timeout.","code":404}

文档写的不够详细,那请问,我进入设备,是这样连接蓝牙设备吗

米家beta4.5.0.3版本看不到创建的虚拟设备?

wechatimg83
wechatimg84
之前版本好像没问题,重新下载安装米家beta就看不到了?开发者模式里面有勾选“创建一个相应的虚拟设备”;“我的”图片那边也显示有“一个智能设备”;首页的dev里面却没有设备,是我配置错了?

MHBluetoothLE.writeWithoutResponse接口怎么没有callback?

参考以下接口时,发现 (error)回调一直没有执行,是怎么回事?
writeWithoutResponse(identifier, serviceUUID, characteristicUUID, msg, callback)

描述:向某设备的某服务的某特征写入数据

参数:

identifier 需要查询的蓝牙设备identifier
serviceUUID 需要查询的service的UUID
characteristic 需要查询的characteristic的UUID
msg 发生到设备端的16进制字符串 例如:'FF00FF00'
callback(error) error表示是否有错误
例子:

MHBluetoothLE.writeWithoutResponse(service.peripheral, service.uuid, CharacteristicUUID_READ_NORDIC, 'FF00FF00', (error) => {
if (error) {
MHPluginSDK.showFilTips('数据写入失败');
return;
}
});

但是,如果我使用MHBluetoothLE.writeValue接口,可以正常有 (error)回调的,蓝牙功能基本正常。
之所以想使用writeWithoutResponse接口,是因为蓝牙固件升级时传输太慢,希望看看这个接口能否快一些。

米家app崩溃问题

在开发过程中我们想利用MHXiaomiBLE.encryptMessageXiaoMiBLE()进行加密时,报错{"message":"login first","code":1},貌似说我要登陆。

我修改了逻辑,在加密前,想先用MHXiaomiBLE.loginXiaoMiBLE()进行登录,结果这方法直接导致米家app崩溃。

请注意,这里是米家app崩溃,而不是扩展程序崩溃。

我后来移植了米家自带的Demo(com.xiaomi.croebledemo.io)中的XiaoMiBLEMainPage.js逻辑,结果发现登录方法依然会导致米家app直接崩溃。

请问我应该如何加解密?

网关数据和上传数据不一致问题

甲醛仪会广播数据给小米网关,那广播的数据中,哪部分会上传到小米云?插件也会上传历史数据到小米云,两边现在看起来不一致,需要确认一下,修改成一样的数据。

向蓝牙设备传输文件的问题

我们目前希望ios通过蓝牙向设备发送大文件。由于蓝牙一次传输字节有限,需要将文件打撒。
结果发现sdk中没有相关方法。

想用OC或者swift写一个本地方法,然后由RN调用。
结果发现网上的方法似乎无法在米家的sdk中进行添加。

1、请问我们应该如何将文件通过蓝牙传输到设备?
2、在sdk中,我们如何调用原生控件、方法或lib文件。

关于设备删除后的通知问题

1.现在插件里调用删除设备,删除后没有提供一个回调来通知插件删除本地数据
2.如果用户没打开插件,直接在列表里删除设备/直接重置设备,本地保存的用户数据是不是也要处理下

使用米家MHPluginSDK 自带的com.xiaomi.demoios报错

React packager ready.

[16:02:55] Crawling File System (700ms)
[16:02:55] Building in-memory fs for JavaScript
[16:02:55] Building in-memory fs for JavaScript (3ms)
[16:02:55] Building in-memory fs for Assets
[16:02:55] Building in-memory fs for Assets (2ms)
[16:02:55] Building Haste Map
[16:02:55] Building (deprecated) Asset Map
[16:02:55] Building (deprecated) Asset Map (1ms)
[16:02:55] Building Haste Map (4ms)
[16:02:55] Building Dependency Graph (721ms)
::ffff:192.168.31.97 - - [08/May/2018:08:03:00 +0000] "GET /com.xiaomi.demoios/config.plist HTTP/1.1" 404 44 "-" "Mi%20Home/4.7.7.2 CFNetwork/894 Darwin/17.4.0"
[16:03:00] request:/com.xiaomi.demoios/Main/index.ios.bundle
[16:03:00] find dependencies
::ffff:192.168.31.97 - - [08/May/2018:08:14:26 +0000] "GET /com.xiaomi.demoios/config.plist HTTP/1.1" 404 44 "-" "Mi%20Home/4.7.7.2 CFNetwork/894 Darwin/17.4.0"
[16:14:26] request:/com.xiaomi.demoios/Main/index.ios.bundle
[16:14:26] find dependencies

点击虚拟设备,提示报错如下:
Cannot find entry file
com.xiaomi.demoios/Main/index.ios.js
in any of the roots:["/Users/gl/Desktop/RNProject/ios-rn-sdk-master-MiHomePluginSDK/node_modules/_react_native@0.25.1@react-native

请问一下,米家SDK这个自带的iOS demo该如何才能跑起来?

关于上传、下载API

如下图所示,我现在有个历史数据是2018-6-20产生的,我2018-6-29 读出来了,那time字段用哪个时间?目前用的是2018-6-20。
image001
另外,关于获取历史数据的API,如下所示,取月数据时,time_end 是当前时间,那time_start 是怎么算的?按照年获取的时候怎么算?

  "did":"123",//设备的did
  "uid":'123',//用户uid 
  "key":"4112",//Object ID,甲醛(0x1010)十进制转化
  "type":"event", //甲醛(0x1010)定义为属性
  "time_start":"1514649599", //例:2017-12-31 00:00:00
  "time_end":"1514822399", //例:2018-01-01 23:59:59
  "group":"raw" //返回数据的方式,默认 raw , 可选值为 hour、day、week、 month。
  "limit":"20" //返回数据的条数,默认 20,最大 1000

请问怎样才能在没有实体硬件时试用SDK里的Demo?

前提: 我们有企业开发者账号, 已经申请了新硬件进行开发, 但是还没有实体硬件做完. 目前在做rn扩展程序时想试用SDK目录下的Demo

尝试: 参照文档, 做了两种尝试

  • 使用createPlugin创建新扩展程序

  • 打包签名并上传

  • 设置为白名单测试

  • 启动Node服务器

  • 在米家App上打开开发者模式, 填入我们申请的model id和新创建的插件包名, 选中创建一个相应的虚拟设备

  • 在设备列表里并没有发现虚拟设备图标(设备数量倒是+1了)

  • 前面步骤相似, 但是在米家App上打开开发者模式时, 填入文档里示例中的model id和sdk中demo的包名.
    model id: com.xiaomi.demo.model
    插件包名:com.xiaomi.svgdemo.ios
    选中创建一个相应的虚拟设备

  • 在设备列表里也没有发现虚拟设备图标(设备数量也+1了)

请问, 如何能快速的看到demo在米家app里运行的效果?

IOS扩展程序订阅机制不好用的问题---帮忙看下,谢谢

根据贵司的文档,我们编写测试程序,步骤分别如下

  1. 模块端编写指令&通过调试工具获取信息如下图

image004

image002

2.IOS扩展程序config.plist&reactNative代码分别如下
image001

   MHPluginSDK.registerDeviceStatusProps(["prop.AQI","event.SentAlarm"]);
var subscription3 = DeviceEventEmitter.addListener(MHPluginSDK.deviceStatusUpdatedEventName,(notification) => {
    console.log("小米插件notification-----"+JSON.stringify(notification));
});

var subscription2 = DeviceEventEmitter.addListener(MHPluginSDK.onReceivingForegroundPushEventName,(notification) => {
    // 插件在前台收到push通知回调
    console.log(JSON.stringify(notification));
});
  1. 结果是监听不到任何事件?这是为什么?希望小米同学可以帮忙看看我们开发的问题所在,拜托了

白名单测试时图片资源加载异常

调试模式下图片显示正常,打包白名单测试后,在大陆地区下插件加载不出图片,将app设置为**香港等地区能够加载图片。(移动4g,Wi-Fi下均存在此问题)

关于MHPluginSDK中callMethod中回调方法参数response在不同情况下数据结构不一致问题

MHPluginSDK里面的callMethod的回调方法callback(isSuccess, response),response里面是有error code这个参数,但是在通过局域网向设备发送命令时,response却没有error code。

我们的插件之前同事开发的旧的代码是有去判断response里面的error code或者error message,现在在局域网下就会有问题。

isSuccess是表示网络请求(链路请求)是否成功还是向设备发送指令发送成功,文档里面没有明确的说明这些字段具体意义,再者isSuccess和response里面的code意义是一致的么?

我现在测试的是method是get_prop,测试了一些其他method也会有该问题,请帮忙看一下,谢谢。

引入ART模块,运用其中的LinearGradient,代码如下,但也没无任何颜色效果,包括边框效果均未出现,也无报错,页面正常打开,求解惑

'use strict';

var React = require('react-native');
var {
StyleSheet,
WebView,
View,
Text,
StatusBar,
Platform,
Navigator,
ART,
Dimensions,
} = React;

var {
Surface,
Shape,
Path,
LinearGradient,
RadialGradient
} = ART;

var {
width,
height
} = Dimensions.get('window');

var Rectangle = require('./Rectangle.art');

import Circle from '../CommonModules/Chart/Circle';

class DataDisplay extends React.Component {
render() {

  var textHeight = 20;
  var surfaceHeight = (height - (Platform.OS === 'ios' ? 64 : 76) - 2*textHeight)/2;
  return (
      <View style={styles.container} >
          <StatusBar barStyle='light-content'/>
          <View style={{width:width, height:textHeight}}><Text style={{textAlign:'center'}}>线性渐变</Text></View>
          <Surface width={width} height={surfaceHeight}>
              <Rectangle x={width/2-50} y={20} width={100}
                         height={200}
                         stroke="red"
                         strokeWidth={1}
                         fill={
                             new LinearGradient({
                                     '0': 'rgba(255,0,0,0)', //stop offsets and color
                                     '0.5':'rgba(0,255,255,1)',
                                     '1':'rgba(0,0,255,1)'
                                 },
                                 "50",  //x1 起始点x
                                 "0",  //y1 起始点y
                                 "50",  //x2 结束点x
                                 "200"  //y2 结束点y
                             )}/>
          </Surface>
      </View>
  );

}
}

var styles = StyleSheet.create({
container: {
marginTop: Platform.OS === 'ios' ? 64 : 76,
flexDirection:'row',
flex:1,
}

});

var route = {
key: 'DataDisplay',
title: '数据展示',
component: DataDisplay,
sceneConig: {
...Navigator.SceneConfigs.FloatFromRight,
gestures: {},
}
};

module.exports = {
component: DataDisplay,
route: route,
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.