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為例),點擊創建,如下圖所示。

image

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文件加入按鈕控件和信息顯示控件,如下圖所示。
image

 

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中進行監視,如下圖所示。
image
    同樣,為了演示Android設備接收Azure IoTHub的消息,可以在Device Explore的Message to Device中,發送一個hello world的消息,然后在Android應用程序中點擊Receive Message進行數據的接收,顯示在TextView控件上,如下圖所示。

image

    源代碼下載:鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM