Microsoft Azure IoTHub Serials 1 - 使用Android设备与Azure IoTHub进行交互
Azure IoTHub的目标是为物联网的应用场景提供方便的设备接入,完成消息的发送和接收(C2D和D2C)。经过持续不断的努力,目前Azure IoTHub已经支持多种操作系统设备的接入,包括Android、Linux、mbed、TI RTOS、Windows等等,通过微软官方认证的设备更是多达上百种,大家可以通过网站(https://catalog.azureiotsuite.com/)查找设备。
目前,Andorid设备的占据了移动设备市场头把交椅。微软也为Android设备接入Azure IoTHub提供了SDK。本篇文章讲述如何利用Android接入Azure IoTHub,完成消息的发送和接收。
1. 开发环境和工具需求
开发环境和Android的开发环境一致,目前的标准配置就是JDK+Android Studio。
需要使用的工具是Device Explore,可以去(https://github.com/Azure/azure-iot-sdks/releases)下载,用于Azure IoTHub设备的创建和消息的发送接收监控。
2. 利用Device Explore创建设备
设备接入Azure IoTHub需要提供认证,该步骤可以通过Device Explore完成,具体方法如下:
- 首先,参考文档(https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-create-through-portal)完成Azure IoTHub的创建。
- 其次,打开Device Explore,在Configuration页面,配置Connect String,然后点击Update进行更新。
- 最后,在管理(Management)页面,通过Create创建新的设备,输入名称(以MyAndroidDevice为例),点击创建,如下图所示。

3. 创建Android工程
创建Andorid工程,在build.gradle文件中,加入对“iot-device-client:1.1.25”的依赖,如下:
dependencies {
// Remote binary dependency
compile 'com.microsoft.azure.sdk.iot:iot-device-client:1.1.25'
}
4. 编写xml界面文件
为Activity_main.xml文件加入按钮控件和信息显示控件,如下图所示。
5. 编写后台java文件
首先,在默认生成的代码基础上,引入如下几个需要用的包:
import android.widget.Button;
import android.widget.TextView;
import com.microsoft.azure.sdk.iot.device.*;
import android.os.Handler;
其次,在MainActivity类中申明全局的变量如下:
String connString = "此处需要填写Device Explore生成的连接字符串";
String deviceId = "MyAndroidDevice";
double temperature;
double humidity;
TextView info;
static String rxinfo;
其中,connString是步骤2中生成的Android设备的连接字符串,可以通过右键“Copy ConnectString”进行拷贝,复制到这里来。设备名称是MyAndroidDevice,后面申明了两个全局的变量,用于存放模拟的温度和湿度;rxinfo用于存放接收的Azure IotHub的数据。
接着,为发送消息Send Message按钮添加监听事件,在用户点击时,完成模拟温湿度消息的发送,其代码如下:
public void btnSendOnClick(View v) throws URISyntaxException, IOException {
Button button = (Button) v;
IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
DeviceClient client = new DeviceClient(connString, protocol);
try {
client.open();
}
catch(IOException e1)
{
System.out.println("Exception while opening IoTHub connection: " + e1.toString());
}
catch(Exception e2)
{
System.out.println("Exception while opening IoTHub connection: " + e2.toString());
}
temperature = 20.0 + Math.random() * 10;
humidity = 30.0 + Math.random() * 20;
String msgStr = "{\"deviceId\":\"" + deviceId + ",\"temperature\":"+ temperature +",\"humidity\":"+ humidity +"}";
try
{
Message msg = new Message(msgStr);
msg.setProperty("temperatureAlert", temperature > 28 ? "true" : "false");
msg.setMessageId(java.util.UUID.randomUUID().toString());
System.out.println(msgStr);
EventCallback eventCallback = new EventCallback();
client.sendEventAsync(msg, eventCallback,null);
}
catch (Exception e)
{
}
client.close();
}
然后,为接收数据Receive Message添加监听事件,在用户点击时,接收Azure IoTHub的数据,其代码如下:
public void btnReceiveOnClick(View v) throws URISyntaxException, IOException {
Button button = (Button) v;
IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
DeviceClient client = new DeviceClient(connString, protocol);
if (protocol == IotHubClientProtocol.MQTT)
{
MessageCallbackMqtt callback = new MessageCallbackMqtt();
Counter counter = new Counter(0);
client.setMessageCallback(callback, counter);
}
else
{
MessageCallback callback = new MessageCallback();
Counter counter = new Counter(0);
client.setMessageCallback(callback, counter);
}
try {
client.open();
}
catch(IOException e1)
{
System.out.println("Exception while opening IoTHub connection: " + e1.toString());
}
catch(Exception e2)
{
System.out.println("Exception while opening IoTHub connection: " + e2.toString());
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
client.close();
}
之后,在接收消息的回调函数中,进行数据的接收,并赋给全局的rxinfo,其代码如下:
protected static class MessageCallbackMqtt implements com.microsoft.azure.sdk.iot.device.MessageCallback
{
public IotHubMessageResult execute(Message msg, Object context)
{
Counter counter = (Counter) context;
rxinfo= "Received message " + counter.toString() + " with content: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET);
counter.increment(); return IotHubMessageResult.COMPLETE;
}
}
另外,为了接收的数据能够更新到界面的textview控件,需要在MainActivity类中设置一个Handle,其代码如下:
Handler mTimeHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == 0) {
info.setText(rxinfo);
sendEmptyMessageDelayed(0, 1000);
}
}
};
最后,在MainActivity的onCreate生命周期事件中启动它,代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
info=(TextView)findViewById(R.id.info);
rxinfo="no rx message";
mTimeHandler.sendEmptyMessageDelayed(0, 1000);
}
6. 调试结果
本应用程序在模拟器和Nexus 5设备上调试通过,应用程序启动以后,点击Send Message按键,发送一次消息给Azure IoTHub,可以在Device Explore的Data中进行监视,如下图所示。
同样,为了演示Android设备接收Azure IoTHub的消息,可以在Device Explore的Message to Device中,发送一个hello world的消息,然后在Android应用程序中点击Receive Message进行数据的接收,显示在TextView控件上,如下图所示。

源代码下载:链接
Microsoft Azure IoTHub Serials 1 - 使用Android设备与Azure IoTHub进行交互的更多相关文章
- 微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案
微软的云平台媒体服务为流媒体服务提供了多种选择,在使用流媒体服务为企业做流媒体方案时,首先需要确认要流媒体接收目标,如针对广大iOS, Android移动设备,由于它们都支持HLS 格式的流媒体,基于 ...
- 在ios android设备上使用 Protobuf (使用dll方式)
http://game.ceeger.com/forum/read.php?tid=13479 如果你的工程可以以.Net 2.0 subset模式运行,请看这个帖子中的方法. 地址:http://g ...
- (转)在ios android设备上使用 Protobuf (使用dll方式)
自:http://game.ceeger.com/forum/read.php?tid=13479 如果你的工程可以以.Net 2.0 subset模式运行,请看这个帖子中的方法. 地址:http:/ ...
- chorme浏览器调试Android设备
Android设备开启开发者模式,并打开USB调试: 接着在Android设备上运行项目 在chrome浏览器打开F12: 在Remote devices里即可调试页面. ! 一般需要FQ
- 无线连接Android设备
有时设备处于低电,此时又需要进行设备与PC的数据传输,但是通过USB连接充电速度太慢.这时就可以通过无线进行传输数据,然后通过AC充电.一举两得. 前提: 1.在Android设备的开发者模式-打开U ...
- 制作bat脚本,抓取Android设备logcat
::bat制作抓取Android设备的logcat,并保存以时间命名的txt文件至设备目录 1 @ECHO off adb wait-for-device ECHO 正在连接设备 adb logcat ...
- 电脑控制Android设备的软件——Total Control
最早开始搞Android开发时,为了调试方便,想找一个Android下的远程控制软件,支持在电脑端远程控制和同步显示Android设备.先后试了360手机助手.Mobizen.Vysor和Mirror ...
- python Windows下的android设备截图工具
目录 界面版 命令行版 界面版 利用python的wx库写个ui界面,用来把android设备的截图输出到电脑屏幕,前提需要安装adb,涉及到的python库也要安装.代码如下: #!/usr/bin ...
- Python写一个Windows下的android设备截图工具
界面版 利用python的wx库写个ui界面,用来把android设备的截图输出到电脑屏幕,前提需要安装adb,涉及到的python库也要安装.代码如下: import wx,subprocess,o ...
随机推荐
- JavaWeb总结(七)—JSTL标签库
一.JSTL标签库介绍 JSTL标签库的使用时为了弥补HTML标签的不足,规范自定义标签的使用而诞生的.使用JSTL标签的目的是不希望在JSP中出现Java逻辑代码. 二.JSTL标签库的分类 1.核 ...
- WCF和ASP.NET Web API在应用上的选择
小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/shareto ...
- 前端必备PS技巧
hai,how is it going?I'm MuQing.I come back.哈哈,最近在英语的路上奋战,小秀一下.又好久没写博客了,实习的生活渐行渐远了,回到学校也终于能够坐下来对很多东西进 ...
- win8.1启用ahci后蓝屏
先简单介绍一下,本应该win7开始,系统安装的时候默认就启用了ahci硬盘模式.但是博主犯了傻,装了win8.1后安装win XP形成双系统.xp并不支持ahci模式,所以将硬盘模式改成了IDE模式, ...
- PMBOK 学习与实践分享视频
本系列为自己在学习PMBOK时进行的总结与分享,每一节主要包括两部分: 对PMBOK本身的一个结构笔记和讲解. 对自己项目管理工作的一个总结和思考. PMBOK 学习与实践分享视频内容清单 人力资源管 ...
- 2017-4-26 winform 菜单和工具栏
如何让radiobutton进行分组: 用Panel 相当于div 菜单和工具栏: MenuStrip(菜单条) ShortcutKeys-------------------------与菜单 ...
- (知识点)JavaScript继承
1)原型链 ①原型链示例 function Shape() { this.name = 'shape'; this.toString = function(){ return this.name; } ...
- iframe框架的应用
同学接私活,我写几个页面. 后台系统,点击侧栏菜单后,右边div的要显示对应的内容.就是说,没选一下左边的菜单,右边的内容都要变化. 这次首先尝试了一下Oldfasional办法--iframe框架. ...
- hdu1507 Uncle Tom's Inherited Land* 二分匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1507 将i+j为奇数的构成x集合中 将i+j为偶数的构成y集合中 然后就是构建二部图 关键就是构图 然 ...
- 转:Redis使用认证密码登录
Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用.这在安全性上会有一定的问题,所以需要启用Redis的认证密码,增加Redis服务器的安 ...

