|
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.};
复制代码
|
|