机智云插座 安卓源码只修改了三个参数: APPID、 PRODUCT_KEY、APP_SECRET,导出的App登陆失败,是什么原因啊? 对于这种情况,建议你第一步先用虚拟设备调试,一步步缩小问题的范围, 手机与云端,手机与硬件, 既然你想测试机智云插座,你需要新建一个人设备,添加数据点时,使用推荐的机智云插座数据点,生成APPID、 PRODUCT_KEY、APP_SECRET,下载新设备的SDK更新源码里面lib下需要 更新的内容,修改APPID、 PRODUCT_KEY、APP_SECRET,修改成功后编译下载,不建议直接使用设备,因为设备有时是数据点数据类型存在问题,那么我们先使用虚拟设备调试,这样我们首先可以很方便的查找APP的问题,一般源码为机智云宠物屋,里面需要修改自己想要的控制命令,这时你需要参考自动生成的APP保留相关数据点,如果不进行修改的话,处出现当进入控制界面后它又会退到查找设备里,让你重新登陆, |
SDK流程简介 2.1. 通用流程图 2.2. 关键点说明 •SDK已经封装了所有的用户、配置、发现、连接、控制的过程,开发者使用这些API可以完成上述流程中的功能开发,不需要再自行实现通讯协议。 •SDK采取回调的工作方式,所以必须设置必要的监听,比如通用监听和设备监听,具体请参见流程详解。SDK在主线程中给APP回调。 •SDK支持APP在Activity之间以及在Activity和Service之间传递对象。 1、如果是在activity之间传递对象的话可以用intent来传递 (传递) 01.Intent intent = new Intent(Context, A.class); 02.Bundle bundle = new Bundle(); 03.bundle.putParcelable(“参数名”, 设备类对象); 04.intent.putExtras(bundle); 05.startActivity(intent); 复制代码 (接收) 01.Intent intent = getIntent(); 02.intent.getParcelableExtra("参数名"); 复制代码 2、在activity和service之间传递对象可以通过广播来传递数据,由一方发送数据另一方接收。 (注册广播) 01.IntentFilter filter = new IntentFilter();//创建IntentFilter对象 02.//注册一个广播,用于接收Activity传送过来的命令,控制Service的行为,如:发送数据,停止服务等 03.filter.addAction("AAAAAAA"); 04.//注册Broadcast Receiver 05.registerReceiver(cmdReceiver, filter); s 复制代码 (发送广播) 01.Intent intent = new Intent(); 02.intent.setAction("AAAAAAA"); 03.Bundle bundle = new Bundle(); 04.bundle.putParcelable(“参数名”, 设备类对象); 05.intent.putExtras(bundle); 06.sendOrderedBroadcast(intent, null); 复制代码 3、另外一种,是在Activity中通过bindService获取到Service对象,直接调用Service方法获取想要的设备对象 2.3. 混淆打包配置 如果您的项目使用了Proguard混淆打包,为了避免SDK被二次混淆导致无法正常使用SDK,请务必在 proguard-project.txt中添加以下代码: 01.-libraryjars libs/GizWifiSDK.jar 02.-dontwarn com.gizwits.** 03.-keep class com.gizwits.**{ 04. *; 05.} 复制代码 并在project.properties中指向Android混淆文件: proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 点评回复 支持 反对 使用道具 举报 . boboP 查看详细资料 20 主题 208 帖子 286 积分 超级版主 Rank: 8Rank: 8 积分286..发消息 . 板凳 楼主| 发表于 2016-8-8 11:29:09 | 只看该作者 3.1. SDK初始化部分 3.1.1. 初始化部分流程图 3.1.2. 配置AndroidManifest.xml 请将下面权限配置代码复制到 AndroidManifest.xml 文件中: 01.<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 02.<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 03.<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 04.<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 05.<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 06.<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 07.<uses-permission android:name="android.permission.INTERNET" /> 08.<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 09.<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 复制代码 权限说明: [td] 权限 用途 ACCESS_NETWORK_STATE 允许程序访问有关GSM网络信息 ACCESS_WIFI_STATE 允许程序访问WiFI网络状态信息 READ_PHONE_STATE 允许程序访问手机状态信息 ACCESS_COARSE_LOCATION 允许程序访问CellID或WiFi热点来获取粗略的位置 ACCESS_FINE_LOCATION 允许程序访问精良位置(如GPRS) WRITE_EXTERNAL_STORAGE 允许程序写入外部SD卡 INTERNET 允许程序打开网络接口 CHANGE_WIFI_STATE 允许程序改变WiFi连接状态 CHANGE_WIFI_MULTICAST_STATE 允许程序改变WiFi多播状态 3.1.3. 注册SDK通用** 注册SDK通用**是为了能让APP收到来自GizWifiSDK类的响应事件,包含了注册、登录、配置设备、绑定设备等回调接口。该**是SDK使用中十分重要的一个**,与GizWifiSDK类相关的操作都会在这里会回调。如果没有正确注册通用**,将无法正常使用SDK。注册监听时,APP可以根据自己的需求实现回调接口。建议两种设置方式: 1、在每一个使用到的Activity中都实例化一次**并注册一次,且只实现需要的回调接口。该种方式比较灵活,可在service中使用。但要注意必须每次打开activity都监听一次, 且无法多个Activity同时收到回调。 【示例代码】 01.// 实例化** 02.GizWifiSDKListener mListener = new GizWifiSDKListener() { 03. 04.// 实现手机号注册用户回调 05. @Override 06. public void didRegisterUser(GizWifiErrorCode result, String uid, String token){ 07. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 08. // 注册成功,处理注册成功的逻辑 09. } else { 10. // 注册失败,处理注册失败的逻辑 11. } 12. } 13.}; 14. 15.public void onCreate() { 16. super.onCreate(); 17. 18. // 注册** 19. GizWifiSDK.sharedInstance().setListener(mListener); 20. // 调用SDK的手机号注册接口 21. GizWifiSDK.sharedInstance().registerUser("HelloGizwits", "12345678"); 22.} 复制代码 2、在一个基类中实例化一次**,并把回调抛出,子类继承基类,这就不需要每个子类都实例化一次**。该种方式通过继承的方式,可以多个Activity都收到回调。但该种方式无法在Service中使用。如无特别说明,文档中的范例都是使用该方法注册**。 【示例代码】 01.// 创建基类,在基类中实例化和注册** 02.public class BaseActivity extends Activity { 03. private GizWifiSDKListener mListener = new GizWifiSDKListener() { 04. @Override 05. public void didRegisterUser(GizWifiErrorCode result, String uid, String token) { 06. BaseActivity.this.didRegisterUser(result, uid, token); 07. } 08. }; 09. 10. public void didRegisterUser(GizWifiErrorCode result, String uid, String token){ 11. // 实现逻辑 12. } 13. 14. @Override 15. protected void onCreate(Bundle savedInstanceState) { 16. super.onCreate(savedInstanceState); 17. 18. //每次启动activity都要注册一次sdk**,保证sdk状态能正确回调 19. GizWifiSDK.sharedInstance().setListener(mListener); 20. } 21.} 22. 23.//子类继承基类,实现基类的回调接口。 24.public class TestActivity extends BaseActivity { 25. protected void onCreate(android.os.Bundle savedInstanceState) { 26. //调用父类方法 27. super.onCreate(savedInstanceState); 28. //调用用户注册方法 29. GizWifiSDK.sharedInstance().registerUser ("your_phone_number", "your_ password", “your_verify_code”, GizUserAccountType.GizUserPhone); 30. } 31. 32. @Override 33. public void didRegisterUser(GizWifiErrorCode result, String uid, String token) { 34. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 35. // 注册成功 36. } else { 37. // 注册失败 38. } 39. } 40.} 复制代码3.1.4. 初始化 sdk SDK启动前,任何功能都是无法正常使用的。SDK启动时,会进行SDK初始化,并自动发现当前局域网设备。SDK将通过通用监听,上报已发现的设备以及相应的事件。APP可以先设置SDK的通用监听,再启动SDK,以便处理这些事件通知。 SDK启动时需要指定应用程序的AppID,开发者需要先在机智云网站上为自己的APP申请一个AppID,请在应用的Application或者第一个启动的Activity的onCreate中调用该方法指定应用的APPID。该方法只需要调用一次。 SDK的日志可以帮助开发者发现APP运行时发生的问题,SDK默认将所有日志信息输出到调试终端和日志文件中。如果手机有SD卡,则日志文件会保存在SD卡上,如果没有SD卡,就只保存在应用程序路径下。SD卡上的日志文件目录为手机SD卡路径下的app_package_name/GizWifiSDK/GizSDKLog。APP如果不希望在调试终端输出日志,可以通过日志级别设置接口,把日志输出级别修改为GizLogPrintNone。 【示例代码】 01.public void onCreate() { 02. super.onCreate(); 03. GizWifiSDK.sharedInstance().setListener(mListener); 04. GizWifiSDK.sharedInstance().startWithAppID(getApplicationContext(), "your_app_id"); 05. 06. GizWifiSDKListener mListener = new GizWifiSDKListener() { 07. @Override 08. public void didNotifyEvent(GizEventType eventType, Object eventSource, GizWifiErrorCode eventID, String eventMessage) { 09. if (eventType == GizEventType.GizEventSDK) { 10. // SDK的事件通知 11. Log.i("GizWifiSDK", "SDK event happened: " + eventID + ", " + eventMessage); 12. } else if (eventType == GizEventType.GizEventDevice) { 13. // 设备连接断开时可能产生的通知 14. GizWifiDevice mDevice = (GizWifiDevice)eventSource; 15. Log.i("GizWifiSDK", "device mac: " + mDevice.getMacAddress() + " disconnect caused by eventID: " + eventID + ", eventMessage: " + eventMessage); 16. } else if (eventType == GizEventType.GizEventM2MService) { 17. // M2M服务返回的异常通知 18. Log.i("GizWifiSDK", "M2M domain " + (String)eventSource + " exception happened, eventID: " + eventID + ", eventMessage: " + eventMessage); 19. } else if (eventType == GizEventType.GizEventToken) { 20. // token失效通知 21. Log.i("GizWifiSDK", "token " + (String)eventSource + " expired: " + eventMessage); 22. } 23. } 24. }; 25.} 复制代码 点评回复 支持 反对 使用道具 举报 . boboP 查看详细资料 20 主题 208 帖子 286 积分 超级版主 Rank: 8Rank: 8 积分286..发消息 . 地板 楼主| 发表于 2016-8-8 11:37:18 | 只看该作者 3.2. 用户部分 机智云的用户系统包含了用户的注册、登录、重置密码、修改个人信息等功能,机智云以APPID区分用户系统,不同APPID的用户系统相互独立。更换APPID后,需要重新注册用户。 以下流程中涉及到的**注册方法是用子类继承基类的方式实现的。 3.2.1. 用户部分主要流程图 用户的注册方式有多种,比如手机号、普通用户名、邮箱等,APP可以根据需要采取不同的方式。其他流程比如登录、密码修改、个人信息修改等部分,请直接阅读下面的流程文档。 3.2.2. 用户注册 机智云提供三种用户注册方式:手机注册、普通用户注册、邮箱注册。 3.2.2.1. 注册手机用户 通过手机注册账号,需要一个有效的手机号。注册时需要两步操作:获取短信验证码、用短信验证码注册用户。 第一步:APP获取短信验证码时,SDK向云端发送短信验证码请求,如果请求成功,云端会给手机发送短信验证码。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().requestSendPhoneSMSCode ("your_app_secret", "your_phone_number"); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didRequestSendPhoneSMSCode(GizWifiErrorCode result, String token) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 请求成功 10. } else { 11. // 请求失败 12. } 13. } 14.} 复制代码 第二步:用短信验证码注册时,APP把手机收到的短信验证码传给SDK,填上手机号和密码就可以注册了。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().registerUser("your_phone_number", "your_password", "your_verify_code", GizUserAccountType.GizUserPhone); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didRegisterUser(GizWifiErrorCode result, String uid, String token) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 注册成功 10. } else { 11. // 注册失败 12. } 13. } 14.} 复制代码3.2.2.2. 注册普通用户 注册普通用户,使用用户名、密码即可创建一个账号。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().registerUser("your_user_name", "your_password", null, GizUserAccountType.GizUserNormal); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didRegisterUser(GizWifiErrorCode result, String uid, String token) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 注册成功 10. } else { 11. // 注册失败 12. } 13. } 14.} 复制代码3.2.2.3. 注册邮箱用户 通过有效的电子邮箱地址,注册一个账号。注册成功后,云端会给指定邮箱发送注册成功的邮件。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().registerUser("your_email_address", "your_password", null, GizUserAccountType.GizUserEmail); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didRegisterUser(GizWifiErrorCode result, String uid, String token) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 注册成功 10. } else { 11. // 注册失败 12. } 13. } 14.} 复制代码3.2.3. 用户登录 机智云提供三种用户登录方式:实名登录、匿名登录、第三方账号登录。实名登录适用于设计了登录界面,必须使用用户名密码注册登录以后才能使用的APP。匿名登录适用于没有设计登录界面,由后台自动生成用户账号的APP。登录后获取到的token有效期为7天。 3.2.3.1. 实名登录 实名用户登录时,用户名可以是注册过的手机号、邮箱、普通用户名。登录账号要先注册好,如果更换了AppID,登录账号需要重新注册。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().userLogin("your_user_name", "your_password"); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didUserLogin(GizWifiErrorCode result, String uid, String token) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 登录成功 10. } else { 11. // 登录失败 12. } 13. } 14.} 复制代码3.2.3.2. 匿名登录 用户每次匿名登录时,获取到的uid是相同的。Android SDK使用Android ID生成登录账号。每个Android系统都有一个独立的Android ID,系统刷机后将改变。因此,系统刷机后匿名登录的用户信息将无法保留。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().userLoginAnonymous(); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didUserLogin(GizWifiErrorCode result, String uid, String token) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 登录成功 10. } else { 11. // 登录失败 12. } 13. } 14.} 复制代码3.2.3.3. 第三方账号登录 目前支持的第三方账号有百度、新浪、腾讯。用户可以使用这三者的API获取到uid和token登录机智云,使用第三方账号登录时无需在机智云上注册,可直接登录。 开发者可通过新浪、百度或腾讯api获取uid和token, 具体方法请参考各第三方平台的开发者文档。 【示例代码】 01.// 以新浪账号为例 02.GizWifiSDK.sharedInstance().setListener(mListener); 03.GizWifiSDK.sharedInstance().loginWithThirdAccount(GizThirdAccountType.GizThirdSINA, "your_third_uid", "your_third_token"); 04. 05.// 实现回调 06.GizWifiSDKListener mListener = new GizWifiSDKListener() { 07. @Override 08. public void didUserLogin(GizWifiErrorCode result, String uid, String token) { 09. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 10. // 登录成功 11. } else { 12. // 登录失败 13. } 14. } 15.} 复制代码3.2.4. 重置密码 如果忘记了用户密码,可以通过手机验证码或邮箱设置新的密码。SDK支持手机号重置密码和邮箱重置密码两种,手机号重置需要接收验证码,邮箱重置需要进⼊邮箱,根据链接提示进行重置。 3.2.4.1. 手机号重置密码 手机号重置密码时,需要先获取短信验证码再重置。获取短信验证码方式与手机注册时相同。 第一步:获取短信验证码 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().requestSendPhoneSMSCode("your_app_secret", "your_phone_number"); 03. 04.GizWifiSDKListener mListener = new GizWifiSDKListener() { 05. @Override 06. public void didRequestSendPhoneSMSCode(GizWifiErrorCode result, String token) { 07. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 08. // 请求成功 09. } else { 10. // 请求失败 11. } 12. } 13.} 复制代码 第二步:用短信验证码重置密码 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().resetPassword("your_phone_number", "your_verify_code", "your_new_password", GizUserAccountType.GizUserPhone); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didChangeUserPassword(GizWifiErrorCode result) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 修改成功 10. } else { 11. // 修改失败 12. } 13. } 14.} 复制代码3.2.4.2. 邮箱重置密码 邮箱重置密码时,云端会给指定邮箱发送安全链接。用户需要到邮箱中查收邮件,并按邮件指示执行重置操作。重置密码邮件有可能进入用户的邮箱的垃圾箱中,需提醒用户。 邮件发送成功回调与密码修改成功回调一致,因此需要注意在回调的时候区分。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().resetPassword("your_email_address", null, "your_new_password", GizUserAccountType.GizUserEmail); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didChangeUserPassword(GizWifiErrorCode result) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. //重置密码邮件发送成功,提示用户查收 10. } else { 11. //重置密码邮件发送失败,弹出错误信息 12. } 13. } 14.} 复制代码3.2.5. 修改密码 用户登录后可以修改密码。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().changeUserPassword("your_token", "your_old_password", "your_new_password"); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didChangeUserPassword(GizWifiErrorCode result) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 修改成功 10. } else { 11. // 修改失败 12. } 13. } 14.} 复制代码3.2.6. 匿名用户转换 匿名注册的用户可以转换为普通用户或者手机用户,转换后匿名用户的信息会转移到实名用户下,原匿名账号失效。但普通用户和手机用户必须是还未注册过的,已注册的用户名是无法转换的。 3.2.6.1. 匿名用户转普通用户 转普通用户时,填入待转换的用户名、密码,以及登录的token就可以了。 【示例代码】 01.// 匿名转手机用户 02.GizWifiSDK.sharedInstance().setListener(mListener); 03.GizWifiSDK.sharedInstance().transAnonymousUser("your_token", "your_user_name", "your_password", null, GizUserAccountType.GizUserNormal); 04. 05.// 实现回调 06.GizWifiSDKListener mListener = new GizWifiSDKListener() { 07. @Override 08. public void didTransAnonymousUser(GizWifiErrorCode result) { 09. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 10. // 转换成功 11. } else { 12. // 转换失败 13. } 14. } 15.} 复制代码3.2.6.2. 匿名用户转手机用户 转手机用户时,需要填入待转换的手机号、密码、短信验证码,登录的token。获取短信验证码的过程与手机注册时一样。 【示例代码】 01.// 匿名转手机用户 02.GizWifiSDK.sharedInstance().setListener(mListener); 03.GizWifiSDK.sharedInstance().transAnonymousUser("your_token", "your_phone_number", "your_password", "your_verify_code", GizUserAccountType. GizUserPhone); 04. 05.// 实现回调 06.GizWifiSDKListener mListener = new GizWifiSDKListener() { 07. @Override 08. public void didTransAnonymousUser(GizWifiErrorCode result) { 09. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 10. // 转换成功 11. } else { 12. // 转换失败 13. } 14. } 15.} 复制代码3.2.7. 修改用户信息 实名用户不支持修改普通用户名,可以修改邮箱、手机号,可以补充个人信息。实名用户必须登录后才能修改这些信息,并且待修改的邮箱或手机号必须是已经注册过的。 实名用户修改邮箱或手机号成功后,可以使用修改后的邮箱或手机号登录。登录后获得的绑定设备列表与原实名用户一致。 修改邮箱或手机号时,可以同时补充个人信息。不想修改个人信息时,对应参数可以传null。同时修改个人信息时,如果邮箱或用户名修改成功而个人信息修改失败,回调会返回成功并在errorMessage中提示个人信息修改失败的原因。 3.2.7.1. 修改用户邮箱 只修改用户邮箱时,个人信息的参数传null,用户类型可以指定为邮箱用户。以下为修改用户邮箱的示例代码。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().changeUserInfo("your_token", "your_email_address", null, GizUserAccountType.GizUserEmail, null); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didChangeUserInfo(GizWifiErrorCode result) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 修改成功 10. } else { 11. // 修改失败 12. } 13. } 14.} 复制代码3.2.7.2. 修改用户手机号 只修改用户手机号时,个人信息参数传null,用户类型可以指定为手机用户。修改手机号之前,需要先获取手机验证码。以下示例代码为修改用户手机号的代码,获取短信验证码的代码请参考手机号注册。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().changeUserInfo("your_token", "your_phone_number", "your_verify_code", GizUserAccountType.GizUserPhone, null); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didChangeUserInfo(GizWifiErrorCode result) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 修改成功 10. } else { 11. // 修改失败 12. } 13. } 14.} 复制代码3.2.7.3. 修改用户个人信息 只修改用户个人信息时,手机号或邮箱参数传null,用户类型可以指定为普通用户。个人信息包含多项内容,通过GizUserInfo类指定。其中不想修改的信息填null,云端会保留上次修改过的值。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02. 03.GizUserInfo additionalInfo = new GizUserInfo(); 04.additionalInfo.setName("nickname"); 05.additionalInfo.setGender(GizUserGenderType.Male); 06.additionalInfo.setBirthday("1990-1-1"); 07.additionalInfo.setAddress("Beijing"); 08.additionalInfo.setRemark("home"); 09. 10.GizWifiSDK.sharedInstance().changeUserInfo("your_token", null, null, GizUserAccountType.GizUserNormal, additionalInfo); 11. 12.// 实现回调 13.GizWifiSDKListener mListener = new GizWifiSDKListener() { 14. @Override 15. public void didChangeUserInfo(GizWifiErrorCode result) { 16. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 17. // 修改成功 18. } else { 19. // 修改失败 20. } 21. } 22.} 复制代码3.2.7.4. 同时修改邮箱和个人信息 修改邮箱同时修改个人信息时,用户类型需指定为邮箱用户。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02. 03.GizUserInfo additionalInfo = new GizUserInfo(); 04.additionalInfo.setName("nickname"); 05.additionalInfo.setGender(GizUserGenderType.Male); 06.additionalInfo.setBirthday("1990-1-1"); 07.additionalInfo.setAddress("Beijing"); 08.additionalInfo.setRemark("home"); 09. 10.GizWifiSDK.sharedInstance().changeUserInfo("your_token", "your_email_address", null, GizUserAccountType.GizUserEmail, additionalInfo); 11. 12.// 实现回调 13.GizWifiSDKListener mListener = new GizWifiSDKListener() { 14. @Override 15. public void didChangeUserInfo(GizWifiErrorCode result) { 16. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 17. // 修改成功 18. } else { 19. // 修改失败 20. } 21. } 22.} 复制代码3.2.7.5. 同时修改手机号和个人信息 修改手机号同时修改个人信息时,用户类型需指定为手机用户。修改手机号同样需要先获取手机验证码,获取短信验证码的代码请参考手机号注册。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02. 03.GizUserInfo additionalInfo = new GizUserInfo(); 04.additionalInfo.setName("nickname"); 05.additionalInfo.setGender(GizUserGenderType.Male); 06.additionalInfo.setBirthday("1990-1-1"); 07.additionalInfo.setAddress("Beijing"); 08.additionalInfo.setRemark("home"); 09. 10.GizWifiSDK.sharedInstance().changeUserInfo("your_token", "your_phone_number", "your_verify_code", GizUserAccountType.GizUserPhone, additionalInfo); 11. 12.// 实现回调 13.GizWifiSDKListener mListener = new GizWifiSDKListener() { 14. @Override 15. public void didChangeUserInfo(GizWifiErrorCode result) { 16. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 17. // 修改成功 18. } else { 19. // 修改失败 20. } 21. } 22.} 复制代码 点评回复 支持 反对 使用道具 举报 . boboP 查看详细资料 20 主题 208 帖子 286 积分 超级版主 Rank: 8Rank: 8 积分286..发消息 . 5# 楼主| 发表于 2016-8-8 11:40:26 | 只看该作者 3.3. 配置设备入网部分 控制设备前,需要先让设备连到路由器上。连上路由器的设备,如果路由器能接入外网,设备会自动注册到机智云。 有两种配置方式能够让设备连到路由器上,一种是Airlink方式,一种是Softap方式,APP可以根据产品需求采取相应的配置方式。在开始配置前,设备要先进入配置模式,然后APP调用配置接口发送要配置的路由器ssid和密码。设备配置成功后,SDK给APP返回已配置成功的设备mac地址和产品类型标识,便于APP做下一步的操作。如果设备是重置后进入的配置模式,如果配置成功时设备还来不及从云端获取到DID,则APP得到的DID为空。 SDK的设备配置接口如果超时时间还未结束,无法进行下一次配置。此外,因为设备配置成功的广播包只有APP连到同一路由上才能收取,因此这个超时时间应该预留出APP连接路由器的时间。 需要注意的是,如果配置上线的设备不是APP要获取的产品类型,该设备就不会出现在设备列表中。 3.3.1. 设备配置流程图 3.3.2. AirLink配置 AirLink使⽤UDP广播方式,由手机端发出含有目标路由器名称和密码的广播,设备上的Wifi模块接收到广播包后自动连接目标路由器,连上路由器后发出配置成功广播,通知手机配置已完成。 模块开启AirLink模式后,如果一分钟内未收到AirLink广播或无法正确连上路由器,将进入SoftAP模式。 【示例代码】 01.// 让手机连上目标Wifi 02.// MCU发出开启AirLink串口指令,通知模组开启AirLink模式。详情请参考《智能云空调-机智云接入串口通信协议文档》 03. 04.//配置设备入网,发送要配置的wifi名称、密码 05.GizWifiSDK.sharedInstance().setListener(mListener); 06.List<GizWifiGAgentType> types = new ArrayList<GizWifiGAgentType> (); 07.types.add(GizWifiGAgentType.GizGAgentESP); GizWifiSDK.sharedInstance().setDeviceOnboarding("your_ssid", "your_key", GizWifiConfigureMode.GizWifiAirLink, null, 60, types); 08. 09.GizWifiSDKListener mListener = new GizWifiSDKListener() { 10. //等待配置完成或超时,回调配置完成接口 11. @Override 12. public void didSetDeviceOnboarding (GizWifiErrorCode result, String mac, String did, String productKey) { 13. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 14. // 配置成功 15. } else { 16. // 配置失败 17. } 18. } 19.}; 复制代码3.3.3. SoftAP配置 设备进入SoftAP模式后,会产生一个Wifi热点。手机连上此热点后,将要配置的SSID和密码发给设备。设备上的Wi-Fi模块接收到SoftAP配置包后自动连接目标路由器,与airlink一样,连上路由器后发出配置成功广播,通知手机配置已完成。 使用机智云提供的模组固件,设备产生的Wifi热点以“XPG-GAgent-”开头,密码为” 123456789”。其他厂商提供的模组,SoftAP热点名称由各自厂商指定。APP可以根据需要传入正确的热点前缀。 【示例代码】 01.// MCU发出进入SoftAP串口指令,通知模组开启SoftAP模式。详情请参考《智能云空调-机智云接入串口通信协议文档》 02.//让手机连接模组的SoftAP热点 03. 04.//配置设备入网,发送要配置的wifi名称、密码 05.GizWifiSDK.sharedInstance().setListener(mListener); 06.GizWifiSDK.sharedInstance().setDeviceOnboarding("your_ssid", "your_key", GizWifiConfigureMode.GizWifiSoftAP, "your_gagent_hotspot_prefix", 60, null); 07. 08.//模块收到配置信息,尝试连接路由器并自动关闭热点 09.//让手机连接到配置的wifi上 10. 11.GizWifiSDKListener mListener = new GizWifiSDKListener() { 12. //等待配置完成或超时,回调配置完成接口 13. @Override 14. public void didSetDeviceOnboarding (GizWifiErrorCode result, String mac, String did, String productKey) { 15. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 16. // 配置成功 17. } else { 18. // 配置失败 19. } 20. } 21.}; 复制代码 点评回复 支持 反对 使用道具 举报 . boboP 查看详细资料 20 主题 208 帖子 286 积分 超级版主 Rank: 8Rank: 8 积分286..发消息 . 6# 楼主| 发表于 2016-8-8 11:43:54 | 只看该作者 3.4. 设备发现和订阅部分 3.4.1. 设备发现和订阅流程图 3.4.2. 设备发现 APP设置好监听,启动SDK后,就可以收到SDK的设备列表推送。每次局域网设备或者用户绑定设备发生变化时,SDK都会主动上报最新的设备列表。设备断电再上电、有新设备上线等都会触发设备列表发生变化。用户登录后,SDK会主动把用户已绑定的设备列表上报给APP,绑定设备在不同的手机上登录帐号都可获取到。 如果APP想要刷新绑定设备列表,可以调用绑定设备列表接口,同时可以指定自己关心的产品类型标识,SDK会把筛选后的设备列表返回给APP。 SDK提供设备列表缓存,设备列表中的设备对象在整个APP生命周期中一直有效。缓存的设备列表会与当前最新的已发现设备同步更新。 【示例代码】 01.// 使用缓存的设备列表刷新UI 02.List<GizWifiDevice> devices = GizWifiSDK.sharedInstance().getDeviceList(); 03. 04.// 接收设备列表变化上报,刷新UI 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06.@Override 07.public void didDiscovered(GizWifiErrorCode result, List<GizWifiDevice> deviceList) { 08. // 提示错误原因 09. if(result != GizWifiErrorCode.GIZ_SDK_SUCCESS) { 10. Log.d("", "result: " + result.name()); 11. } 12. // 显示变化后的设备列表 13. Log.d("", "discovered deviceList: " + deviceList); 14. devices = deviceList; 15. } 16.}; 17. 18.// 主动刷新绑定设备列表、指定筛选的设备productKey 19.List<String> pks = new ArrayList<String> (); 20.pks.add("your_productKey"); 21.GizWifiSDK.sharedInstance().getBoundDevices("your_uid", "your_token", pks); 复制代码3.4.3. 设置设备的** 在设备列表中得到设备对象,为其设置设备**,以便于刷新设备UI。APP根据自己的需要实现相应的回调。 3.4.4. 设备订阅和绑定 APP得到设备列表后,给设备设置监听后,可以订阅设备。已订阅的设备将被自动绑定和自动登录,设备登录成功后会主动上报最新状态。 自动绑定仅限于局域网设备。对于无法在局域网内发现的设备,APP可以通过手动绑定的方式完成绑定。绑定成功的设备,需要订阅后才能使用。 无论是手动绑定还是自动绑定,设备的remark和alias信息,都需要在设备绑定成功后再设置。 解除订阅的设备,连接会被断开,不能再继续下发控制指令了。 3.4.4.1. 设备订阅 所有通过SDK得到的设备,都可以订阅,订阅结果通过回调返回。订阅成功的设备,要在其网络状态变为可控时才能查询状态和下发控制指令。 【示例代码】 01.// 以设备列表中的第一个设备实例为例,为其设置监听 02.GizWifiDevice mDevice = null; 03.for (int i = 0; i < deviceList.size(); i++) { 04. mDevice = deviceList[0]; 05. mDevice.setListener(mListener); 06. mDevice.setSubscribe(true); 07. break; 08.} 09. 10.GizWifiDeviceListener mListener = new GizWifiDeviceListener() { 11. @Override 12. public void didSetSubscribe(GizWifiErrorCode result, GizWifiDevice device, boolean isSubscribed) { 13. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 14. // 订阅或解除订阅成功 15. } else { 16. // 失败 17. } 18. } 19.}; 复制代码3.4.4.2. 非局域网设备绑定 APP可以通过设备的mac、productKey、productSecret完成非局域网设备的绑定,可以用上述信息生成二维码,APP通过扫码方式绑定。GPRS设备、蓝牙设备等都是无法通过Wifi局域网发现的设备,都属于非局域网设备。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().bindRemoteDevice ("your_uid", "your_token", "your_device_mac", "your_device_product_key", "your_product_secret"); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didBindDevice(GizWifiErrorCode result, String did) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 绑定成功 10. } else { 11. // 绑定失败 12. } 13. } 14.}; 复制代码3.4.4.3. 设置设备的绑定信息 不订阅设备也可以设置设备的绑定信息。在设备列表中找到要修改的设备,如果是已绑定的,可以修改remark和alias信息。 【示例代码】 01.// mDevice是从设备列表中获取到的设备实体对象,设置监听 02.mDevice.setCustomInfo("your_remark", "your_alias"); 03. 04.// 实现回调 05.GizWifiDeviceListener mListener = new GizWifiDeviceListener() { 06. @Override 07. public void didSetCustomInfo(GizWifiErrorCode result, GizWifiDevice device) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 修改成功 10. } else { 11. // 修改失败 12. } 13. } 14.}; 复制代码3.4.5. 设备解绑 已绑定的设备可以解绑,解绑需要APP调用接口完成操作,SDK不支持自动解绑。对于已订阅的设备,解绑成功时会被解除订阅,同时断开设备连接,设备状态也不会再主动上报了。设备解绑后,APP刷新绑定设备列表时就得不到该设备了。 【示例代码】 01.GizWifiSDK.sharedInstance().setListener(mListener); 02.GizWifiSDK.sharedInstance().unbindDevice("your_uid", "your_token", "your_device_did"); 03. 04.// 实现回调 05.GizWifiSDKListener mListener = new GizWifiSDKListener() { 06. @Override 07. public void didUnbindDevice(GizWifiErrorCode result, String did) { 08. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 09. // 解绑成功 10. } else { 11. // 解绑失败 12. } 13. } 14.}; 复制代码3.4.6. 获取设备硬件信息 不订阅设备也可以获取到硬件信息。APP可以获取模块协议版本号,mcu固件版本号等硬件信息,但是只能在小循环下才能获取。 【示例代码】 01.// mDevice是从设备列表中获取到的设备实体对象,设置监听 02.mDevice.setListener(mListener); 03.mDevice.getHardwareInfo(); 04. 05.// 实现回调 06.GizWifiDeviceListener mListener = new GizWifiDeviceListener() { 07. @Override 08. public void didGetHardwareInfo(GizWifiErrorCode result, GizWifiDevice device, ConcurrentHashMap<String, String> hardwareInfo) { 09. StringBuilder sb = new StringBuilder(); 10. if(result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 11. sb.append("Wifi Hardware Version:" + hardwareInfo.get("wifiHardVersion") 12. + "\r\n"); 13. sb.append("Wifi Software Version:" + hardwareInfo.get("wifiSoftVersion") 14. + "\r\n"); 15. sb.append("MCU Hardware Version:" + hardwareInfo.get("mcuHardVersion") 16. + "\r\n"); 17. sb.append("MCU Software Version:" + hardwareInfo.get("mcuSoftVersion") 18. + "\r\n"); 19. sb.append("Firmware Id:" + hardwareInfo.get("wifiFirmwareId") + "\r\n"); 20. sb.append("Firmware Version:" + hardwareInfo.get("wifiFirmwareVer") 21. + "\r\n"); 22. sb.append("Product Key:" + hardwareInfo.get("productKey") + "\r\n"); 23. sb.append("Device ID:" + device.getDid() + "\r\n"); 24. sb.append("Device IP:" + device.getIPAddress() + "\r\n"); 25. sb.append("Device MAC:" + device.getMacAddress() + "\r\n"); 26. 27. }else{ 28. sb.append("获取失败,错误号:" + result); 29. } 30. 31. Message msg = new Message(); 32. msg.what = HARDWARE; 33. msg.obj = sb.toString(); 34. handler.sendMessage(msg); 35. } 36.}; 复制代码 点评回复 支持 反对 使用道具 举报 . boboP 查看详细资料 20 主题 208 帖子 286 积分 超级版主 Rank: 8Rank: 8 积分286..发消息 . 7# 楼主| 发表于 2016-8-8 11:46:54 | 只看该作者 3.5. 设备控制部分 SDK通过字典键值对方式进行设备控制和状态接收。SDK接收到APP下发的指令字典后,对应解析为设备可识别的数据,发送给设备。反之,SDK收到设备回复或上报的数据后,对应解析为字典键值对上报给APP。 智能设备需正确烧写了GAgent固件和机智云串口通讯协议。如果设备定义了数据点,APP发送的指令必须符合数据点定义。如果设备没有定义数据点,设备指令可以按照透传数据以自定义格式下发。 3.5.1. 设备控制流程图 3.5.2. 发送控制指令 设备订阅变成可控状态后,APP可以发送操作指令。操作指令是字典格式,键值对为数据点名称和值。操作指令的确认回复,通过didReceiveData回调返回。 APP下发操作指令时可以指定sn,通过回调参数中的sn能够对应到下发指令是否发送成功了。但回调参数dataMap有可能是空字典,这取决于设备回复时是否携带当前数据点的状态。 如果APP下发指令后只关心是否有设备状态上报,那么下发指令的sn可填0,这时回调参数sn也为0。 【示例代码】 01./* 02. * 以下代码为App使用sn的示例。如果App不使用sn,sn可设为0,回调中也不需要判断sn 03. */ 04.// mDevice是从设备列表中获取到的设备实体对象,设置监听 05.mDevice.setListener(mListener); 06. 07.// 订阅设备并变为可控状态后,执行开灯动作 08.int sn = 5; // 如果App不使用sn,此处可写成 int sn = 0; 09.ConcurrentHashMap<String, Object> command = new ConcurrentHashMap<String, Object> (); 10.command.put("LED_OnOff", true); 11.mDevice.write(command, sn); 12. 13.// 实现回调 14.GizWifiDeviceListener mListener = new GizWifiDeviceListener() { 15. @Override 16. public void didReceiveData(GizWifiErrorCode result, GizWifiDevice device, ConcurrentHashMap<String, Object> dataMap, int sn) { 17. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 18. // 如果App不使用sn,此处不需要判断sn 19. if (sn == 5) { 20. // 命令序号相符,开灯指令执行成功 21. } else { 22. // 其他命令的ack或者数据上报 23. } 24. } else { 25. // 操作失败 26. } 27. } 28.}; 复制代码3.5.3. 接收设备状态 设备订阅变成可控状态后,APP可以随时收到设备状态的主动上报,仍然通过didReceiveData回调返回。设备上报状态时,回调参数sn为0,回调参数dataMap为设备上报的状态。 【示例代码】 01.GizWifiDeviceListener mListener = new GizWifiDeviceListener() { 02. @Override 03. public void didReceiveData(GizWifiErrorCode result, GizWifiDevice device, ConcurrentHashMap<String, Object> dataMap, int sn) { 04. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 05. 06. // 已定义的设备数据点,有布尔、数值和枚举型数据 07. if (dataMap.get("data") != null) { 08. ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>) dataMap.get("data"); 09. 10. // 普通数据点,打印对应的key和value 11. StringBuilder sb = new StringBuilder(); 12. for (String key : map.keySet()) { 13. sb.append(key + " :" + map.get(key) + "\r\n"); 14. Toast.makeText(DeviceControlActivity.this, 15. sb.toString(), Toast.LENGTH_SHORT).show(); 16. } 17. 18. // 扩展数据点,key如果是“BBBB” 19. byte[] bytes = (byte[]) map.get("BBBB"); 20. String string = Arrays.toString(bytes); 21. Toast.makeText(DeviceControlActivity.this, 22. string, Toast.LENGTH_SHORT).show(); 23. } 24. 25. // 已定义的设备故障数据点,设备发生故障后该字段有内容,没有发生故障则没内容 26. if (dataMap.get("faults") != null) { 27. ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>)dataMap.get("faults"); 28. StringBuilder sb = new StringBuilder(); 29. 30. for (String key : map.keySet()) { 31. sb.append(key + " :" + map.get(key) + "\r\n"); 32. Toast.makeText(DeviceControlActivity.this, 33. sb.toString(), Toast.LENGTH_SHORT).show(); 34. } 35. } 36. 37. // 已定义的设备报警数据点,设备发生报警后该字段有内容,没有发生报警则没内容 38. if (dataMap.get("alerts") != null) { 39. ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>)dataMap.get("alerts"); 40. StringBuilder sb = new StringBuilder(); 41. 42. for (String key : map.keySet()) { 43. sb.append(key + " :" + map.get(key) + "\r\n"); 44. Toast.makeText(DeviceControlActivity.this, 45. sb.toString(), Toast.LENGTH_SHORT).show(); 46. } 47. } 48. 49. // 透传数据,无数据点定义,适合开发者自行定义协议自行解析 50. if (dataMap.get("binary") != null) { 51. byte[] binary = (byte[]) dataMap.get("binary"); 52. Log.i("", "Binary data:" 53. + bytesToHex(binary, 0, binary.length)); 54. } 55. } 56. } 57.}; 复制代码3.5.4. 设备状态查询 设备订阅变成可控状态后,APP可以查询设备状态。设备状态查询结果也通过didReceiveData回调返回,回调参数sn为0。回调参数dataMap为设备回复的状态。 【示例代码】 01.// mDevice是从设备列表中获取到的设备实体对象,设置监听 02.mDevice.setListener(mListener); 03.mDevice.getDeviceStatus(); 04. 05.// 实现回调 06.GizWifiDeviceListener mListener = new GizWifiDeviceListener() { 07. @Override 08. public void didReceiveData(GizWifiErrorCode result, GizWifiDevice device, ConcurrentHashMap<String, Object> dataMap, int sn) { 09. if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) { 10. // 数据解析与3.5.3相同 11. } else { 12. // 查询失败 13. } 14. } 15.}; 复制代码 |
longy 发表于 2016-8-11 09:51 我用手机扫虚拟机的二维码就可以了 这个我也不太懂哦 QQ:707083746 |
桂七 发表于 2016-8-9 10:30 能看一下你的虚拟机怎么设置的么,我的设置之后总是能安装打不开,总是报错。球联系方式。 |
北影狂刀 发表于 2016-8-9 10:02 多谢指导,我用虚拟设备试了一下,也有通讯了,做为一个菜鸟已经满足了 |
boboP 发表于 2016-8-8 09:54 换一部手机就可以了。。。 |
你再重新注册一遍? |
版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )